[PATCH 2/2] shell32: Add IApplicationDestinations stub.
Andrey Gusev
andrey.goosev at gmail.com
Wed Jun 7 08:20:33 CDT 2017
Signed-off-by: Andrey Gusev <andrey.goosev at gmail.com>
---
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;
--
2.7.5
More information about the wine-patches
mailing list