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

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

typedef void *PPST_PROMPTIFO;



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

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

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

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

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

[
  object,
  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,
  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,
  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_PROMPTIFO 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_PROMPTIFO 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_PROMPTIFO pProomptInfo,
        [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 );
}
