From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/omBrowser/browserWndEnum.cpp | 179 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 Src/omBrowser/browserWndEnum.cpp (limited to 'Src/omBrowser/browserWndEnum.cpp') diff --git a/Src/omBrowser/browserWndEnum.cpp b/Src/omBrowser/browserWndEnum.cpp new file mode 100644 index 00000000..24759772 --- /dev/null +++ b/Src/omBrowser/browserWndEnum.cpp @@ -0,0 +1,179 @@ +#include "main.h" +#include "./browserWndEnum.h" +#include "./browserWndRecord.h" +#include "./browserView.h" +#include "./browserPopup.h" +#include "./ifc_omservice.h" + + +OmBrowserWndEnumerator::OmBrowserWndEnumerator(const GUID *windowTypeFilter, const UINT *serviceIdFilter, OmBrowserWndRecord * const *windowList, size_t windowListSize) + : ref(1), index(0), list(NULL), size(0), filterId(FALSE), filterType(FALSE) +{ + if (NULL != serviceIdFilter) + { + serviceId = *serviceIdFilter; + filterId = TRUE; + } + else + serviceId = 0; + + if (NULL != windowTypeFilter) + { + windowType = *windowTypeFilter; + filterType = TRUE; + } + else + windowType = GUID_NULL; + + if (NULL != windowList && 0 != windowListSize) + { + list = (OmBrowserWndRecord**)calloc(windowListSize, sizeof(OmBrowserWndRecord*)); + if (NULL != list) + { + for (size_t i = 0; i < windowListSize; i++) + { + list[i] = windowList[i]; + list[i]->AddRef(); + } + size = windowListSize; + } + } + +} + +OmBrowserWndEnumerator::~OmBrowserWndEnumerator() +{ + if (NULL != list) + { + for (size_t i = 0; i < size; i++) + { + list[i]->Release(); + } + free(list); + } +} + +HRESULT OmBrowserWndEnumerator::CreateInstance(const GUID *windowTypeFilter, const UINT *serviceIdFilter, OmBrowserWndRecord * const* windowList, size_t windowListSize, OmBrowserWndEnumerator **instance) +{ + if (NULL == instance) return E_POINTER; + + *instance = new OmBrowserWndEnumerator(windowTypeFilter, serviceIdFilter, windowList, windowListSize); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +size_t OmBrowserWndEnumerator::AddRef() +{ + return InterlockedIncrement((LONG*)&ref); +} + +size_t OmBrowserWndEnumerator::Release() +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + delete(this); + + return r; +} + +int OmBrowserWndEnumerator::QueryInterface(GUID interface_guid, void **object) +{ + if (NULL == object) return E_POINTER; + + if (IsEqualIID(interface_guid, IFC_OmBrowserWindowEnumerator)) + *object = static_cast(this); + else + { + *object = NULL; + return E_NOINTERFACE; + } + + if (NULL == *object) + return E_UNEXPECTED; + + AddRef(); + return S_OK; +} + +HRESULT OmBrowserWndEnumerator::Next(ULONG listSize, HWND *elementList, ULONG *elementCount) +{ + if (NULL == elementList || 0 == listSize) return E_INVALIDARG; + if (index >= size) + { + if (NULL != elementCount) *elementCount = 0; + return S_FALSE; + } + + ULONG count = 0; + + for (;index < size && count < listSize; index++) + { + OmBrowserWndRecord *r = list[index]; + + if (FALSE != filterType) + { + if (S_OK != r->IsEqualType(&windowType)) + continue; + } + + if (FALSE != filterId) + { + BOOL passOk = FALSE; + if (S_OK == r->IsEqualType(&WTID_BrowserView) || + S_OK == r->IsEqualType(&WTID_BrowserPopup)) + { + ifc_omservice *service; + if (FALSE != SendMessage(r->GetHwnd(), NBCM_GETSERVICE, 0, (LPARAM)&service) && NULL != service) + { + if (serviceId == service->GetId()) + passOk = TRUE; + + service->Release(); + } + } + + if (FALSE == passOk) + continue; + } + + elementList[count] = r->GetHwnd(); + count++; + + } + + if (NULL != elementCount) *elementCount = count; + + return (count == listSize) ? S_OK : S_FALSE; +} + +HRESULT OmBrowserWndEnumerator::Reset(void) +{ + index = 0; + return S_OK; +} + +HRESULT OmBrowserWndEnumerator::Skip(ULONG elementCount) +{ + index += elementCount; + if (index >= size) + { + index = (size - 1); + return S_FALSE; + } + return S_OK; +} + +#define CBCLASS OmBrowserWndEnumerator +START_DISPATCH; +CB(ADDREF, AddRef) +CB(RELEASE, Release) +CB(QUERYINTERFACE, QueryInterface) +CB(API_NEXT, Next) +CB(API_RESET, Reset) +CB(API_SKIP, Skip) +END_DISPATCH; +#undef CBCLASS \ No newline at end of file -- cgit