diff options
Diffstat (limited to 'Src/Winamp/Wasabi.cpp')
-rw-r--r-- | Src/Winamp/Wasabi.cpp | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/Src/Winamp/Wasabi.cpp b/Src/Winamp/Wasabi.cpp new file mode 100644 index 00000000..5236ae50 --- /dev/null +++ b/Src/Winamp/Wasabi.cpp @@ -0,0 +1,292 @@ +/** (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 <api.h> + +#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<api_syscb, SysCallbacks> syscbsvc; +static Singleton2<api_config, Config> configSvc; +Config config; +static Singleton2<api_stats, Stats> 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<api_memmgr, MemoryManager> memoryManagerFactory; + Singleton<api_metadata, Metadata> metadataFactory; + Singleton<api_application, Application> applicationFactory; + Singleton<api_random, Random> randomFactory; + Singleton<api_decodefile, DecodeFile> decodeFileFactory; + Singleton<api_language, Language> languageFactory; + Singleton<api_explorerfindfile, ExplorerFindFile> ExplorerFindFileFactory; + Singleton<api_urlmanager, URLManager> urlManagerFactory; + Singleton<JSAPI2::api_security, JSAPI2::Security> jsapi2_securityFactory; + Singleton<api_colorthemes, GammaManagerAPI> gammaManagerFactory; + Singleton<api_palette, PaletteManager> paletteManagerFactory; + Singleton<api_threadpool, ThreadPool> threadPoolFactory; + Singleton<api_winamp, WinampApi> winampFactory; + + SingletonServiceFactory<svc_urihandler, WinampURIHandler> 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); + 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; + } +}
\ No newline at end of file |