aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/setup/setupfactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/setup/setupfactory.cpp')
-rw-r--r--Src/Winamp/setup/setupfactory.cpp249
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
+