#include "./setupfactory.h" #include #include #include "api.h" #include "gen.h" #include "main.h" #define GUID_DEFINE #include "./setup.h" #undef GUID_DEFINE //#include "./spage_lang.h" //#include "./spage_connect.h" #include "./spage_skin.h" #include "./spage_assoc.h" //#include "./spage_feedback.h" #include "./sjob_register.h" #include class setup_factory : public waServiceFactory { public: setup_factory(); virtual ~setup_factory(); public: int AddRef(); int Release(); FOURCC GetServiceType(); const char *GetServiceName(); GUID GetGUID(); void *GetInterface(int global_lock); int SupportNonLockingInterface(); int ReleaseInterface(void *ifc); const char *GetTestString(); int ServiceNotify(int msg, int param1, int param2); private: int ref; svc_setup *psvcSetup; protected: RECVS_DISPATCH; }; #ifdef __cplusplus extern "C" { #endif // __cplusplus BOOL Setup_RegisterService(void) { setup_factory *psf = new setup_factory(); WASABI_API_SVC->service_register(psf); return (0 != psf->Release()); } int Setup_RegisterDefault(void) { waServiceFactory *psf = WASABI_API_SVC->service_getServiceByGuid(UID_SVC_SETUP); if (!psf) return 0; svc_setup *pSvc = (svc_setup*)psf->getInterface(); if (pSvc) { int index = 0; ifc_setuppage *pp; ifc_setupjob *pj; // pp = new setup_page_lang(); // if (pp) { pSvc->InsertPage(pp, &index); pp->Release(); } pp = new setup_page_skin(); if (pp) { pSvc->InsertPage(pp, &++index); pp->Release(); } // pp = new setup_page_connect(); // if (pp) { pSvc->InsertPage(pp, &++index); pp->Release(); } pp = new setup_page_assoc(); if (pp) { pSvc->InsertPage(pp, &++index); pp->Release(); } // disabled for 5.66 // pp = new setup_page_feedback(); // if (pp) { pSvc->InsertPage(pp, &++index); pp->Release(); } pj = new setup_job_register(); if (pj) { pSvc->AddJob(pj); pj->Release(); } pSvc->Release(); return 1; } return 0; } int Setup_RegisterPlugins(void) { wchar_t dirstr[MAX_PATH] = {0}; WIN32_FIND_DATAW d = {0}; PathCombineW(dirstr, PLUGINDIR, L"GEN_*.DLL"); HANDLE h = FindFirstFileW(dirstr,&d); if (h != INVALID_HANDLE_VALUE) { do { wchar_t temp[MAX_PATH] = {0}; PathCombineW(temp, PLUGINDIR, d.cFileName); HINSTANCE hLib = LoadLibraryW(temp); if (hLib) { winampGeneralPurposePluginGetter pr = (winampGeneralPurposePluginGetter) GetProcAddress(hLib,"winampGetGeneralPurposePlugin"); if (pr) { Plugin_RegisterSetup fn = (Plugin_RegisterSetup)GetProcAddress(hLib, "RegisterSetup"); if (NULL == fn || FALSE == fn(hLib, WASABI_API_SVC)) { winampGeneralPurposePlugin *plugin = pr(); if (plugin && (plugin->version == GPPHDR_VER || plugin->version == GPPHDR_VER_U)) { char desc[128] = {0}; lstrcpynA(desc, plugin->description, sizeof(desc)); if (desc[0] && !memcmp(desc, "nullsoft(", 9)) { // we'll let this leak for all 3rd party plug-ins as some crash during // setup when we try to unload the plug-in e.g gen_Wake_up_call.dll FreeModule(hLib); } } } } } } while (FindNextFileW(h,&d)); FindClose(h); } return 1; } #ifdef __cplusplus } #endif // __cplusplus setup_factory::setup_factory() : ref(1), psvcSetup(NULL) { } setup_factory::~setup_factory() { if (NULL != psvcSetup) { psvcSetup->Release(); } } int setup_factory::AddRef(void) { return ++ref; } int setup_factory::Release(void) { if (1 == ref) { delete(this); return 0; } return --ref; } FOURCC setup_factory::GetServiceType() { return WaSvc::UNIQUE; } const char *setup_factory::GetServiceName() { return "Setup Service"; } GUID setup_factory::GetGUID() { return UID_SVC_SETUP; } int setup_factory::SupportNonLockingInterface() { return 1; } const char *setup_factory::GetTestString() { return NULL; } int setup_factory::ServiceNotify(int msg, int param1, int param2) { switch(msg) { case SvcNotify::ONREGISTERED: AddRef(); break; case SvcNotify::ONDEREGISTERED: Release(); break; } return 1; } void *setup_factory::GetInterface(int global_lock) { if (NULL == psvcSetup) { psvcSetup = WASetup::CreateInstance(); if (NULL == psvcSetup) return NULL; } psvcSetup->AddRef(); return psvcSetup; } int setup_factory::ReleaseInterface(void *ifc) { if (ifc == psvcSetup && NULL != psvcSetup) { if (0 == psvcSetup->Release()) psvcSetup = NULL; } return 1; } #ifdef CBCLASS #undef CBCLASS #endif #define CBCLASS setup_factory START_DISPATCH CB(ADDREF, AddRef) CB(RELEASE, Release) CB(WASERVICEFACTORY_GETSERVICETYPE, GetServiceType) CB(WASERVICEFACTORY_GETSERVICENAME, GetServiceName) CB(WASERVICEFACTORY_GETGUID, GetGUID) CB(WASERVICEFACTORY_GETINTERFACE, GetInterface) CB(WASERVICEFACTORY_SUPPORTNONLOCKINGGETINTERFACE, SupportNonLockingInterface) CB(WASERVICEFACTORY_RELEASEINTERFACE, ReleaseInterface) CB(WASERVICEFACTORY_GETTESTSTRING, GetTestString) CB(WASERVICEFACTORY_SERVICENOTIFY, ServiceNotify) END_DISPATCH