From 41d7b3700ddf7ef628313e9321fa917e6277c1b0 Mon Sep 17 00:00:00 2001 From: Brock Mammen Date: Sat, 17 Aug 2019 21:41:59 -0500 Subject: [PATCH] [SHELLFIND] Add search command events --- dll/win32/browseui/shellfind/CFindFolder.cpp | 33 ++++++++++++++------ dll/win32/browseui/shellfind/CFindFolder.h | 10 ++++++ sdk/include/psdk/exdisp.idl | 12 +++++++ sdk/include/psdk/exdispid.h | 4 +++ 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/dll/win32/browseui/shellfind/CFindFolder.cpp b/dll/win32/browseui/shellfind/CFindFolder.cpp index 535c1af09d0..7b65d834a95 100644 --- a/dll/win32/browseui/shellfind/CFindFolder.cpp +++ b/dll/win32/browseui/shellfind/CFindFolder.cpp @@ -1,11 +1,5 @@ -/* - * PROJECT: ReactOS Search Shell Extension - * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) - * PURPOSE: Search results folder - * COPYRIGHT: Copyright 2019 Brock Mammen - */ - #include "CFindFolder.h" +#include WINE_DEFAULT_DEBUG_CHANNEL(shellfind); @@ -88,6 +82,7 @@ struct _SearchData HWND hwnd; HANDLE hStopEvent; SearchStart *pSearchParams; + CFindFolder *pFindFolder; }; static LPCSTR WINAPI StrStrNA(LPCSTR lpFirst, LPCSTR lpSrch, UINT cchMax) @@ -210,20 +205,40 @@ static VOID RecursiveFind(LPCWSTR lpPath, _SearchData *pSearchData) FindClose(hFindFile); } -static DWORD WINAPI _SearchThreadProc(LPVOID lpParameter) +DWORD WINAPI CFindFolder::_SearchThreadProc(LPVOID lpParameter) { _SearchData *data = static_cast<_SearchData*>(lpParameter); - SearchStart* params = (SearchStart *) data->pSearchParams; + data->pFindFolder->NotifyConnections(DISPID_SEARCHSTART); + RecursiveFind(params->szPath, data); + data->pFindFolder->NotifyConnections(DISPID_SEARCHCOMPLETE); + SHFree(params); SHFree(lpParameter); return 0; } +void CFindFolder::NotifyConnections(DISPID id) +{ + DISPPARAMS dispatchParams = {0}; + CComDynamicUnkArray &subscribers = + IConnectionPointImpl::m_vec; + for (IUnknown** pSubscriber = subscribers.begin(); pSubscriber < subscribers.end(); pSubscriber++) + { + if (!*pSubscriber) + continue; + + CComPtr pDispatch; + HRESULT hResult = (*pSubscriber)->QueryInterface(IID_PPV_ARG(IDispatch, &pDispatch)); + if (!FAILED_UNEXPECTEDLY(hResult)) + pDispatch->Invoke(id, GUID_NULL, 0, DISPATCH_METHOD, &dispatchParams, NULL, NULL, NULL); + } +} + LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { if (!lParam) diff --git a/dll/win32/browseui/shellfind/CFindFolder.h b/dll/win32/browseui/shellfind/CFindFolder.h index 1768d47f2c4..885e49b590d 100644 --- a/dll/win32/browseui/shellfind/CFindFolder.h +++ b/dll/win32/browseui/shellfind/CFindFolder.h @@ -12,6 +12,8 @@ class CFindFolder : public IShellFolder2, public IPersistFolder2, public IShellFolderViewCB, + public IConnectionPointContainerImpl, + public IConnectionPointImpl, public IContextMenuCB { // *** IShellFolder2 methods *** @@ -68,6 +70,9 @@ private: CComPtr m_shellBrowser; HANDLE m_hStopEvent; + void NotifyConnections(DISPID id); + static DWORD WINAPI SearchThreadProc(LPVOID lpParameter); + //// *** IPersistFolder2 methods *** STDMETHODIMP GetCurFolder(LPITEMIDLIST *pidl); @@ -95,6 +100,10 @@ public: DECLARE_PROTECT_FINAL_CONSTRUCT() + BEGIN_CONNECTION_POINT_MAP(CFindFolder) + CONNECTION_POINT_ENTRY(DIID_DSearchCommandEvents) + END_CONNECTION_POINT_MAP() + BEGIN_MSG_MAP(CFindFolder) MESSAGE_HANDLER(WM_SEARCH_START, StartSearch) MESSAGE_HANDLER(WM_SEARCH_ADD_RESULT, AddResult) @@ -108,6 +117,7 @@ public: COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2) COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder) COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist) + COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer, IConnectionPointContainer) COM_INTERFACE_ENTRY_IID(IID_IContextMenuCB, IContextMenuCB) END_COM_MAP() }; diff --git a/sdk/include/psdk/exdisp.idl b/sdk/include/psdk/exdisp.idl index 3791acb464f..1471f9e0c93 100644 --- a/sdk/include/psdk/exdisp.idl +++ b/sdk/include/psdk/exdisp.idl @@ -1043,4 +1043,16 @@ coclass SearchAssistantOC { [default, source] dispinterface _SearchAssistantEvents; } +[ + uuid(60890160-69f0-11d1-b758-00a0c90564fe), + hidden +] +dispinterface DSearchCommandEvents { + properties: + methods: + [id(DISPID_SEARCHSTART)] void SearchStart(); + [id(DISPID_SEARCHCOMPLETE)] void SearchComplete(); + [id(DISPID_SEARCHABORT)] void SearchAbort(); +} + } /* library */ diff --git a/sdk/include/psdk/exdispid.h b/sdk/include/psdk/exdispid.h index 012f704cacd..deaafb389f6 100644 --- a/sdk/include/psdk/exdispid.h +++ b/sdk/include/psdk/exdispid.h @@ -169,4 +169,8 @@ #define DISPID_EXPAND 25 #define DISPID_UNSELECTALL 26 +#define DISPID_SEARCHSTART 1 +#define DISPID_SEARCHCOMPLETE 2 +#define DISPID_SEARCHABORT 3 + #endif /* EXDISPID_H_ */ -- 2.17.1