/*
 * system property interfaces
 *
 * Copyright 2009 Maarten Lankhorst
 *
 * 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 "oleidl.idl";
import "ocidl.idl";
import "shtypes.idl";
import "structuredquerycondition.idl";

cpp_quote("#ifndef PSSTDAPI")
cpp_quote("#define PSSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE")
cpp_quote("#endif")

cpp_quote("#if 0")
typedef PROPERTYKEY *REFPROPERTYKEY;
cpp_quote("#endif")
cpp_quote("#include <propkeydef.h>")

[
    uuid(b7d14566-0509-4cce-a71f-0a554233bd9b),
    object,
    pointer_default(unique)
]
interface IInitializeWithFile : IUnknown
{
    HRESULT Initialize(
        [in,string] LPCWSTR pszFilePath,
        [in] DWORD grfMode
    );
}

[
    uuid(b824b49d-22ac-4161-ac8a-9916e8fa3f7f),
    object,
    pointer_default(unique)
]
interface IInitializeWithStream : IUnknown
{
    [local] HRESULT Initialize(
        [in] IStream *pstream,
        [in] DWORD grfMode
    );
}

[
    uuid(886d8eeb-8cf2-4446-8d02-cdba1dbdcf99),
    object,
    pointer_default(unique)
]
interface IPropertyStore : IUnknown
{
    HRESULT GetCount(
        [out] DWORD *cProps
    );
    HRESULT GetAt(
        [in] DWORD iProp,
        [out] PROPERTYKEY *pkey
    );
    HRESULT GetValue(
        [in] REFPROPERTYKEY key,
        [out] PROPVARIANT *pv
    );
    HRESULT SetValue(
        [in] REFPROPERTYKEY key,
        [in] REFPROPVARIANT propvar
    );
    HRESULT Commit(void);
}

typedef IPropertyStore *LPPROPERTYSTORE;

[
    uuid(71604b0f-97b0-4764-8577-2f13e98a1422),
    object,
    pointer_default(unique)
]
interface INamedPropertyStore : IUnknown
{
    HRESULT GetNamedValue(
        [in,string] LPCWSTR pszName,
        [out] PROPVARIANT *ppropvar
    );
    HRESULT SetNamedValue(
        [in,string] LPCWSTR pszName,
        [in] REFPROPVARIANT propvar
    );
    HRESULT GetNameCount(
        [out] DWORD *pdwCount
    );
    HRESULT GetNameAt(
        [in] DWORD iProp,
        [out] BSTR *pbstrName
    );
}

typedef [v1_enum] enum GETPROPERTYSTOREFLAGS
{
    GPS_DEFAULT = 0x00,
    GPS_HANDLERPROPERTIESONLY = 0x01,
    GPS_READWRITE = 0x02,
    GPS_TEMPORARY = 0x04,
    GPS_FASTPROPERTIESONLY = 0x08,
    GPS_OPENSLOWITEM = 0x10,
    GPS_DELAYCREATION = 0x20,
    GPS_BESTEFFORT = 0x40,
    GPS_NO_OPLOCK = 0x80,
    GPS_MASK_VALID = 0xff
} GETPROPERTYSTOREFLAGS;

cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(GETPROPERTYSTOREFLAGS)")

[
    uuid(fc0ca0a7-c316-4fd2-9031-3e628e6d4f23),
    object
]
interface IObjectWithPropertyKey : IUnknown
{
    HRESULT SetPropertyKey(
        [in] REFPROPERTYKEY key
    );
    HRESULT GetPropertyKey(
        [out] PROPERTYKEY *key
    );
}

typedef [v1_enum] enum PKA_FLAGS
{
    PKA_SET,
    PKA_APPEND,
    PKA_DELETE
} PKA_FLAGS;

[
    uuid(f917bc8a-1bba-4478-a245-1bde03eb9431),
    object,
    pointer_default(unique)
]
interface IPropertyChange : IObjectWithPropertyKey
{
    HRESULT ApplyToPropVariant([in] REFPROPVARIANT propvarin, [out] PROPVARIANT *propvarout);
}

[
    uuid(380f5cad-1b5e-42f2-805d-637fd392d31e),
    object,
    pointer_default(unique)
]
interface IPropertyChangeArray : IUnknown
{
    HRESULT GetCount(
        [out] UINT *pcOperations
    );
    HRESULT GetAt(
        [in] UINT iIndex,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv
    );
    HRESULT InsertAt(
        [in] UINT iIndex,
        [in] IPropertyChange *ppropChange
    );
    HRESULT Append(
        [in] IPropertyChange *ppropChange
    );
    HRESULT AppendOrReplace(
        [in] IPropertyChange *ppropChange
    );
    HRESULT RemoveAt(
        [in] UINT iIndex
    );
    HRESULT IsKeyInArray(
        [in] REFPROPERTYKEY key
    );
}

[
    uuid(c8e2d566-186e-4d49-bf41-6909ead56acc),
    object,
    pointer_default(unique)
]
interface IPropertyStoreCapabilities : IUnknown
{
    HRESULT IsPropertyWritable(
        [in] REFPROPERTYKEY key
    );
}

[
    uuid(3017056d-9a91-4e90-937d-746c72abbf4f),
    object,
    pointer_default(unique)
]
interface IPropertyStoreCache : IPropertyStore
{
    typedef [v1_enum] enum PSC_STATE
    {
        PSC_NORMAL = 0,
        PSC_NOTINSOURCE,
        PSC_DIRTY,
        PSC_READONLY
    } PSC_STATE;

    HRESULT GetState(
        [in] REFPROPERTYKEY key,
        [out] PSC_STATE *pstate
    );
    HRESULT GetValueAndState(
        [in] REFPROPERTYKEY key,
        [out] PROPVARIANT *ppropvar,
        [out] PSC_STATE *pstate
    );
    HRESULT SetState(
        [in] REFPROPERTYKEY key,
        [in] PSC_STATE pstate
    );
    HRESULT SetValueAndState(
        [in] REFPROPERTYKEY key,
        [in, unique] const PROPVARIANT *ppropvar,
        [in] PSC_STATE state
    );
}

[
    uuid(11e1fbf9-2d56-4a6b-8db3-7cd193a471f2),
    object,
    pointer_default(unique)
]
interface IPropertyEnumType : IUnknown
{
    typedef [v1_enum] enum PROPENUMTYPE
    {
        PET_DISCRETEVALUE = 0,
        PET_RANGEDVALUE,
        PET_DEFAULTVALUE,
        PET_ENDRANGE
    } PROPENUMTYPE;

    HRESULT GetEnumType(
        [out] PROPENUMTYPE *penumtype
    );
    HRESULT GetValue(
        [out] PROPVARIANT *ppropvar
    );
    HRESULT GetRangeMinValue(
        [out] PROPVARIANT *ppropvar
    );
    HRESULT GetRangeSetValue(
        [out] PROPVARIANT *ppropvar
    );
    HRESULT GetDisplayText(
        [out] LPWSTR *ppszDisplay
    );
}

[
    uuid(9b6e051c-5ddd-4321-9070-fe2acb55e974),
    object,
    pointer_default(unique)
]
interface IPropertyEnumType2 : IPropertyEnumType
{
    HRESULT GetImageReference(
        [out] LPWSTR *ppszImageRes
    );
}

[
    uuid(a99400f4-3d84-4557-94ba-1242fb2cc9a6),
    object,
    pointer_default(unique)
]
interface IPropertyEnumTypeList : IUnknown
{
    HRESULT GetCount(
        [out] UINT *pctypes
    );
    HRESULT GetAt(
        [in] UINT itype,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv
    );
    HRESULT GetConditionAt(
        [in] UINT nIndex,
        [in] REFIID riid,
        [out, iid_is(riid)] void **ppv
    );
    HRESULT FindMatchingIndex(
        [in] REFPROPVARIANT propvarCmp,
        [out] UINT *pnIndex
    );
}

[
    uuid(6f79d558-3e96-4549-a1d1-7d75d2288814),
    object,
    pointer_default(unique)
]
interface IPropertyDescription : IUnknown
{
    typedef [v1_enum] enum PROPDESC_TYPE_FLAGS
    {
        PDTF_DEFAULT = 0,
        PDTF_MULTIPLEVALUES = 0x001,
        PDTF_ISINNATE = 0x002,
        PDTF_ISGROUP = 0x004,
        PDTF_CANGROUPBY = 0x008,
        PDTF_CANSTACKBY = 0x010,
        PDTF_ISTREEPROPERTY = 0x020,
        PDTF_INCLUDEINFULLTEXTQUERY = 0x040,
        PDTF_ISVIEWABLE = 0x080,
        PDTF_ISQUERYABLE = 0x100,
        PDTF_CANBEPURGED = 0x200,
        PDTF_SEARCHRAWVALUE = 0x400,
        PDTF_ISSYSTEMPROPERTY = 0x80000000,
        PDTF_MASK_ALL = 0x800007ff
    } PROPDESC_TYPE_FLAGS;
    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(PROPDESC_TYPE_FLAGS)")

    typedef [v1_enum] enum PROPDESC_VIEW_FLAGS
    {
        PDVF_DEFAULT = 0x0000,
        PDVF_CENTERALIGN = 0x0001,
        PDVF_RIGHTALIGN = 0x0002,
        PDVF_BEGINNEWGROUP = 0x0004,
        PDVF_FILLAREA = 0x0008,
        PDVF_SORTDESCENDING = 0x0010,
        PDVF_SHOWONLYIFPRESENT = 0x0020,
        PDVF_SHOWBYDEFAULT = 0x0040,
        PDVF_SHOWINPRIMARYLIST = 0x0080,
        PDVF_SHOWINSECONDARYLIST = 0x0100,
        PDVF_HIDELABEL = 0x0200,
        PDVF_HIDDEN = 0x0800,
        PDVF_CANWRAP = 0x1000,
        PDVF_MASK_ALL = 0x1bff
    } PROPDESC_VIEW_FLAGS;
    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(PROPDESC_VIEW_FLAGS)")

    typedef [v1_enum] enum PROPDESC_DISPLAYTYPE
    {
        PDDT_STRING = 0,
        PDDT_NUMBER,
        PDDT_BOOLEAN,
        PDDT_DATETIME,
        PDDT_ENUMERATED
    } PROPDESC_DISPLAYTYPE;

    typedef [v1_enum] enum PROPDESC_GROUPING_RANGE
    {
        PDGR_DISCRETE = 0,
        PDGR_ALPHANUMERIC,
        PDGR_SIZE,
        PDGR_DYNAMIC,
        PDGR_DATE,
        PDGR_PERCENT,
        PDGR_ENUMERATED
    } PROPDESC_GROUPING_RANGE;

    typedef [v1_enum] enum PROPDESC_FORMAT_FLAGS
    {
        PDFF_DEFAULT = 0x0000,
        PDFF_PREFIXNAME = 0x0001,
        PDFF_FILENAME = 0x0002,
        PDFF_ALWAYSKB = 0x0004,
        PDFF_RESERVED_RIGHTTOLEFT = 0x0008,
        PDFF_SHORTTIME = 0x0010,
        PDFF_LONGTIME = 0x0020,
        PDFF_HIDETIME = 0x0040,
        PDFF_SHORTDATE = 0x0080,
        PDFF_LONGDATE = 0x0100,
        PDFF_HIDEDATE = 0x0200,
        PDFF_RELATIVEDATE = 0x0400,
        PDFF_USEEDITINVITATION = 0x0800,
        PDFF_READONLY = 0x1000,
        PDFF_NOAUTOREADINGORDER = 0x2000
    } PROPDESC_FORMAT_FLAGS;
    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(PROPDESC_FORMAT_FLAGS)")

    typedef [v1_enum] enum PROPDESC_SORTDESCRIPTION
    {
        PDSD_GENERAL = 0,
        PDSD_A_Z,
        PDSD_LOWEST_HIGHEST,
        PDSD_SMALLEST_BIGGEST,
        PDSD_OLDEST_NEWEST
    } PROPDESC_SORTDESCRIPTION;

    typedef [v1_enum] enum PROPDESC_RELATIVEDESCRIPTION_TYPE
    {
        PDRDT_GENERAL = 0,
        PDRDT_DATE,
        PDRDT_SIZE,
        PDRDT_COUNT,
        PDRDT_REVISION,
        PDRDT_LENGTH,
        PDRDT_DURATION,
        PDRDT_SPEED,
        PDRDT_RATE,
        PDRDT_RATING,
        PDRDT_PRIORITY
    } PROPDESC_RELATIVEDESCRIPTION_TYPE;

    typedef [v1_enum] enum PROPDESC_AGGREGATION_TYPE
    {
        PDAT_DEFAULT = 0,
        PDAT_FIRST,
        PDAT_SUM,
        PDAT_AVERAGE,
        PDAT_DATERANGE,
        PDAT_UNION,
        PDAT_MAX,
        PDAT_MIN
    } PROPDESC_AGGREGATION_TYPE;

    typedef [v1_enum] enum PROPDESC_CONDITION_TYPE
    {
        PDCOT_NONE = 0,
        PDCOT_STRING,
        PDCOT_SIZE,
        PDCOT_DATETIME,
        PDCOT_BOOLEAN,
        PDCOT_NUMBER
    } PROPDESC_CONDITION_TYPE;

    HRESULT GetPropertyKey(
        [out] PROPERTYKEY *pkey
    );
    HRESULT GetCanonicalName(
        [out, string] LPWSTR *ppszName
    );
    HRESULT GetPropertyType(
        [out] VARTYPE *pvartype
    );
    HRESULT GetDisplayName(
        [out, string] LPWSTR *ppszName
    );
    HRESULT GetEditInvitation(
        [out, string] LPWSTR *ppszName
    );
    HRESULT GetTypeFlags(
        [in] PROPDESC_TYPE_FLAGS mask,
        [out] PROPDESC_TYPE_FLAGS *ppdtFlags
    );
    HRESULT GetViewFlags(
        [out] PROPDESC_VIEW_FLAGS *ppdvFlags
    );
    HRESULT GetDefaultColumnWidth(
        [out] UINT *pcxChars
    );
    HRESULT GetDisplayType(
        [out] PROPDESC_DISPLAYTYPE *pdisplaytype
    );
    HRESULT GetColumnState(
        [out] SHCOLSTATEF *pcsFlags
    );
    HRESULT GetGroupingRange(
        [out] PROPDESC_GROUPING_RANGE *psd
    );
    HRESULT GetRelativeDescriptionType(
        [out] PROPDESC_RELATIVEDESCRIPTION_TYPE *prdt
    );
    HRESULT GetRelativeDescription(
        [in] REFPROPVARIANT propvar1,
        [in] REFPROPVARIANT propvar2,
        [out,string] LPWSTR *ppszDesc1,
        [out,string] LPWSTR *ppszDesc2
    );
    HRESULT GetSortDescription(
        [out] PROPDESC_SORTDESCRIPTION *psd
    );
    HRESULT GetSortDescriptionLabel(
        [in] BOOL fDescending,
        [out,string] LPWSTR *ppszDescription
    );
    HRESULT GetAggregationType(
        [out] PROPDESC_AGGREGATION_TYPE *paggtype
    );
    HRESULT GetConditionType(
        [out] PROPDESC_CONDITION_TYPE *pcontype,
        [out] CONDITION_OPERATION *popDefault
    );
    HRESULT GetEnumTypeList(
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    [local] HRESULT CoerceToCanonicalValue(
        [in,out] PROPVARIANT *propvar
    );
    [call_as(CoerceToCanonicalValue)] HRESULT RemoteCoerceToCanonicalValue(
        [in] REFPROPVARIANT propvar,
        [out] PROPVARIANT *ppropvar
    );
    HRESULT FormatForDisplay(
        [in] REFPROPVARIANT propvar,
        [in] PROPDESC_FORMAT_FLAGS flags,
        [out,string] LPWSTR *ppszDisplay
    );
    HRESULT IsValueCanonical(
        [in] REFPROPVARIANT propvar
    );
}

[
    uuid(57d2eded-5062-400e-b107-5dae79fe57a6),
    object,
    pointer_default(unique)
]
interface IPropertyDescription2 : IPropertyDescription
{
    HRESULT GetImageReferenceForValue(
        [in] REFPROPVARIANT propvar,
        [out,string] LPWSTR *ppszImageRes
    );
}

[
    uuid(f67104fc-2af9-46fd-b32d-243c1404f3d1),
    object,
    pointer_default(unique)
]
interface IPropertyDescriptionAliasInfo : IPropertyDescription
{
    HRESULT GetSortByAlias(
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    HRESULT GetAdditionalSortByAliases(
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
}

[
    uuid(078f91bd-29a2-440f-924e-46a291524520),
    object,
    pointer_default(unique)
]
interface IPropertyDescriptionSearchInfo : IPropertyDescription
{
    typedef [v1_enum] enum PROPDESC_SEARCHINFO_FLAGS
    {
        PDSIF_DEFAULT = 0x0,
        PDSIF_ININVERTEDINDEX = 0x1,
        PDSIF_ISCOLUMN = 0x2,
        PDSIF_ISCOLUMNSPARSE = 0x4,
        PDSIF_ALWAYSINCLUDE = 0x8,
    } PROPDESC_SEARCHINFO_FLAGS;
    cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(PROPDESC_SEARCHINFO_FLAGS)")

    typedef [v1_enum] enum PROPDESC_COLUMNINDEX_TYPE
    {
        PDCIT_NONE = 0,
        PDCIT_ONDISK,
        PDCIT_INMEMORY,
        PDCIT_ONDEMAND,
        PDCIT_ONDISKALL,
        PDCIT_ONDISKVECTOR
    } PROPDESC_COLUMNINDEX_TYPE;

    HRESULT GetSearchInfoFlags(
        [out] PROPDESC_SEARCHINFO_FLAGS *ppdsiFlags
    );
    HRESULT GetColumnIndexType(
        [out] PROPDESC_COLUMNINDEX_TYPE *ppdciType
    );
    HRESULT GetProjectionString(
        [out] LPWSTR *ppszProjection
    );
    HRESULT GetMaxSize(
        [out] UINT *pcbMaxSize
    );
}

[
    uuid(507393f4-2a3d-4a60-b59e-d9c75716c2dd),
    object,
    pointer_default(unique)
]
interface IPropertyDescriptionRelatedPropertyInfo : IPropertyDescription
{
    HRESULT GetRelatedProperty(
        [in] LPCWSTR ppszRelationshipName,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
}

typedef [v1_enum] enum PROPDESC_ENUMFILTER
{
    PDEF_ALL = 0,
    PDEF_SYSTEM,
    PDEF_NONSYSTEM,
    PDEF_VIEWABLE,
    PDEF_QUERYABLE,
    PDEF_INFULLTEXTQUERY,
    PDEF_COLUMN
} PROPDESC_ENUMFILTER;

[
    uuid(ca724e8a-c3e6-442b-88a4-6fb0db8035a3),
    object,
    pointer_default(unique)
]
interface IPropertySystem : IUnknown
{
    HRESULT GetPropertyDescription(
        [in] REFPROPERTYKEY propkey,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    HRESULT GetPropertyDescriptionByName(
        [in,string] LPCWSTR pszCanonicalName,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    HRESULT GetPropertyDescriptionListFromString(
        [in,string] LPCWSTR pszPropList,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    HRESULT EnumeratePropertyDescriptions(
        [in] PROPDESC_ENUMFILTER filterOn,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    HRESULT FormatForDisplay(
        [in] REFPROPERTYKEY key,
        [in] REFPROPVARIANT propvar,
        [in] PROPDESC_FORMAT_FLAGS pdff,
        [out,string,size_is(cchText)] LPWSTR pszText,
        [in] DWORD cchText
    );
    HRESULT FormatForDisplayAlloc(
        [in] REFPROPERTYKEY key,
        [in] REFPROPVARIANT propvar,
        [in] PROPDESC_FORMAT_FLAGS pdff,
        [out,string] LPWSTR *pszText
    );
    HRESULT RegisterPropertySchema(
        [in,string] LPCWSTR pszPath
    );
    HRESULT UnregisterPropertySchema(
        [in,string] LPCWSTR pszPath
    );
    HRESULT RefreshPropertySchema(void);
}

[
    uuid(1f9fc1d0-c39b-4b26-817f-011967d3440e),
    object,
    pointer_default(unique)
]
interface IPropertyDescriptionList : IUnknown
{
    HRESULT GetCount(
        [out] UINT *pcelem
    );
    HRESULT GetAt(
        [in] UINT iElem,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
}

[
    uuid(bc110b6d-57e8-4148-a9c6-91015ab2f3a5),
    object,
    pointer_default(unique)
]
interface IPropertyStoreFactory : IUnknown
{
    HRESULT GetPropertyStore(
        [in] GETPROPERTYSTOREFLAGS flags,
        [in,unique] IUnknown *pUnkFactory,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
    HRESULT GetPropertyStoreForKeys(
        [in,unique] const PROPERTYKEY *rgKeys,
        [in] UINT cKeys,
        [in] GETPROPERTYSTOREFLAGS flags,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
}

[
    uuid(40d4577f-e237-4bdb-bd69-58f089431b6a),
    object,
    pointer_default(unique)
]
interface IDelayedPropertyStoreFactory : IPropertyStoreFactory
{
    HRESULT GetDelayedPropertyStore(
        [in] GETPROPERTYSTOREFLAGS flags,
        [in] DWORD dwStoreId,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
}

[v1_enum] enum _PERSIST_SPROPSTORE_FLAGS
{
    FPSPS_DEFAULT = 0,
    FPSPS_READONLY = 1
};
typedef int PERSIST_SPROPSTORE_FLAGS;

typedef struct tagSERIALIZEDROPSTORAGE SERIALIZEDPROPSTORAGE;

cpp_quote("#if 0") /* Wine doesn't have __unaligned builtin, hack */
typedef SERIALIZEDPROPSTORAGE *PUSERIALIZEDPROPSTORAGE;
typedef const SERIALIZEDPROPSTORAGE *PCUSERIALIZEDPROPSTORAGE;
cpp_quote("#endif")
cpp_quote("typedef SERIALIZEDPROPSTORAGE UNALIGNED *PUSERIALIZEDPROPSTORAGE;")
cpp_quote("typedef const SERIALIZEDPROPSTORAGE UNALIGNED *PCUSERIALIZEDPROPSTORAGE;")

