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

typedef DWORD DBKIND;

enum DBKINDENUM {
    DBKIND_GUID_NAME,
    DBKIND_GUID_PROPID,
    DBKIND_NAME,
    DBKIND_PGUID_NAME,
    DBKIND_PGUID_PROPID,
    DBKIND_PROPID,
    DBKIND_GUID,
};

typedef struct tagDBID {
    [switch_type(DBKIND), switch_is(eKind)] union
    {
    [case(DBKIND_GUID_NAME, DBKIND_GUID_PROPID, DBKIND_GUID, DBKIND_NAME, DBKIND_PROPID)]
        GUID guid;
    [case(DBKIND_PGUID_NAME, DBKIND_PGUID_PROPID)]
        GUID *pguid;
    [default]
        ;
    } uGuid;
    DBKIND eKind;
    [switch_type(DBKIND), switch_is(eKind)] union
    {
    [case(DBKIND_GUID_NAME, DBKIND_NAME, DBKIND_PGUID_NAME)]
        LPOLESTR pwszName;
    [case(DBKIND_GUID_PROPID, DBKIND_GUID, DBKIND_PGUID_PROPID, DBKIND_PROPID)]
        ULONG ulPropid;
    [default]
        ;
    } uName;
} DBID;

typedef DWORD DBPROPID;

typedef struct tagDBPROPIDSET {
    [size_is(cPropertyIDs)] DBPROPID *rgPropertyIDs;
    ULONG cPropertyIDs;
    GUID guidPropertySet;
} DBPROPIDSET;

typedef DWORD DBPROPOPTIONS;

enum DBPROPOPTIONENUM {
    DBPROPOPTIONS_REQUIRED = 0,
    DBPROPOPTIONS_SETIFCHEAP = 1,
    DBPROPOPTIONS_OPTIONAL = 1,
};

typedef DWORD DBPROPSTATUS;

typedef struct tagDBPROP {
    DBPROPID dwPropertyID;
    DBPROPOPTIONS dwOptions;
    DBPROPSTATUS dwStatus;
    DBID colid;
    VARIANT vValue;
} DBPROP;

typedef struct tagDBPROPSET {
    [size_is(cProperties)] DBPROP *rgProperties;
    ULONG cProperties;
    GUID guidPropertySet;
} DBPROPSET;

typedef DWORD DBPROPFLAGS;

typedef struct tagDBPROPINFO {
    LPOLESTR pwszDescription;
    DBPROPID dwPropertyID;
    DBPROPFLAGS dwFlags;
    VARTYPE vtType;
    VARIANT vValues;
} DBPROPINFO;

typedef DBPROPINFO *PDBPROPINFO;

typedef struct tagDBPROPINFOSET {
    [size_is(cPropertyInfos)] PDBPROPINFO rgPropertyInfos;
    ULONG cPropertyInfos;
    GUID guidPropertySet;
} DBPROPINFOSET;