| /* |
| * 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 "initguid.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; |
| } |
| 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 %p\n", This, debugstr_guid(riid), ppvObj); |
| |
| *ppvObj = NULL; |
| |
| if (IsEqualIID(riid, &IID_IPStore) || IsEqualIID(riid, &IID_IUnknown)) |
| { |
| *ppvObj = &This->IPStore_iface; |
| } |
| |
| 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 pPromptInfo, DWORD dwFlags ) |
| { |
| FIXME("(%p,%08x,%s,%s,%s,%08x,%p,%08x) stub\n", This, Key, debugstr_guid(pItemType), |
| debugstr_guid(pItemSubtype), debugstr_w(szItemName), ModeFlags, pPromptInfo, 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 = &ips->IPStore_iface; |
| |
| 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_FALSE; |
| } |