aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/wasabiHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/omBrowser/wasabiHelper.cpp')
-rw-r--r--Src/omBrowser/wasabiHelper.cpp252
1 files changed, 252 insertions, 0 deletions
diff --git a/Src/omBrowser/wasabiHelper.cpp b/Src/omBrowser/wasabiHelper.cpp
new file mode 100644
index 00000000..39112f2e
--- /dev/null
+++ b/Src/omBrowser/wasabiHelper.cpp
@@ -0,0 +1,252 @@
+#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 \ No newline at end of file