/*
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 );
}
