shell32: Merge the property bag implementation from the Unix shell folder.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2021-09-10 18:54:46 +02:00
parent df9c67d196
commit ed5c882975
1 changed files with 93 additions and 0 deletions

View File

@ -62,6 +62,7 @@ typedef struct {
LONG ref; LONG ref;
IShellFolder2 IShellFolder2_iface; IShellFolder2 IShellFolder2_iface;
IPersistFolder3 IPersistFolder3_iface; IPersistFolder3 IPersistFolder3_iface;
IPersistPropertyBag IPersistPropertyBag_iface;
IDropTarget IDropTarget_iface; IDropTarget IDropTarget_iface;
ISFHelper ISFHelper_iface; ISFHelper ISFHelper_iface;
IUnknown *outer_unk; IUnknown *outer_unk;
@ -92,6 +93,11 @@ static inline IGenericSFImpl *impl_from_IPersistFolder3(IPersistFolder3 *iface)
return CONTAINING_RECORD(iface, IGenericSFImpl, IPersistFolder3_iface); return CONTAINING_RECORD(iface, IGenericSFImpl, IPersistFolder3_iface);
} }
static inline IGenericSFImpl *impl_from_IPersistPropertyBag(IPersistPropertyBag *iface)
{
return CONTAINING_RECORD(iface, IGenericSFImpl, IPersistPropertyBag_iface);
}
static inline IGenericSFImpl *impl_from_IDropTarget(IDropTarget *iface) static inline IGenericSFImpl *impl_from_IDropTarget(IDropTarget *iface)
{ {
return CONTAINING_RECORD(iface, IGenericSFImpl, IDropTarget_iface); return CONTAINING_RECORD(iface, IGenericSFImpl, IDropTarget_iface);
@ -120,6 +126,8 @@ static HRESULT WINAPI IUnknown_fnQueryInterface(IUnknown *iface, REFIID riid, vo
else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IPersistFolder) || else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IPersistFolder) ||
IsEqualIID(riid, &IID_IPersistFolder2) || IsEqualIID(riid, &IID_IPersistFolder3)) IsEqualIID(riid, &IID_IPersistFolder2) || IsEqualIID(riid, &IID_IPersistFolder3))
*ppvObj = &This->IPersistFolder3_iface; *ppvObj = &This->IPersistFolder3_iface;
else if (IsEqualIID(&IID_IPersistPropertyBag, riid))
*ppvObj = &This->IPersistPropertyBag_iface;
else if (IsEqualIID (riid, &IID_ISFHelper)) else if (IsEqualIID (riid, &IID_ISFHelper))
*ppvObj = &This->ISFHelper_iface; *ppvObj = &This->ISFHelper_iface;
else if (IsEqualIID (riid, &IID_IDropTarget)) { else if (IsEqualIID (riid, &IID_IDropTarget)) {
@ -1507,6 +1515,90 @@ static const IPersistFolder3Vtbl pfvt =
IFSFldr_PersistFolder3_GetFolderTargetInfo IFSFldr_PersistFolder3_GetFolderTargetInfo
}; };
/****************************************************************************
* IPersistPropertyBag implementation
*/
static HRESULT WINAPI PersistPropertyBag_QueryInterface(IPersistPropertyBag* iface,
REFIID riid, void** ppv)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
}
static ULONG WINAPI PersistPropertyBag_AddRef(IPersistPropertyBag* iface)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
return IUnknown_AddRef(This->outer_unk);
}
static ULONG WINAPI PersistPropertyBag_Release(IPersistPropertyBag* iface)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
return IUnknown_Release(This->outer_unk);
}
static HRESULT WINAPI PersistPropertyBag_GetClassID(IPersistPropertyBag* iface, CLSID* pClassID)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
return IPersistFolder3_GetClassID(&This->IPersistFolder3_iface, pClassID);
}
static HRESULT WINAPI PersistPropertyBag_InitNew(IPersistPropertyBag* iface)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
FIXME("(%p): stub\n", This);
return E_NOTIMPL;
}
static HRESULT WINAPI PersistPropertyBag_Load(IPersistPropertyBag *iface,
IPropertyBag *pPropertyBag, IErrorLog *pErrorLog)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
static const WCHAR wszTarget[] = { 'T','a','r','g','e','t', 0 };
PERSIST_FOLDER_TARGET_INFO pftiTarget;
VARIANT var;
HRESULT hr;
TRACE("(%p)->(%p %p)\n", This, pPropertyBag, pErrorLog);
if (!pPropertyBag)
return E_POINTER;
/* Get 'Target' property from the property bag. */
V_VT(&var) = VT_BSTR;
hr = IPropertyBag_Read(pPropertyBag, wszTarget, &var, NULL);
if (FAILED(hr))
return E_FAIL;
lstrcpyW(pftiTarget.szTargetParsingName, V_BSTR(&var));
SysFreeString(V_BSTR(&var));
pftiTarget.pidlTargetFolder = NULL;
pftiTarget.szNetworkProvider[0] = 0;
pftiTarget.dwAttributes = -1;
pftiTarget.csidl = -1;
return IPersistFolder3_InitializeEx(&This->IPersistFolder3_iface, NULL, NULL, &pftiTarget);
}
static HRESULT WINAPI PersistPropertyBag_Save(IPersistPropertyBag *iface,
IPropertyBag *pPropertyBag, BOOL fClearDirty, BOOL fSaveAllProperties)
{
IGenericSFImpl *This = impl_from_IPersistPropertyBag(iface);
FIXME("(%p): stub\n", This);
return E_NOTIMPL;
}
static const IPersistPropertyBagVtbl ppbvt = {
PersistPropertyBag_QueryInterface,
PersistPropertyBag_AddRef,
PersistPropertyBag_Release,
PersistPropertyBag_GetClassID,
PersistPropertyBag_InitNew,
PersistPropertyBag_Load,
PersistPropertyBag_Save
};
/**************************************************************************** /****************************************************************************
* ISFDropTarget implementation * ISFDropTarget implementation
*/ */
@ -1698,6 +1790,7 @@ HRESULT WINAPI IFSFolder_Constructor(IUnknown *outer_unk, REFIID riid, void **pp
sf->IUnknown_inner.lpVtbl = &unkvt; sf->IUnknown_inner.lpVtbl = &unkvt;
sf->IShellFolder2_iface.lpVtbl = &sfvt; sf->IShellFolder2_iface.lpVtbl = &sfvt;
sf->IPersistFolder3_iface.lpVtbl = &pfvt; sf->IPersistFolder3_iface.lpVtbl = &pfvt;
sf->IPersistPropertyBag_iface.lpVtbl = &ppbvt;
sf->IDropTarget_iface.lpVtbl = &dtvt; sf->IDropTarget_iface.lpVtbl = &dtvt;
sf->ISFHelper_iface.lpVtbl = &shvt; sf->ISFHelper_iface.lpVtbl = &shvt;
sf->pclsid = (CLSID *) & CLSID_ShellFSFolder; sf->pclsid = (CLSID *) & CLSID_ShellFSFolder;