/*
 * 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 struct _PST_PROMPTINFO
{
    DWORD cbSize;
    DWORD dwPromptFlags;
    HWND hwndApp;
    LPCWSTR szPrompt;
} PST_PROMPTINFO, *PPST_PROMPTINFO;

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;

[
  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_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 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 );
}
