diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/omBrowser/browserClass.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/omBrowser/browserClass.cpp')
-rw-r--r-- | Src/omBrowser/browserClass.cpp | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/Src/omBrowser/browserClass.cpp b/Src/omBrowser/browserClass.cpp new file mode 100644 index 00000000..9a05846f --- /dev/null +++ b/Src/omBrowser/browserClass.cpp @@ -0,0 +1,191 @@ +#include "main.h" +#include "./browserClass.h" +#include "./browserRegistry.h" +#include "./configIni.h" +#include <strsafe.h> + +OmBrowserClass::OmBrowserClass(LPCWSTR pszName) + : ref(1), name(NULL), config(NULL), registry(NULL) +{ + InitializeCriticalSection(&lock); + name = Plugin_CopyString(pszName); +} + +OmBrowserClass::~OmBrowserClass() +{ + if (NULL != config) + config->Release(); + + if (NULL != registry) + { + registry->Delete(); + registry->Release(); + } + + Plugin_FreeString(name); + + DeleteCriticalSection(&lock); +} + +HRESULT OmBrowserClass::CreateInstance(LPCWSTR pszName, OmBrowserClass **instance) +{ + if (NULL == instance) return E_POINTER; + *instance = NULL; + + *instance = new OmBrowserClass(pszName); + if (NULL == *instance) return E_OUTOFMEMORY; + + return S_OK; +} + +size_t OmBrowserClass::AddRef() +{ + return InterlockedIncrement((LONG*)&ref); +} + +size_t OmBrowserClass::Release() +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + { + if (NULL != name && L'\0' != *name) + Plugin_UnregisterBrowserClass(name); + delete(this); + } + + return r; +} + +int OmBrowserClass::QueryInterface(GUID interface_guid, void **object) +{ + if (NULL == object) return E_POINTER; + + if (IsEqualIID(interface_guid, IFC_OmBrowserClass)) + *object = static_cast<ifc_ombrowserclass*>(this); + else + { + *object = NULL; + return E_NOINTERFACE; + } + + if (NULL == *object) + return E_UNEXPECTED; + + AddRef(); + return S_OK; +} + +HRESULT OmBrowserClass::GetName(LPWSTR pszBuffer, INT cchBufferMax) +{ + if (NULL == pszBuffer) return E_POINTER; + return StringCchCopyEx(pszBuffer, cchBufferMax, name, NULL, NULL, STRSAFE_IGNORE_NULLS); +} + +HRESULT OmBrowserClass::IsEqual(LPCWSTR pszName) +{ + if (NULL == pszName || L'\0' == *pszName) + return E_INVALIDARG; + + if (NULL == name) + return E_UNEXPECTED; + + INT result = CompareString(CSTR_INVARIANT, NORM_IGNORECASE, pszName, -1, name, -1); + if (0 == result) + { + DWORD errorCode = GetLastError(); + return HRESULT_FROM_WIN32(errorCode); + } + + return (CSTR_EQUAL == result) ? S_OK : S_FALSE; +} + +HRESULT OmBrowserClass::GetConfig(ifc_omconfig **instance) +{ + if (NULL == instance) return E_POINTER; + *instance = NULL; + + HRESULT hr = S_OK; + + EnterCriticalSection(&lock); + + if (NULL == config) + { + hr = OmConfigIni::CreateInstance(name, &config); + if (FAILED(hr)) + { + config = NULL; + } + } + + if (SUCCEEDED(hr)) + { + *instance = config; + config->AddRef(); + } + + LeaveCriticalSection(&lock); + + return S_OK; +} + +HRESULT OmBrowserClass::GetRegistry(ifc_ombrowserregistry **instance) +{ + if (NULL == instance) return E_POINTER; + *instance = NULL; + + HRESULT hr = S_OK; + + EnterCriticalSection(&lock); + + if (NULL == registry) + { + hr = OmBrowserRegistry::CreateInstance(name, ®istry); + if (FAILED(hr)) + { + registry = NULL; + } + else + { + registry->Write(); + } + } + + if (SUCCEEDED(hr)) + { + *instance = registry; + registry->AddRef(); + } + + LeaveCriticalSection(&lock); + + return S_OK; +} + +HRESULT OmBrowserClass::UpdateRegColors() +{ + HRESULT hr = S_FALSE; + EnterCriticalSection(&lock); + + if (NULL != registry) + hr = registry->UpdateColors(); + + LeaveCriticalSection(&lock); + + return hr; +} + +#define CBCLASS OmBrowserClass +START_DISPATCH; +CB(ADDREF, AddRef) +CB(RELEASE, Release) +CB(QUERYINTERFACE, QueryInterface) +CB(API_GETNAME, GetName) +CB(API_ISEQUAL, IsEqual) +CB(API_GETCONFIG, GetConfig) +CB(API_GETREGISTRY, GetRegistry) +CB(API_UPDATEREGCOLORS, UpdateRegColors) +END_DISPATCH; +#undef CBCLASS
\ No newline at end of file |