diff --git a/SkinInstaller/DialogBackup.cpp b/SkinInstaller/DialogBackup.cpp index 96281969..ca20cfd8 100644 --- a/SkinInstaller/DialogBackup.cpp +++ b/SkinInstaller/DialogBackup.cpp @@ -19,6 +19,7 @@ #include "StdAfx.h" #include "Application.h" #include "DialogBackup.h" +#include "DialogInstall.h" #include "resource.h" #include "../Version.h" @@ -190,10 +191,9 @@ void CDialogBackup::StartBackup() bool CDialogBackup::CreateBackup() { m_WriteBuffer = new char[c_WriteBufferSize]; - - std::wstring addonsPath = g_Data.programPath + L"Addons"; - std::wstring fontsPath = g_Data.programPath + L"Fonts"; - std::wstring pluginsPath = g_Data.programPath + L"Plugins"; + + std::wstring addonsPath = g_Data.settingsPath + L"Addons"; + std::wstring pluginsPath = g_Data.settingsPath + L"Plugins"; std::wstring themesPath = g_Data.settingsPath + L"Themes"; std::wstring skinsPath = g_Data.skinsPath; @@ -207,9 +207,26 @@ bool CDialogBackup::CreateBackup() return false; } + // Create and add the options file + { + WCHAR tempFile[MAX_PATH]; + GetTempPath(MAX_PATH, tempFile); + GetTempFileName(tempFile, L"ini", 0, tempFile); + + WCHAR userName[UNLEN + 1]; + DWORD userNameSize = UNLEN + 1; + GetUserName(userName, &userNameSize); + + WritePrivateProfileString(L"rmskin", L"Name", L"Backup", tempFile); + WritePrivateProfileString(L"rmskin", L"Author", userName, tempFile); + WritePrivateProfileString(L"rmskin", L"Version", m_BackupTime.c_str(), tempFile); + WritePrivateProfileString(L"rmskin", L"MinimumRainmeter", L"2.3", tempFile); + AddFileToBackup(ConvertToAscii(tempFile).c_str(), "RMSKIN.ini"); + DeleteFile(tempFile); + } + if ((_waccess(addonsPath.c_str(), 0) == 0 && !AddFolderToBackup(addonsPath, L"", "Addons", true)) || - (_waccess(fontsPath.c_str(), 0) == 0 && !AddFolderToBackup(themesPath, L"", "Fonts", true)) || - (_waccess(skinsPath.c_str(), 0) == 0 && !AddFolderToBackup(skinsPath, L"", "Skins", true)) || + //(_waccess(skinsPath.c_str(), 0) == 0 && !AddFolderToBackup(skinsPath, L"", "Skins", true)) || (_waccess(themesPath.c_str(), 0) == 0 && !AddFolderToBackup(themesPath, L"", "Themes", true)) || #ifdef _WIN64 (_waccess(pluginsPath.c_str(), 0) == 0 && !AddFolderToBackup(pluginsPath, L"", "Plugins\\64bit", false))) @@ -221,30 +238,22 @@ bool CDialogBackup::CreateBackup() return false; } - // Create and add the config file - WCHAR tempFile[MAX_PATH]; - GetTempPath(MAX_PATH, tempFile); - GetTempFileName(tempFile, L"ini", 0, tempFile); - - std::wstring tmpSz = m_TargetFile; - std::wstring::size_type pos = m_TargetFile.find_last_of(L'\\'); - if (pos != std::wstring::npos) - { - tmpSz.erase(0, ++pos); - } - - WritePrivateProfileString(L"Rainstaller", L"Name", tmpSz.c_str(), tempFile); - WritePrivateProfileString(L"Rainstaller", L"RainmeterFonts", L"1", tempFile); - WritePrivateProfileString(L"Rainstaller", L"MinRainmeterVer", L"2.2", tempFile); - AddFileToBackup(ConvertToAscii(tempFile).c_str(), "Rainstaller.cfg"); - DeleteFile(tempFile); - if (zipClose(m_ZipFile, NULL) != ZIP_OK) { MessageBox(NULL, L"Unable to access backup .rmskin file.", NULL, MB_OK | MB_TOPMOST); return false; } + // Add footer + FILE* file = _wfopen(m_TargetFile.c_str(), L"r+b"); + if (file) + { + fseek(file, 0, SEEK_END); + CDialogInstall::PackageFooter footer = { _ftelli64(file), CDialogInstall::PackageFlag::Backup, "RMSKIN" }; + fwrite(&footer, sizeof(footer), 1, file); + fclose(file); + } + delete m_WriteBuffer; return true; } @@ -431,10 +440,16 @@ void CDialogBackup::CTabBackup::Initialize() if (SUCCEEDED(hr)) { c_Dialog->m_TargetFile = buffer; + SYSTEMTIME lt; GetLocalTime(<); - _snwprintf_s(buffer, _TRUNCATE, L"\\Backup-%02d.%02d.%02d-%02d.%02d.rmskin", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute); - c_Dialog->m_TargetFile += buffer; + _snwprintf_s(buffer, _TRUNCATE, L"%02d.%02d.%02d-%02d.%02d", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute); + + c_Dialog->m_BackupTime = buffer; + + c_Dialog->m_TargetFile += L"\\Backup-"; + c_Dialog->m_TargetFile += c_Dialog->m_BackupTime; + c_Dialog->m_TargetFile += L".rmskin"; HWND item = GetDlgItem(m_Window, IDC_BACKUP_FILE_TEXT); SetWindowText(item, c_Dialog->m_TargetFile.c_str()); diff --git a/SkinInstaller/DialogBackup.h b/SkinInstaller/DialogBackup.h index 3dd789ca..ec6a9702 100644 --- a/SkinInstaller/DialogBackup.h +++ b/SkinInstaller/DialogBackup.h @@ -62,6 +62,7 @@ private: CTabBackup m_TabBackup; std::wstring m_TargetFile; + std::wstring m_BackupTime; HANDLE m_ThreadHandle; diff --git a/SkinInstaller/DialogInstall.cpp b/SkinInstaller/DialogInstall.cpp index de76f515..71300a7a 100644 --- a/SkinInstaller/DialogInstall.cpp +++ b/SkinInstaller/DialogInstall.cpp @@ -264,7 +264,7 @@ bool CDialogInstall::ReadPackage() __int64 fileSize = 0; if (file) { - fseek(file, sizeof(footer), SEEK_END); + fseek(file, -(long)sizeof(footer), SEEK_END); fileSize = _ftelli64(file); fread(&footer, sizeof(footer), 1, file); fclose(file); @@ -331,15 +331,15 @@ bool CDialogInstall::ReadPackage() if (!path) { path = buffer; - + } + else + { if (m_PackageFormat == PackageFormat::New) { // New package files must be in root of archive continue; } - } - else - { + ++path; // Skip slash } diff --git a/SkinInstaller/DialogInstall.h b/SkinInstaller/DialogInstall.h index 9124bf83..bd42422e 100644 --- a/SkinInstaller/DialogInstall.h +++ b/SkinInstaller/DialogInstall.h @@ -40,6 +40,8 @@ protected: virtual CTab& GetActiveTab(); private: + friend class CDialogBackup; + class CTabInstall : public CTab { public: diff --git a/SkinInstaller/SkinInstaller.rc b/SkinInstaller/SkinInstaller.rc index 8915161f..72315bf3 100644 --- a/SkinInstaller/SkinInstaller.rc +++ b/SkinInstaller/SkinInstaller.rc @@ -64,12 +64,12 @@ IDD_BACKUP_TABDIALOG DIALOGEX 15, 30, 250, 58 STYLE DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS FONT 8, "MS Shell Dlg 2" { - LTEXT "A backup allows you to save a complete copy of your setup, including skins and statistics.\n\nThe backup will be created at:", IDC_BACKUP_DESCRIPTION_TEXT, 0, 0, 245, 39 + LTEXT "A backup allows you to save a complete copy of your current Rainmeter skins and themes.\n\nThe backup will be created at:", IDC_BACKUP_DESCRIPTION_TEXT, 0, 0, 245, 39 EDITTEXT IDC_BACKUP_FILE_TEXT, 0, 42, 220, 14, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "...", IDC_BACKUP_BROWSE_BUTTON, 225, 42, 25, 14, WS_TABSTOP - LTEXT "Backup in progress...", IDC_BACKUP_INPROGRESS_TEXT, 0, 0, 245, 9, NOT WS_VISIBLE - CONTROL "", IDC_BACKUP_PROGRESS, "msctls_progress32", PBS_MARQUEE | NOT WS_VISIBLE | WS_BORDER, 0, 42, 250, 11 + LTEXT "Backup in progress...", IDC_BACKUP_INPROGRESS_TEXT, 0, 0, 245, 39, NOT WS_VISIBLE + CONTROL "", IDC_BACKUP_PROGRESS, "msctls_progress32", PBS_MARQUEE | NOT WS_VISIBLE | WS_BORDER, 0, 15, 250, 11 } IDD_INSTALL_DIALOG DIALOGEX 0, 0, 266, 270 diff --git a/SkinInstaller/StdAfx.h b/SkinInstaller/StdAfx.h index f5ed3bf1..115f39b2 100644 --- a/SkinInstaller/StdAfx.h +++ b/SkinInstaller/StdAfx.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include