office-gobmx/dbaccess/source/ui/dlg/adodatalinks.cxx
Stephan Bergmann 475d4b274b Use sal_IntPtr to transport HWND to IDataSourceLocator::put_hWnd
The HWND hWnd source is in OConnectionHelper::implInitControls
(dbaccess/source/ui/dlg/ConnectionHelper.cxx) and the
IDataSourceLocator::put_hWnd call sinks are in PromptNew and PromptEdit
(dbaccess/source/ui/dlg/adodatalinks.cxx).  The IDataSourceLocator source code
has

          virtual HRESULT __stdcall put_hWnd(
                         COMPATIBLE_LONG hwndParent) = 0;

with

  typedef LONGLONG COMPATIBLE_LONG;

(both C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\msdasc.h),
so it looks like an integer type large enough to hold pointers is what is
appropriate here.  (Which matches the fact that HWND aka HANDLE aka PVOID is a
pointer type.)

Change-Id: I3a18e9a1d2f75a1feac716ef6e7bca78165ffe95
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106695
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
2020-11-26 17:34:18 +01:00

206 lines
5.6 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#if defined(_WIN32)
// LO/windows.h conflict
#undef WB_LEFT
#undef WB_RIGHT
#include <msdasc.h>
#include <comphelper/scopeguard.hxx>
#include <o3tl/char16_t2wchar_t.hxx>
#include <initguid.h>
#include <adoid.h>
#include <adoint.h>
#include "adodatalinks.hxx"
namespace {
OUString PromptNew(sal_IntPtr hWnd)
{
HRESULT hr;
IDataSourceLocator* dlPrompt = nullptr;
ADOConnection* piTmpConnection = nullptr;
BSTR _result=nullptr;
// Initialize COM
hr = ::CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED );
if (FAILED(hr) && hr != RPC_E_CHANGED_MODE)
std::abort();
const bool bDoUninit = SUCCEEDED(hr);
comphelper::ScopeGuard g([bDoUninit] () {
if (bDoUninit)
CoUninitialize();
});
// Instantiate DataLinks object.
hr = CoCreateInstance(
CLSID_DataLinks, //clsid -- Data Links UI
nullptr, //pUnkOuter
CLSCTX_INPROC_SERVER, //dwClsContext
IID_IDataSourceLocator, //riid
reinterpret_cast<void**>(&dlPrompt) //ppvObj
);
if( FAILED( hr ) )
{
return OUString();
}
dlPrompt->put_hWnd(hWnd);
if( FAILED( hr ) )
{
dlPrompt->Release( );
return OUString();
}
// Prompt for connection information.
hr = dlPrompt->PromptNew(reinterpret_cast<IDispatch **>(&piTmpConnection));
if( FAILED( hr ) || !piTmpConnection )
{
dlPrompt->Release( );
return OUString();
}
hr = piTmpConnection->get_ConnectionString(&_result);
if( FAILED( hr ) )
{
piTmpConnection->Release( );
dlPrompt->Release( );
return OUString();
}
piTmpConnection->Release( );
dlPrompt->Release( );
// Don't we need SysFreeString(_result)?
return OUString(o3tl::toU(_result));
}
OUString PromptEdit(sal_IntPtr hWnd, OUString const & connstr)
{
HRESULT hr;
IDataSourceLocator* dlPrompt = nullptr;
ADOConnection* piTmpConnection = nullptr;
BSTR _result=nullptr;
// Initialize COM
::CoInitializeEx( nullptr, COINIT_APARTMENTTHREADED );
hr = CoCreateInstance(CLSID_CADOConnection,
nullptr,
CLSCTX_INPROC_SERVER,
IID_IADOConnection,
reinterpret_cast<LPVOID *>(&piTmpConnection));
if( FAILED( hr ) )
{
piTmpConnection->Release( );
return connstr;
}
hr = piTmpConnection->put_ConnectionString(
const_cast<BSTR>(o3tl::toW(connstr.getStr())));
if( FAILED( hr ) )
{
piTmpConnection->Release( );
return connstr;
}
// Instantiate DataLinks object.
hr = CoCreateInstance(
CLSID_DataLinks, //clsid -- Data Links UI
nullptr, //pUnkOuter
CLSCTX_INPROC_SERVER, //dwClsContext
IID_IDataSourceLocator, //riid
reinterpret_cast<void**>(&dlPrompt) //ppvObj
);
if( FAILED( hr ) )
{
piTmpConnection->Release( );
dlPrompt->Release( );
return connstr;
}
dlPrompt->put_hWnd(hWnd);
if( FAILED( hr ) )
{
piTmpConnection->Release( );
dlPrompt->Release( );
return connstr;
}
VARIANT_BOOL pbSuccess;
// Prompt for connection information.
hr = dlPrompt->PromptEdit(reinterpret_cast<IDispatch **>(&piTmpConnection),&pbSuccess);
if( SUCCEEDED( hr ) && !pbSuccess ) //if user press cancel then sal_False == pbSuccess
{
piTmpConnection->Release( );
dlPrompt->Release( );
return connstr;
}
if( FAILED( hr ) )
{
// Prompt for new connection information.
piTmpConnection->Release( );
piTmpConnection = nullptr;
hr = dlPrompt->PromptNew(reinterpret_cast<IDispatch **>(&piTmpConnection));
if( FAILED( hr ) || !piTmpConnection )
{
dlPrompt->Release( );
return connstr;
}
}
hr = piTmpConnection->get_ConnectionString(&_result);
if( FAILED( hr ) )
{
piTmpConnection->Release( );
dlPrompt->Release( );
return connstr;
}
piTmpConnection->Release( );
dlPrompt->Release( );
CoUninitialize();
// Don't we need SysFreeString(_result)?
return OUString(o3tl::toU(_result));
}
}
OUString getAdoDatalink(sal_IntPtr hWnd,OUString const & oldLink)
{
OUString dataLink;
if (!oldLink.isEmpty())
{
dataLink=PromptEdit(hWnd,oldLink);
}
else
dataLink=PromptNew(hWnd);
return dataLink;
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */