From 7aff1e4cb053394db57c2814d5fe1e6493e0cc75 Mon Sep 17 00:00:00 2001 From: watcherhd Date: Sat, 26 Nov 2011 14:19:43 +0000 Subject: Project folders rename part 2 git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@214 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- Dbx_mmap_SA/db_autobackups/backup.c | 230 ++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 Dbx_mmap_SA/db_autobackups/backup.c (limited to 'Dbx_mmap_SA/db_autobackups/backup.c') diff --git a/Dbx_mmap_SA/db_autobackups/backup.c b/Dbx_mmap_SA/db_autobackups/backup.c new file mode 100644 index 0000000..3aeaf6a --- /dev/null +++ b/Dbx_mmap_SA/db_autobackups/backup.c @@ -0,0 +1,230 @@ +#include "headers.h" +#include + +TCHAR dbname[MAX_PATH]; + +static UINT_PTR timer_id; + +INT_PTR CALLBACK DlgProcProgress(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) { + case WM_INITDIALOG: + { + HWND prog = GetDlgItem(hwndDlg, IDC_PROGRESS); + TranslateDialogDefault( hwndDlg ); + SendMessage(prog, PBM_SETPOS, 0, 0); + } + break; + case WM_COMMAND: + if ( HIWORD( wParam ) == BN_CLICKED && LOWORD( wParam ) == IDCANCEL ) { + // in the progress dialog, use the user data to indicate that the user has pressed cancel + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR)1); + return TRUE; + } + break; + } + return FALSE; +} + +INT_PTR DBSaveAs(WPARAM wParam, LPARAM lParam) +{ + HWND progress_dialog = 0; + TCHAR fname_buff[MAX_PATH], szFilter[128]; + int i; + OPENFILENAME ofn = {0}; + CallService(MS_DB_GETPROFILENAMET,MAX_PATH,(LPARAM)fname_buff); + + i = mir_sntprintf(szFilter, 64, _T("%s (*.dat)"), TranslateT("Miranda Databases")) + 1; + _tcscpy(szFilter + i, _T("*.dat")); + i += 6; + i += mir_sntprintf(szFilter + i, 48, _T("%s (*.*)"), TranslateT("All Files")) + 1; + _tcscpy(szFilter + i, _T("*")); + szFilter[i + 2] = 0; + + ofn.lStructSize = sizeof(ofn); + ofn.lpstrFile = fname_buff; + ofn.nMaxFile = MAX_PATH; + ofn.Flags = OFN_NOREADONLYRETURN | OFN_OVERWRITEPROMPT; + ofn.lpstrFilter = szFilter; + ofn.nFilterIndex = 1; + ofn.lpstrDefExt = _T("dat"); + + if (GetSaveFileName(&ofn)) + Backup(fname_buff); + + return 0; +} + +struct FileNameFound_Tag +{ + TCHAR Name[MAX_PATH]; + FILETIME CreationTime; +}FileNameFound; + +int RotateBackups(HWND progress_dialog, DWORD start_time) +{ + TCHAR backupfilename1[MAX_PATH] = {0}, backupfilename2[MAX_PATH] = {0}, backupfolderTmp[MAX_PATH] = {0}; + TCHAR* backupfolder; + unsigned int i = 0; + HWND prog = GetDlgItem(progress_dialog, IDC_PROGRESS); + MSG msg; + + WIN32_FIND_DATA FindFileData; + HANDLE hFind; + + backupfolder = Utils_ReplaceVarsT(options.folder); + + mir_sntprintf(backupfolderTmp, SIZEOF(backupfolderTmp), _T("%s\\*"), backupfolder); + hFind = FindFirstFile(backupfolderTmp, &FindFileData); + if (hFind == INVALID_HANDLE_VALUE) + return 0; + _tcscpy(FileNameFound.Name, _T("")); + while (FindNextFile(hFind, &FindFileData)) + { + if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + else if (_tcsicmp(&FindFileData.cFileName[_tcslen(FindFileData.cFileName)-4], _T(".bak")) == 0) + { + if (_tcsicmp(FileNameFound.Name, _T("")) == 0) + { + _tcscpy(FileNameFound.Name, FindFileData.cFileName); + FileNameFound.CreationTime = FindFileData.ftCreationTime; + } + else if ((FindFileData.ftCreationTime.dwHighDateTime < FileNameFound.CreationTime.dwHighDateTime) || (FindFileData.ftCreationTime.dwHighDateTime == FileNameFound.CreationTime.dwHighDateTime && FindFileData.ftCreationTime.dwLowDateTime < FileNameFound.CreationTime.dwLowDateTime)) + { + _tcscpy(FileNameFound.Name, FindFileData.cFileName); + FileNameFound.CreationTime = FindFileData.ftCreationTime; + } + i++; + while(PeekMessage(&msg, progress_dialog, 0, 0, PM_REMOVE) != 0) + { + if(!IsDialogMessage(progress_dialog, &msg)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + SendMessage(prog, PBM_SETPOS, (WPARAM)(int)(100 * (options.num_backups - i) / options.num_backups), 0); + UpdateWindow(progress_dialog); + } + } + + FindClose(hFind); + if (i >= options.num_backups) + { + mir_sntprintf(backupfilename1, MAX_PATH, _T("%s\\%s"), backupfolder, FileNameFound.Name); + DeleteFile(backupfilename1); + } + mir_free(backupfolder); + return 0; +} + +int Backup(TCHAR* backup_filename) +{ + TCHAR source_file[MAX_PATH] = {0}, dest_file[MAX_PATH] = {0}; + TCHAR* backupfolder,* pathtmp,* puText; + HWND progress_dialog; + DWORD start_time = GetTickCount(); + int i; + size_t dest_file_len; + + CallService(MS_DB_GETPROFILENAMET, MAX_PATH, (LPARAM)dbname); + + if (backup_filename == NULL) + { + int err = 0; + + SYSTEMTIME st; + TCHAR buffer[MAX_COMPUTERNAME_LENGTH+1]; + DWORD size = sizeof(buffer); + + backupfolder = Utils_ReplaceVarsT(options.folder); + // ensure the backup folder exists (either create it or return non-zero signifying error) + err = CreateDirectoryTree(backupfolder); + if(err != ERROR_ALREADY_EXISTS && err != 0) { + return 1; + } + + GetLocalTime(&st); + GetComputerName(buffer, &size); + mir_sntprintf(dest_file, MAX_PATH, _T("%s\\%s_%02d.%02d.%02d@%02d-%02d-%02d_%s.bak"), backupfolder, dbname, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, buffer); + mir_free(backupfolder); + } + else + lstrcpyn(dest_file, backup_filename, MAX_PATH); + + if(!options.disable_popups) + ShowPopup(dbname, TranslateT("Backup in Progress")); + + if(!options.disable_progress) { + progress_dialog = CreateDialog(hInst, MAKEINTRESOURCE(IDD_COPYPROGRESS), 0, (DLGPROC)DlgProcProgress); + SetDlgItemText(progress_dialog, IDC_PROGRESSMESSAGE, TranslateT("Rotating backup files...")); + } + + RotateBackups(progress_dialog, start_time); + + SetDlgItemText(progress_dialog, 0xDAED, TranslateT("Copying database file...")); + SendMessage(progress_dialog, PBM_SETPOS, (WPARAM)(int)(0), 0); + UpdateWindow(progress_dialog); + + mir_sntprintf(source_file, MAX_PATH, _T("%s\\%s"), profilePath, dbname); + pathtmp = Utils_ReplaceVarsT(source_file); + if (CopyFile(pathtmp, dest_file, 0)) + { + SendMessage(progress_dialog, PBM_SETPOS, (WPARAM)(int)(100), 0); + UpdateWindow(progress_dialog); + DBWriteContactSettingDword(0, "AutoBackups", "LastBackupTimestamp", (DWORD)time(0)); + if(!options.disable_popups) + { + dest_file_len = lstrlen(dest_file); + if(dest_file_len > 50) + { + puText = mir_alloc(sizeof(TCHAR) * (dest_file_len + 2)); + for(i = dest_file_len - 1; dest_file[i] != _T('\\'); i--); + + lstrcpyn(puText, dest_file, i + 2); + lstrcat(puText, _T("\n")); + lstrcat(puText, dest_file + i + 1); + } + else + puText = mir_tstrdup(dest_file); + + ShowPopup(puText, TranslateT("Database backuped")); + mir_free(puText); + } + } + else + DeleteFile(dest_file); + mir_free(pathtmp); + + DestroyWindow(progress_dialog); + return 0; +} + +VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { + time_t t = time(0), diff = t - (time_t)DBGetContactSettingDword(0, "AutoBackups", "LastBackupTimestamp", (DWORD)t); + if(diff > (time_t)(options.period * (options.period_type == PT_MINUTES ? 60 : (options.period_type == PT_HOURS ? 60 * 60 : 60 * 60 * 24 ) ))) + Backup(NULL); +} + +int SetBackupTimer(void) +{ + if(options.backup_types & BT_PERIODIC) + { + if(timer_id == 0) + timer_id = SetTimer(0, 0, 1000 * 60, TimerProc); + } + else if(timer_id != 0) + { + KillTimer(0, timer_id); + timer_id = 0; + } + return 0; +} + +INT_PTR ABService(WPARAM wParam, LPARAM lParam) +{ + Backup((TCHAR*)wParam); + return 0; +} -- cgit v1.2.3