123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347 |
- // 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
|