292 lines
8.1 KiB
C++
292 lines
8.1 KiB
C++
|
/** (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;
|
||
|
}
|
||
|
}
|