[
    uuid(e318ad57-0aa0-450f-aca5-6fab7103d917),
    pointer_default(unique),
    local
]
interface IPersistSerializedPropStorage : IUnknown
{
    HRESULT SetFlags(
        [in] PERSIST_SPROPSTORE_FLAGS flags
    );
    HRESULT SetPropertyStorage(
        [in] PCUSERIALIZEDPROPSTORAGE psps,
        [in] DWORD cb
    );
    HRESULT GetPropertyStorage(
        [out] SERIALIZEDPROPSTORAGE **psps,
        [out] DWORD *pcb
    );
}

[
    uuid(77effa68-4f98-4366-ba72-573b3d880571),
    pointer_default(unique),
    local
]
interface IPersistSerializedPropStorage2 : IPersistSerializedPropStorage
{
    HRESULT GetpropertyStorageSize(
        [out] DWORD *pcb
    );
    HRESULT GetPropertyStorageBuffer(
        [out] SERIALIZEDPROPSTORAGE *psps,
        [in] DWORD cb,
        [out] DWORD *pcbWritten
    );
}

[
    uuid(fa955fd9-38be-4879-a6ce-824cf52d609f),
    object,
    pointer_default(unique)
]
interface IPropertySystemChangeNotify : IUnknown
{
    HRESULT SchemaRefreshed(void);
}

