/*
 * Copyright (C) 2006 Mike McCormack
 *
 * 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(0c733a8a-2a1c-11ce-ade5-00aa0044773d),
    pointer_default(unique)
]
interface IDBProperties : IUnknown {
    [local] HRESULT GetProperties(
             [in] ULONG cPropertyIDSets,
             [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],
             [in, out] ULONG *pcPropertySets,
             [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets);

    [call_as(GetProperties)] HRESULT RemoteGetProperties(
             [in] ULONG cPropertyIDSets,
             [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],
             [in, out] ULONG *pcPropertySets,
             [out, size_is(,*pcPropertySets)] DBPROPSET **prgPropertySets,
             [out] IErrorInfo **ppErrorInfoRem);

    [local] HRESULT GetPropertyInfo(
             [in] ULONG cPropertyIDSets,
             [in, size_is(cPropertyIDSets)] const DBPROPIDSET rgPropertyIDSets[],
             [in, out] ULONG *pcPropertyInfoSets,
             [out, size_is(,*pcPropertyInfoSets)] DBPROPINFOSET **prgPropertyInfoSets);

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

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

    [call_as(SetProperties)] HRESULT RemoteSetProperties(
             [in] ULONG cPropertySets,
             [in, out, size_is(cPropertySets)] DBPROPSET *rgPropertySets,
             [in] ULONG cTotalProps,
             [out, size_is(cTotalProps)] DBPROPSTATUS *rgPropStatus,
             [out] IErrorInfo **ppErrorInfoRem);
}
