/*
 * Copyright (C) 2012 Alistair Leslie-Hughes
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "oaidl.idl";
import "ocidl.idl";
import "oledb.idl";

#if !defined(progid) && !defined(__WIDL__)
#define threading(model)
#define progid(str)
#define vi_progid(str)
#endif

typedef LONG_PTR COMPATIBLE_LONG;

[
    uuid(2206CEB0-19C1-11D1-89E0-00C04FD7A829),
    version(1.0)
]
library MSDASC
{
    importlib("stdole2.tlb");

    typedef DWORD DBPROMPTOPTIONS;

    typedef enum tagDBPROMPTOPTIONSENUM
    {
        DBPROMPTOPTIONS_NONE                        = 0x00,
        DBPROMPTOPTIONS_WIZARDSHEET                 = 0x01,
        DBPROMPTOPTIONS_PROPERTYSHEET               = 0x02,
        DBPROMPTOPTIONS_BROWSEONLY                  = 0x08,
        DBPROMPTOPTIONS_DISABLE_PROVIDER_SELECTION  = 0x10,
        DBPROMPTOPTIONS_DISABLESAVEPASSWORD         = 0x20
    } DBPROMPTOPTIONSENUM;

    [
      odl,
      uuid(2206CCB2-19C1-11D1-89E0-00C04FD7A829),
      helpstring("OLE DB Service Component Automation Interface"),
      dual,
      oleautomation
    ]
    interface IDataSourceLocator : IDispatch
    {
        [id(0x60020000), propget]
        HRESULT hWnd([out, retval] COMPATIBLE_LONG* phwndParent);

        [id(0x60020000), propput]
        HRESULT hWnd([in] COMPATIBLE_LONG hwndParent);

        [id(0x60020002), helpstring("PromptNew")]
        HRESULT PromptNew([out, retval] IDispatch** ppADOConnection);

        [id(0x60020003), helpstring("PromptEdit")]
        HRESULT PromptEdit([in, out] IDispatch** ppADOConnection, [out, retval] VARIANT_BOOL* pbSuccess);
    }

    [
      odl,
      uuid(2206CCB0-19C1-11D1-89E0-00C04FD7A829),
      restricted
    ]
    interface IDBPromptInitialize : IUnknown
    {
        HRESULT _stdcall PromptDataSource([in] IUnknown* pUnkOuter, [in] HWND hWndParent,
            [in] DBPROMPTOPTIONS dwPromptOptions, [in] ULONG cSourceTypeFilter,
            [in] DBSOURCETYPE* rgSourceTypeFilter, [in] LPWSTR pwszszzProviderFilter,
            [in] GUID* riid, [in, out] IUnknown** ppDataSource);

        HRESULT _stdcall PromptFileName([in] HWND hWndParent, [in] ULONG dwPromptOptions,
            [in] LPWSTR pwszInitialDirectory, [in] LPWSTR pwszInitialFile, [out] LPWSTR* ppwszSelectedFile);
    }

    [
      uuid(2206CCB1-19C1-11D1-89E0-00C04FD7A829),
    ]
    interface IDataInitialize : IUnknown
    {
        HRESULT GetDataSource([in] IUnknown* pUnkOuter, [in]  DWORD dwClsCtx,
                        [in] LPWSTR pwszInitializationString, [in] REFIID riid,
                        [in, out] IUnknown** ppDataSource);

        HRESULT GetInitializationString([in] IUnknown* pDataSource, [in] boolean fIncludePassword,
                        [out] LPWSTR* ppwszInitString);

        HRESULT CreateDBInstance([in] REFCLSID clsidProvider, [in] IUnknown* pUnkOuter,
                        [in] DWORD dwClsCtx, [in] LPWSTR pwszReserved,
                        [in] REFIID riid, [out] IUnknown** ppDataSource);

        [local]
        HRESULT CreateDBInstanceEx([in] REFCLSID clsidProvider,  [in] IUnknown* pUnkOuter,
                        [in] DWORD dwClsCtx, [in] LPWSTR pwszReserved,  [in] COSERVERINFO* pServerInfo,
                        [in] DWORD cmq,  [in, out, size_is(cmq)] MULTI_QI *results);

        [call_as(CreateDBInstanceEx)]
        HRESULT RemoteCreateDBInstanceEx([in] REFCLSID clsidProvider,  [in] IUnknown* pUnkOuter,
                        [in] DWORD dwClsCtx, [in] LPWSTR pwszReserved,  [in] COSERVERINFO* pServerInfo,
                        [in] DWORD cmq,  [in, size_is(cmq)] const IID **iids, [out, size_is(cmq)] IUnknown **ifs,
                        [out, size_is(cmq)] HRESULT *hr);

        HRESULT LoadStringFromStorage([in] LPWSTR pwszFileName, [out] LPWSTR* ppwszInitializationString);

        HRESULT WriteStringToStorage([in] LPWSTR pwszFileName,  [in] LPWSTR pwszInitializationString,
                        [in] DWORD dwCreationDisposition);
    }

    [
      uuid(2206CDB0-19C1-11D1-89E0-00C04FD7A829),
      threading(both),
      progid("MSDASC.MSDAINITIALIZE.1"),
      vi_progid("MSDASC.MSDAINITIALIZE"),
    ]
    coclass MSDAINITIALIZE
    {
        [default] interface IDataInitialize;
    }

    [
      uuid(2206CDB2-19C1-11D1-89E0-00C04FD7A829),
      threading(both),
      progid("DataLinks")
    ]
    coclass DataLinks
    {
        [default] interface IDataSourceLocator;
        interface IDBPromptInitialize;
        interface IDataInitialize;
    }
}
