diff options
Diffstat (limited to 'src/modules/plugins/newplugins.cpp')
-rw-r--r-- | src/modules/plugins/newplugins.cpp | 151 |
1 files changed, 65 insertions, 86 deletions
diff --git a/src/modules/plugins/newplugins.cpp b/src/modules/plugins/newplugins.cpp index 9712f01d07..3c27b63f22 100644 --- a/src/modules/plugins/newplugins.cpp +++ b/src/modules/plugins/newplugins.cpp @@ -91,14 +91,24 @@ int equalUUID(const MUUID& u1, const MUUID& u2) return memcmp(&u1, &u2, sizeof(MUUID))?0:1;
}
+bool hasMuuid(const MUUID* p, const MUUID& uuid)
+{
+ if (p == NULL)
+ return false;
+
+ for (int i=0; !equalUUID(miid_last, p[i]); i++)
+ if ( equalUUID(uuid, p[i]))
+ return true;
+
+ return false;
+}
+
+
bool hasMuuid(const BASIC_PLUGIN_INFO& bpi, const MUUID& uuid)
{
- if (bpi.Interfaces) {
- MUUID *piface = bpi.Interfaces();
- for (int i=0; !equalUUID(miid_last, piface[i]); i++)
- if ( equalUUID(uuid, piface[i]))
- return true;
- }
+ if (bpi.Interfaces)
+ return hasMuuid(bpi.Interfaces, uuid);
+
return false;
}
@@ -162,13 +172,8 @@ MUUID miid_clist = MIID_CLIST; MUUID miid_database = MIID_DATABASE;
MUUID miid_servicemode = MIID_SERVICEMODE;
-static bool validInterfaceList(Miranda_Plugin_Interfaces ifaceProc)
+static bool validInterfaceList(MUUID *piface)
{
- // we don't need'em anymore in the common case
- if (ifaceProc == NULL)
- return true;
-
- MUUID *piface = ifaceProc();
if (piface == NULL)
return false;
@@ -256,7 +261,7 @@ int checkAPI(TCHAR* plugin, BASIC_PLUGIN_INFO* bpi, DWORD mirandaVersion, int ch bpi->Load = (Miranda_Plugin_Load) GetProcAddress(h, "Load");
bpi->Unload = (Miranda_Plugin_Unload) GetProcAddress(h, "Unload");
bpi->InfoEx = (Miranda_Plugin_InfoEx) GetProcAddress(h, "MirandaPluginInfoEx");
- bpi->Interfaces = (Miranda_Plugin_Interfaces) GetProcAddress(h, "MirandaPluginInterfaces");
+ bpi->Interfaces = (MUUID*) GetProcAddress(h, "MirandaInterfaces");
// if they were present
if ( !bpi->Load || !bpi->Unload || !bpi->InfoEx) {
@@ -367,42 +372,6 @@ static int valid_library_name(TCHAR *name) return 0;
}
-// returns true if the given file matches dbx_*.dll, which is used to LoadLibrary()
-static int validguess_db_name(TCHAR *name)
-{
- int rc = 0;
- // this is ONLY SAFE because name -> ffd.cFileName == MAX_PATH
- TCHAR x = name[4];
- name[4] = 0;
- rc = lstrcmpi(name, _T("dbx_")) == 0 || lstrcmpi(name, _T("dbrw")) == 0;
- name[4] = x;
- return rc;
-}
-
-// returns true if the given file matches clist_*.dll
-static int validguess_clist_name(TCHAR *name)
-{
- int rc = 0;
- // argh evil
- TCHAR x = name[6];
- name[6] = 0;
- rc = lstrcmpi(name, _T("clist_")) == 0;
- name[6] = x;
- return rc;
-}
-
-// returns true if the given file matches svc_*.dll
-static int validguess_servicemode_name(TCHAR *name)
-{
- int rc = 0;
- // argh evil
- TCHAR x = name[4];
- name[4] = 0;
- rc = lstrcmpi(name, _T("svc_")) == 0;
- name[4] = x;
- return rc;
-}
-
void enumPlugins(SCAN_PLUGINS_CALLBACK cb, WPARAM wParam, LPARAM lParam)
{
// get miranda's exe path
@@ -456,16 +425,27 @@ static INT_PTR PluginsEnum(WPARAM, LPARAM lParam) pluginEntry* OpenPlugin(TCHAR *tszFileName, TCHAR *dir, TCHAR *path)
{
- BASIC_PLUGIN_INFO bpi;
pluginEntry* p = (pluginEntry*)HeapAlloc(hPluginListHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, sizeof(pluginEntry));
_tcsncpy(p->pluginname, tszFileName, SIZEOF(p->pluginname));
- TCHAR buf[MAX_PATH];
- mir_sntprintf(buf, SIZEOF(buf), _T("%s\\%s\\%s"), path, dir, tszFileName);
+ // add it to the list anyway
+ pluginList.insert(p);
+
+ TCHAR tszFullPath[MAX_PATH];
+ mir_sntprintf(tszFullPath, SIZEOF(tszFullPath), _T("%s\\%s\\%s"), path, dir, tszFileName);
+
+ // map dll into the memory and check its exports
+ bool bIsPlugin = false;
+ mir_ptr<MUUID> pIds( GetPluginInterfaces(tszFullPath, bIsPlugin));
+ if ( !bIsPlugin) {
+ p->pclass |= PCLASS_FAILED; // piece of shit
+ return p;
+ }
- // plugin name suggests its a db module, load it right now
- if ( validguess_db_name(tszFileName)) {
- if (checkAPI(buf, &bpi, mirandaVersion, CHECKAPI_DB)) {
+ // plugin declared that it's a database. load it asap!
+ if ( hasMuuid(pIds, miid_database)) {
+ BASIC_PLUGIN_INFO bpi;
+ if (checkAPI(tszFullPath, &bpi, mirandaVersion, CHECKAPI_DB)) {
// db plugin is valid
p->pclass |= (PCLASS_DB | PCLASS_BASICAPI);
// copy the dblink stuff
@@ -478,14 +458,18 @@ pluginEntry* OpenPlugin(TCHAR *tszFileName, TCHAR *dir, TCHAR *path) // didn't have basic APIs or DB exports - failed.
p->pclass |= PCLASS_FAILED;
}
- else if ( validguess_clist_name(tszFileName)) {
+ // plugin declared that it's a contact list. mark it for the future load
+ else if ( hasMuuid(pIds, miid_clist)) {
// keep a note of this plugin for later
if (pluginListUI != NULL) p->nextclass = pluginListUI;
pluginListUI = p;
p->pclass |= PCLASS_CLIST;
}
- else if ( validguess_servicemode_name(tszFileName)) {
- if (checkAPI(buf, &bpi, mirandaVersion, CHECKAPI_NONE)) {
+ // plugin declared that it's a service mode plugin.
+ // load it for a profile manager's window
+ else if ( hasMuuid(pIds, miid_servicemode)) {
+ BASIC_PLUGIN_INFO bpi;
+ if (checkAPI(tszFullPath, &bpi, mirandaVersion, CHECKAPI_NONE)) {
p->pclass |= (PCLASS_OK | PCLASS_BASICAPI);
p->bpi = bpi;
if ( hasMuuid(bpi, miid_servicemode)) {
@@ -499,28 +483,9 @@ pluginEntry* OpenPlugin(TCHAR *tszFileName, TCHAR *dir, TCHAR *path) // didn't have basic APIs or DB exports - failed.
p->pclass |= PCLASS_FAILED;
}
-
- // add it to the list
- pluginList.insert(p);
return p;
}
-// called in the first pass to create pluginEntry* structures and validate database plugins
-static BOOL scanPluginsDir(WIN32_FIND_DATA *fd, TCHAR *path, WPARAM, LPARAM)
-{
- pluginEntry* p = OpenPlugin(fd->cFileName, _T("Plugins"), path);
- if ( !(p->pclass & PCLASS_FAILED)) {
- if (pluginList_freeimg == NULL && lstrcmpi(fd->cFileName, _T("advaimg.dll")) == 0)
- pluginList_freeimg = p;
-
- if (pluginList_crshdmp == NULL && lstrcmpi(fd->cFileName, _T("svc_crshdmp.dll")) == 0) {
- pluginList_crshdmp = p;
- p->pclass |= PCLASS_LAST;
- }
- }
-
- return TRUE;
-}
void SetPluginOnWhiteList(const TCHAR* pluginname, int allow)
{
@@ -572,7 +537,7 @@ bool TryLoadPlugin(pluginEntry *p, bool bDynamic) p->pclass |= PCLASS_OK | PCLASS_BASICAPI;
if (p->bpi.Interfaces) {
- MUUID *piface = bpi.Interfaces();
+ MUUID *piface = bpi.Interfaces;
for (int i=0; !equalUUID(miid_last, piface[i]); i++) {
int idx = getDefaultPluginIdx( piface[i] );
if (idx != -1 && pluginDefault[idx].pImpl) {
@@ -591,7 +556,7 @@ bool TryLoadPlugin(pluginEntry *p, bool bDynamic) p->pclass |= PCLASS_LOADED;
if (p->bpi.Interfaces) {
- MUUID *piface = bpi.Interfaces();
+ MUUID *piface = bpi.Interfaces;
for (int i=0; !equalUUID(miid_last, piface[i]); i++) {
int idx = getDefaultPluginIdx( piface[i] );
if (idx != -1)
@@ -744,7 +709,6 @@ void UnloadNewPlugins(void) } }
/////////////////////////////////////////////////////////////////////////////////////////
-//
// Loads all plugins
int LoadNewPluginsModule(void)
@@ -827,6 +791,22 @@ int LoadNewPluginsModule(void) // Plugins module initialization
// called before anything real is loaded, incl. database
+static BOOL scanPluginsDir(WIN32_FIND_DATA *fd, TCHAR *path, WPARAM, LPARAM)
+{
+ pluginEntry* p = OpenPlugin(fd->cFileName, _T("Plugins"), path);
+ if ( !(p->pclass & PCLASS_FAILED)) {
+ if (pluginList_freeimg == NULL && lstrcmpi(fd->cFileName, _T("advaimg.dll")) == 0)
+ pluginList_freeimg = p;
+
+ if (pluginList_crshdmp == NULL && lstrcmpi(fd->cFileName, _T("svc_crshdmp.dll")) == 0) {
+ pluginList_crshdmp = p;
+ p->pclass |= PCLASS_LAST;
+ }
+ }
+
+ return TRUE;
+}
+
int LoadNewPluginsModuleInfos(void)
{
bModuleInitialized = TRUE;
@@ -855,14 +835,13 @@ int LoadNewPluginsModuleInfos(void) void UnloadNewPluginsModule(void)
{
- int i;
-
- if ( !bModuleInitialized) return;
+ if ( !bModuleInitialized)
+ return;
UnloadPluginOptions();
// unload everything but the DB
- for (i = pluginList.getCount()-1; i >= 0; i--) {
+ for (int i = pluginList.getCount()-1; i >= 0; i--) {
pluginEntry* p = pluginList[i];
if ( !(p->pclass & PCLASS_DB) && p != pluginList_crshdmp)
Plugin_Uninit(p);
@@ -872,8 +851,8 @@ void UnloadNewPluginsModule(void) Plugin_Uninit(pluginList_crshdmp);
// unload the DB
- for (i = pluginList.getCount()-1; i >= 0; i--) {
- pluginEntry* p = pluginList[i];
+ for (int k = pluginList.getCount()-1; k >= 0; k--) {
+ pluginEntry* p = pluginList[k];
Plugin_Uninit(p);
}
|