Module: wine Branch: master Commit: 8ea9c3382961fa28a84a60e56be22cbfa3571c70 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8ea9c3382961fa28a84a60e56b...
Author: Andrey Gusev andrey.goosev@gmail.com Date: Wed Jun 7 16:20:33 2017 +0300
shell32: Add IApplicationDestinations stub.
Signed-off-by: Andrey Gusev andrey.goosev@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/shell32/shell32_classes.idl | 6 ++ dlls/shell32/shell32_main.h | 2 + dlls/shell32/shellole.c | 1 + dlls/shell32/shellpath.c | 119 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+)
diff --git a/dlls/shell32/shell32_classes.idl b/dlls/shell32/shell32_classes.idl index cc57b2b..6ed497f 100644 --- a/dlls/shell32/shell32_classes.idl +++ b/dlls/shell32/shell32_classes.idl @@ -69,6 +69,12 @@ coclass KnownFolderManager { interface IKnownFolderManager; } ] coclass ApplicationAssociationRegistration { interface IApplicationAssociationRegistration; }
[ + helpstring("Application Destination List"), + threading(apartment), + uuid(86c14003-4d6b-4ef3-a7b4-0506663b2e68) +] coclass ApplicationDestinations { interface IApplicationDestinations; } + +[ helpstring("Shell Drag and Drop Helper"), threading(apartment), uuid(4657278a-411b-11d2-839a-00c04fd918d0) diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index fc2a5ba..368c0e0 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -109,6 +109,8 @@ HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIco HRESULT WINAPI IAutoComplete_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) DECLSPEC_HIDDEN; HRESULT WINAPI ApplicationAssociationRegistration_Constructor(IUnknown *outer, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
+HRESULT WINAPI ApplicationDestinations_Constructor(IUnknown *outer, REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN; + HRESULT IShellLink_ConstructFromFile(IUnknown * pUnkOuter, REFIID riid, LPCITEMIDLIST pidl, IUnknown **ppv) DECLSPEC_HIDDEN;
LPEXTRACTICONA IExtractIconA_Constructor(LPCITEMIDLIST) DECLSPEC_HIDDEN; diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c index d3d972b..7b6ee92 100644 --- a/dlls/shell32/shellole.c +++ b/dlls/shell32/shellole.c @@ -67,6 +67,7 @@ static const struct { } InterfaceTable[] = {
{&CLSID_ApplicationAssociationRegistration, ApplicationAssociationRegistration_Constructor}, + {&CLSID_ApplicationDestinations, ApplicationDestinations_Constructor}, {&CLSID_AutoComplete, IAutoComplete_Constructor}, {&CLSID_ControlPanel, IControlPanel_Constructor}, {&CLSID_DragDropHelper, IDropTargetHelper_Constructor}, diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index 8569b53..d2ebc66 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -1021,6 +1021,125 @@ typedef enum _CSIDL_Type {
typedef struct { + IApplicationDestinations IApplicationDestinations_iface; + LONG ref; +} IApplicationDestinationsImpl; + +static inline IApplicationDestinationsImpl *impl_from_IApplicationDestinations( IApplicationDestinations *iface ) +{ + return CONTAINING_RECORD(iface, IApplicationDestinationsImpl, IApplicationDestinations_iface); +} + +static HRESULT WINAPI ApplicationDestinations_QueryInterface(IApplicationDestinations *iface, REFIID riid, + LPVOID *ppv) +{ + IApplicationDestinationsImpl *This = impl_from_IApplicationDestinations(iface); + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppv); + + if (ppv == NULL) + return E_POINTER; + + if (IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IApplicationDestinations, riid)) + { + *ppv = &This->IApplicationDestinations_iface; + IUnknown_AddRef((IUnknown*)*ppv); + + TRACE("Returning IApplicationDestinations: %p\n", *ppv); + return S_OK; + } + + *ppv = NULL; + FIXME("(%p)->(%s, %p) interface not supported.\n", This, debugstr_guid(riid), ppv); + + return E_NOINTERFACE; +} + +static ULONG WINAPI ApplicationDestinations_AddRef(IApplicationDestinations *iface) +{ + IApplicationDestinationsImpl *This = impl_from_IApplicationDestinations(iface); + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p), new refcount=%i\n", This, ref); + + return ref; +} + +static ULONG WINAPI ApplicationDestinations_Release(IApplicationDestinations *iface) +{ + IApplicationDestinationsImpl *This = impl_from_IApplicationDestinations(iface); + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p), new refcount=%i\n", This, ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +static HRESULT WINAPI ApplicationDestinations_SetAppID(IApplicationDestinations *iface, const WCHAR *appid) +{ + IApplicationDestinationsImpl *This = impl_from_IApplicationDestinations(iface); + + FIXME("(%p, %s) stub!\n", This, debugstr_w(appid)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ApplicationDestinations_RemoveDestination(IApplicationDestinations *iface, IUnknown *punk) +{ + IApplicationDestinationsImpl *This = impl_from_IApplicationDestinations(iface); + + FIXME("(%p, %p) stub!\n", This, punk); + + return E_NOTIMPL; +} + +static HRESULT WINAPI ApplicationDestinations_RemoveAllDestinations(IApplicationDestinations *iface) +{ + IApplicationDestinationsImpl *This = impl_from_IApplicationDestinations(iface); + + FIXME("(%p) stub!\n", This); + + return E_NOTIMPL; +} + +static const IApplicationDestinationsVtbl ApplicationDestinationsVtbl = +{ + ApplicationDestinations_QueryInterface, + ApplicationDestinations_AddRef, + ApplicationDestinations_Release, + ApplicationDestinations_SetAppID, + ApplicationDestinations_RemoveDestination, + ApplicationDestinations_RemoveAllDestinations +}; + +HRESULT WINAPI ApplicationDestinations_Constructor(IUnknown *outer, REFIID riid, LPVOID *ppv) +{ + IApplicationDestinationsImpl *This; + HRESULT hr; + + TRACE("(%p, %s, %p)\n", outer, debugstr_guid(riid), ppv); + + if (outer) + return CLASS_E_NOAGGREGATION; + + if (!(This = SHAlloc(sizeof(*This)))) + return E_OUTOFMEMORY; + + This->IApplicationDestinations_iface.lpVtbl = &ApplicationDestinationsVtbl; + This->ref = 0; + + hr = IUnknown_QueryInterface(&This->IApplicationDestinations_iface, riid, ppv); + if (FAILED(hr)) + SHFree(This); + + return hr; +} + +typedef struct +{ const KNOWNFOLDERID *id; CSIDL_Type type; LPCWSTR szValueName;