/*
 * 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
 */

[
    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);
}
