static void CheckUpdates(void *) { TCHAR tszBuff[2048] = { 0 }, tszFileInfo[30] = { 0 }, tszTmpIni[MAX_PATH] = { 0 }; char szKey[64] = { 0 }; vector<FILEINFO> UpdateFiles; if (!Exists(tszRoot)) CreateDirectory(tszRoot, NULL); Files.clear(); Reminder = db_get_b(NULL, MODNAME, "Reminder", DEFAULT_REMINDER); FileCount = db_get_dw(NULL, MODNAME, "FileCount", DEFAULT_FILECOUNT); // Load files info ptrT tszDownloadURL(db_get_tsa(NULL, MODNAME, "File_VersionURL")); if (!tszDownloadURL) { // URL is not set Title = TranslateT("Pack Updater"); Text = TranslateT("URL for checking updates not found."); if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1) && db_get_b(NULL, MODNAME, "Popups1", DEFAULT_POPUP_ENABLED)) { Number = 1; show_popup(0, Title, Text, Number, 0); } else if (db_get_b(NULL, MODNAME, "Popups1M", DEFAULT_MESSAGE_ENABLED)) MessageBox(NULL, Text, Title, MB_ICONSTOP); hCheckThread = NULL; return; } // Download version info pFileUrl = (FILEURL *)mir_alloc(sizeof(*pFileUrl)); mir_tstrncpy(pFileUrl->tszDownloadURL, tszDownloadURL, _countof(pFileUrl->tszDownloadURL)); mir_sntprintf(tszBuff, _countof(tszBuff), _T("%s\\tmp.ini"), tszRoot); mir_tstrncpy(pFileUrl->tszDiskPath, tszBuff, _countof(pFileUrl->tszDiskPath)); mir_tstrncpy(tszTmpIni, tszBuff, _countof(tszTmpIni)); Title = TranslateT("Pack Updater"); Text = TranslateT("Downloading version info..."); DlgDownloadProc(); mir_free(pFileUrl); if (!DlgDld) { hCheckThread = NULL; return; } for (CurrentFile = 0; CurrentFile < FileCount; CurrentFile++) { FILEINFO FileInfo = { _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), _T(""), { _T(""), _T("") } }; mir_snprintf(szKey, _countof(szKey), "File_%d_CurrentVersion", CurrentFile + 1); ptrT tszCurVer(db_get_tsa(NULL, MODNAME, szKey)); if (tszCurVer) mir_tstrncpy(FileInfo.tszCurVer, tszCurVer, _countof(FileInfo.tszCurVer)); else mir_tstrncpy(FileInfo.tszCurVer, _T(""), _countof(FileInfo.tszCurVer)); mir_snprintf(szKey, _countof(szKey), "File_%d_LastVersion", CurrentFile + 1); ptrT tszLastVer(db_get_tsa(NULL, MODNAME, szKey)); if (tszLastVer) mir_tstrncpy(FileInfo.tszLastVer, tszLastVer, _countof(FileInfo.tszLastVer)); else mir_tstrncpy(FileInfo.tszLastVer, _T(""), _countof(FileInfo.tszLastVer)); Files.push_back(FileInfo); // Read version info mir_sntprintf(tszFileInfo, _countof(tszFileInfo), _T("FileInfo_%d"), CurrentFile + 1); GetPrivateProfileString(tszFileInfo, _T("FileVersion"), _T(""), Files[CurrentFile].tszNewVer, _countof(Files[CurrentFile].tszNewVer), tszTmpIni); GetPrivateProfileString(tszFileInfo, _T("Message"), _T(""), Files[CurrentFile].tszMessage, _countof(Files[CurrentFile].tszMessage), tszTmpIni); GetPrivateProfileString(tszFileInfo, _T("DownloadURL"), _T(""), Files[CurrentFile].File.tszDownloadURL, _countof(Files[CurrentFile].File.tszDownloadURL), tszTmpIni); GetPrivateProfileString(tszFileInfo, _T("AdvFolder"), _T(""), Files[CurrentFile].tszAdvFolder, _countof(Files[CurrentFile].tszAdvFolder), tszTmpIni); GetPrivateProfileString(tszFileInfo, _T("Descr"), _T(""), Files[CurrentFile].tszDescr, _countof(Files[CurrentFile].tszDescr), tszTmpIni); GetPrivateProfileString(tszFileInfo, _T("DiskFileName"), _T(""), tszBuff, MAX_PATH, tszTmpIni); if (_tcsstr(tszBuff, _T("\\"))) { //check update name Title = TranslateT("Pack Updater"); Text = TranslateT("Name of Update's file is not supported."); if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1) && db_get_b(NULL, MODNAME, "Popups1", DEFAULT_POPUP_ENABLED)) { Number = 1; show_popup(0, Title, Text, Number, 0); } else if (db_get_b(NULL, MODNAME, "Popups1M", DEFAULT_MESSAGE_ENABLED)) MessageBox(NULL, Text, Title, MB_ICONINFORMATION); continue; } // end check update name mir_tstrncpy(Files[CurrentFile].File.tszDiskPath, tszBuff, _countof(Files[CurrentFile].File.tszDiskPath)); GetPrivateProfileString(tszFileInfo, _T("InfoURL"), _T(""), Files[CurrentFile].tszInfoURL, _countof(Files[CurrentFile].tszInfoURL), tszTmpIni); Files[CurrentFile].FileType = GetPrivateProfileInt(tszFileInfo, _T("FileType"), 0, tszTmpIni); Files[CurrentFile].Force = GetPrivateProfileInt(tszFileInfo, _T("Force"), 0, tszTmpIni); Files[CurrentFile].FileNum = CurrentFile + 1; if (Files[CurrentFile].FileType == 2) { if (mir_tstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0) mir_sntprintf(tszBuff, _countof(tszBuff), _T("Plugins\\%s"), Files[CurrentFile].File.tszDiskPath); else mir_sntprintf(tszBuff, _countof(tszBuff), _T("Plugins\\%s\\%s"), Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath); TCHAR pluginFolderName[MAX_PATH]; PathToAbsoluteT(tszBuff, pluginFolderName); if (!Files[CurrentFile].Force && (IsPluginDisabled(Files[CurrentFile].File.tszDiskPath) || !Exists(pluginFolderName))) //check if plugin disabled or not exists continue; } // Compare versions if (getVer(Files[CurrentFile].tszCurVer) < getVer(Files[CurrentFile].tszNewVer)) { // Yeah, we've got new version. VARST tszSysRoot(_T("%SystemRoot%")); VARST tszProgFiles(_T("%ProgramFiles%")); if (Files[CurrentFile].FileType != 1 && !IsUserAnAdmin() && (_tcsstr(tszRoot, tszSysRoot) || _tcsstr(tszRoot, tszProgFiles))) { MessageBox(NULL, TranslateT("Update is not possible!\nYou have no Administrator's rights.\nPlease run Miranda NG with Administrator's rights."), Title, MB_ICONINFORMATION); DeleteFile(tszTmpIni); hCheckThread = NULL; return; } // user have not admin's rights //добавить проверку на существование файла TCHAR tszFilePathDest[MAX_PATH] = { 0 }; switch (Files[CurrentFile].FileType) { case 0: case 1: break; case 2: { VARST tszUtilRootPlug(_T("%miranda_path%\\Plugins")); if (mir_tstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0) mir_sntprintf(tszFilePathDest, _countof(tszFilePathDest), _T("%s\\%s"), tszUtilRootPlug, Files[CurrentFile].File.tszDiskPath); else mir_sntprintf(tszFilePathDest, _countof(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRootPlug, Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath); } break; case 3: { VARST tszUtilRootIco(_T("%miranda_path%\\Icons")); if (mir_tstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0) mir_sntprintf(tszFilePathDest, _countof(tszFilePathDest), _T("%s\\%s"), tszUtilRootIco, Files[CurrentFile].File.tszDiskPath); else mir_sntprintf(tszFilePathDest, _countof(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRootIco, Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath); } break; case 4: case 5: { VARST tszUtilRoot = Utils_ReplaceVarsT(_T("%miranda_path%")); if (mir_tstrcmp(Files[CurrentFile].tszAdvFolder, _T("")) == 0) mir_sntprintf(tszFilePathDest, _countof(tszFilePathDest), _T("%s\\%s"), tszUtilRoot, Files[CurrentFile].File.tszDiskPath); else mir_sntprintf(tszFilePathDest, _countof(tszFilePathDest), _T("%s\\%s\\%s"), tszUtilRoot, Files[CurrentFile].tszAdvFolder, Files[CurrentFile].File.tszDiskPath); } break; }//end* switch (Files[CurrentFile].FileType) if (Files[CurrentFile].Force || Exists(tszFilePathDest)) UpdateFiles.push_back(Files[CurrentFile]); // Save last version mir_tstrncpy(Files[CurrentFile].tszLastVer, Files[CurrentFile].tszNewVer, _countof(Files[CurrentFile].tszLastVer)); mir_snprintf(szKey, _countof(szKey), "File_%d_LastVersion", CurrentFile + 1); db_set_ts(NULL, MODNAME, szKey, Files[CurrentFile].tszLastVer); } // end compare versions } //end checking all files in for () // Show dialog INT upd_ret = 0; if (UpdateFiles.size() > 0) upd_ret = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_UPDATE), GetDesktopWindow(), DlgUpdate, (LPARAM)&UpdateFiles); DeleteFile(tszTmpIni); if (upd_ret == IDCANCEL) { hCheckThread = NULL; return; } if (!UpdatesCount && !Silent) { Title = TranslateT("Pack Updater"); Text = TranslateT("No updates found."); if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1) && db_get_b(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED)) { Number = 2; show_popup(0, Title, Text, Number, 0); } else if (db_get_b(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED)) MessageBox(NULL, Text, Title, MB_ICONINFORMATION); } if (!FileCount) { Title = TranslateT("Pack Updater"); Text = TranslateT("No files for update."); if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1) && db_get_b(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED)) { Number = 2; show_popup(0, Title, Text, Number, 0); } else if (db_get_b(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED)) MessageBox(NULL, Text, Title, MB_ICONINFORMATION); } hCheckThread = NULL; }
INT_PTR CALLBACK DlgUpdate(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { HWND hwndList = GetDlgItem(hDlg, IDC_LIST_UPDATES); switch (message) { case WM_INITDIALOG: TranslateDialogDefault(hDlg); SetWindowLongPtr(hDlg, GWLP_USERDATA, 0); SendMessage(hwndList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES); { LVCOLUMN lvc = { 0 }; // Initialize the LVCOLUMN structure. // The mask specifies that the format, width, text, and // subitem members of the structure are valid. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.iSubItem = 0; lvc.pszText = TranslateT("Component Name"); lvc.cx = 145; // width of column in pixels ListView_InsertColumn(hwndList, 0, &lvc); lvc.iSubItem = 1; lvc.pszText = TranslateT("Current Version"); lvc.cx = 95; // width of column in pixels ListView_InsertColumn(hwndList, 1, &lvc); lvc.iSubItem = 2; lvc.pszText = TranslateT("New Version"); lvc.cx = 82; // width of column in pixels ListView_InsertColumn(hwndList, 2, &lvc); //enumerate plugins, fill in list //bool one_enabled = false; ListView_DeleteAllItems(hwndList); LVITEM lvI = { 0 }; // Some code to create the list-view control. // Initialize LVITEM members that are common to all // items. lvI.mask = LVIF_TEXT | LVIF_PARAM | LVIF_NORECOMPUTE;// | LVIF_IMAGE; vector<FILEINFO> &todo = *(vector<FILEINFO> *)lParam; for (int i = 0; i < (int)todo.size(); ++i) { lvI.mask = LVIF_TEXT | LVIF_PARAM;// | LVIF_IMAGE; lvI.iSubItem = 0; lvI.lParam = (LPARAM)&todo[i]; lvI.pszText = todo[i].tszDescr; lvI.iItem = i; ListView_InsertItem(hwndList, &lvI); lvI.mask = LVIF_TEXT;// | LVIF_IMAGE; lvI.iSubItem = 1; lvI.pszText = todo[i].tszCurVer; ListView_SetItem(hwndList, &lvI); lvI.iSubItem = 2; lvI.pszText = todo[i].tszNewVer; ListView_SetItem(hwndList, &lvI); ListView_SetCheckState(hwndList, lvI.iItem, true); todo[i].enabled = true; } HWND hwOk = GetDlgItem(hDlg, IDOK); EnableWindow(hwOk, true/*one_enabled ? TRUE : FALSE*/); // do this after filling list - enables 'ITEMCHANGED' below SetWindowLongPtr(hDlg, GWLP_USERDATA, lParam); Utils_RestoreWindowPositionNoSize(hDlg, 0, MODNAME, "ConfirmWindow"); } return TRUE; case WM_NOTIFY: if (((LPNMHDR)lParam)->hwndFrom == hwndList) { switch (((LPNMHDR)lParam)->code) { case LVN_ITEMCHANGED: if (GetWindowLongPtr(hDlg, GWLP_USERDATA)) { NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam; LVITEM lvI = { 0 }; lvI.iItem = nmlv->iItem; lvI.iSubItem = 0; lvI.mask = LVIF_PARAM; ListView_GetItem(hwndList, &lvI); vector<FILEINFO> &todo = *(vector<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); if ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK) { todo[lvI.iItem].enabled = ListView_GetCheckState(hwndList, nmlv->iItem); bool enableOk = false; for (int i = 0; i < (int)todo.size(); ++i) { if (todo[i].enabled) { enableOk = true; break; } } HWND hwOk = GetDlgItem(hDlg, IDOK); EnableWindow(hwOk, enableOk ? TRUE : FALSE); } if (nmlv->uNewState & LVIS_SELECTED) { if (mir_tstrcmp(todo[lvI.iItem].tszInfoURL, _T(""))) EnableWindow(GetDlgItem(hDlg, IDC_INFO), TRUE); else EnableWindow(GetDlgItem(hDlg, IDC_INFO), FALSE); SetDlgItemText(hDlg, IDC_MESSAGE, TranslateTS(todo[lvI.iItem].tszMessage)); } } break; } } break; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { switch (LOWORD(wParam)) { case IDOK: { vector<FILEINFO> &todo = *(vector<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); ShowWindow(hDlg, SW_HIDE); TCHAR tszBuff[2048] = { 0 }, tszFileDest[MAX_PATH] = { 0 }, tszFilePathDest[MAX_PATH] = { 0 }, tszFilePathBack[MAX_PATH] = { 0 }, tszFileName[MAX_PATH] = { 0 }; TCHAR* tszExt = NULL; char szKey[64] = { 0 }; vector<int> arFileType; vector<tString> arFilePath; vector<tString> arFileName; vector<tString> arAdvFolder; vector<tString> arExt; STARTUPINFO si; PROCESS_INFORMATION pi; SetWindowLongPtr(hDlg, GWLP_USERDATA, 0); Utils_SaveWindowPosition(hDlg, NULL, MODNAME, "ConfirmWindow"); arFileType.clear(); arFilePath.clear(); arFileName.clear(); arAdvFolder.clear(); arExt.clear(); for (int i = 0; i < (int)todo.size(); ++i) { if (todo[i].enabled) { switch (todo[i].FileType) { case 1: mir_sntprintf(tszFileDest, _T("%s\\Pack"), tszRoot); CreateDirectory(tszFileDest, NULL); break; case 2: mir_sntprintf(tszFileDest, _T("%s\\Plugins"), tszRoot); CreateDirectory(tszFileDest, NULL); break; case 3: mir_sntprintf(tszFileDest, _T("%s\\Icons"), tszRoot); CreateDirectory(tszFileDest, NULL); break; case 4: mir_sntprintf(tszFileDest, _T("%s\\Others"), tszRoot); CreateDirectory(tszFileDest, NULL); break; case 5: mir_sntprintf(tszFileDest, _T("%s\\Others"), tszRoot); CreateDirectory(tszFileDest, NULL); break; default: mir_tstrncpy(tszFileDest, tszRoot, _countof(tszFileDest)); break; } mir_sntprintf(tszBuff, _T("%s\\Backups"), tszRoot); CreateDirectory(tszBuff, NULL); mir_tstrncpy(tszFileName, todo[i].File.tszDiskPath, _countof(tszFileName)); mir_sntprintf(todo[i].File.tszDiskPath, _T("%s\\%s"), tszFileDest, tszFileName); UpdatesCount++; tszExt = &todo[i].File.tszDownloadURL[mir_tstrlen(todo[i].File.tszDownloadURL) - 5]; if (mir_tstrcmp(tszExt, _T(".html")) == 0) { char* szUrl = mir_t2a(todo[i].File.tszDownloadURL); Utils_OpenUrl(szUrl); mir_free(szUrl); } else { // download update pFileUrl = &todo[i].File; Title = TranslateT("Pack Updater"); if (todo[i].FileType == 1) Text = TranslateT("Downloading pack updates..."); else Text = TranslateT("Downloading update..."); DlgDownloadProc(); if (!DlgDld) { if (UpdatesCount) UpdatesCount--; continue; } } mir_tstrncpy(todo[i].tszCurVer, todo[i].tszNewVer, _countof(todo[i].tszCurVer)); mir_snprintf(szKey, "File_%d_CurrentVersion", todo[i].FileNum); db_set_ts(NULL, MODNAME, szKey, todo[i].tszCurVer); arFileType.push_back(todo[i].FileType); arFilePath.push_back(todo[i].File.tszDiskPath); arFileName.push_back(tszFileName); arAdvFolder.push_back(todo[i].tszAdvFolder); arExt.push_back(tszExt); if (todo[i].FileType == 1) i = (int)todo.size(); } } if (UpdatesCount > 1 && mir_tstrcmp(arExt[0].c_str(), _T(".html")) != 0) mir_tstrncpy(tszBuff, TranslateT("Downloads complete. Start updating? All your data will be saved and Miranda NG will be closed."), _countof(tszBuff)); else if (UpdatesCount == 1 && mir_tstrcmp(arExt[0].c_str(), _T(".html")) != 0) mir_tstrncpy(tszBuff, TranslateT("Download complete. Start updating? All your data will be saved and Miranda NG will be closed."), _countof(tszBuff)); if (UpdatesCount > 0 && mir_tstrcmp(arExt[0].c_str(), _T(".html")) != 0) { INT rc = -1; Title = TranslateT("Pack Updater"); Text = tszBuff; if (ServiceExists(MS_POPUP_ADDPOPUPT) && ServiceExists(MS_POPUP_REGISTERACTIONS) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1) && db_get_b(NULL, MODNAME, "Popups0", DEFAULT_POPUP_ENABLED) && (db_get_dw(NULL, "Popup", "Actions", 0) & 1)) rc = DialogBox(hInst, MAKEINTRESOURCE(IDD_POPUPDUMMI), NULL, DlgMsgPop); else rc = MessageBox(NULL, tszBuff, Title, MB_YESNO | MB_ICONQUESTION); if (rc == IDYES) { for (int i = 0; i < UpdatesCount; i++) { TCHAR* tszUtilRootPlug = NULL; TCHAR* tszUtilRootIco = NULL; TCHAR* tszUtilRoot = NULL; TCHAR tszCurrentDir[MAX_PATH]; switch (arFileType[i]) { case 0: break; case 1: if (Reminder == 2) db_set_b(NULL, MODNAME, "Reminder", 1); memset(&si, 0, sizeof(STARTUPINFO)); memset(&pi, 0, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); { _tcsncpy_s(tszCurrentDir, arFilePath[i].c_str(), _TRUNCATE); TCHAR *p = _tcsrchr(tszCurrentDir, '\\'); if (p) *p = 0; } CreateProcess(arFilePath[i].c_str(), _T(""), NULL, NULL, FALSE, NULL, NULL, tszCurrentDir, &si, &pi); i = UpdatesCount; CallFunctionAsync(ExitMe, 0); break; case 2: tszUtilRootPlug = Utils_ReplaceVarsT(_T("%miranda_path%\\Plugins")); if (mir_tstrcmp(arAdvFolder[i].c_str(), _T("")) == 0) mir_sntprintf(tszFilePathDest, _T("%s\\%s"), tszUtilRootPlug, arFileName[i].c_str()); else mir_sntprintf(tszFilePathDest, _T("%s\\%s\\%s"), tszUtilRootPlug, arAdvFolder[i].c_str(), arFileName[i].c_str()); mir_sntprintf(tszFilePathBack, _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str()); MoveFile(tszFilePathDest, tszFilePathBack); MoveFile(arFilePath[i].c_str(), tszFilePathDest); mir_free(tszUtilRootPlug); if (i == UpdatesCount - 1) CallFunctionAsync(RestartMe, 0); break; case 3: tszUtilRootIco = Utils_ReplaceVarsT(_T("%miranda_path%\\Icons")); if (mir_tstrcmp(arAdvFolder[i].c_str(), _T("")) == 0) mir_sntprintf(tszFilePathDest, _T("%s\\%s"), tszUtilRootIco, arFileName[i].c_str()); else mir_sntprintf(tszFilePathDest, _T("%s\\%s\\%s"), tszUtilRootIco, arAdvFolder[i].c_str(), arFileName[i].c_str()); mir_sntprintf(tszFilePathBack, _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str()); MoveFile(tszFilePathDest, tszFilePathBack); MoveFile(arFilePath[i].c_str(), tszFilePathDest); mir_free(tszUtilRootIco); if (i == UpdatesCount - 1) CallFunctionAsync(RestartMe, 0); break; case 4: tszUtilRoot = Utils_ReplaceVarsT(_T("%miranda_path%")); if (mir_tstrcmp(arAdvFolder[i].c_str(), _T("")) == 0) mir_sntprintf(tszFilePathDest, _T("%s\\%s"), tszUtilRoot, arFileName[i].c_str()); else mir_sntprintf(tszFilePathDest, _T("%s\\%s\\%s"), tszUtilRoot, arAdvFolder[i].c_str(), arFileName[i].c_str()); mir_sntprintf(tszFilePathBack, _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str()); MoveFile(tszFilePathDest, tszFilePathBack); MoveFile(arFilePath[i].c_str(), tszFilePathDest); mir_free(tszUtilRoot); if (i == UpdatesCount - 1) CallFunctionAsync(RestartMe, 0); break; case 5: tszUtilRoot = Utils_ReplaceVarsT(_T("%miranda_path%")); if (mir_tstrcmp(arAdvFolder[i].c_str(), _T("")) == 0) mir_sntprintf(tszFilePathDest, _T("%s\\%s"), tszUtilRoot, arFileName[i].c_str()); else mir_sntprintf(tszFilePathDest, _T("%s\\%s\\%s"), tszUtilRoot, arAdvFolder[i].c_str(), arFileName[i].c_str()); mir_sntprintf(tszFilePathBack, _T("%s\\Backups\\%s"), tszRoot, arFileName[i].c_str()); MoveFile(tszFilePathDest, tszFilePathBack); MoveFile(arFilePath[i].c_str(), tszFilePathDest); mir_free(tszUtilRoot); break; } } } else { //reminder for not installed pack update if (Reminder && (UpdatesCount == 1) && (arFileType[0] == 1)) db_set_b(NULL, MODNAME, "Reminder", 2); mir_sntprintf(tszBuff, TranslateT("You have chosen not to install the pack update immediately.\nYou can install it manually from this location:\n\n%s"), arFilePath[0].c_str()); Title = TranslateT("Pack Updater"); Text = tszBuff; if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1) && db_get_b(NULL, MODNAME, "Popups2", DEFAULT_POPUP_ENABLED)) { Number = 2; show_popup(0, Title, Text, Number, 0); } else if (db_get_b(NULL, MODNAME, "Popups2M", DEFAULT_MESSAGE_ENABLED)) MessageBox(NULL, Text, Title, MB_ICONINFORMATION); } } } EndDialog(hDlg, IDOK); return TRUE; case IDCANCEL: SetWindowLongPtr(hDlg, GWLP_USERDATA, 0); Utils_SaveWindowPosition(hDlg, NULL, MODNAME, "ConfirmWindow"); EndDialog(hDlg, IDCANCEL); return TRUE; case IDC_INFO: int sel = ListView_GetSelectionMark(hwndList); vector<FILEINFO> &todo = *(vector<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); Utils_OpenUrlT(todo[sel].tszInfoURL); } break; } } return FALSE; }