winamp/Src/Wasabi/api/apiinit.cpp

548 lines
13 KiB
C++

#include "./wndmgr/layout.h"
#include <tataki/export.h>
//<?#include "<class data="implementationheader"/>"
#include "apiinit.h"
//?>
#include <api/memmgr/api_memmgr.h>
#define WASABI_SAYMYNAME
#include <wasabicfg.h>
#undef WASABI_SAYMYNAME
#include <api/service/servicei.h>
#include <api/locales/api_localesi.h>
#include <api/config/api_configi.h>
#include <api/config/items/cfgitem.h>
#ifdef WASABI_COMPILE_FONTS
#include <api/font/FontCreator.h>
#include <api/font/fontapi.h>
#endif
#include <api/skin/skinapi.h>
#include <api/skin/groupwndcreate.h>
#include <api/script/makiapi.h>
#include <api/script/objecttable.h>
#include <api/wnd/wndapi.h>
#include <api/wnd/wndclass/foreignwnd.h>
#include <api/wnd/wndclass/clickwnd.h>
#include <api/imgldr/imgldrapi.h>
#ifdef WASABI_COMPILE_FONTS
#ifdef WIN32
# include <api/font/win32/truetypefont_win32.h>
#elif defined(LINUX)
# include <api/font/linux/truetypefont_linux.h>
#else
# error port me
#endif // platform
#endif // fonts
#include <api/wndmgr/wndmgrapi.h>
#ifdef WASABI_COMPILE_MAKIDEBUG
#include <api/script/debugger/debugapi.h>
#endif
#ifdef WASABI_COMPILE_MAKIDEBUG
#include <api/core/api_core.h>
#endif
#ifdef WASABI_COMPILE_FILEREADER
#include <api/filereader/filereaderapi.h>
#ifdef WASABI_COMPILE_ZIPREADER
#include <api/filereader/zip/zipread.h>
#endif
#endif
#ifdef WASABI_COMPILE_LINUX
#include <api/linux/api_linuxi.h>
#endif
#ifdef WASABI_COMPILE_TEXTMODE
#if defined(WIN32)
#include <api/textmode/textmode_win32.h>
#elif defined(LINUX)
#include <api/textmode/textmode_ncurses.h>
#else // dummy
#include <api/textmode/api_textmodeI.h>
#endif
#endif
#if defined(WASABI_COMPILE_COMPONENTS) | defined(GEN_FF) // MULTIAPI-FIXME
#include <api/wac/compon.h>
#endif
#include <api/wndmgr/gc.h>
#include <api/application/api_application.h>
#ifndef WASABI_CUSTOM_MODULE_SVCMGR
DECLARE_MODULE_SVCMGR;
#endif
#ifdef _WIN32
extern HINSTANCE hInstance;
#endif
extern StringW g_resourcepath;
api_application *applicationApi = NULL;
timer_api *timerApi = NULL;
int ApiInit::init(OSMODULEHANDLE hinstance, OSWINDOWHANDLE mainwnd, api_service *wa5_svc)
{
Tataki::Init(wa5_svc);
serviceApi = wa5_svc;
initcount++;
#ifndef WA3COMPATIBILITY
// ------------------------------------------------------------------------
// Init callback system
// ------------------------------------------------------------------------
waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(syscbApiServiceGuid);
if (sf) sysCallbackApi = reinterpret_cast<api_syscb *>(sf->getInterface());
// ------------------------------------------------------------------------
// Init application API
// ------------------------------------------------------------------------
sf = WASABI_API_SVC->service_getServiceByGuid(applicationApiServiceGuid);
if (sf) applicationApi = reinterpret_cast<api_application *>(sf->getInterface());
g_resourcepath = StringPathCombine(WASABI_API_APP->path_getAppPath(), WASABI_RESOURCES_SUBDIRECTORY);
// ------------------------------------------------------------------------
// Init centralized memory manager api
// ------------------------------------------------------------------------
sf = WASABI_API_SVC->service_getServiceByGuid(memMgrApiServiceGuid);
if (sf) WASABI_API_MEMMGR = reinterpret_cast<api_memmgr *>(sf->getInterface());
#ifdef WASABI_COMPILE_FILEREADER
// ------------------------------------------------------------------------
// Init file reader api and optional file readers
// ------------------------------------------------------------------------
fr = new FileReaderApi();
fileApi = fr;
WASABI_API_SVC->service_register(frapisvc = new FileReaderApiService());
//WASABI_API_SVC->service_register(&diskReader);
// set up custom file readers
#ifdef WASABI_COMPILE_ZIPREADER
zipRead = new waServiceTSingle<svc_fileReader, ZipRead>;
#endif
#ifdef WASABI_COMPILE_ZIPREADER
WASABI_API_SVC->service_register(zipRead);
#endif
#endif // WASABI_COMPILE_FILEREADER
// ------------------------------------------------------------------------
// Init config api and register optional config items
// ------------------------------------------------------------------------
#ifdef WASABI_COMPILE_CONFIG
cfg = new api_configI();
configApi = cfg;
WASABI_API_SVC->service_register(cfgapisvc = new ConfigApiService());
#endif
// if no static service was ever declared, we need to init it so we don't hit null
INIT_MODULE_SVCMGR();
DebugStringW(L"Auto-initializing %d services (system pass)\n", staticServiceMgr->__m_modules2.getNumItems());
MODULE_SVCMGR_ONINIT2();
#ifdef WASABI_COMPILE_IMGLDR
// ------------------------------------------------------------------------
// Init image loading api and optional image formats
// ------------------------------------------------------------------------
img = new ImgLdrApi();
imgLoaderApi = img;
WASABI_API_SVC->service_register(imgldrapisvc = new ImgLdrApiService());
#endif
#ifdef WASABI_COMPILE_FONTS
// ------------------------------------------------------------------------
// Init font rendering api
// ------------------------------------------------------------------------
font = new FontApi();
fontApi = font;
win32Font = new FontCreator<TrueTypeFont_Win32>;
WASABI_API_SVC->service_register(win32Font);
WASABI_API_SVC->service_register(fontapisvc = new FontApiService());
#endif
#ifdef WASABI_COMPILE_LOCALES
// ------------------------------------------------------------------------
// Init localization
// ------------------------------------------------------------------------
loc = new api_localesI();
localesApi = loc;
WASABI_API_SVC->service_register(localesapisvc = new LocalesApiService());
#endif
// ------------------------------------------------------------------------
// Init timer api
// ------------------------------------------------------------------------
sf = WASABI_API_SVC->service_getServiceByGuid(timerApiServiceGuid);
if (sf) timerApi = reinterpret_cast<timer_api *>(sf->getInterface());
#ifdef WASABI_COMPILE_WND
// ------------------------------------------------------------------------
// Init window api
// ------------------------------------------------------------------------
wnd = new WndApi();
wndApi = wnd;
#ifdef _WIN32
if (mainwnd != NULL)
{
mainWnd = new ForeignWnd(mainwnd, hInstance);
DebugStringW(L"main wnd handle is %x\n", mainWnd->gethWnd());
wnd->main_setRootWnd(mainWnd);
}
else
{
default_mainWnd = new ClickWnd();
default_mainWnd->init(hInstance, NULL, TRUE);
wnd->main_setRootWnd(default_mainWnd);
}
#endif
WASABI_API_SVC->service_register(wndapisvc = new WndApiService());
#endif
// ------------------------------------------------------------------------
// Init media core api
// ------------------------------------------------------------------------
#ifdef WASABI_COMPILE_MEDIACORE
#ifndef WA3COMPATIBILITY
#ifdef WASABI_CUSTOMIMPL_MEDIACORE
coreApi = createCustomCoreApi();
#else
#error "not done yet"
#endif
#endif
WASABI_API_SVC->service_register(coreapisvc = new CoreApiService());
#endif
#ifdef WASABI_COMPILE_WNDMGR
// ------------------------------------------------------------------------
// Init window manager api
// ------------------------------------------------------------------------
wndmgr = new WndMgrApi ();
wndManagerApi = wndmgr;
WASABI_API_SVC->service_register(wndmgrapisvc = new WndMgrApiService());
#endif
#ifdef WASABI_COMPILE_SKIN
// ------------------------------------------------------------------------
// Init skin
// ------------------------------------------------------------------------
skin = new SkinApi();
skinApi = skin;
#ifdef WASABI_COMPILE_COMPONENTS
groupcreate = new waServiceTSingle<svc_windowCreate, GroupWndCreateSvc>;
WASABI_API_SVC->service_register(groupcreate);
#endif
WASABI_API_SVC->service_register(skinapisvc = new SkinApiService());
#endif
#ifdef WASABI_COMPILE_MAKIDEBUG
// ------------------------------------------------------------------------
// Init script debugger api
// ------------------------------------------------------------------------
debug = new MakiDebuggerApi();
debugApi = debug;
WASABI_API_SVC->service_register(makidebugapisvc = new MakiDebugApiService());
#endif
#ifdef WASABI_COMPILE_SKIN
widgets = new Widgets();
#endif
#endif
DebugStringW(L"Auto-initializing %d services (user pass)\n", staticServiceMgr->__m_modules.getNumItems());
MODULE_SVCMGR_ONINIT();
#ifndef WA3COMPATIBILITY
#ifdef WASABI_COMPILE_SCRIPT
// ------------------------------------------------------------------------
// Init scripting api
// ------------------------------------------------------------------------
maki = new api_makiI();
makiApi = maki;
WASABI_API_SVC->service_register(makiapisvc = new MakiApiService());
maki->init();
#ifdef WASABI_COMPILE_WNDMGR
garbageCollector = new GarbageCollector();
#endif
ObjectTable::start();
#endif
#endif //wa3compat
return 1; // success
}
int ApiInit::shutdown()
{
#ifndef WA3COMPATIBILITY
garbageCollector->gccb_onGarbageCollect();
delete garbageCollector;
#ifdef WASABI_COMPILE_SKIN
skin->preShutdown();
#endif
MODULE_SVCMGR_ONSHUTDOWN();
#ifdef _WIN32
ComponentManager::unloadAll();
#else
#warning port me?
#endif
WASABI_API_SVC->service_deregister(skinapisvc);
delete skin;
skinApi = NULL;
delete skinapisvc;
skinapisvc = 0;
#ifdef WASABI_COMPILE_SCRIPT
ObjectTable::shutdown();
#endif
#ifdef WASABI_COMPILE_SKIN
delete widgets;
widgets = NULL;
#endif
WASABI_API_SVC->service_deregister(makiapisvc);
delete maki;
makiApi = NULL;
delete makiapisvc;
makiapisvc = 0;
#ifdef WASABI_COMPILE_COMPONENTS
WASABI_API_SVC->service_deregister(groupcreate);
delete groupcreate;
groupcreate = 0;
#endif
WASABI_API_SVC->service_deregister(win32Font);
delete win32Font;
win32Font = 0;
#ifdef WASABI_COMPILE_MEDIACORE
#ifndef WA3COMPATIBILITY
#ifdef WASABI_CUSTOMIMPL_MEDIACORE
destroyCustomCoreApi(coreApi);
#else
#error "not done yet"
#endif
#endif
WASABI_API_SVC->service_deregister(coreapisvc);
delete coreapisvc;
coreapisvc = 0;
#endif
WASABI_API_SVC->service_deregister(wndmgrapisvc);
delete wndmgr;
wndManagerApi = NULL;
delete wndmgrapisvc;
wndmgrapisvc = 0;
delete loc;
localesApi = NULL;
WASABI_API_SVC->service_deregister(localesapisvc);
delete localesapisvc;
localesapisvc = 0;
#ifdef WASABI_COMPILE_FILEREADER
#ifdef WASABI_COMPILE_ZIPREADER
WASABI_API_SVC->service_deregister(zipRead);
delete zipRead;
#endif
delete fr;
fileApi = NULL;
WASABI_API_SVC->service_deregister(frapisvc);
delete frapisvc;
frapisvc = 0;
#endif
#endif
delete mainWnd;
mainWnd = NULL;
delete default_mainWnd;
default_mainWnd = NULL;
WASABI_API_SVC->service_deregister(wndapisvc);
delete wnd;
wndApi = NULL;
delete wndapisvc;
wndapisvc = 0;
#ifdef WASABI_COMPILE_FONTS
WASABI_API_SVC->service_deregister(fontapisvc);
delete font;
fontApi = NULL;
delete fontapisvc;
fontapisvc = 0;
#endif
#ifndef WA3COMPATIBILITY
delete img;
imgLoaderApi = NULL;
WASABI_API_SVC->service_deregister(imgldrapisvc);
delete imgldrapisvc;
imgldrapisvc = 0;
#ifdef WASABI_COMPILE_CONFIG
WASABI_API_SVC->service_deregister(cfgapisvc);
delete cfg;
configApi = NULL;
delete cfgapisvc;
cfgapisvc = 0;
#endif
MODULE_SVCMGR_ONSHUTDOWN2();
WASABI_API_MEMMGR = NULL;
applicationApi=NULL;
#endif //wa3compatibility
#ifdef WASABI_COMPILE_MAKIDEBUG
delete debug;
debugApi = NULL;
WASABI_API_SVC->service_deregister(makidebugapisvc);
delete makidebugapisvc;
makidebugapisvc = 0;
#endif
if (alphaMgr)
delete alphaMgr;
alphaMgr=0;
// TODO: releaseInterface
timerApi = NULL;
Tataki::Quit();
sysCallbackApi = NULL;
return 1; // success
}
int ApiInit::getInitCount()
{
return initcount;
}
#ifdef WASABI_COMPILE_SKIN
#ifdef WASABI_COMPILE_COMPONENTS
waServiceFactoryI * ApiInit::groupcreate = NULL;
#endif
#endif //WASABI_COMPILE_SKIN
#ifdef WASABI_COMPILE_FONTS
waServiceFactoryI * ApiInit::win32Font = NULL;
FontApiService *ApiInit::fontapisvc = NULL;
#endif //WASABI_COMPILE_FONTS
#ifdef WASABI_COMPILE_SKIN
Widgets * ApiInit::widgets = NULL;
SkinApiService *ApiInit::skinapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_CONFIG
api_configI * ApiInit::cfg = NULL;
ConfigApiService *ApiInit::cfgapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_IMGLDR
ImgLdrApi * ApiInit::img = NULL;
ImgLdrApiService *ApiInit::imgldrapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_FONTS
FontApi * ApiInit::font = NULL;
#endif
#ifdef WASABI_COMPILE_FILEREADER
FileReaderApi * ApiInit::fr = NULL;
#ifdef WASABI_COMPILE_ZIPREADER
waServiceFactoryI * ApiInit::zipRead = NULL;
#endif
FileReaderApiService *ApiInit::frapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_LOCALES
api_localesI * ApiInit::loc = NULL;
LocalesApiService *ApiInit::localesapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_WND
WndApi * ApiInit::wnd = NULL;
ForeignWnd * ApiInit::mainWnd = NULL;
ClickWnd * ApiInit::default_mainWnd = NULL;
WndApiService *ApiInit::wndapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_WNDMGR
WndMgrApi * ApiInit::wndmgr = NULL;
WndMgrApiService *ApiInit::wndmgrapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_SCRIPT
api_makiI * ApiInit::maki = NULL;
MakiApiService *ApiInit::makiapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_SKIN
SkinApi * ApiInit::skin = NULL;
#endif
#ifdef WASABI_COMPILE_MAKIDEBUG
MakiDebuggerApi * ApiInit::debug = NULL;
MakiDebugApiService *ApiInit::makidebugapisvc = NULL;
#endif
#ifdef WASABI_COMPILE_MEDIACORE
CoreApiService *ApiInit::coreapisvc = NULL;
#endif
int ApiInit::initcount = 0;
api_memmgr *memmgrApi = NULL;