/*
 * Copyright 2002 Ove Kaaven
 * Copyright 2004 Francois Gouget
 * Copyright 2005 Juan Lang
 *
 * 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
 */

#ifndef DO_NO_IMPORTS
import "objidl.idl";
import "oaidl.idl";
#endif

/*
 * Windows SDK braindamage alert
 *
 * PID_DICTIONARY and PID_CODEPAGE are defined by msidefs.h too
 * PID_SECURITY is defined in msidefs.h with a different value!
 * So these need to be undefined first.
 */
cpp_quote("#ifdef PID_DICTIONARY")
cpp_quote("#undef PID_DICTIONARY")
cpp_quote("#endif")

cpp_quote("#ifdef PID_CODEPAGE")
cpp_quote("#undef PID_CODEPAGE")
cpp_quote("#endif")

cpp_quote("#ifdef PID_SECURITY")
cpp_quote("#undef PID_SECURITY")
cpp_quote("#endif")

/******************** Property Storage ********************/

interface IEnumSTATPROPSTG;
interface IEnumSTATPROPSETSTG;

[
  object,
  uuid(00000138-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IPropertyStorage : IUnknown
{
  typedef [unique] IPropertyStorage *LPPROPERTYSTORAGE;

  const DWORD PROPSETFLAG_DEFAULT = 0;
  const DWORD PROPSETFLAG_NONSIMPLE = 1;
  const DWORD PROPSETFLAG_ANSI = 2;
  const DWORD PROPSETFLAG_UNBUFFERED = 4;
  const DWORD PROPSETFLAG_CASE_SENSITIVE = 8;

  const DWORD PROPSET_BEHAVIOR_CASE_SENSITIVE = 1;

  const PROPID PID_DICTIONARY          = 0x00000000;
  const PROPID PID_CODEPAGE            = 0x00000001;
  const PROPID PID_FIRST_USABLE        = 0x00000002;
  const PROPID PID_FIRST_NAME_DEFAULT  = 0x00000fff;
  const PROPID PID_LOCALE              = 0x80000000;
  const PROPID PID_MODIFY_TIME         = 0x80000001;
  const PROPID PID_SECURITY            = 0x80000002;
  const PROPID PID_BEHAVIOR            = 0x80000003;
  const PROPID PID_ILLEGAL             = 0xffffffff;
  const PROPID PID_MIN_READONLY        = 0x80000000;
  const PROPID PID_MAX_READONLY        = 0xbfffffff;

  typedef struct tagPROPVARIANT PROPVARIANT;

#define TYPEDEF_CA(type, name) \
    typedef struct tag##name { \
      ULONG cElems; \
      [size_is(cElems)] \
      type *pElems; \
    } name

  TYPEDEF_CA(unsigned char, CAUB);
  TYPEDEF_CA(short, CAI);
  TYPEDEF_CA(USHORT, CAUI);
  TYPEDEF_CA(long, CAL);
  TYPEDEF_CA(ULONG, CAUL);
  TYPEDEF_CA(float, CAFLT);
  TYPEDEF_CA(double, CADBL);
  TYPEDEF_CA(CY, CACY);
  TYPEDEF_CA(DATE, CADATE);
  TYPEDEF_CA(BSTR, CABSTR);
  TYPEDEF_CA(BSTRBLOB, CABSTRBLOB);
  TYPEDEF_CA(VARIANT_BOOL, CABOOL);
  TYPEDEF_CA(SCODE,  CASCODE);
  TYPEDEF_CA(PROPVARIANT, CAPROPVARIANT);
  TYPEDEF_CA(LARGE_INTEGER, CAH);
  TYPEDEF_CA(ULARGE_INTEGER, CAUH);
  TYPEDEF_CA(LPSTR, CALPSTR);
  TYPEDEF_CA(LPWSTR, CALPWSTR);
  TYPEDEF_CA(FILETIME, CAFILETIME);
  TYPEDEF_CA(CLIPDATA, CACLIPDATA);
  TYPEDEF_CA(CLSID, CACLSID);

  struct tagPROPVARIANT {
    VARTYPE vt;
    WORD wReserved1;
    WORD wReserved2;
    WORD wReserved3;
    [switch_is(vt & 0x1fff)] union {
    [case(VT_EMPTY, VT_NULL)]             ;
    [case(VT_I1)]                         char cVal;
    [case(VT_UI1)]                        UCHAR bVal;
    [case(VT_I2)]                         short iVal;
    [case(VT_UI2)]                        USHORT uiVal;
    [case(VT_BOOL)]                       VARIANT_BOOL boolVal;
#if 0 /* illegal in C++ */
    [case(VT_ILLEGAL)]                    _VARIANT_BOOL bool;
#endif
    [case(VT_I4)]                         long lVal;
    [case(VT_UI4)]                        ULONG ulVal;
    [case(VT_R4)]                         float fltVal;
    [case(VT_ERROR)]                      SCODE scode;
    [case(VT_I8)]                         LARGE_INTEGER hVal;
    [case(VT_UI8)]                        ULARGE_INTEGER uhVal;
    [case(VT_R8)]                         double dblVal;
    [case(VT_CY)]                         CY cyVal;
    [case(VT_DATE)]                       DATE date;
    [case(VT_FILETIME)]                   FILETIME filetime;
    [case(VT_CLSID)]                      CLSID *puuid;
    [case(VT_BLOB, VT_BLOB_OBJECT)]       BLOB blob;
    [case(VT_CF)]                         CLIPDATA *pclipdata;
    [case(VT_STREAM, VT_STREAMED_OBJECT)] IStream *pStream;
    [case(VT_STORAGE, VT_STORED_OBJECT)]  IStorage *pStorage;
    [case(VT_BSTR)]                       BSTR bstrVal;
    [case(VT_BSTR_BLOB)]                  BSTRBLOB bstrblobVal;
    [case(VT_LPSTR)]                      LPSTR pszVal;
    [case(VT_LPWSTR)]                     LPWSTR pwszVal;
    [case(VT_UI1|VT_VECTOR)]              CAUB caub;
    [case(VT_I2|VT_VECTOR)]               CAI cai;
    [case(VT_UI2|VT_VECTOR)]              CAUI caui;
    [case(VT_BOOL|VT_VECTOR)]             CABOOL cabool;
    [case(VT_I4|VT_VECTOR)]               CAL cal;
    [case(VT_UI4|VT_VECTOR)]              CAUL caul;
    [case(VT_R4|VT_VECTOR)]               CAFLT caflt;
    [case(VT_ERROR|VT_VECTOR)]            CASCODE cascode;
    [case(VT_I8|VT_VECTOR)]               CAH cah;
    [case(VT_UI8|VT_VECTOR)]              CAUH cauh;
    [case(VT_R8|VT_VECTOR)]               CADBL cadbl;
    [case(VT_CY|VT_VECTOR)]               CACY cacy;
    [case(VT_DATE|VT_VECTOR)]             CADATE cadate;
    [case(VT_FILETIME|VT_VECTOR)]         CAFILETIME cafiletime;
    [case(VT_CLSID|VT_VECTOR)]            CACLSID cauuid;
    [case(VT_CF|VT_VECTOR)]               CACLIPDATA caclipdata;
    [case(VT_BSTR|VT_VECTOR)]             CABSTR cabstr;
    [case(VT_BSTR_BLOB|VT_VECTOR)]        CABSTRBLOB cabstrblob;
    [case(VT_LPSTR|VT_VECTOR)]            CALPSTR calpstr;
    [case(VT_LPWSTR|VT_VECTOR)]           CALPWSTR calpwstr;
    [case(VT_VARIANT|VT_VECTOR)]          CAPROPVARIANT capropvar;
    [case(VT_ARRAY|VT_I1,
          VT_ARRAY|VT_UI1,
          VT_ARRAY|VT_I2,
          VT_ARRAY|VT_UI2,
          VT_ARRAY|VT_I4,
          VT_ARRAY|VT_UI4,
          VT_ARRAY|VT_INT,
          VT_ARRAY|VT_UINT,
          VT_ARRAY|VT_R4,
          VT_ARRAY|VT_R8,
          VT_ARRAY|VT_CY,
          VT_ARRAY|VT_DATE,
          VT_ARRAY|VT_BSTR,
          VT_ARRAY|VT_BOOL,
          VT_ARRAY|VT_DECIMAL,
          VT_ARRAY|VT_DISPATCH,
          VT_ARRAY|VT_UNKNOWN,
          VT_ARRAY|VT_ERROR,
          VT_ARRAY|VT_VARIANT)]           LPSAFEARRAY parray;
    [case(VT_BYREF|VT_I1)]                CHAR *pcVal;
    [case(VT_BYREF|VT_UI1)]               UCHAR *pbVal;
    [case(VT_BYREF|VT_I2)]                SHORT *piVal;
    [case(VT_BYREF|VT_UI2)]               USHORT *puiVal;
    [case(VT_BYREF|VT_I4)]                LONG *plVal;
    [case(VT_BYREF|VT_UI4)]               ULONG *pulVal;
    [case(VT_BYREF|VT_INT)]               INT *pintVal;
    [case(VT_BYREF|VT_UINT)]              UINT *puintVal;
    [case(VT_BYREF|VT_R4)]                FLOAT *pfltVal;
    [case(VT_BYREF|VT_R8)]                DOUBLE *pdblVal;
    [case(VT_BYREF|VT_BOOL)]              VARIANT_BOOL *pboolVal;
    [case(VT_BYREF|VT_DECIMAL)]           DECIMAL *pdecVal;
    [case(VT_BYREF|VT_ERROR)]             SCODE *pscode;
    [case(VT_BYREF|VT_CY)]                CY *pcyVal;
    [case(VT_BYREF|VT_DATE)]              DATE *pdate;
    [case(VT_BYREF|VT_BSTR)]              BSTR *pbstrVal;
    [case(VT_BYREF|VT_UNKNOWN)]           IUnknown **ppunkVal;
    [case(VT_BYREF|VT_DISPATCH)]          IDispatch **ppdispVal;
    [case(VT_BYREF|VT_ARRAY)]             LPSAFEARRAY *pparray;
    [case(VT_BYREF|VT_VARIANT)]           PROPVARIANT *pvarVal;
    };
  };

  typedef struct tagPROPVARIANT *LPPROPVARIANT;

  cpp_quote("#if 0")
  typedef const PROPVARIANT * REFPROPVARIANT;
  cpp_quote("#endif")
  cpp_quote("#ifndef _REFPROPVARIANT_DEFINED")
  cpp_quote("#define _REFPROPVARIANT_DEFINED")
  cpp_quote("#ifdef __cplusplus")
  cpp_quote("#define REFPROPVARIANT const PROPVARIANT &")
  cpp_quote("#else")
  cpp_quote("#define REFPROPVARIANT const PROPVARIANT * __MIDL_CONST")
  cpp_quote("#endif")
  cpp_quote("#endif")

  cpp_quote("#define PIDDI_THUMBNAIL 0x00000002L /* VT_BLOB */")
  cpp_quote("")
  cpp_quote("#define PIDSI_TITLE        0x00000002L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_SUBJECT      0x00000003L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_AUTHOR       0x00000004L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_KEYWORDS     0x00000005L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_COMMENTS     0x00000006L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_TEMPLATE     0x00000007L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_LASTAUTHOR   0x00000008L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_REVNUMBER    0x00000009L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_EDITTIME     0x0000000AL /* VT_FILETIME (UTC) */")
  cpp_quote("#define PIDSI_LASTPRINTED  0x0000000BL /* VT_FILETIME (UTC) */")
  cpp_quote("#define PIDSI_CREATE_DTM   0x0000000CL /* VT_FILETIME (UTC) */")
  cpp_quote("#define PIDSI_LASTSAVE_DTM 0x0000000DL /* VT_FILETIME (UTC) */")
  cpp_quote("#define PIDSI_PAGECOUNT    0x0000000EL /* VT_I4 */")
  cpp_quote("#define PIDSI_WORDCOUNT    0x0000000FL /* VT_I4 */")
  cpp_quote("#define PIDSI_CHARCOUNT    0x00000010L /* VT_I4 */")
  cpp_quote("#define PIDSI_THUMBNAIL    0x00000011L /* VT_CF */")
  cpp_quote("#define PIDSI_APPNAME      0x00000012L /* VT_LPSTR */")
  cpp_quote("#define PIDSI_DOC_SECURITY 0x00000013L /* VT_I4 */")
  cpp_quote("")
  cpp_quote("#define PIDDSI_CATEGORY    0x00000002L /* VT_LPSTR */")
  cpp_quote("#define PIDDSI_PRESFORMAT  0x00000003L /* VT_LPSTR */")
  cpp_quote("#define PIDDSI_BYTECOUNT   0x00000004L /* VT_I4 */")
  cpp_quote("#define PIDDSI_LINECOUNT   0x00000005L /* VT_I4 */")
  cpp_quote("#define PIDDSI_PARCOUNT    0x00000006L /* VT_I4 */")
  cpp_quote("#define PIDDSI_SLIDECOUNT  0x00000007L /* VT_I4 */")
  cpp_quote("#define PIDDSI_NOTECOUNT   0x00000008L /* VT_I4 */")
  cpp_quote("#define PIDDSI_HIDDENCOUNT 0x00000009L /* VT_I4 */")
  cpp_quote("#define PIDDSI_MMCLIPCOUNT 0x0000000AL /* VT_I4 */")
  cpp_quote("#define PIDDSI_SCALE       0x0000000BL /* VT_BOOL */")
  cpp_quote("#define PIDDSI_HEADINGPAIR 0x0000000CL /* VT_VARIANT|VT_VECTOR */")
  cpp_quote("#define PIDDSI_DOCPARTS    0x0000000DL /* VT_LPSTR|VT_VECTOR */")
  cpp_quote("#define PIDDSI_MANAGER     0x0000000EL /* VT_LPSTR */")
  cpp_quote("#define PIDDSI_COMPANY     0x0000000FL /* VT_LPSTR */")
  cpp_quote("#define PIDDSI_LINKSDIRTY  0x00000010L /* VT_B0OL */")

  const ULONG PRSPEC_INVALID = 0xffffffff;
  const ULONG PRSPEC_LPWSTR = 0;
  const ULONG PRSPEC_PROPID = 1;

  typedef struct tagPROPSPEC {
    ULONG ulKind;
    [switch_is(ulKind)] union {
    [case(PRSPEC_PROPID)] PROPID propid;
    [case(PRSPEC_LPWSTR)] LPOLESTR lpwstr;
    [default]             ;
    } DUMMYUNIONNAME;
  } PROPSPEC;

  typedef struct tagSTATPROPSTG {
    LPOLESTR lpwstrName;
    PROPID propid;
    VARTYPE vt;
  } STATPROPSTG;

  cpp_quote("/* Macros for dwOSVersion member of STATPROPSETSTG */")
  cpp_quote("#define PROPSETHDR_OSVER_KIND(dwOSVer)  HIWORD((dwOSVer))")
  cpp_quote("#define PROPSETHDR_OSVER_MAJOR(dwOSVer) LOBYTE(LOWORD((dwOSVer)))")
  cpp_quote("#define PROPSETHDR_OSVER_MINOR(dwOSVer) HIBYTE(LOWORD((dwOSVer)))")
  cpp_quote("#define PROPSETHDR_OSVERSION_UNKNOWN    0xffffffff")

  typedef struct tagSTATPROPSETSTG {
    FMTID fmtid;
    CLSID clsid;
    DWORD grfFlags;
    FILETIME mtime;
    FILETIME ctime;
    FILETIME atime;
    DWORD dwOSVersion;
  } STATPROPSETSTG;

  HRESULT ReadMultiple(
    [in] ULONG cpspec,
    [in, size_is(cpspec)] const PROPSPEC rgpspec[],
    [out, size_is(cpspec)] PROPVARIANT rgpropvar[]);

  HRESULT WriteMultiple(
    [in] ULONG cpspec,
    [in, size_is(cpspec)] const PROPSPEC rgpspec[],
    [in, size_is(cpspec)] const PROPVARIANT rgpropvar[],
    [in] PROPID propidNameFirst);

  HRESULT DeleteMultiple(
    [in] ULONG cpspec,
    [in, size_is(cpspec)] const PROPSPEC rgpspec[]);

  HRESULT ReadPropertyNames(
    [in] ULONG cpropid,
    [in, size_is(cpropid)] const PROPID rgpropid[],
    [out, size_is(cpropid)] LPOLESTR rglpwstrName[]);

  HRESULT WritePropertyNames(
    [in] ULONG cpropid,
    [in, size_is(cpropid)] const PROPID rgpropid[],
    [in, size_is(cpropid)] const LPOLESTR rglpwstrName[]);

  HRESULT DeletePropertyNames(
    [in] ULONG cpropid,
    [in, size_is(cpropid)] const PROPID rgpropid[]);

  HRESULT Commit(
    [in] DWORD grfCommitFlags);

  HRESULT Revert();

  HRESULT Enum(
    [out] IEnumSTATPROPSTG **ppenum);

  HRESULT SetTimes(
    [in] const FILETIME *pctime,
    [in] const FILETIME *patime,
    [in] const FILETIME *pmtime);

  HRESULT SetClass(
    [in] REFCLSID clsid);

  HRESULT Stat(
    [out] STATPROPSETSTG *statpsstg);
}

[
  object,
  uuid(0000013A-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IPropertySetStorage : IUnknown
{
  typedef [unique] IPropertySetStorage *LPPROPERTYSETSTORAGE;

  HRESULT Create(
    [in] REFFMTID rfmtid,
    [in, unique] const CLSID *pclsid,
    [in] DWORD grfFlags,
    [in] DWORD grfMode,
    [out] IPropertyStorage **ppprstg);

  HRESULT Open(
    [in] REFFMTID rfmtid,
    [in] DWORD grfMode,
    [out] IPropertyStorage **ppprstg);

  HRESULT Delete(
    [in] REFFMTID rfmtid);

  HRESULT Enum(
    [out] IEnumSTATPROPSETSTG **ppenum);
}

[
  object,
  uuid(00000139-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IEnumSTATPROPSTG : IUnknown
{
  typedef [unique] IEnumSTATPROPSTG *LPENUMSTATPROPSTG;

  [local]
  HRESULT Next(
    [in] ULONG celt,
    [out, size_is(celt), length_is(*pceltFetched)]
    STATPROPSTG *rgelt,
    [out] ULONG *pceltFetched);

  [call_as(Next)]
  HRESULT RemoteNext(
    [in] ULONG celt,
    [out, size_is(celt), length_is(*pceltFetched)]
    STATPROPSTG *rgelt,
    [out] ULONG *pceltFetched);

  HRESULT Skip(
    [in] ULONG celt);

  HRESULT Reset();

  HRESULT Clone(
    [out] IEnumSTATPROPSTG **ppenum);
}

[
  object,
  uuid(0000013B-0000-0000-C000-000000000046),
  pointer_default(unique)
]
interface IEnumSTATPROPSETSTG : IUnknown
{
  typedef [unique] IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;

  [local]
  HRESULT Next(
    [in] ULONG celt,
    [out, size_is(celt), length_is(*pceltFetched)]
    STATPROPSETSTG *rgelt,
    [out] ULONG *pceltFetched);

  [call_as(Next)]
  HRESULT RemoteNext(
    [in] ULONG celt,
    [out, size_is(celt), length_is(*pceltFetched)]
    STATPROPSETSTG *rgelt,
    [out] ULONG *pceltFetched);

  HRESULT Skip(
    [in] ULONG celt);

  HRESULT Reset();

  HRESULT Clone(
    [out] IEnumSTATPROPSETSTG **ppenum);
}

typedef struct SERIALIZEDPROPERTYVALUE {
    DWORD dwType;
    BYTE rgb[1];
} SERIALIZEDPROPERTYVALUE;

cpp_quote("HRESULT WINAPI FreePropVariantArray(ULONG,PROPVARIANT*);")
cpp_quote("HRESULT WINAPI PropVariantClear(PROPVARIANT*);")
cpp_quote("HRESULT WINAPI PropVariantCopy(PROPVARIANT*,const PROPVARIANT*);")
cpp_quote("")
cpp_quote("#define _PROPVARIANT_INIT_DEFINED_")
cpp_quote("#define PropVariantInit(p) memset((p), 0, sizeof(PROPVARIANT))")
cpp_quote("")
cpp_quote("#ifndef _STGCREATEPROPSTG_DEFINED_")
cpp_quote("#define _STGCREATEPROPSTG_DEFINED_")
cpp_quote("HRESULT WINAPI StgCreatePropStg(IUnknown *, REFFMTID, const CLSID *, DWORD, DWORD, IPropertyStorage **);")
cpp_quote("HRESULT WINAPI StgOpenPropStg(IUnknown *, REFFMTID, DWORD, DWORD, IPropertyStorage **);")
cpp_quote("HRESULT WINAPI StgCreatePropSetStg(IStorage *, DWORD, IPropertySetStorage **);")
cpp_quote("#define CCH_MAX_PROPSTG_NAME 31")
cpp_quote("HRESULT WINAPI FmtIdToPropStgName(const FMTID *, LPOLESTR);")
cpp_quote("HRESULT WINAPI PropStgNameToFmtId(const LPOLESTR, FMTID *);")
cpp_quote("#endif /* _STGCREATEPROPSTG_DEFINED_ */")
cpp_quote("")
