/*
 * Copyright (C) 2004 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
 */

import "wtypes.idl";
import "oaidl.idl";

cpp_quote("#define PST_KEY_CURRENT_USER    0")
cpp_quote("#define PST_KEY_LOCAL_MACHINE   1")

cpp_quote("#define PST_E_OK          0x00000000L")
cpp_quote("#define PST_E_TYPE_EXISTS 0x800C0004L")

cpp_quote("#define PST_AUTHENTICODE        1")
cpp_quote("#define PST_BINARY_CHECK        2")
cpp_quote("#define PST_SECURITY_DESCRIPTOR 4")

typedef DWORD PST_ACCESSMODE;
typedef DWORD PST_ACCESSCLAUSETYPE;
typedef DWORD PST_KEY;
typedef DWORD PST_PROVIDERCAPABILITIES;
typedef GUID PST_PROVIDERID, *PPST_PROVIDERID;

/*****************************************************************************
 * PSTOREC library
 */
[
    uuid(5a6f1ebd-2db1-11d0-8c39-00c04fd9126b),
    version(1.0),
    helpstring("PStore 1.0 Type Library")
]
library PSTORECLib
{
    importlib("stdole2.tlb");

typedef struct _PST_PROVIDERINFO
{
    DWORD cbSize;
    PST_PROVIDERID ID;
    PST_PROVIDERCAPABILITIES Capabilities;
    LPWSTR szProviderName;
} PST_PROVIDERINFO, *PPST_PROVIDERINFO;

typedef struct _PST_PROMPTINFO
{
    DWORD cbSize;
    DWORD dwPromptFlags;
    HWND hwndApp;
    LPCWSTR szPrompt;
} PST_PROMPTINFO, *PPST_PROMPTINFO;

typedef struct _PST_ACCESSCLAUSE {
    DWORD cbSize;
    PST_ACCESSCLAUSETYPE ClauseType;
    DWORD cbClauseData;
    BYTE* pbClauseData;
} PST_ACCESSCLAUSE, *PPST_ACCESSCLAUSE;

typedef struct _PST_ACCESSRULE {
    DWORD cbSize;
    PST_ACCESSMODE AccessModeFlags;
    DWORD cClauses;
    PST_ACCESSCLAUSE* rgClauses;
} PST_ACCESSRULE, *PPST_ACCESSRULE;

typedef struct _PST_ACCESSRULESET {
    DWORD cbSize;
    DWORD cClause;
    PST_ACCESSRULE* rgRules;
} PST_ACCESSRULESET, *PPST_ACCESSRULESET;

typedef struct _PST_TYPEINFO {
    DWORD cbSize;
    LPWSTR szDisplayName;
} PST_TYPEINFO, *PPST_TYPEINFO;

[
  object,
  uuid(5a6f1ec1-2db1-11d0-8c39-00c04fd9126b),
  pointer_default(unique)
]
interface IEnumPStoreItems : IUnknown
{
    HRESULT Clone(
        [in] IEnumPStoreItems** ppenum );

    HRESULT Next(
        [in] DWORD celt,
        [in] LPWSTR* rgelt,
        [in] DWORD* pceltFetched );

    HRESULT Reset();

    HRESULT Skip(
        [in] DWORD celt );
}

[
  object,
  uuid(789c1cbf-31ee-11d0-8c39-00c04fd9126b),
  pointer_default(unique)
]
interface IEnumPStoreTypes : IUnknown
{
    HRESULT Clone(
        [in] IEnumPStoreTypes** ppenum );

    HRESULT Next(
        [in] DWORD celt,
        [in] LPWSTR* rgelt,
        [in] DWORD* pceltFetched );

    HRESULT Reset();

    HRESULT Skip(
        [in] DWORD celt );
}

/*****************************************************************************
 * IPStore interface
 */
[
  object,
  uuid(5a6f1ec0-2db1-11d0-8c39-00c04fd9126b),
  pointer_default(unique)
]
interface IPStore : IUnknown
{
    HRESULT GetInfo(
        [in] PPST_PROVIDERINFO* ppProperties );

    HRESULT GetProvParam(
        [in] DWORD dwParam,
        [out] DWORD* pcbData,
        [out] BYTE** ppbData,
        [in] DWORD dwFlags );

    HRESULT SetProvParam(
        [in] DWORD dwParam,
        [in] DWORD cbData,
        [in] BYTE* pbData,
        [in] DWORD* dwFlags );

    HRESULT CreateType(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] PPST_TYPEINFO pInfo,
        [in] DWORD dwFlags );

    HRESULT GetTypeInfo(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] PPST_TYPEINFO** ppInfo,
        [in] DWORD dwFlags );

    HRESULT DeleteType(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] DWORD dwFlags );

    HRESULT CreateSubtype(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] const GUID* pSubtype,
        [in] PPST_TYPEINFO pInfo,
        [in] PPST_ACCESSRULESET pRules,
        [in] DWORD dwFlags );

    HRESULT GetSubtypeInfo(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] const GUID* pSubtype,
        [in] PPST_TYPEINFO** ppInfo,
        [in] DWORD dwFlags );

    HRESULT DeleteSubtype(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] const GUID* pSubtype,
        [in] DWORD dwFlags );

    HRESULT ReadAccessRuleset(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] const GUID* pSubtype,
        [in] PPST_TYPEINFO pInfo,
        [in] PPST_ACCESSRULESET** ppRules,
        [in] DWORD dwFlags );

    HRESULT WriteAccessRuleset(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] const GUID* pSubtype,
        [in] PPST_TYPEINFO pInfo,
        [in] PPST_ACCESSRULESET pRules,
        [in] DWORD dwFlags );

    HRESULT EnumTypes(
        [in] PST_KEY Key,
        [in] DWORD dwFlags,
        [in] IEnumPStoreTypes** ppenum );

    HRESULT EnumSubtypes(
        [in] PST_KEY Key,
        [in] const GUID* pType,
        [in] DWORD dwFlags,
        [in] IEnumPStoreTypes** ppenum );

    HRESULT DeleteItem(
        [in] PST_KEY Key,
        [in] const GUID* pItemType,
        [in] const GUID* pItemSubType,
        [in] LPCWSTR szItemName,
        [in] PPST_PROMPTINFO pPromptInfo,
        [in] DWORD dwFlags );

    HRESULT ReadItem(
        [in] PST_KEY Key,
        [in] const GUID* pItemType,
        [in] const GUID* pItemSubtype,
        [in] LPCWSTR szItemName,
        [in] DWORD *cbData,
        [in] BYTE** pbData,
        [in] PPST_PROMPTINFO pPromptInfo,
        [in] DWORD dwFlags );

    HRESULT WriteItem(
        [in] PST_KEY Key,
        [in] const GUID* pItemType,
        [in] const GUID* pItemSubtype,
        [in] LPCWSTR szItemName,
        [in] DWORD cbData,
        [in,size_is(cbData)] BYTE *ppbData,
        [in] PPST_PROMPTINFO pPromptInfo,
        [in] DWORD dwDefaultConfirmationStyle,
        [in] DWORD dwFlags);

    HRESULT OpenItem(
        [in] PST_KEY Key,
        [in] const GUID* pItemType,
        [in] const GUID* pItemSubtype,
        [in] LPCWSTR szItemName,
        [in] PST_ACCESSMODE ModeFlags,
        [in] PPST_PROMPTINFO pPromptInfo,
        [in] DWORD dwFlags );

    HRESULT CloseItem( 
        [in] PST_KEY Key, 
        [in] const GUID* pItemType, 
        [in] const GUID* pItemSubtype,
        [in] LPCWSTR* szItemName,
        [in] DWORD dwFlags );

    HRESULT EnumItems(
        [in] PST_KEY Key,
        [in] const GUID* pItemType,
        [in] const GUID* pItemSubtype,
        [in] DWORD dwFlags,
        [in] IEnumPStoreItems** ppenum );
}

};
