void Database::DoBackup() { QSqlDatabase db(this->Connect()); // Before we overwrite anything, make sure the database is not corrupt QMutexLocker l(&mutex_); const bool ok = IntegrityCheck(db); if (ok) { BackupFile(db.databaseName()); } }
static void ApplyUpdates(void *param) { HWND hDlg = (HWND)param; OBJLIST<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); if (todo.getCount() == 0) { return; } // 1) If we need to escalate priviledges, launch a stub if (!PrepareEscalation()) { PostMessage(hDlg, WM_CLOSE, 0, 0); return; } AutoHandle pipe(hPipe); HWND hwndList = GetDlgItem(hDlg, IDC_LIST_UPDATES); //create needed folders after escalating priviledges. Folders creates when we actually install updates TCHAR tszFileTemp[MAX_PATH], tszFileBack[MAX_PATH]; mir_sntprintf(tszFileBack, SIZEOF(tszFileBack), _T("%s\\Backups"), tszRoot); SafeCreateDirectory(tszFileBack); mir_sntprintf(tszFileTemp, SIZEOF(tszFileTemp), _T("%s\\Temp"), tszRoot); SafeCreateDirectory(tszFileTemp); // 2) Download all plugins HANDLE nlc = NULL; for (int i=0; i < todo.getCount(); i++) { ListView_EnsureVisible(hwndList, i, FALSE); if (!todo[i].bEnabled) { SetStringText(hwndList, i, TranslateT("Skipped.")); } else if (todo[i].bDeleteOnly) { SetStringText(hwndList, i, TranslateT("Will be deleted!")); } else { // download update SetStringText(hwndList, i, TranslateT("Downloading...")); FILEURL *pFileUrl = &todo[i].File; if (!DownloadFile(pFileUrl, nlc)) { SetStringText(hwndList, i, TranslateT("Failed!")); // interrupt update as we require all components to be updated Netlib_CloseHandle(nlc); PostMessage(hDlg, UM_ERROR, 0, 0); SkinPlaySound("updatefailed"); return; } SetStringText(hwndList, i, TranslateT("Succeeded.")); } } Netlib_CloseHandle(nlc); // 3) Unpack all zips VARST tszMirandaPath(_T("%miranda_path%")); for (int i = 0; i < todo.getCount(); i++) { FILEINFO& p = todo[i]; if (p.bEnabled) { if (p.bDeleteOnly) { // we need only to backup the old file TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1, tszBackFile[MAX_PATH]; mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, ptszRelPath); BackupFile(p.tszNewName, tszBackFile); } else { // if file name differs, we also need to backup the old file here // otherwise it would be replaced by unzip if ( _tcsicmp(p.tszOldName, p.tszNewName)) { TCHAR tszSrcPath[MAX_PATH], tszBackFile[MAX_PATH]; mir_sntprintf(tszSrcPath, SIZEOF(tszSrcPath), _T("%s\\%s"), tszMirandaPath, p.tszOldName); mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, p.tszOldName); BackupFile(tszSrcPath, tszBackFile); } if ( unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack,true)) SafeDeleteFile(p.File.tszDiskPath); // remove .zip after successful update } } } SkinPlaySound("updatecompleted"); #if MIRANDA_VER < 0x0A00 // 4) Change title of clist ptrT title = db_get_tsa(NULL, "CList", "TitleText"); if (!_tcsicmp(title, _T("Miranda IM"))) db_set_ts(NULL, "CList", "TitleText", _T("Miranda NG")); #endif opts.bForceRedownload = false; db_unset(NULL, MODNAME, DB_SETTING_REDOWNLOAD); db_set_b(NULL, MODNAME, DB_SETTING_RESTART_COUNT, 5); // 5) Prepare Restart int rc = MessageBox(hDlg, TranslateT("Update complete. Press Yes to restart Miranda now or No to postpone a restart until the exit."), TranslateT("Plugin Updater"), MB_YESNO | MB_ICONQUESTION); PostMessage(hDlg, WM_CLOSE, 0, 0); if (rc == IDYES) #if MIRANDA_VER >= 0x0A00 CallServiceSync(MS_SYSTEM_RESTART, db_get_b(NULL, MODNAME, "RestartCurrentProfile", 1) ? 1 : 0, 0); #else CallFunctionAsync(RestartMe, 0); #endif }
// Handles exporting input bindings to a file bool HandleInputBindingsExport( const FString& Filename ) { FInputBindingManager::Get().SaveInputBindings(); GConfig->Flush(false, GEditorKeyBindingsIni); return BackupFile(GEditorKeyBindingsIni, Filename); }
static void DlgUpdateSilent(void *lParam) { OBJLIST<FILEINFO> &UpdateFiles = *(OBJLIST<FILEINFO> *)lParam; if (UpdateFiles.getCount() == 0) { delete &UpdateFiles; return; } // 1) If we need to escalate priviledges, launch a stub if (!PrepareEscalation()) { delete &UpdateFiles; return; } AutoHandle pipe(hPipe); //create needed folders after escalating priviledges. Folders creates when we actually install updates TCHAR tszFileTemp[MAX_PATH], tszFileBack[MAX_PATH]; mir_sntprintf(tszFileBack, SIZEOF(tszFileBack), _T("%s\\Backups"), tszRoot); SafeCreateDirectory(tszFileBack); mir_sntprintf(tszFileTemp, SIZEOF(tszFileTemp), _T("%s\\Temp"), tszRoot); SafeCreateDirectory(tszFileTemp); // 2) Download all plugins HANDLE nlc = NULL; // Count all updates that have been enabled int count = 0; for (int i = 0; i < UpdateFiles.getCount(); i++) { if (UpdateFiles[i].bEnabled && !UpdateFiles[i].bDeleteOnly) { // download update FILEURL *pFileUrl = &UpdateFiles[i].File; if (!DownloadFile(pFileUrl, nlc)) { // interrupt update as we require all components to be updated Netlib_CloseHandle(nlc); SkinPlaySound("updatefailed"); delete &UpdateFiles; return; } count++; } } Netlib_CloseHandle(nlc); // All available updates have been disabled if (count == 0) { delete &UpdateFiles; return; } // 3) Unpack all zips VARST tszMirandaPath(_T("%miranda_path%")); for (int i = 0; i < UpdateFiles.getCount(); i++) { FILEINFO& p = UpdateFiles[i]; if (p.bEnabled) { if (p.bDeleteOnly) { // we need only to backup the old file TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1, tszBackFile[MAX_PATH]; mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, ptszRelPath); BackupFile(p.tszNewName, tszBackFile); } else { // if file name differs, we also need to backup the old file here // otherwise it would be replaced by unzip if (_tcsicmp(p.tszOldName, p.tszNewName)) { TCHAR tszSrcPath[MAX_PATH], tszBackFile[MAX_PATH]; mir_sntprintf(tszSrcPath, SIZEOF(tszSrcPath), _T("%s\\%s"), tszMirandaPath, p.tszOldName); mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, p.tszOldName); BackupFile(tszSrcPath, tszBackFile); } // remove .zip after successful update if (unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack, true)) SafeDeleteFile(p.File.tszDiskPath); } } } delete &UpdateFiles; SkinPlaySound("updatecompleted"); #if MIRANDA_VER < 0x0A00 // 4) Change title of clist ptrT title = db_get_tsa(NULL, "CList", "TitleText"); if (!_tcsicmp(title, _T("Miranda IM"))) db_set_ts(NULL, "CList", "TitleText", _T("Miranda NG")); #endif opts.bForceRedownload = false; db_unset(NULL, MODNAME, DB_SETTING_REDOWNLOAD); db_set_b(NULL, MODNAME, DB_SETTING_RESTART_COUNT, 5); db_set_b(NULL, MODNAME, DB_SETTING_NEED_RESTART, 1); // 5) Prepare Restart TCHAR tszTitle[100]; mir_sntprintf(tszTitle, SIZEOF(tszTitle), TranslateT("%d component(s) was updated"), count); if (ServiceExists(MS_POPUP_ADDPOPUPT) && db_get_b(NULL, "Popup", "ModuleIsEnabled", 1)) { ShowPopup(tszTitle,TranslateT("You need to restart your Miranda to apply installed updates."),POPUP_TYPE_MSG); } else { bool notified = false; if (ServiceExists(MS_CLIST_SYSTRAY_NOTIFY)) { MIRANDASYSTRAYNOTIFY err; err.szProto = MODULEA; err.cbSize = sizeof(err); err.dwInfoFlags = NIIF_INTERN_UNICODE | NIIF_INFO; err.tszInfoTitle = tszTitle; err.tszInfo = TranslateT("You need to restart your Miranda to apply installed updates."); err.uTimeout = 30000; notified = !CallService(MS_CLIST_SYSTRAY_NOTIFY, 0, (LPARAM)&err); } if (!notified) { // Error, let's try to show MessageBox as last way to inform user about successful update TCHAR tszText[200]; mir_sntprintf(tszText, SIZEOF(tszText), _T("%s\n\n%s"), TranslateT("You need to restart your Miranda to apply installed updates."), TranslateT("Would you like to restart it now?")); if (MessageBox(NULL, tszText, tszTitle, MB_ICONINFORMATION | MB_YESNO) == IDYES) #if MIRANDA_VER >= 0x0A00 CallServiceSync(MS_SYSTEM_RESTART, db_get_b(NULL, MODNAME, "RestartCurrentProfile", 1) ? 1 : 0, 0); #else CallFunctionAsync(RestartMe, 0); #endif } } }
int CMainDialog::ZipFiles() { CCrashReporterApp* pApp = DYNAMIC_DOWNCAST(CCrashReporterApp, AfxGetApp()); ASSERT_VALID(pApp); int nFiles = 0; // generate zip file name m_strZipFile = pApp->m_strAppDataPath; m_strZipFile += pApp->m_strUpdateItExe; int index = m_strZipFile.ReverseFind(_T('.')); if (index > 0) m_strZipFile = m_strZipFile.Left(index); m_strZipFile += _T(".zip"); TRACE(_T("m_strZipPath = <%s>\n"), m_strZipFile); // backup old zip if it exists BackupFile(m_strZipFile); HZIP hZip = NULL; for (int i = 0; i < m_aFileDetails.GetSize(); i++) { FILEDETAILS *fd = (FILEDETAILS *) m_aFileDetails[i]; if (fd) { // make sure file exists if ((_taccess(fd->strFilePath, 00) == 0) && fd->bSend) { // if this is first file, create zip now if (!hZip) { hZip = CreateZip((LPVOID)(LPCTSTR)m_strZipFile, 0, ZIP_FILENAME); if (!hZip) { TRACE(_T("ERROR - failed to create %s\n"), m_strZipFile); break; } } // zip is open, add file CString strName = fd->strFilePath; int index = strName.ReverseFind(_T('\\')); if (index > 0) strName = strName.Right(strName.GetLength()-index-1); TRACE(_T("strName=<%s>\n"), strName); ZRESULT zr = ZipAdd(hZip, strName, (LPVOID)(LPCTSTR)fd->strFilePath, 0, ZIP_FILENAME); if (zr == ZR_OK) { nFiles++; } else { TRACE(_T("ERROR - failed to add '%s' to zip\n"), fd->strFilePath); } } } } if (hZip) CloseZip(hZip); return nFiles; }
bool extractCurrentFile(unzFile uf, TCHAR *ptszDestPath, TCHAR *ptszBackPath, bool ch) { unz_file_info64 file_info; char filename[MAX_PATH], buf[8192]; int err = unzGetCurrentFileInfo64(uf, &file_info, filename, sizeof(filename), buf, sizeof(buf), NULL, 0); if (err != UNZ_OK) return false; for (char *p = strchr(filename, '/'); p; p = strchr(p+1, '/')) *p = '\\'; if (ch && !db_get_b(NULL, MODNAME "Files", StrToLower(ptrA(mir_strdup(filename))), 1)) return true; TCHAR tszDestFile[MAX_PATH], tszBackFile[MAX_PATH]; TCHAR *ptszNewName = mir_utf8decodeT(filename); if (ptszNewName == NULL) ptszNewName = mir_a2t(filename); if (!(file_info.external_fa & FILE_ATTRIBUTE_DIRECTORY)) { err = unzOpenCurrentFile(uf); if (err != UNZ_OK) return false; if (ptszBackPath != NULL) { PrepareFileName(tszDestFile, SIZEOF(tszDestFile), ptszDestPath, ptszNewName); PrepareFileName(tszBackFile, SIZEOF(tszBackFile), ptszBackPath, ptszNewName); BackupFile(tszDestFile, tszBackFile); } PrepareFileName(tszDestFile, SIZEOF(tszDestFile), ptszDestPath, ptszNewName); SafeCreateFilePath(tszDestFile); TCHAR *ptszFile2unzip; if (hPipe == NULL) // direct mode ptszFile2unzip = tszDestFile; else { TCHAR tszTempPath[MAX_PATH]; GetTempPath( SIZEOF(tszTempPath), tszTempPath); GetTempFileName(tszTempPath, _T("PUtemp"), GetCurrentProcessId(), tszBackFile); ptszFile2unzip = tszBackFile; } HANDLE hFile = CreateFile(ptszFile2unzip, GENERIC_WRITE, FILE_SHARE_WRITE, 0, CREATE_ALWAYS, file_info.external_fa, 0); if (hFile == INVALID_HANDLE_VALUE) return false; while (true) { err = unzReadCurrentFile(uf, buf, sizeof(buf)); if (err <= 0) break; DWORD bytes; if (!WriteFile(hFile, buf, err, &bytes, FALSE)) { err = UNZ_ERRNO; break; } } FILETIME ftLocal, ftCreate, ftLastAcc, ftLastWrite; GetFileTime(hFile, &ftCreate, &ftLastAcc, &ftLastWrite); DosDateTimeToFileTime(HIWORD(file_info.dosDate), LOWORD(file_info.dosDate), &ftLocal); LocalFileTimeToFileTime(&ftLocal, &ftLastWrite); SetFileTime(hFile, &ftCreate, &ftLastAcc, &ftLastWrite); CloseHandle(hFile); unzCloseCurrentFile(uf); /* don't lose the error */ if (hPipe) SafeMoveFile(ptszFile2unzip, tszDestFile); } mir_free(ptszNewName); return true; }
static void ApplyDownloads(void *param) { HWND hDlg = (HWND)param; ////////////////////////////////////////////////////////////////////////////////////// // if we need to escalate priviledges, launch a atub if (!PrepareEscalation()) { DestroyWindow(hDlg); return; } ////////////////////////////////////////////////////////////////////////////////////// // ok, let's unpack all zips AutoHandle pipe(hPipe); HWND hwndList = GetDlgItem(hDlg, IDC_LIST_UPDATES); OBJLIST<FILEINFO> &todo = *(OBJLIST<FILEINFO> *)GetWindowLongPtr(hDlg, GWLP_USERDATA); TCHAR tszBuff[2048], tszFileTemp[MAX_PATH], tszFileBack[MAX_PATH]; mir_sntprintf(tszFileBack, SIZEOF(tszFileBack), _T("%s\\Backups"), tszRoot); SafeCreateDirectory(tszFileBack); mir_sntprintf(tszFileTemp, SIZEOF(tszFileTemp), _T("%s\\Temp"), tszRoot); SafeCreateDirectory(tszFileTemp); HANDLE nlc = NULL; for (int i=0; i < todo.getCount(); ++i) { ListView_EnsureVisible(hwndList, i, FALSE); if (!todo[i].bEnabled) { ListView_SetItemText(hwndList, i, 2, TranslateT("Skipped.")); continue; } // download update ListView_SetItemText(hwndList, i, 2, TranslateT("Downloading...")); FILEURL *pFileUrl = &todo[i].File; if (!DownloadFile(pFileUrl->tszDownloadURL, pFileUrl->tszDiskPath, pFileUrl->CRCsum, nlc)) { ListView_SetItemText(hwndList, i, 2, TranslateT("Failed!")); } else ListView_SetItemText(hwndList, i, 2, TranslateT("Succeeded.")); } Netlib_CloseHandle(nlc); if (todo.getCount() > 0) { ShowPopup(0, LPGENT("Plugin Updater"), TranslateT("Download complete"), 2, 0); TCHAR *tszMirandaPath = Utils_ReplaceVarsT(_T("%miranda_path%")); for (int i = 0; i < todo.getCount(); i++) { if (!todo[i].bEnabled) continue; TCHAR tszBackFile[MAX_PATH]; FILEINFO& p = todo[i]; if (p.bDeleteOnly) { // we need only to backup the old file TCHAR *ptszRelPath = p.tszNewName + _tcslen(tszMirandaPath) + 1; mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, ptszRelPath); BackupFile(p.tszNewName, tszBackFile); continue; } // if file name differs, we also need to backup the old file here // otherwise it would be replaced by unzip if ( _tcsicmp(p.tszOldName, p.tszNewName)) { TCHAR tszSrcPath[MAX_PATH]; mir_sntprintf(tszSrcPath, SIZEOF(tszSrcPath), _T("%s\\%s"), tszMirandaPath, p.tszOldName); mir_sntprintf(tszBackFile, SIZEOF(tszBackFile), _T("%s\\%s"), tszFileBack, p.tszOldName); BackupFile(tszSrcPath, tszBackFile); } if ( unzip(p.File.tszDiskPath, tszMirandaPath, tszFileBack,false)) SafeDeleteFile(p.File.tszDiskPath); // remove .zip after successful update } } PopupDataText temp; temp.Title = TranslateT("Plugin Updater"); temp.Text = tszBuff; lstrcpyn(tszBuff, TranslateT("Download complete. Do you want to go to plugins option page?"), SIZEOF(tszBuff)); int rc = MessageBox(hDlg, temp.Text, temp.Title, MB_YESNO | MB_ICONQUESTION); if (rc == IDYES) CallFunctionAsync(OpenPluginOptions, 0); CloseWindow(hDlg); DestroyWindow(hDlg); hwndDialog = NULL; return; }
BOOL CGuideDoc::OnOpenDocument(LPCTSTR lpszPathName) { // create backup if required if (theApp.GetAutoBackup()) BackupFile(lpszPathName); // == [0-byte file handling] ============================================ // // Treat specially if file is 0 bytes. This is required so that // when the app is asked to open a 0 byte file, it acts as though // it is doing a file->new, but with the associated file name. // This is required when you do New -> Guide from the explorer // RMB. Explorer creates a 0 byte file and calls Guide.exe with // the filename as argument. DWORD fileSize = 0; if (_GetFileSize(lpszPathName, fileSize) && fileSize == 0) { // delete current contents DeleteContents(); // load an empty guide m_pGuide = guide_create(); // return success return TRUE; } // ====================================================================== // load the file as a new document unsigned os_errcode; uint32 gde_format = 0; struct guide_t *pNewDocument = guide_load(lpszPathName, &os_errcode, &gde_format); // could we open it? if (pNewDocument == NULL) { // could not open file: display an error message // get only the filename out CString fullName(lpszPathName); fullName.Replace(_T('/'), _T('\\')); int slashPos = fullName.ReverseFind(_T('\\')); LPCTSTR fileName = static_cast<LPCTSTR>(fullName) + slashPos + 1; // note: if \ is not present, slashPos == -1. // we form the error message in 'msg' CString msg; if (os_errcode == 0) { msg.FormatMessage(IDS_NOGDE, fileName); } else { if (os_errcode == 32) { // show a specific message for file locked msg.FormatMessage(IDS_FILELOCKED, fileName); } else { // show a generic message otherwise msg.FormatMessage(IDS_FILEOPENERR, fileName, getMessage(os_errcode)); } } // display the message AfxMessageBox(msg, MB_OK|MB_ICONSTOP); // return error return FALSE; } // now we can delete the old document DeleteContents(); ASSERT(m_pGuide == NULL); // use the new one hereafter m_pGuide = pNewDocument; // opened: "lock" the .gde file m_Locker.lock(lpszPathName); // migrate old (v1.x gde file format) links to new ones if (gde_format == 1) migrateLinks(m_pGuide); // success! return TRUE; }