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/serviceManager.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/omBrowser/serviceManager.cpp')
-rw-r--r-- | Src/omBrowser/serviceManager.cpp | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/Src/omBrowser/serviceManager.cpp b/Src/omBrowser/serviceManager.cpp new file mode 100644 index 00000000..3c66e983 --- /dev/null +++ b/Src/omBrowser/serviceManager.cpp @@ -0,0 +1,214 @@ +#include "main.h" +#include "./serviceManager.h" +#include "./service.h" + +#include "./ifc_wasabihelper.h" + +#include "./storageIni.h" +#include "./storageXml.h" +#include "./storageUrl.h" +#include "./storageEnum.h" + +#include <shlwapi.h> +#include <strsafe.h> + +OmServiceManager::OmServiceManager() + : ref(1), registerStorage(TRUE) +{ +} + +OmServiceManager::~OmServiceManager() +{ + size_t index = storageList.size(); + while(index--) + { + storageList[index]->Release(); + } +} + +OmServiceManager *OmServiceManager::CreateInstance() +{ + return new OmServiceManager(); +} + +size_t OmServiceManager::AddRef() +{ + return InterlockedIncrement((LONG*)&ref); +} + +size_t OmServiceManager::Release() +{ + if (0 == ref) + return ref; + + LONG r = InterlockedDecrement((LONG*)&ref); + if (0 == r) + delete(this); + + return r; +} + +int OmServiceManager::QueryInterface(GUID interface_guid, void **object) +{ + if (NULL == object) return E_POINTER; + + if (IsEqualIID(interface_guid, IFC_OmServiceManager)) + *object = static_cast<ifc_omservicemanager*>(this); + else + { + *object = NULL; + return E_NOINTERFACE; + } + + if (NULL == *object) + return E_UNEXPECTED; + + AddRef(); + + return S_OK; +} + +HRESULT OmServiceManager::RegisterDefaultStorage() +{ + ifc_omstorage *storage; + if (SUCCEEDED(OmStorageIni::CreateInstance((OmStorageIni**)&storage))) + { + RegisterStorage(storage); + storage->Release(); + } + + if (SUCCEEDED(OmStorageXml::CreateInstance((OmStorageXml**)&storage))) + { + RegisterStorage(storage); + storage->Release(); + } + + if (SUCCEEDED(OmStorageUrl::CreateInstance((OmStorageUrl**)&storage))) + { + RegisterStorage(storage); + storage->Release(); + } + + return S_OK; +} + +HRESULT OmServiceManager::RegisterStorage(ifc_omstorage *storage) +{ + if (NULL == storage) return E_INVALIDARG; + + HRESULT hr; + GUID storageId, testId; + + if (FAILED(storage->GetId(&storageId))) + return E_FAIL; + + size_t index = storageList.size(); + while(index--) + { + if(SUCCEEDED(storageList[index]->GetId(&testId)) && IsEqualGUID(storageId, testId)) + break; + } + + if (((size_t)-1) == index) + { + storageList.push_back(storage); + storage->AddRef(); + hr = S_OK; + } + else + { + hr = S_FALSE; + } + return hr; +} + +HRESULT OmServiceManager::UnregisterStorage(const GUID *storageId) +{ + if (NULL == storageId) return E_INVALIDARG; + + HRESULT hr = S_FALSE; + GUID testId; + + size_t index = storageList.size(); + while(index--) + { + ifc_omstorage *storage = storageList[index]; + if(SUCCEEDED(storage->GetId(&testId)) && IsEqualGUID(*storageId, testId)) + { + storageList.erase(storageList.begin() + index); + storage->Release(); + hr = S_OK; + break; + } + } + return hr; +} + +HRESULT OmServiceManager::QueryStorage(const GUID *storageId, ifc_omstorage **storageOut) +{ + if (NULL == storageOut) return E_POINTER; + *storageOut = NULL; + + if (NULL == storageId) + return E_INVALIDARG; + + if (FALSE != registerStorage && SUCCEEDED(RegisterDefaultStorage())) + registerStorage = FALSE; + + HRESULT hr = S_FALSE; + GUID testId; + + size_t index = storageList.size(); + while(index--) + { + ifc_omstorage *storage = storageList[index]; + if(SUCCEEDED(storage->GetId(&testId)) && IsEqualGUID(*storageId, testId)) + { + storage->AddRef(); + *storageOut = storage; + hr = S_OK; + break; + } + } + + return hr; +} + +HRESULT OmServiceManager::EnumStorage(const GUID *filterType, UINT filterCapabilities, ifc_omstorageenumerator **enumOut) +{ + if (FALSE != registerStorage && SUCCEEDED(RegisterDefaultStorage())) + registerStorage = FALSE; + + return OmStorageEnumerator::CreateInstance(storageList.size() ? &storageList.at(0) : nullptr, storageList.size(), + filterType, filterCapabilities, + (OmStorageEnumerator**)enumOut); +} + +HRESULT OmServiceManager::CreateService(UINT serviceId, ifc_omservicehost *host, ifc_omservice **serviceOut) +{ + if (NULL == serviceOut) return E_POINTER; + + OmService *service = NULL; + HRESULT hr = OmService::CreateInstance(serviceId, host, &service); + if (FAILED(hr)) + { + *serviceOut = NULL; + return hr; + } + + *serviceOut = service; + return hr; +} + +#define CBCLASS OmServiceManager +START_DISPATCH; +CB(ADDREF, AddRef) +CB(RELEASE, Release) +CB(QUERYINTERFACE, QueryInterface) +CB(API_REGISTERSTORAGE, RegisterStorage) +CB(API_UNREGISTERSTORAGE, UnregisterStorage) +CB(API_QUERYSTORAGE, QueryStorage) +CB(API_ENUMSTORAGE, EnumStorage) +CB(API_CREATESERVICE, CreateService) +END_DISPATCH; +#undef CBCLASS
\ No newline at end of file |