/*
 * Copyright (C) 2009 Huw Davies
 *
 * 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
 */

#if 0
#pragma makedep install
#endif

[
    object,
    uuid(0c733a7a-2a1c-11ce-ade5-00aa0044773d),
    pointer_default(unique)
]
interface IDBDataSourceAdmin : IUnknown
{
    [local]
    HRESULT CreateDataSource([in] ULONG cPropertySets,
                             [in, out, size_is(cPropertySets)] DBPROPSET rgPropertySets[],
                             [in] IUnknown *pUnkOuter,
                             [in] REFIID riid,
                             [out, iid_is(riid)] IUnknown **ppDBSession);

    [call_as(CreateDataSource)]
    HRESULT RemoteCreateDataSource([in] ULONG cPropertySets,
                                   [in, unique, size_is(cPropertySets)] DBPROPSET *rgPropertySets,
                                   [in] IUnknown *pUnkOuter,
                                   [in] REFIID riid,
                                   [in, out, unique, iid_is(riid)] IUnknown **ppDBSession,
                                   [in] ULONG cTotalProps,
                                   [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus,
                                   [out] IErrorInfo **ppErrorInfoRem);

    [local]
    HRESULT DestroyDataSource();

    [call_as(DestroyDataSource)]
    HRESULT RemoteDestroyDataSource([out] IErrorInfo **ppErrorInfoRem);

    [local]
    HRESULT GetCreationProperties([in] ULONG cPropertyIDSets,
                                  [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],
                                  [in, out] ULONG *pcPropertyInfoSets,
                                  [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets,
                                  [out, annotation("__deref_out_z_opt")] OLECHAR **ppDescBuffer);

    [call_as(GetCreationProperties)]
    HRESULT RemoteGetCreationProperties([in] ULONG cPropertyIDSets,
                                        [in, unique, size_is(cPropertyIDSets)] const DBPROPIDSET *rgPropertyIDSets,
                                        [in, out] ULONG *pcPropertyInfoSets,
                                        [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets,
                                        [in, out] DBCOUNTITEM *pcOffsets,
                                        [out, size_is(,(ULONG)*pcOffsets)] DBBYTEOFFSET **prgDescOffsets,
                                        [in, out] ULONG *pcbDescBuffer,
                                        [in, out, unique, size_is(,*pcbDescBuffer)] OLECHAR **ppDescBuffer,
                                        [out] IErrorInfo **ppErrorInfoRem);

    [local]
    HRESULT ModifyDataSource([in] ULONG cPropertySets,
                             [in, size_is(cPropertySets)] DBPROPSET rgPropertySets[]);

    [call_as(ModifyDataSource)]
    HRESULT RemoteModifyDataSource([in] ULONG cPropertySets,
                                   [in, size_is(cPropertySets)] DBPROPSET *rgPropertySets,
                                   [out] IErrorInfo **ppErrorInfoRem);
}
