| /* | 
 |  * Protected Storage (pstores) | 
 |  * | 
 |  * Copyright 2004 Mike McCormack for CodeWeavers | 
 |  * | 
 |  * 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 | 
 |  */ | 
 |  | 
 | #include <stdarg.h> | 
 |  | 
 | #define COBJMACROS | 
 | #include "windef.h" | 
 | #include "winbase.h" | 
 | #include "winuser.h" | 
 | #include "ole2.h" | 
 | #include "pstore.h" | 
 |  | 
 | #include "wine/debug.h" | 
 |  | 
 | WINE_DEFAULT_DEBUG_CHANNEL(pstores); | 
 |  | 
 | typedef struct | 
 | { | 
 |     IPStore IPStore_iface; | 
 |     LONG ref; | 
 | } PStore_impl; | 
 |  | 
 | static inline PStore_impl *impl_from_IPStore(IPStore *iface) | 
 | { | 
 |     return CONTAINING_RECORD(iface, PStore_impl, IPStore_iface); | 
 | } | 
 |  | 
 | BOOL WINAPI DllMain(HINSTANCE hinst, DWORD fdwReason, LPVOID fImpLoad) | 
 | { | 
 |     TRACE("%p %x %p\n", hinst, fdwReason, fImpLoad); | 
 |  | 
 |     switch (fdwReason) | 
 |     { | 
 |     case DLL_WINE_PREATTACH: | 
 |         return FALSE;  /* prefer native version */ | 
 |     case DLL_PROCESS_ATTACH: | 
 |         DisableThreadLibraryCalls(hinst); | 
 |         break; | 
 |     case DLL_PROCESS_DETACH: | 
 |         break; | 
 |     } | 
 |     return TRUE; | 
 | } | 
 |  | 
 | /************************************************************************** | 
 |  *  IPStore->QueryInterface | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnQueryInterface( | 
 |         IPStore* iface, | 
 |         REFIID riid, | 
 |         LPVOID *ppvObj) | 
 | { | 
 |     PStore_impl *This = impl_from_IPStore(iface); | 
 |  | 
 |     TRACE("%p %s\n",This,debugstr_guid(riid)); | 
 |  | 
 |     *ppvObj = NULL; | 
 |  | 
 |     if (IsEqualIID(riid, &IID_IUnknown)) | 
 |     { | 
 |         *ppvObj = This; | 
 |     } | 
 |  | 
 |     if (*ppvObj) | 
 |     { | 
 |         IUnknown_AddRef((IUnknown*)(*ppvObj)); | 
 |         return S_OK; | 
 |     } | 
 |     TRACE("-- Interface: E_NOINTERFACE\n"); | 
 |     return E_NOINTERFACE; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->AddRef | 
 |  */ | 
 | static ULONG WINAPI PStore_fnAddRef(IPStore* iface) | 
 | { | 
 |     PStore_impl *This = impl_from_IPStore(iface); | 
 |  | 
 |     TRACE("%p %u\n", This, This->ref); | 
 |  | 
 |     return InterlockedIncrement( &This->ref ); | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->Release | 
 |  */ | 
 | static ULONG WINAPI PStore_fnRelease(IPStore* iface) | 
 | { | 
 |     PStore_impl *This = impl_from_IPStore(iface); | 
 |     LONG ref; | 
 |  | 
 |     TRACE("%p %u\n", This, This->ref); | 
 |  | 
 |     ref = InterlockedDecrement( &This->ref ); | 
 |     if( !ref ) | 
 |         HeapFree( GetProcessHeap(), 0, This ); | 
 |  | 
 |     return ref; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->GetInfo | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnGetInfo( IPStore* iface, PPST_PROVIDERINFO* ppProperties) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->GetProvParam | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnGetProvParam( IPStore* iface, | 
 |     DWORD dwParam, DWORD* pcbData, BYTE** ppbData, DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->SetProvParam | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnSetProvParam( IPStore* This, | 
 |     DWORD dwParam, DWORD cbData, BYTE* pbData, DWORD* dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->CreateType | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnCreateType( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, PPST_TYPEINFO pInfo, DWORD dwFlags) | 
 | { | 
 |     FIXME("%p %08x %s %p(%d,%s) %08x\n", This, Key, debugstr_guid(pType), | 
 |           pInfo, pInfo->cbSize, debugstr_w(pInfo->szDisplayName), dwFlags); | 
 |  | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->GetTypeInfo | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnGetTypeInfo( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, PPST_TYPEINFO** ppInfo, DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->DeleteType | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnDeleteType( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, DWORD dwFlags) | 
 | { | 
 |     FIXME("%p %d %s %08x\n", This, Key, debugstr_guid(pType), dwFlags); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->CreateSubtype | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnCreateSubtype( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, const GUID* pSubtype, | 
 |     PPST_TYPEINFO pInfo, PPST_ACCESSRULESET pRules, DWORD dwFlags) | 
 | { | 
 |     FIXME("%p %08x %s %s %p %p %08x\n", This, Key, debugstr_guid(pType), | 
 |            debugstr_guid(pSubtype), pInfo, pRules, dwFlags); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->GetSubtypeInfo | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnGetSubtypeInfo( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, const GUID* pSubtype, | 
 |     PPST_TYPEINFO** ppInfo, DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->DeleteSubtype | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnDeleteSubtype( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, const GUID* pSubtype, DWORD dwFlags) | 
 | { | 
 |     FIXME("%p %u %s %s %08x\n", This, Key, | 
 |           debugstr_guid(pType), debugstr_guid(pSubtype), dwFlags); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->ReadAccessRuleset | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnReadAccessRuleset( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, const GUID* pSubtype, PPST_TYPEINFO pInfo, | 
 |     PPST_ACCESSRULESET** ppRules, DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->WriteAccessRuleSet | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnWriteAccessRuleset( IPStore* This, | 
 |     PST_KEY Key, const GUID* pType, const GUID* pSubtype, | 
 |     PPST_TYPEINFO pInfo, PPST_ACCESSRULESET pRules, DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->EnumTypes | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnEnumTypes( IPStore* This, PST_KEY Key, | 
 |     DWORD dwFlags, IEnumPStoreTypes** ppenum) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->EnumSubtypes | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnEnumSubtypes( IPStore* This, PST_KEY Key, | 
 |     const GUID* pType, DWORD dwFlags, IEnumPStoreTypes** ppenum) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->DeleteItem | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnDeleteItem( IPStore* This, PST_KEY Key, | 
 |     const GUID* pItemType, const GUID* pItemSubType, LPCWSTR szItemName, | 
 |     PPST_PROMPTINFO pPromptInfo, DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->ReadItem | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnReadItem( IPStore* This, PST_KEY Key, | 
 |     const GUID* pItemType, const GUID* pItemSubtype, LPCWSTR szItemName, | 
 |     DWORD *cbData, BYTE** pbData, PPST_PROMPTINFO pPromptInfo, DWORD dwFlags) | 
 | { | 
 |     FIXME("%p %08x %s %s %s %p %p %p %08x\n", This, Key, | 
 |           debugstr_guid(pItemType), debugstr_guid(pItemSubtype), | 
 |           debugstr_w(szItemName), cbData, pbData, pPromptInfo, dwFlags); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->WriteItem | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnWriteItem( IPStore* This, PST_KEY Key, | 
 |     const GUID* pItemType, const GUID* pItemSubtype, LPCWSTR szItemName, | 
 |     DWORD cbData, BYTE* ppbData, PPST_PROMPTINFO pPromptInfo, | 
 |     DWORD dwDefaultConfirmationStyle, DWORD dwFlags) | 
 | { | 
 |     FIXME("%p %08x %s %s %s %d %p %p %08x\n", This, Key, | 
 |           debugstr_guid(pItemType), debugstr_guid(pItemSubtype), | 
 |           debugstr_w(szItemName), cbData, ppbData, pPromptInfo, dwFlags); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->OpenItem | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnOpenItem( IPStore* This, PST_KEY Key, | 
 |     const GUID* pItemType, const GUID* pItemSubtype, LPCWSTR szItemName, | 
 |     PST_ACCESSMODE ModeFlags, PPST_PROMPTINFO pProomptInfo, DWORD dwFlags ) | 
 | { | 
 |     FIXME("%p %08x %s %s %p %08x %p %08x\n", This, Key, | 
 |            debugstr_guid(pItemType), debugstr_guid(pItemSubtype), | 
 |            debugstr_w(szItemName), ModeFlags, pProomptInfo, dwFlags); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->CloseItem | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnCloseItem( IPStore* This, PST_KEY Key, | 
 |     const GUID* pItemType, const GUID* pItemSubtype, LPCWSTR* szItemName, | 
 |     DWORD dwFlags) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 | /****************************************************************************** | 
 |  * IPStore->EnumItems | 
 |  */ | 
 | static HRESULT WINAPI PStore_fnEnumItems( IPStore* This, PST_KEY Key, | 
 |     const GUID* pItemType, const GUID* pItemSubtype, DWORD dwFlags, | 
 |     IEnumPStoreItems** ppenum) | 
 | { | 
 |     FIXME("\n"); | 
 |     return E_NOTIMPL; | 
 | } | 
 |  | 
 |  | 
 | static const IPStoreVtbl pstores_vtbl = | 
 | { | 
 |     PStore_fnQueryInterface, | 
 |     PStore_fnAddRef, | 
 |     PStore_fnRelease, | 
 |     PStore_fnGetInfo, | 
 |     PStore_fnGetProvParam, | 
 |     PStore_fnSetProvParam, | 
 |     PStore_fnCreateType, | 
 |     PStore_fnGetTypeInfo, | 
 |     PStore_fnDeleteType, | 
 |     PStore_fnCreateSubtype, | 
 |     PStore_fnGetSubtypeInfo, | 
 |     PStore_fnDeleteSubtype, | 
 |     PStore_fnReadAccessRuleset, | 
 |     PStore_fnWriteAccessRuleset, | 
 |     PStore_fnEnumTypes, | 
 |     PStore_fnEnumSubtypes, | 
 |     PStore_fnDeleteItem, | 
 |     PStore_fnReadItem, | 
 |     PStore_fnWriteItem, | 
 |     PStore_fnOpenItem, | 
 |     PStore_fnCloseItem, | 
 |     PStore_fnEnumItems | 
 | }; | 
 |  | 
 | HRESULT WINAPI PStoreCreateInstance( IPStore** ppProvider, | 
 |             PST_PROVIDERID* pProviderID, void* pReserved, DWORD dwFlags) | 
 | { | 
 |     PStore_impl *ips; | 
 |  | 
 |     TRACE("%p %s %p %08x\n", ppProvider, debugstr_guid(pProviderID), pReserved, dwFlags); | 
 |  | 
 |     ips = HeapAlloc( GetProcessHeap(), 0, sizeof (PStore_impl) ); | 
 |     if( !ips ) | 
 |         return E_OUTOFMEMORY; | 
 |  | 
 |     ips->IPStore_iface.lpVtbl = &pstores_vtbl; | 
 |     ips->ref = 1; | 
 |  | 
 |     *ppProvider = (IPStore*) ips; | 
 |  | 
 |     return S_OK; | 
 | } | 
 |  | 
 | HRESULT WINAPI DllRegisterServer(void) | 
 | { | 
 |     FIXME("\n"); | 
 |     return S_OK; | 
 | } | 
 |  | 
 | HRESULT WINAPI DllUnregisterServer(void) | 
 | { | 
 |     FIXME("\n"); | 
 |     return S_OK; | 
 | } | 
 |  | 
 | /*********************************************************************** | 
 |  *             DllGetClassObject (PSTOREC.@) | 
 |  */ | 
 | HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) | 
 | { | 
 |     FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); | 
 |     return CLASS_E_CLASSNOTAVAILABLE; | 
 | } | 
 |  | 
 | HRESULT WINAPI DllCanUnloadNow(void) | 
 | { | 
 |     return S_OK; | 
 | } |