diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Winamp/setup/setupfactory.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/Winamp/setup/setupfactory.cpp')
-rw-r--r-- | Src/Winamp/setup/setupfactory.cpp | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/Src/Winamp/setup/setupfactory.cpp b/Src/Winamp/setup/setupfactory.cpp new file mode 100644 index 00000000..fdb417ef --- /dev/null +++ b/Src/Winamp/setup/setupfactory.cpp @@ -0,0 +1,249 @@ +#include "./setupfactory.h" +#include <api/service/waservicefactorybase.h> +#include <api/service/services.h> +#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 <shlwapi.h> + +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 + |