diff options
author | George Hazan <george.hazan@gmail.com> | 2012-08-04 19:32:05 +0000 |
---|---|---|
committer | George Hazan <george.hazan@gmail.com> | 2012-08-04 19:32:05 +0000 |
commit | 7dadddb7b4f9f6a0e2ee4ba9d7b78d61edc5ab0d (patch) | |
tree | 9ef7d58326d57c5c7a5aabd7de63fedf64960a73 | |
parent | c4be319c2fc418026b542976083a04a35c31f84d (diff) |
scanner separated from utils
git-svn-id: http://svn.miranda-ng.org/main/trunk@1357 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
-rw-r--r-- | plugins/PluginUpdater/PluginUpdater_10.vcxproj | 1 | ||||
-rw-r--r-- | plugins/PluginUpdater/PluginUpdater_10.vcxproj.filters | 3 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/Scanner.cpp | 212 | ||||
-rw-r--r-- | plugins/PluginUpdater/src/Utils.cpp | 193 |
4 files changed, 218 insertions, 191 deletions
diff --git a/plugins/PluginUpdater/PluginUpdater_10.vcxproj b/plugins/PluginUpdater/PluginUpdater_10.vcxproj index ce340b3835..c2276fca33 100644 --- a/plugins/PluginUpdater/PluginUpdater_10.vcxproj +++ b/plugins/PluginUpdater/PluginUpdater_10.vcxproj @@ -205,6 +205,7 @@ <ClCompile Include="src\PluginUpdater.cpp">
<PrecompiledHeader>Create</PrecompiledHeader>
</ClCompile>
+ <ClCompile Include="src\Scanner.cpp" />
<ClCompile Include="src\unzipfile.cpp" />
<ClCompile Include="src\Utils.cpp" />
</ItemGroup>
diff --git a/plugins/PluginUpdater/PluginUpdater_10.vcxproj.filters b/plugins/PluginUpdater/PluginUpdater_10.vcxproj.filters index b22edcde74..595ed68903 100644 --- a/plugins/PluginUpdater/PluginUpdater_10.vcxproj.filters +++ b/plugins/PluginUpdater/PluginUpdater_10.vcxproj.filters @@ -91,6 +91,9 @@ <ClCompile Include="src\Minizip\unzip.c">
<Filter>Source Files\Minizip</Filter>
</ClCompile>
+ <ClCompile Include="src\Scanner.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="res\menu.ico">
diff --git a/plugins/PluginUpdater/src/Scanner.cpp b/plugins/PluginUpdater/src/Scanner.cpp new file mode 100644 index 0000000000..369c98e3fc --- /dev/null +++ b/plugins/PluginUpdater/src/Scanner.cpp @@ -0,0 +1,212 @@ +/*
+Copyright (C) 2010 Mataes
+
+This is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public
+License as published by the Free Software Foundation; either
+version 2 of the License, or (at your option) any later version.
+
+This is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with this file; see the file license.txt. If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.
+*/
+
+#include "Common.h"
+
+int CalculateModuleHash(const TCHAR* tszFileName, char* dest);
+
+static BYTE IsPluginDisabled(const char *filename)
+{
+ return DBGetContactSettingByte(NULL, "PluginDisable", filename, 0);
+}
+
+static bool Exists(LPCTSTR strName)
+{
+ return GetFileAttributes(strName) != INVALID_FILE_ATTRIBUTES;
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+
+typedef map<string, string> hashMap;
+typedef pair<string, string> hashItem;
+
+static void ScanFolder(const TCHAR* tszFolder, const TCHAR* tszBaseUrl, hashMap& hashes, vector<FILEINFO>& UpdateFiles)
+{
+ TCHAR tszMask[MAX_PATH], tszFileBack[MAX_PATH];
+ mir_sntprintf(tszMask, SIZEOF(tszMask), _T("%s\\*"), tszFolder);
+ mir_sntprintf(tszFileBack, SIZEOF(tszFileBack), _T("%s\\Backups"), tszRoot);
+
+ WIN32_FIND_DATA ffd;
+ HANDLE hFind = FindFirstFile(tszMask, &ffd);
+ if (hFind == INVALID_HANDLE_VALUE)
+ return;
+
+ do {
+ if ( !_tcscmp(ffd.cFileName, _T(".")) || !_tcscmp(ffd.cFileName, _T("..")))
+ continue;
+
+ if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+ mir_sntprintf(tszMask, SIZEOF(tszMask), _T("%s\\%s"), tszFolder, ffd.cFileName);
+ ScanFolder(tszMask, tszBaseUrl, hashes, UpdateFiles);
+ continue;
+ }
+
+ TCHAR *p = _tcsrchr(ffd.cFileName, '.');
+ if (!p) continue;
+ if ( _tcsicmp(p, _T(".dll")) && _tcsicmp(p, _T(".exe")))
+ continue;
+
+ char szFileName[MAX_PATH];
+ strncpy(szFileName, _T2A(ffd.cFileName), SIZEOF(szFileName));
+ _strlwr(szFileName);
+ if ( IsPluginDisabled(szFileName)) //check if plugin disabled
+ continue;
+
+ // Read version info
+ hashMap::iterator boo = hashes.find(szFileName);
+ if (boo == hashes.end())
+ continue;
+
+ TCHAR *plugname = ffd.cFileName;
+ FILEINFO FileInfo = { 0 };
+ DBVARIANT dbv;
+ if ( !DBGetContactSettingString(NULL, MODNAME, szFileName, &dbv)) {
+ //ñ÷èòàòü õýø ôàéëà
+ lstrcpynA(FileInfo.curhash, dbv.pszVal, SIZEOF(FileInfo.curhash));
+ _strlwr(FileInfo.curhash);
+ DBFreeVariant(&dbv);
+ }
+ else {
+ mir_sntprintf(tszMask, SIZEOF(tszMask), _T("%s\\%s"), tszFolder, ffd.cFileName);
+ CalculateModuleHash(tszMask, FileInfo.curhash);
+ DBWriteContactSettingString(NULL, MODNAME, szFileName, FileInfo.curhash);
+ }
+
+ strncpy(FileInfo.newhash, boo->second.c_str(), SIZEOF(FileInfo.newhash));
+
+ // Compare versions
+ if ( strcmp(FileInfo.curhash, FileInfo.newhash)) { // Yeah, we've got new version.
+ _tcscpy(FileInfo.tszDescr, ffd.cFileName);
+
+ *p = 0;
+ mir_sntprintf(FileInfo.File.tszDownloadURL, SIZEOF(FileInfo.File.tszDownloadURL), _T("%s/%s.zip"), tszBaseUrl, ffd.cFileName);
+ _tcslwr(FileInfo.File.tszDownloadURL);
+
+ mir_sntprintf(FileInfo.File.tszDiskPath, SIZEOF(FileInfo.File.tszDiskPath), _T("%s\\%s.zip"), tszFileBack, ffd.cFileName);
+
+ UpdateFiles.push_back(FileInfo);
+ } // end compare versions
+ }
+ while (FindNextFile(hFind, &ffd) != 0);
+
+ FindClose(hFind);
+}
+
+static void CheckUpdates(void *)
+{
+ TCHAR tszBuff[2048] = {0}, /*tszFileInfo[30] = {0},*/ tszTmpIni[MAX_PATH] = {0};
+ char szKey[64] = {0};
+ INT upd_ret;
+ DBVARIANT dbVar = {0};
+ vector<FILEINFO> UpdateFiles;
+
+ if (!Exists(tszRoot))
+ CreateDirectoryTreeT(tszRoot);
+
+ //Files.clear();
+ Reminder = DBGetContactSettingByte(NULL, MODNAME, "Reminder", DEFAULT_REMINDER);
+
+ // Load files info
+ if (DBGetContactSettingTString(NULL, MODNAME, "UpdateURL", &dbVar)) { // URL is not set
+ DBWriteContactSettingTString(NULL, MODNAME, "UpdateURL", _T(DEFAULT_UPDATE_URL));
+ DBGetContactSettingTString(NULL, MODNAME, "UpdateURL", &dbVar);
+ }
+ TCHAR* tszBaseUrl = NEWTSTR_ALLOCA(dbVar.ptszVal);
+ DBFreeVariant(&dbVar);
+
+ // Download version info
+ FILEURL *pFileUrl = (FILEURL *)mir_alloc(sizeof(*pFileUrl));
+ mir_sntprintf(pFileUrl->tszDownloadURL, SIZEOF(pFileUrl->tszDownloadURL), _T("%s/hashes.txt"), tszBaseUrl);
+ mir_sntprintf(tszBuff, SIZEOF(tszBuff), _T("%s\\tmp.ini"), tszRoot);
+ lstrcpyn(pFileUrl->tszDiskPath, tszBuff, SIZEOF(pFileUrl->tszDiskPath));
+ lstrcpyn(tszTmpIni, tszBuff, SIZEOF(tszTmpIni));
+ PopupDataText temp;
+ temp.Title = TranslateT("Plugin Updater");
+ temp.Text = TranslateT("Downloading version info...");
+ DlgDownloadProc(pFileUrl, temp);
+ mir_free(pFileUrl);
+ if (!DlgDld) {
+ CheckThread = NULL;
+ return;
+ }
+
+ FILE* fp = _tfopen(tszTmpIni, _T("r"));
+ if (!fp)
+ return;
+
+ hashMap hashes;
+ char str[200];
+ while(fgets(str, SIZEOF(str), fp) != NULL) {
+ rtrim(str);
+ char* p = strchr(str, ' ');
+ if (p == NULL)
+ continue;
+
+ *p++ = 0;
+ _strlwr(str);
+ _strlwr(p);
+ hashes[str] = p;
+ }
+ fclose(fp);
+ DeleteFile(tszTmpIni);
+
+ TCHAR *dirname = Utils_ReplaceVarsT(_T("%miranda_path%"));
+ ScanFolder(dirname, tszBaseUrl, hashes, UpdateFiles);
+ mir_free(dirname);
+
+ // Show dialog
+ if (UpdateFiles.size() > 0)
+ upd_ret = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_UPDATE), GetDesktopWindow(), DlgUpdate, (LPARAM)&UpdateFiles);
+ if (upd_ret == IDCANCEL) {
+ CheckThread = NULL;
+ return;
+ }
+
+ if (!UpdateFiles.size() && !Silent) {
+ LPCTSTR Title = TranslateT("Plugin Updater");
+ LPCTSTR Text = TranslateT("No updates found.");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED)) {
+ Number = 2;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ }
+
+ CheckThread = NULL;
+}
+
+void DoCheck(int iFlag, int iFlag2)
+{
+ if (iFlag2) {
+ LPCTSTR Title = TranslateT("Plugin Updater");
+ LPCTSTR Text = TranslateT("Update checking already started!");
+ if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED))
+ {
+ Number = 2;
+ show_popup(0, Title, Text, Number, 0);
+ }
+ else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
+ MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
+ }
+ else if (iFlag) {
+ CheckThread = mir_forkthread(CheckUpdates, 0);
+ DBWriteContactSettingDword(NULL, MODNAME, "LastUpdate", time(NULL));
+ }
+}
diff --git a/plugins/PluginUpdater/src/Utils.cpp b/plugins/PluginUpdater/src/Utils.cpp index fad176be69..70da945507 100644 --- a/plugins/PluginUpdater/src/Utils.cpp +++ b/plugins/PluginUpdater/src/Utils.cpp @@ -1,4 +1,4 @@ -/*
+/*
Copyright (C) 2010 Mataes
This is free software; you can redistribute it and/or
@@ -14,7 +14,7 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public
License along with this file; see the file license.txt. If
not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.
+Boston, MA 02111-1307, USA.
*/
#include "Common.h"
@@ -32,11 +32,6 @@ HANDLE CheckThread = NULL, hNetlibUser = NULL; MYOPTIONS MyOptions = {0};
aPopups PopupsList[POPUPS];
-int CalculateModuleHash(const TCHAR* tszFileName, char* dest);
-
-typedef map<string, string> hashMap;
-typedef pair<string, string> hashItem;
-
struct
{
char* szIconName;
@@ -182,192 +177,8 @@ VOID __stdcall RestartMe(void*) CallService(MS_SYSTEM_RESTART, 0, 0);
}
-BOOL Exists(LPCTSTR strName)
-{
- return GetFileAttributes(strName) != INVALID_FILE_ATTRIBUTES;
-}
-
-BOOL IsPluginDisabled(const char *filename)
-{
- return DBGetContactSettingByte(NULL, "PluginDisable", filename, 0);
-}
-
/////////////////////////////////////////////////////////////////////////////////////////
-static void ScanFolder(const TCHAR* tszFolder, const TCHAR* tszBaseUrl, hashMap& hashes, vector<FILEINFO>& UpdateFiles)
-{
- TCHAR tszMask[MAX_PATH], tszFileBack[MAX_PATH];
- mir_sntprintf(tszMask, SIZEOF(tszMask), _T("%s\\*"), tszFolder);
- mir_sntprintf(tszFileBack, SIZEOF(tszFileBack), _T("%s\\Backups"), tszRoot);
-
- WIN32_FIND_DATA ffd;
- HANDLE hFind = FindFirstFile(tszMask, &ffd);
- if (hFind == INVALID_HANDLE_VALUE)
- return;
-
- do {
- if (!_tcscmp(ffd.cFileName, _T(".")) || !_tcscmp(ffd.cFileName, _T("..")))
- continue;
-
- if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
- mir_sntprintf(tszMask, SIZEOF(tszMask), _T("%s\\%s"), tszFolder, ffd.cFileName);
- ScanFolder(tszMask, tszBaseUrl, hashes, UpdateFiles);
- continue;
- }
-
- TCHAR *p = _tcsrchr(ffd.cFileName, '.');
- if (!p) continue;
- if ( _tcsicmp(p, _T(".dll")) && _tcsicmp(p, _T(".exe")))
- continue;
-
- char szFileName[MAX_PATH];
- strncpy(szFileName, _T2A(ffd.cFileName), SIZEOF(szFileName));
- _strlwr(szFileName);
- if ( IsPluginDisabled(szFileName)) //check if plugin disabled
- continue;
-
- // Read version info
- hashMap::iterator boo = hashes.find(szFileName);
- if (boo == hashes.end())
- continue;
-
- TCHAR *plugname = ffd.cFileName;
- FILEINFO FileInfo = { 0 };
- DBVARIANT dbv;
- if ( !DBGetContactSettingString(NULL, MODNAME, szFileName, &dbv)) {
- //ñ÷èòàòü õýø ôàéëà
- lstrcpynA(FileInfo.curhash, dbv.pszVal, SIZEOF(FileInfo.curhash));
- _strlwr(FileInfo.curhash);
- DBFreeVariant(&dbv);
- }
- else {
- mir_sntprintf(tszMask, SIZEOF(tszMask), _T("%s\\%s"), tszFolder, ffd.cFileName);
- CalculateModuleHash(tszMask, FileInfo.curhash);
- DBWriteContactSettingString(NULL, MODNAME, szFileName, FileInfo.curhash);
- }
-
- strncpy(FileInfo.newhash, boo->second.c_str(), SIZEOF(FileInfo.newhash));
-
- // Compare versions
- if ( strcmp(FileInfo.curhash, FileInfo.newhash)) { // Yeah, we've got new version.
- _tcscpy(FileInfo.tszDescr, ffd.cFileName);
-
- *p = 0;
- mir_sntprintf(FileInfo.File.tszDownloadURL, SIZEOF(FileInfo.File.tszDownloadURL), _T("%s/%s.zip"), tszBaseUrl, ffd.cFileName);
- _tcslwr(FileInfo.File.tszDownloadURL);
-
- mir_sntprintf(FileInfo.File.tszDiskPath, SIZEOF(FileInfo.File.tszDiskPath), _T("%s\\%s.zip"), tszFileBack, ffd.cFileName);
-
- UpdateFiles.push_back(FileInfo);
- } // end compare versions
- }
- while (FindNextFile(hFind, &ffd) != 0);
-
- FindClose(hFind);
-}
-
-static void CheckUpdates(void *)
-{
- TCHAR tszBuff[2048] = {0}, /*tszFileInfo[30] = {0},*/ tszTmpIni[MAX_PATH] = {0};
- char szKey[64] = {0};
- INT upd_ret;
- DBVARIANT dbVar = {0};
- vector<FILEINFO> UpdateFiles;
-
- if (!Exists(tszRoot))
- CreateDirectoryTreeT(tszRoot);
-
- //Files.clear();
- Reminder = DBGetContactSettingByte(NULL, MODNAME, "Reminder", DEFAULT_REMINDER);
-
- // Load files info
- if (DBGetContactSettingTString(NULL, MODNAME, "UpdateURL", &dbVar)) { // URL is not set
- DBWriteContactSettingTString(NULL, MODNAME, "UpdateURL", _T(DEFAULT_UPDATE_URL));
- DBGetContactSettingTString(NULL, MODNAME, "UpdateURL", &dbVar);
- }
- TCHAR* tszBaseUrl = NEWTSTR_ALLOCA(dbVar.ptszVal);
- DBFreeVariant(&dbVar);
-
- // Download version info
- FILEURL *pFileUrl = (FILEURL *)mir_alloc(sizeof(*pFileUrl));
- mir_sntprintf(pFileUrl->tszDownloadURL, SIZEOF(pFileUrl->tszDownloadURL), _T("%s/hashes.txt"), tszBaseUrl);
- mir_sntprintf(tszBuff, SIZEOF(tszBuff), _T("%s\\tmp.ini"), tszRoot);
- lstrcpyn(pFileUrl->tszDiskPath, tszBuff, SIZEOF(pFileUrl->tszDiskPath));
- lstrcpyn(tszTmpIni, tszBuff, SIZEOF(tszTmpIni));
- PopupDataText temp;
- temp.Title = TranslateT("Plugin Updater");
- temp.Text = TranslateT("Downloading version info...");
- DlgDownloadProc(pFileUrl, temp);
- mir_free(pFileUrl);
- if (!DlgDld) {
- CheckThread = NULL;
- return;
- }
-
- FILE* fp = _tfopen(tszTmpIni, _T("r"));
- if (!fp)
- return;
-
- hashMap hashes;
- char str[200];
- while(fgets(str, SIZEOF(str), fp) != NULL) {
- rtrim(str);
- char* p = strchr(str, ' ');
- if (p == NULL)
- continue;
-
- *p++ = 0;
- _strlwr(p);
- hashes[str] = p;
- }
- fclose(fp);
- DeleteFile(tszTmpIni);
-
- TCHAR *dirname = Utils_ReplaceVarsT(_T("%miranda_path%"));
- ScanFolder(dirname, tszBaseUrl, hashes, UpdateFiles);
- mir_free(dirname);
-
- // Show dialog
- if (UpdateFiles.size() > 0)
- upd_ret = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_UPDATE), GetDesktopWindow(), DlgUpdate, (LPARAM)&UpdateFiles);
- if (upd_ret == IDCANCEL) {
- CheckThread = NULL;
- return;
- }
-
- if (!UpdateFiles.size() && !Silent) {
- LPCTSTR Title = TranslateT("Plugin Updater");
- LPCTSTR Text = TranslateT("No updates found.");
- if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED)) {
- Number = 2;
- show_popup(0, Title, Text, Number, 0);
- }
- else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
- MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
- }
-
- CheckThread = NULL;
-}
-
-void DoCheck(int iFlag, int iFlag2)
-{
- if (iFlag2) {
- LPCTSTR Title = TranslateT("Plugin Updater");
- LPCTSTR Text = TranslateT("Update checking already started!");
- if (ServiceExists(MS_POPUP_ADDPOPUPEX) && DBGetContactSettingByte(NULL, "PopUp", "ModuleIsEnabled", 1) && DBGetContactSettingByte(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED))
- {
- Number = 2;
- show_popup(0, Title, Text, Number, 0);
- }
- else if (DBGetContactSettingByte(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED))
- MessageBox(NULL, Text, Title, MB_ICONINFORMATION);
- }
- else if (iFlag) {
- CheckThread = mir_forkthread(CheckUpdates, 0);
- DBWriteContactSettingDword(NULL, MODNAME, "LastUpdate", time(NULL));
- }
-}
-
BOOL AllowUpdateOnStartup()
{
if (OnlyOnceADay) {
|