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

import "objidl.idl";
import "oaidl.idl";


/*
 * 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("#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]             ;
    };
  } 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);
}


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("")