/* Interface for CoCreateInstance? */
[
    uuid(75121952-e0d0-43e5-9380-1d80483acf72),
    pointer_default(unique)
]
interface ICreateObject : IUnknown
{
    HRESULT CreateObject(
        [in] REFCLSID clsid,
        [in,unique] IUnknown *pUnkOuter,
        [in] REFIID riid,
        [out,iid_is(riid)] void **ppv
    );
}

cpp_quote("#define PKEY_PIDSTR_MAX 10")
cpp_quote("#define GUIDSTRING_MAX 39")
cpp_quote("#define PKEYSTR_MAX (GUIDSTRING_MAX + 1 + PKEY_PIDSTR_MAX)")

cpp_quote("HRESULT WINAPI PSStringFromPropertyKey(REFPROPERTYKEY,LPWSTR,UINT);")
cpp_quote("HRESULT WINAPI PSPropertyKeyFromString(LPCWSTR,PROPERTYKEY*);")
cpp_quote("HRESULT WINAPI PSGetPropertyDescription(REFPROPERTYKEY,REFIID,void **);")
cpp_quote("HRESULT WINAPI PSRefreshPropertySchema(void);")

/* TODO: Add remainder of the C api here */

[
    uuid(2cda3294-6c4f-4020-b161-27c530c81fa6),
    lcid(0x0000),
    version(1.0)
]
library PropSysObjects
{
    [uuid(9a02e012-6303-4e1e-b9a1-630f802592c5)] coclass InMemoryPropertyStore
    {
        interface IPropertyStore;
    }
    [uuid(b8967f86-58ae-4f96-9fb2-5d7904798f4b)] coclass PropertySystem
    {
        interface IPropertySystem;
    }
}
