diff options
Diffstat (limited to 'Src/Wasabi/api/wac/waclient.cpp')
-rw-r--r-- | Src/Wasabi/api/wac/waclient.cpp | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wac/waclient.cpp b/Src/Wasabi/api/wac/waclient.cpp new file mode 100644 index 00000000..3cc394c8 --- /dev/null +++ b/Src/Wasabi/api/wac/waclient.cpp @@ -0,0 +1,347 @@ +// the glue! +#include <precomp.h> +#include <wasabicfg.h> +#include <bfc/assert.h> +#include "wac.h" + +#include <api/service/servicei.h> +#include <api/memmgr/api_memmgr.h> + +#ifndef STATIC_COMPONENT +extern WAComponentClient *the; + +#ifndef WASABINOMAINAPI +ComponentAPI *api; // we do NOT delete this on shutdown!!! +#endif + +OSMODULEHANDLE g_modulehandle; +#endif //STATIC_COMPONENT + +WAComponentClient::WAComponentClient(const wchar_t *name) : + CfgItemI(name) { + OSModuleHandle = NULL; +} + +const wchar_t *WAComponentClient::getName() { + return cfgitem_getName(); +} + +#ifdef WASABINOMAINAPI +void WAComponentClient::registerServices(api_service *_serviceapi) +{ + serviceApi = _serviceapi; + + waServiceFactory *sf = serviceApi->service_getServiceByGuid(applicationApiServiceGuid); + if (sf) applicationApi = reinterpret_cast<api_application*>(sf->getInterface()); + +#ifdef WASABI_COMPILE_SYSCB + sf = serviceApi->service_getServiceByGuid(syscbApiServiceGuid); + if (sf) sysCallbackApi = reinterpret_cast<api_syscb *>(sf->getInterface()); +#endif + + sf = serviceApi->service_getServiceByGuid(memMgrApiServiceGuid); + if (sf) memmgrApi = reinterpret_cast<api_memmgr *>(sf->getInterface()); + +#ifdef WASABI_COMPILE_CONFIG + sf = serviceApi->service_getServiceByGuid(configApiServiceGuid); + if (sf) configApi = reinterpret_cast<api_config *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_IMGLDR + sf = serviceApi->service_getServiceByGuid(imgLdrApiServiceGuid); + if (sf) imgLoaderApi = reinterpret_cast<imgldr_api *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_FONTS + sf = serviceApi->service_getServiceByGuid(fontApiServiceGuid); + if (sf) fontApi = reinterpret_cast<api_font *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_FILEREADER + sf = serviceApi->service_getServiceByGuid(fileReaderApiServiceGuid); + if (sf) fileApi = reinterpret_cast<api_fileReader *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_LOCALES + sf = serviceApi->service_getServiceByGuid(localesApiServiceGuid); + if (sf) localesApi = reinterpret_cast<api_locales *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_TIMERS + sf = serviceApi->service_getServiceByGuid(timerApiServiceGuid); + if (sf) timerApi = reinterpret_cast<timer_api *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_WND + sf = serviceApi->service_getServiceByGuid(wndApiServiceGuid); + if (sf) wndApi = reinterpret_cast<wnd_api *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_WNDMGR + sf = serviceApi->service_getServiceByGuid(wndMgrApiServiceGuid); + if (sf) wndManagerApi = reinterpret_cast<wndmgr_api *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_COMPONENTS +#endif + +#ifdef WASABI_COMPILE_METADB +#endif + +#ifdef WASABI_COMPILE_SCRIPT + sf = serviceApi->service_getServiceByGuid(makiApiServiceGuid); + if (sf) makiApi = reinterpret_cast<api_maki *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_SKIN + sf = serviceApi->service_getServiceByGuid(skinApiServiceGuid); + if (sf) skinApi = reinterpret_cast<api_skin *>(sf->getInterface()); +#endif + +#ifdef WASABI_COMPILE_MAKIDEBUG + sf = serviceApi->service_getServiceByGuid(makiDebugApiServiceGuid); + if (sf) debugApi = reinterpret_cast<api_makiDebugger *>(sf->getInterface()); +#endif + +#else +void WAComponentClient::registerServices(ComponentAPI *_api) { + // save API * + api = _api; +#endif + + // propagate name from component to cfgitemi + if (cfgitem_getName() == NULL) CfgItemI::setName(WaComponent::getName()); + + // register resources + foreach(resources) + resources.getfor()->onRegisterServices(); + endfor + + // our CfgItem GUID defaults to our component GUID + cfgitem_setGUID(getGUID()); + + // by default, peg us under "Installed Components" in config + // {99CFD75C-1CA7-49e5-B8C0-7D78AA443C10} + const GUID installed_guid = + { 0x99cfd75c, 0x1ca7, 0x49e5, { 0xb8, 0xc0, 0x7d, 0x78, 0xaa, 0x44, 0x3c, 0x10 } }; + if (cfgitem_getParentGuid() == INVALID_GUID) + setParentGuid(installed_guid); + + WASABI_API_CONFIG->config_registerCfgItem(this); + + // allow overridden component class to do stuff + onRegisterServices(); +} + +int WAComponentClient::RegisterServicesSafeModeOk() +{ + return 1; +} + +void WAComponentClient::deregisterServices() { + foreach(resources) + resources.getfor()->onDeregisterServices(); + endfor + WASABI_API_CONFIG->config_deregisterCfgItem(this); +} + +CfgItem *WAComponentClient::getCfgInterface(int n) { + if (n == 0) return this; + return NULL; +} + +class RegService : public LoadableResource { +public: + RegService(waServiceFactoryI *sf) : factory(sf) {} + + virtual void onRegisterServices() { + WASABI_API_SVC->service_register(factory); + } + virtual void onDeregisterServices() { + WASABI_API_SVC->service_deregister(factory); + } + +private: + waServiceFactoryI *factory; +}; + +void WAComponentClient::registerService(waServiceFactoryI* service) { + registerResource(new RegService(service)); +} + +class SkinPart : public LoadableResource { +public: + SkinPart(const wchar_t *name, int rel) : filename(name), id(-1), relative(rel) {} + + void beforeLoadingSkinElements() { + ASSERT(!filename.isempty()); + StringW fn(filename); + switch (relative) { + case RSF_RELATIVETOWAC: + fn.prepend(the->getComponentPath());// api->path_getComponentPath()); + break; + case RSF_RELATIVETOTHEME: { + wchar_t theme[WA_MAX_PATH]=L""; + WASABI_API_CONFIG->getStringPrivate(L"theme", theme, WA_MAX_PATH, L"default"); + StringW path = WASABI_API_APP->path_getAppPath(); + path.AppendPath(L"themes"); + path.AppendPath(theme); + fn = StringPathCombine(path, fn); + } + break; + } + id = WASABI_API_SKIN->loadSkinFile(fn); + } + virtual void onDeregisterServices() { + if (id >= 0 && WASABI_API_SKIN) WASABI_API_SKIN->unloadSkinPart(id); + id = -1; + } + +private: + StringW filename; + int id; + int relative; +}; + +void WAComponentClient::registerSkinFile(const wchar_t *filename, int relative) +{ + registerResource(new SkinPart(filename, relative)); +} + +void WAComponentClient::registerResource(LoadableResource *res) { + ASSERT(!resources.haveItem(res)); + resources.addItem(res); + if (postregisterservices) res->onRegisterServices(); +} + +void WAComponentClient::internal_onDestroy() { + onDestroy(); + foreach(resources) + if (resources.getfor()->deleteOnShutdown()) delete resources.getfor(); + endfor + resources.removeAll(); +} + +int WAComponentClient::internal_onNotify(int cmd, int param1, int param2, int param3, int param4) { + switch (cmd) { + case WAC_NOTIFY_BEFORELOADINGSKINELEMENTS: + foreach(resources) + resources.getfor()->beforeLoadingSkinElements(); + endfor + break; + case WAC_NOTIFY_SKINLOADED: + onSkinLoaded(); + break; + } + return onNotify(cmd, param1, param2, param3, param4); +} + +#ifndef STATIC_COMPONENT +extern "C" { + +__declspec(dllexport) UINT WAC_getVersion(void) { + return WA_COMPONENT_VERSION; +} + +__declspec(dllexport) int WAC_init(OSMODULEHANDLE moduleHandle) { + the->setOSModuleHandle(moduleHandle); + if (g_modulehandle == NULL) g_modulehandle = moduleHandle; + return TRUE; +} + +__declspec(dllexport) WaComponent *WAC_enumComponent(int n) { + return the; +} + +} // end extern "C" +#endif + +#define CBCLASS WaComponentI +START_DISPATCH; + CB(GETNAME, getName); + CB(GETGUID, getGUID); +#ifndef WASABINOMAINAPI + VCB(REGISTERSERVICES, registerServices); +#else + VCB(REGISTERSERVICES2, registerServices); +#endif + CB(15, RegisterServicesSafeModeOk) + VCB(DEREGISTERSERVICES, deregisterServices); + VCB(ONCREATE, onCreate); + VCB(ONDESTROY, internal_onDestroy); + CB(CREATEWINDOW, createWindow); + CB(ONNOTIFY, internal_onNotify); + CB(ONCOMMAND, onCommand); + CB(GETCFGINTERFACE, getCfgInterface); + VCB(SETOSMODULEHANDLE, setOSModuleHandle); + CB(GETOSMODULEHANDLE, getOSModuleHandle); + VCB(SETPATH, setComponentPath); + CB(GETPATH, getComponentPath); +END_DISPATCH; +#undef CBCLASS + +#ifdef WASABINOMAINAPI + +api_application *applicationApi = NULL; +api_service *serviceApi = NULL; +api_syscb *sysCallbackApi = NULL; + + +api_memmgr *memmgrApi = NULL; + +#ifdef WASABI_COMPILE_CONFIG +api_config *configApi = NULL; +#endif + +#ifdef WASABI_COMPILE_IMGLDR +imgldr_api *imgLoaderApi = NULL; +#endif + +#ifdef WASABI_COMPILE_FONTS +api_font *fontApi = NULL; +#endif + + +#ifdef WASABI_COMPILE_FILEREADER +api_fileReader *fileApi = NULL; +#endif + +#ifdef WASABI_COMPILE_LOCALES +api_locales *localesApi = NULL; +#endif + +#ifdef WASABI_COMPILE_TIMERS +timer_api *timerApi = NULL; +#endif + +#ifdef WASABI_COMPILE_WND +wnd_api *wndApi = NULL; +#endif + +#ifdef WASABI_COMPILE_WNDMGR +wndmgr_api *wndManagerApi = NULL; +#endif + +#ifdef WASABI_COMPILE_COMPONENTS +#endif + +#ifdef WASABI_COMPILE_METADB +#endif + +#ifdef WASABI_COMPILE_SCRIPT +api_maki *makiApi = NULL; +#endif + +#ifdef WASABI_COMPILE_SKIN +api_skin *skinApi; +#endif + +#ifdef WASABI_COMPILE_MAKIDEBUG +api_makiDebugger *debugApi = NULL; +#endif + +#ifdef WASABI_COMPILE_MEDIACORE +api_core *coreApi = NULL; +#endif + +#endif // ifdef WASABINOMAINAPI
\ No newline at end of file |