mirror of
https://github.com/WinampDesktop/winamp.git
synced 2024-12-29 18:16:06 +00:00
250 lines
5 KiB
C++
250 lines
5 KiB
C++
#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
|
|
|