/** (c) Nullsoft, Inc. C O N F I D E N T I A L ** Filename: ** Project: ** Description: ** Author: Ben Allison benski@nullsoft.com ** Created: **/ #include "Main.h" #include #include "VideoFeedFactory.h" #include "TagProvider.h" #include "Singleton.h" #include "Random.h" #include "DecodeFile.h" #include "Language.h" #include "ExplorerFindFile.h" #include "../config/config.h" #include "JSAPI2_Security.h" #include "GammaManagerAPI.h" #include "PaletteManager.h" #include "../nu/ServiceWatcher.h" #include "JSAPI2_Creator.h" #include "stats.h" #include "../nu/Singleton.h" #include "handler.h" ServiceWatcher serviceWatcher; api_playlistmanager *playlistManager=0; api_playlists *AGAVE_API_PLAYLISTS=0; api_language *WASABI_API_LNG=0; api_downloadManager *WAC_API_DOWNLOADMANAGER=0; api_skin *WASABI_API_SKIN=0; api_amgsucks *AGAVE_API_AMGSUCKS=0; api_albumart *AGAVE_API_ALBUMART=0; // ----- Services ----- api_service *serviceManager = 0; VideoTextFeed *videoTextFeed = 0; PlaylistTextFeed *playlistTextFeed = 0; TagProvider *tagProvider = 0; SysCallbacks *sysCallbacks = 0; MemoryManager *memoryManager = 0; GammaManagerAPI *gammaManager = 0; PaletteManager *paletteManager = 0; Metadata *metadata = 0; Application *application = 0; DecodeFile *decodeFile = 0; URLManager *AGAVE_API_URLMANAGER = 0; ThreadPool *WASABI_API_THREADPOOL = 0; WinampApi *WASABI_API_WINAMP = 0; Random random; WinampURIHandler winamp_uri_handler; Language *langManager = 0; ExplorerFindFile *explorerFindFileManager = 0; // ----- Service Factories ----- static VideoTextFeedFactory *videoTextFeedFactory = 0; static PlaylistTextFeedFactory *playlistTextFeedFactory = 0; //TagProviderFactory *tagProviderFactory = 0; static Singleton2 syscbsvc; static Singleton2 configSvc; Config config; static Singleton2 statsSvc; // this class is using the RAII concept (resource allocation is initialization) // it registers services in its constructor, and deregisters in the destructor class WinampServices { public: WinampServices() : memoryManagerFactory(memoryManager), metadataFactory(metadata), applicationFactory(application), randomFactory(&random, true), decodeFileFactory(decodeFile), languageFactory(langManager), ExplorerFindFileFactory(explorerFindFileManager), urlManagerFactory(AGAVE_API_URLMANAGER), jsapi2_securityFactory(&JSAPI2::security, true), gammaManagerFactory(gammaManager), paletteManagerFactory(paletteManager), threadPoolFactory(WASABI_API_THREADPOOL), winampFactory(WASABI_API_WINAMP) { WASABI_API_SVC->service_register(&jsapi2_creator_factory); WASABI_API_LNG = langManager; uriHandlerFactory.Register(WASABI_API_SVC, &winamp_uri_handler); } ~WinampServices() { WASABI_API_SVC->service_deregister(&jsapi2_creator_factory); uriHandlerFactory.Deregister(WASABI_API_SVC); } Singleton memoryManagerFactory; Singleton metadataFactory; Singleton applicationFactory; Singleton randomFactory; Singleton decodeFileFactory; Singleton languageFactory; Singleton ExplorerFindFileFactory; Singleton urlManagerFactory; Singleton jsapi2_securityFactory; Singleton gammaManagerFactory; Singleton paletteManagerFactory; Singleton threadPoolFactory; Singleton winampFactory; SingletonServiceFactory uriHandlerFactory; JSAPI2CreatorFactory jsapi2_creator_factory; }; WinampServices *services=0; namespace Wasabi { bool loaded = false; } void Wasabi_Load() { if (!Wasabi::loaded) { RegisterConfigGroups(); // TODO: this isn't the best place to set up this config stuff, but it's going here now 'cause it's convienent serviceManager = new ServiceManager; syscbsvc.RegisterNew(sysCallbacks); configSvc.Register(&config); statsSvc.Register(&stats); services = new WinampServices(); videoTextFeed = new VideoTextFeed; serviceManager->service_register(videoTextFeedFactory = new VideoTextFeedFactory); playlistTextFeed = new PlaylistTextFeed; serviceManager->service_register(playlistTextFeedFactory = new PlaylistTextFeedFactory); tagProvider = new TagProvider; //serviceManager->service_register(tagProviderFactory = new TagProviderFactory); // watch for services that might be loaded later by plugins serviceWatcher.WatchWith(serviceManager); serviceWatcher.WatchFor(&WASABI_API_SKIN, skinApiServiceGuid); // register for service callbacks in case any of these don't exist yet WASABI_API_SYSCB->syscb_registerCallback(&serviceWatcher); Wasabi::loaded = true; } } void Wasabi_Unload() { if (Wasabi::loaded) { //delete textFeeds; //textFeeds=0; serviceWatcher.StopWatching(); serviceWatcher.Clear(); // serviceManager->service_deregister(tagProviderFactory); serviceManager->service_deregister(videoTextFeedFactory); serviceManager->service_deregister(playlistTextFeedFactory); // delete tagProviderFactory; tagProviderFactory = 0; delete videoTextFeedFactory; videoTextFeedFactory = 0; delete playlistTextFeedFactory; playlistTextFeedFactory = 0; delete tagProvider; tagProvider = 0; delete videoTextFeed; videoTextFeed = 0; delete playlistTextFeed; playlistTextFeed = 0; WASABI_API_THREADPOOL->Kill(); delete services; configSvc.Deregister(); statsSvc.Deregister(); syscbsvc.Deregister(); // delete this last delete static_cast(serviceManager); serviceManager = 0; Wasabi::loaded = false; } } // other people's services that we might be interested in api_tagz *WINAMP5_API_TAGZ = 0; void Wasabi_FindSystemServices() { waServiceFactory *sf; sf = WASABI_API_SVC->service_getServiceByGuid(tagzGUID); if (sf) WINAMP5_API_TAGZ = (api_tagz *)sf->getInterface(); sf = WASABI_API_SVC->service_getServiceByGuid(api_playlistmanagerGUID); if (sf) AGAVE_API_PLAYLISTMANAGER = (api_playlistmanager *)sf->getInterface(); sf = WASABI_API_SVC->service_getServiceByGuid(DownloadManagerGUID); if (sf) WAC_API_DOWNLOADMANAGER = (api_downloadManager *)sf->getInterface(); sf = WASABI_API_SVC->service_getServiceByGuid(amgSucksGUID); if (sf) AGAVE_API_AMGSUCKS = (api_amgsucks *)sf->getInterface(); sf = WASABI_API_SVC->service_getServiceByGuid(api_playlistsGUID); if (sf) AGAVE_API_PLAYLISTS = (api_playlists *)sf->getInterface(); sf = WASABI_API_SVC->service_getServiceByGuid(albumArtGUID); if (sf) AGAVE_API_ALBUMART = (api_albumart *)sf->getInterface(); } void Wasabi_ForgetSystemServices() { waServiceFactory *sf; if (WINAMP5_API_TAGZ) { sf = WASABI_API_SVC->service_getServiceByGuid(tagzGUID); if (sf) sf->releaseInterface(WINAMP5_API_TAGZ); WINAMP5_API_TAGZ = 0; } if (AGAVE_API_PLAYLISTMANAGER) { sf = WASABI_API_SVC->service_getServiceByGuid(api_playlistmanagerGUID); if (sf) sf->releaseInterface(AGAVE_API_PLAYLISTMANAGER); AGAVE_API_PLAYLISTMANAGER = 0; } if (WAC_API_DOWNLOADMANAGER) { sf = WASABI_API_SVC->service_getServiceByGuid(DownloadManagerGUID); if (sf) sf->releaseInterface(WAC_API_DOWNLOADMANAGER); WAC_API_DOWNLOADMANAGER = 0; } if (WASABI_API_SKIN) { sf = WASABI_API_SVC->service_getServiceByGuid(skinApiServiceGuid); if (sf) sf->releaseInterface(WASABI_API_SKIN); WASABI_API_SKIN = 0; } if (AGAVE_API_AMGSUCKS) { sf = WASABI_API_SVC->service_getServiceByGuid(amgSucksGUID); if (sf) sf->releaseInterface(AGAVE_API_AMGSUCKS); AGAVE_API_AMGSUCKS = 0; } if (AGAVE_API_PLAYLISTS) { sf = WASABI_API_SVC->service_getServiceByGuid(api_playlistsGUID); if (sf) sf->releaseInterface(AGAVE_API_PLAYLISTS); AGAVE_API_PLAYLISTS = 0; } if (AGAVE_API_ALBUMART) { sf = WASABI_API_SVC->service_getServiceByGuid(albumArtGUID); if (sf) sf->releaseInterface(AGAVE_API_ALBUMART); AGAVE_API_ALBUMART = 0; } }