diff options
Diffstat (limited to 'updater/scan.cpp')
-rw-r--r-- | updater/scan.cpp | 148 |
1 files changed, 50 insertions, 98 deletions
diff --git a/updater/scan.cpp b/updater/scan.cpp index 04cff9e..ff86172 100644 --- a/updater/scan.cpp +++ b/updater/scan.cpp @@ -35,6 +35,12 @@ const char* findAlternateShortName(const char* name) return NULL;
}
+bool valDllName(TCHAR* name)
+{
+ TCHAR *p = _tcsrchr(name, '.');
+ return p && _tcsicmp(p, _T(".dll")) == 0;
+}
+
void ScanPlugins(FilenameMap *fn_map, UpdateList *update_list)
{
if (!XMLDataAvailable(MC_PLUGINS)) return;
@@ -46,7 +52,6 @@ void ScanPlugins(FilenameMap *fn_map, UpdateList *update_list) Miranda_Plugin_Info_Ex dll_info_func_ex;
DWORD mirandaVersion = (DWORD)CallService(MS_SYSTEM_GETVERSION, 0, 0);
PLUGININFO *pluginInfo;
- HMODULE hModule;
GetModuleFileName(0, mir_exe, MAX_PATH);
@@ -67,13 +72,20 @@ void ScanPlugins(FilenameMap *fn_map, UpdateList *update_list) WIN32_FIND_DATA findData;
HANDLE hFileSearch = FindFirstFile(plugins_folder, &findData);
- if(hFileSearch != INVALID_HANDLE_VALUE)
+ if (hFileSearch != INVALID_HANDLE_VALUE)
{
do {
- _tcscpy(dll_name, findData.cFileName);
- hModule = GetModuleHandle(dll_path);
- bool notLoaded = hModule == NULL;
- if (notLoaded) hModule = LoadLibrary(dll_path);
+ HMODULE hModule = NULL;
+ bool notLoaded = false;
+ if (valDllName(findData.cFileName))
+ {
+ _tcscpy(dll_name, findData.cFileName);
+ if (hModule = GetModuleHandle(dll_path))
+ {
+ hModule = LoadLibrary(dll_path);
+ notLoaded = true;
+ }
+ }
if (hModule)
{
dll_info_func = (Miranda_Plugin_Info)GetProcAddress(hModule, "MirandaPluginInfo");
@@ -229,35 +241,31 @@ void ScanLangpacks(FilenameMap *fn_map, UpdateList *update_list) }
}
-
-
-bool RearrangeDlls(char *shortName, StrList &filenames)
+bool RearrangeDllsWorker(char *shortName, StrList &filenames, TCHAR *basedir)
{
bool dll_enabled = false;
-
- TCHAR file_path[MAX_PATH], updates_folder[MAX_PATH], new_filename[MAX_PATH];
- TCHAR *dll_name;
BYTE disabled_val;
+ TCHAR file_path[MAX_PATH];
+
Miranda_Plugin_Info dll_info_func;
Miranda_Plugin_Info_Ex dll_info_func_ex;
DWORD mirandaVersion = (DWORD)CallService(MS_SYSTEM_GETVERSION, 0, 0);
PLUGININFO *pluginInfo;
HMODULE hModule;
- mir_sntprintf(file_path, SIZEOF(file_path), _T("%s\\"), options.temp_folder);
- // set dll_name to point into the file_path string, at the point where we can write the plugin name
- // to end up with the full dll path
- dll_name = file_path + _tcslen(file_path);
-
// add filemask
- mir_sntprintf(updates_folder, SIZEOF(updates_folder), _T("%s\\*.dll"), options.temp_folder);
+ mir_sntprintf(file_path, SIZEOF(file_path), _T("%s\\*.dll"), basedir);
WIN32_FIND_DATA findData;
- HANDLE hFileSearch = FindFirstFile(updates_folder, &findData);
- if(hFileSearch != INVALID_HANDLE_VALUE) {
- do {
- if(hModule = LoadLibrary(file_path)) {
+ HANDLE hFileSearch = FindFirstFile(file_path, &findData);
+ if (hFileSearch != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ mir_sntprintf(file_path, SIZEOF(file_path), _T("%s\\%s"), basedir, findData.cFileName);
+ if (valDllName(findData.cFileName) && (hModule = LoadLibrary(file_path)))
+ {
dll_info_func = (Miranda_Plugin_Info)GetProcAddress(hModule, "MirandaPluginInfo");
dll_info_func_ex = (Miranda_Plugin_Info_Ex)GetProcAddress(hModule, "MirandaPluginInfoEx");
if((dll_info_func_ex && (pluginInfo = (PLUGININFO *)dll_info_func_ex(mirandaVersion))) || (dll_info_func && (pluginInfo = dll_info_func(mirandaVersion))))
@@ -271,14 +279,15 @@ bool RearrangeDlls(char *shortName, StrList &filenames) TCHAR* newname = NULL;
for (int j = 0; j < filenames.getCount(); j++)
{
+ TCHAR new_filename[MAX_PATH];
TCHAR* fileName = filenames[j];
- mir_sntprintf(new_filename, SIZEOF(new_filename), _T("%s\\%s"), options.temp_folder, fileName);
+ mir_sntprintf(new_filename, SIZEOF(new_filename), _T("%s\\%s"), basedir, fileName);
// disable any new plugins (i.e. not installed before) that somehome got into the
// dowloaded archives (e.g. loadavatars comes with loadavatarsw - installing both is not good!)
char *temp_str = mir_t2a(fileName);
disabled_val = DBGetContactSettingByte(0, "PluginDisable", temp_str, 255);
- if(disabled_val == 255) { // assume this means setting not in db (should be 1 or 0)
+ if (disabled_val == 255) { // assume this means setting not in db (should be 1 or 0)
DBWriteContactSettingByte(0, "PluginDisable", temp_str, 1);
disabled_val = 1;
}
@@ -286,98 +295,41 @@ bool RearrangeDlls(char *shortName, StrList &filenames) dll_enabled |= (disabled_val == 0);
- //MessageBox(0, new_filename, "New Filename", MB_OK);
- if (!moved) {
+ if (!moved)
+ {
if (_tcsicmp(findData.cFileName, fileName))
MoveFile(file_path, new_filename);
mir_free(newname); newname = mir_tstrdup(new_filename);
moved = true;
- } else {
- //char msg[2048];
- //sprintf(msg, "Copying %s to %s", newname.c_str(), new_filename);
- //MessageBox(0, msg, "msg", MB_OK);
+ } else
CopyFile(newname, new_filename, FALSE);
- }
}
mir_free(newname);
FreeLibrary(hModule);
break;
}
- } //else
- //MessageBox(0, _T("Library does not contain Miranda PluginInfo function"), findData.cFileName, MB_OK);
+ }
FreeLibrary(hModule);
- } //else
- //MessageBox(0, _T("File not loadable as library"), findData.cFileName, MB_OK);
- } while(FindNextFile(hFileSearch, &findData));
+ }
+ }
+ while(FindNextFile(hFileSearch, &findData));
FindClose(hFileSearch);
}
+ return dll_enabled;
+}
- // do exactly the same thing again, for the updates/plugins folder... :(
-
- _tcscpy(file_path, options.temp_folder);
- _tcscat(file_path, _T("\\Plugins\\"));
- dll_name = file_path + _tcslen(file_path);
-
- // add filemask
- _tcscpy(updates_folder, options.temp_folder);
- _tcscat(updates_folder, _T("\\Plugins\\*.dll"));
-
- hFileSearch = FindFirstFile(updates_folder, &findData);
- if(hFileSearch != INVALID_HANDLE_VALUE) {
- do {
- _tcscpy(dll_name, findData.cFileName);
- _tcslwr(findData.cFileName);
-
- if(hModule = LoadLibrary(file_path)) {
- dll_info_func = (Miranda_Plugin_Info)GetProcAddress(hModule, "MirandaPluginInfo");
- dll_info_func_ex = (Miranda_Plugin_Info_Ex)GetProcAddress(hModule, "MirandaPluginInfoEx");
- if((dll_info_func_ex && (pluginInfo = (PLUGININFO *)dll_info_func_ex(mirandaVersion))) || (dll_info_func && (pluginInfo = dll_info_func(mirandaVersion))))
- {
- const char* alternateName = findAlternateShortName(pluginInfo->shortName);
- if (alternateName == NULL) alternateName = pluginInfo->shortName;
-
- if (_stricmp(alternateName, shortName) == 0)
- {
- bool moved = false;
- TCHAR* newname = NULL;
- for (int j = 0; j < filenames.getCount(); j++)
- {
- TCHAR *fileName = filenames[j];
- mir_sntprintf(new_filename, SIZEOF(new_filename), _T("%s\\Plugins\\%s"), options.temp_folder, fileName);
- // disable any new plugins (i.e. not installed before) that somehome got into the
- // dowloaded archives (e.g. loadavatars comes with loadavatarsw - installing both is not good!)
- char *temp_str = mir_t2a(fileName);
- disabled_val = DBGetContactSettingByte(0, "PluginDisable", temp_str, 255);
- if(disabled_val == 255) { // assume this means setting not in db (should be 1 or 0)
- DBWriteContactSettingByte(0, "PluginDisable", temp_str, 1);
- disabled_val = 1;
- }
- mir_free(temp_str);
+bool RearrangeDlls(char *shortName, StrList &filenames)
+{
+ bool dll_enabled = false;
- dll_enabled |= (disabled_val == 0);
-
- if(!moved) {
- if (_tcsicmp(findData.cFileName, fileName) != 0)
- MoveFile(file_path, new_filename);
- mir_free(newname); newname = mir_tstrdup(new_filename);
- moved = true;
- } else
- CopyFile(newname, new_filename, FALSE);
- }
- mir_free(newname);
- FreeLibrary(hModule);
- break;
- }
- }
- FreeLibrary(hModule);
- }
- } while(FindNextFile(hFileSearch, &findData));
- FindClose(hFileSearch);
- }
+ TCHAR dir[MAX_PATH];
+ mir_sntprintf(dir, SIZEOF(dir), _T("%s\\Plugins"), options.temp_folder);
- return dll_enabled;
+ return
+ RearrangeDllsWorker(shortName, filenames, options.temp_folder) ||
+ RearrangeDllsWorker(shortName, filenames, dir);
}
bool RearrangeLangpacks(char *shortName, StrList &filenames)
|