mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-11-27 23:50:51 +01:00
252 lines
6.3 KiB
C++
252 lines
6.3 KiB
C++
#include "main.h"
|
|
#include "./wasabiHelper.h"
|
|
#include <api/service/waservicefactory.h>
|
|
|
|
EXTERN_C const GUID pngLoaderGUID =
|
|
{ 0x5e04fb28, 0x53f5, 0x4032, { 0xbd, 0x29, 0x3, 0x2b, 0x87, 0xec, 0x37, 0x25 } };
|
|
|
|
WasabiHelper::WasabiHelper(api_service *serviceManager)
|
|
: ref(1), serviceManager(NULL), applicationApi(NULL), configApi(NULL), memoryApi(NULL),
|
|
pngLoader(NULL), languageManager(NULL), securityApi(NULL), threadpoolApi(NULL), languageModule(NULL)
|
|
{
|
|
this->serviceManager = serviceManager;
|
|
}
|
|
|
|
WasabiHelper::~WasabiHelper()
|
|
{
|
|
ReleaseWasabiInterface(&applicationApiServiceGuid, applicationApi);
|
|
ReleaseWasabiInterface(&AgaveConfigGUID, configApi);
|
|
ReleaseWasabiInterface(&languageApiGUID, languageManager);
|
|
ReleaseWasabiInterface(&pngLoaderGUID, pngLoader);
|
|
ReleaseWasabiInterface(&memMgrApiServiceGuid, memoryApi);
|
|
ReleaseWasabiInterface(&JSAPI2::api_securityGUID, securityApi);
|
|
ReleaseWasabiInterface(&ThreadPoolGUID, threadpoolApi);
|
|
}
|
|
|
|
HRESULT WasabiHelper::CreateInstance(api_service *serviceManager, WasabiHelper **instance)
|
|
{
|
|
if (NULL == instance) return E_POINTER;
|
|
if (NULL == serviceManager) return E_INVALIDARG;
|
|
|
|
*instance = new WasabiHelper(serviceManager);
|
|
if (*instance == NULL) return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
size_t WasabiHelper::AddRef()
|
|
{
|
|
return InterlockedIncrement((LONG*)&ref);
|
|
}
|
|
|
|
size_t WasabiHelper::Release()
|
|
{
|
|
if (0 == ref)
|
|
return ref;
|
|
|
|
LONG r = InterlockedDecrement((LONG*)&ref);
|
|
if (0 == r)
|
|
delete(this);
|
|
|
|
return r;
|
|
}
|
|
|
|
int WasabiHelper::QueryInterface(GUID interface_guid, void **object)
|
|
{
|
|
if (NULL == object) return E_POINTER;
|
|
|
|
if (IsEqualIID(interface_guid, IFC_WasabiHelper))
|
|
*object = static_cast<ifc_wasabihelper*>(this);
|
|
else
|
|
{
|
|
*object = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
if (NULL == *object)
|
|
return E_UNEXPECTED;
|
|
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT WasabiHelper::QueryWasabiInterface(const GUID *iid, void **ppi)
|
|
{
|
|
if (NULL == ppi) return E_POINTER;
|
|
*ppi = NULL;
|
|
|
|
if (NULL == iid) return E_INVALIDARG;
|
|
|
|
if (NULL == serviceManager) return E_UNEXPECTED;
|
|
waServiceFactory *serviceFactory = serviceManager->service_getServiceByGuid(*iid);
|
|
if (NULL == serviceFactory) return E_NOINTERFACE;
|
|
|
|
*ppi = serviceFactory->getInterface();
|
|
if (NULL == *ppi) return E_OUTOFMEMORY;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT WasabiHelper::ReleaseWasabiInterface(const GUID *iid, void *pi)
|
|
{
|
|
if (NULL == iid || NULL == pi) return E_INVALIDARG;
|
|
|
|
if (NULL == serviceManager) return E_UNEXPECTED;
|
|
waServiceFactory *serviceFactory = serviceManager->service_getServiceByGuid(*iid);
|
|
if (NULL == serviceFactory) return E_NOINTERFACE;
|
|
|
|
serviceFactory->releaseInterface(pi);
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetServiceManager(api_service **manager)
|
|
{
|
|
if (NULL == manager) return E_POINTER;
|
|
*manager = serviceManager;
|
|
|
|
if (NULL == *manager) return E_UNEXPECTED;
|
|
(*manager)->AddRef();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetApplicationApi(api_application **application)
|
|
{
|
|
if (NULL == application) return E_POINTER;
|
|
HRESULT hr = (NULL == applicationApi)? QueryWasabiInterface(&applicationApiServiceGuid, (void**)&applicationApi) : S_OK;
|
|
|
|
*application = applicationApi;
|
|
if (NULL != applicationApi)
|
|
applicationApi->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetConfigApi(api_config ** config)
|
|
{
|
|
if (NULL == config) return E_POINTER;
|
|
HRESULT hr = (NULL == configApi)? QueryWasabiInterface(&AgaveConfigGUID, (void**)&configApi) : S_OK;
|
|
|
|
*config = configApi;
|
|
if (NULL != configApi)
|
|
configApi->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetMemoryManager(api_memmgr **memoryManager)
|
|
{
|
|
if (NULL == memoryManager) return E_POINTER;
|
|
HRESULT hr = (NULL == memoryApi)? QueryWasabiInterface(&memMgrApiServiceGuid, (void**)&memoryApi) : S_OK;
|
|
|
|
*memoryManager = memoryApi;
|
|
if (NULL != memoryApi)
|
|
memoryApi->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetPngLoader(svc_imageLoader **loader)
|
|
{
|
|
if (NULL == loader) return E_POINTER;
|
|
HRESULT hr = (NULL == pngLoader)? QueryWasabiInterface(&pngLoaderGUID, (void**)&pngLoader) : S_OK;
|
|
|
|
*loader = pngLoader;
|
|
if (NULL != pngLoader)
|
|
pngLoader->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WasabiHelper::InitLanguageSupport()
|
|
{
|
|
if (NULL != languageManager && NULL != languageModule)
|
|
return S_FALSE;
|
|
|
|
if(NULL == languageManager)
|
|
{
|
|
languageModule = NULL;
|
|
HRESULT hr = QueryWasabiInterface(&languageApiGUID, (void**)&languageManager);
|
|
if (FAILED(hr))
|
|
return hr;
|
|
}
|
|
|
|
if (NULL == languageModule)
|
|
{
|
|
languageModule = languageManager->StartLanguageSupport(Plugin_GetInstance(), omBrowserLangGUID);
|
|
if (NULL == languageModule)
|
|
{
|
|
languageManager->Release();
|
|
languageManager = NULL;
|
|
return E_FAIL;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetLanguageManager(api_language **language)
|
|
{
|
|
if (NULL == language) return E_POINTER;
|
|
|
|
HRESULT hr = InitLanguageSupport();
|
|
if (FAILED(hr)) return hr;
|
|
|
|
*language = (SUCCEEDED(hr)) ? languageManager : NULL;
|
|
if (NULL != *language)
|
|
(*language)->AddRef();
|
|
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetLanguageModule(HINSTANCE *module)
|
|
{
|
|
if (NULL == module) return E_POINTER;
|
|
|
|
HRESULT hr = InitLanguageSupport();
|
|
if (FAILED(hr)) return hr;
|
|
|
|
*module = languageModule;
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetSecurityApi(JSAPI2::api_security **security)
|
|
{
|
|
if (NULL == security) return E_POINTER;
|
|
HRESULT hr = (NULL == securityApi)? QueryWasabiInterface(&JSAPI2::api_securityGUID, (void**)&securityApi) : S_OK;
|
|
|
|
*security = securityApi;
|
|
if (NULL != securityApi)
|
|
securityApi->AddRef();
|
|
return hr;
|
|
}
|
|
|
|
HRESULT WasabiHelper::GetThreadpoolApi(api_threadpool **threadpool)
|
|
{
|
|
if (NULL == threadpool) return E_POINTER;
|
|
HRESULT hr = (NULL == threadpoolApi)? QueryWasabiInterface(&ThreadPoolGUID, (void**)&threadpoolApi) : S_OK;
|
|
|
|
*threadpool = threadpoolApi;
|
|
if (NULL != *threadpool)
|
|
threadpoolApi->AddRef();
|
|
return hr;
|
|
}
|
|
|
|
#define CBCLASS WasabiHelper
|
|
START_DISPATCH;
|
|
CB(ADDREF, AddRef)
|
|
CB(RELEASE, Release)
|
|
CB(QUERYINTERFACE, QueryInterface)
|
|
CB(API_QUERYWASABIINTERFACE, QueryWasabiInterface)
|
|
CB(API_RELEASEWASABIINTERFACE, ReleaseWasabiInterface)
|
|
CB(API_GETSERVICEMANAGER, GetServiceManager)
|
|
CB(API_GETAPPLICATION, GetApplicationApi)
|
|
CB(API_GETCONFIG, GetConfigApi)
|
|
CB(API_GETMEMORYMANAGER, GetMemoryManager)
|
|
CB(API_GETPNGLOADER, GetPngLoader)
|
|
CB(API_GETLANGUAGEMANAGER, GetLanguageManager)
|
|
CB(API_GETLANGUAGEMODULE, GetLanguageModule)
|
|
CB(API_GETSECURITY, GetSecurityApi)
|
|
CB(API_GETTHREADPOOL, GetThreadpoolApi)
|
|
END_DISPATCH;
|
|
#undef CBCLASS |