summaryrefslogtreecommitdiff
path: root/updater/options.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'updater/options.cpp')
-rw-r--r--updater/options.cpp714
1 files changed, 714 insertions, 0 deletions
diff --git a/updater/options.cpp b/updater/options.cpp
new file mode 100644
index 0000000..87b3fb6
--- /dev/null
+++ b/updater/options.cpp
@@ -0,0 +1,714 @@
+#include "common.h"
+#include "options.h"
+#include "icons.h"
+
+Options options;
+
+HWND hwndOptions = 0;
+
+HANDLE hMainMenuItemRestart, hMainMenuItemUpdateAndExit;
+
+HANDLE hTempPath = 0, hBackupPath = 0, hDataPath = 0, hArchivePath = 0;
+
+void add_restart_menu_item() {
+ CLISTMENUITEM menu = {0};
+
+ menu.cbSize=sizeof(menu);
+ menu.flags = CMIM_ALL;
+ menu.hIcon = hIconRestart;
+
+ menu.pszName = Translate("Restart");
+ menu.pszService= MS_UPDATE_MENURESTART;
+ menu.position = 2000099900;
+ hMainMenuItemRestart = (HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&menu);
+}
+
+void add_update_and_exit_menu_item() {
+ CLISTMENUITEM menu = {0};
+
+ menu.cbSize=sizeof(menu);
+ menu.flags = CMIM_ALL;
+ menu.hIcon = hIconCheckExit;
+
+ menu.pszName = Translate("Update and Exit");
+ menu.pszService= MS_UPDATE_MENUUPDATEANDEXIT;
+ menu.position = 2000099901;
+ hMainMenuItemUpdateAndExit = (HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM,0,(LPARAM)&menu);
+}
+
+void remove_restart_menu_item() {
+#ifdef MS_CLIST_REMOVEMAINMENUITEM
+ CallService(MS_CLIST_REMOVEMAINMENUITEM, (WPARAM)hMainMenuItemRestart, 0);
+#endif
+}
+
+void remove_update_and_exit_menu_item() {
+#ifdef MS_CLIST_REMOVEMAINMENUITEM
+ CallService(MS_CLIST_REMOVEMAINMENUITEM, (WPARAM)hMainMenuItemUpdateAndExit, 0);
+#endif
+}
+
+static int EnumerateFuncFillList(char *szComponentName, UpdateOptions *update_options, LPARAM lParam) {
+ LVITEM lvI = {0};
+ HWND hwndDlg = (HWND)lParam;
+ TCHAR *temp_str;
+
+ // Some code to create the list-view control.
+ // Initialize LVITEM members that are common to all
+ // items.
+ lvI.mask = LVIF_TEXT | LVIF_PARAM;
+ lvI.lParam = (update_options->enabled ? 1 : 0) + (update_options->use_beta ? 2 : 0) + (update_options->fixed ? 4 : 0);
+
+ lvI.iSubItem = 0;
+ lvI.pszText = TranslateTS(temp_str = GetTString(szComponentName));
+ lvI.iItem = ListView_InsertItem(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), &lvI);
+ free(temp_str);
+
+ lvI.mask = LVIF_TEXT;
+ lvI.iSubItem = 1;
+ //lvI.pszText = LPSTR_TEXTCALLBACK;
+ if(((int)lvI.lParam & 4) == 4) {
+ lvI.pszText = (((int)lvI.lParam & 2) == 2 ? TranslateT("FORCED") : TranslateT("N/A"));
+ } else {
+ lvI.pszText = (((int)lvI.lParam & 2) == 2 ? TranslateT("TRUE") : TranslateT("FALSE"));
+ }
+
+ ListView_SetItem(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), &lvI);
+
+ ListView_SetCheckState(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), lvI.iItem, update_options->enabled);
+
+ return 0;
+}
+
+static BOOL CALLBACK DlgProcOpts1(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
+
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ hwndOptions = hwndDlg;
+ TranslateDialogDefault( hwndDlg );
+
+ CheckDlgButton(hwndDlg, IDC_CHK_ONSTART, options.check_on_startup);
+ {
+ HWND hw = GetDlgItem(hwndDlg, IDC_CHK_ONCE);
+ EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONSTART) ? TRUE : FALSE));
+ }
+ CheckDlgButton(hwndDlg, IDC_CHK_ONCE, options.check_once);
+ CheckDlgButton(hwndDlg, IDC_CHK_DAILY, options.check_daily);
+ if(!ServiceExists(MS_TRIGGER_REGISTERACTION)) {
+ HWND hw = GetDlgItem(hwndDlg, IDC_CHK_NOCONFIDLE);
+ EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_DAILY) ? TRUE : FALSE));
+ }
+ CheckDlgButton(hwndDlg, IDC_CHK_NOCONFIDLE, options.no_conf_idle);
+ CheckDlgButton(hwndDlg, IDC_CHK_BACKUP, options.backup);
+ CheckDlgButton(hwndDlg, IDC_CHK_STARTOFFLINE, options.start_offline);
+ CheckDlgButton(hwndDlg, IDC_CHK_POPUP, options.popup_notify);
+ CheckDlgButton(hwndDlg, IDC_CHK_RESTART, options.restart_menu_item);
+ CheckDlgButton(hwndDlg, IDC_CHK_UPDATEANDEXIT, options.update_and_exit_menu_item);
+ CheckDlgButton(hwndDlg, IDC_CHK_SAVEZIPS, options.save_zips);
+ {
+ HWND hw = GetDlgItem(hwndDlg, IDC_CHK_POPUP);
+ EnableWindow(hw, ArePopupsEnabled() ? TRUE : FALSE);
+ }
+ CheckDlgButton(hwndDlg, IDC_CHK_DLLSONLY, options.auto_dll_only);
+
+ // set up Version Requirement slider
+ SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_SETRANGE, 0, MAKELONG(0, 3));
+
+ SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_SETPOS, TRUE, (int)options.ver_req);
+ switch(options.ver_req) {
+ case VR_MAJOR:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on major version change."));
+ break;
+ case VR_MINOR:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on minor version change."));
+ break;
+ case VR_RELEASE:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on release number change."));
+ break;
+ case VR_BUILD:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on build number change."));
+ break;
+ }
+
+
+ SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED),LVM_SETEXTENDEDLISTVIEWSTYLE, 0,LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES);
+
+ {
+ LVCOLUMN lvc;
+ // 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 = 260; // width of column in pixels
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), 0, &lvc);
+
+ lvc.iSubItem = 1;
+ lvc.pszText = TranslateT("Use Beta?");
+ lvc.cx = 80; // width of column in pixels
+ ListView_InsertColumn(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), 1, &lvc);
+ }
+
+ ListView_DeleteAllItems(GetDlgItem(hwndDlg, IDC_LST_REGISTERED));
+ CallService(MS_UPDATE_ENUMERATE, (WPARAM)EnumerateFuncFillList, (LPARAM)hwndDlg);
+
+ //SendDlgItemMessage(hwndDlg, IDC_BTN_CHECK, WM_SETICON, ICON_SMALL, (LPARAM)hIconCheck);
+ //SendDlgItemMessage(hwndDlg, IDC_BTN_CHECKNORESTART, WM_SETICON, ICON_SMALL, (LPARAM)hIconCheckExit);
+ SendDlgItemMessage(hwndDlg, IDC_BTN_CHECK, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIconCheck);
+ SendDlgItemMessage(hwndDlg, IDC_BTN_CHECKNORESTART, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIconCheckExit);
+
+ return FALSE;
+
+ case WMU_CHECKING:
+ {
+ HWND hw = GetDlgItem(hwndDlg, IDC_BTN_CHECK);
+ EnableWindow(hw, FALSE);
+ hw = GetDlgItem(hwndDlg, IDC_BTN_CHECKNORESTART);
+ EnableWindow(hw, FALSE);
+ }
+ return TRUE;
+
+ case WMU_DONECHECKING:
+ {
+ HWND hw = GetDlgItem(hwndDlg, IDC_BTN_CHECK);
+ EnableWindow(hw, TRUE);
+ hw = GetDlgItem(hwndDlg, IDC_BTN_CHECKNORESTART);
+ EnableWindow(hw, TRUE);
+ }
+ return TRUE;
+
+ case WM_HSCROLL:
+ //if (LOWORD(wParam) == TB_PAGEUP || LOWORD(wParam) == TB_PAGEDOWN)
+ {
+ VersionRequirement vr = (VersionRequirement)SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_GETPOS, 0, 0);
+ switch(vr) {
+ case VR_MAJOR:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on major version change."));
+ break;
+ case VR_MINOR:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on minor version change."));
+ break;
+ case VR_RELEASE:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on release number change."));
+ break;
+ case VR_BUILD:
+ SetDlgItemText(hwndDlg, IDC_ST_VERREQ, TranslateT("Update on build number change."));
+ break;
+ }
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ }
+ break;
+ case WM_COMMAND:
+ if ( HIWORD( wParam ) == BN_CLICKED ) {
+ switch( LOWORD( wParam )) {
+ case IDC_CHK_ONSTART:
+ {
+ HWND hw = GetDlgItem(hwndDlg, IDC_CHK_ONCE);
+ EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONSTART) ? TRUE : FALSE));
+ }
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ case IDC_CHK_ONCE:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ case IDC_CHK_DAILY:
+ if(!ServiceExists(MS_TRIGGER_REGISTERACTION)) {
+ HWND hw = GetDlgItem(hwndDlg, IDC_CHK_NOCONFIDLE);
+ EnableWindow(hw, (IsDlgButtonChecked(hwndDlg, IDC_CHK_DAILY) ? TRUE : FALSE));
+ }
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ case IDC_CHK_NOCONFIDLE:
+ case IDC_CHK_BACKUP:
+ case IDC_CHK_STARTOFFLINE:
+ case IDC_CHK_POPUP:
+ case IDC_CHK_RESTART:
+ case IDC_CHK_UPDATEANDEXIT:
+ case IDC_CHK_SAVEZIPS:
+ case IDC_CHK_DLLSONLY:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ return TRUE;
+ case IDC_BTN_CHECK:
+ CallService(MS_UPDATE_CHECKFORUPDATES, 0, 0);
+ return TRUE;
+ case IDC_BTN_CHECKNORESTART:
+ CallService(MS_UPDATE_CHECKFORUPDATES, 0, 1);
+ return TRUE;
+ }
+ }
+ break;
+
+ case WM_NOTIFY:
+ if(((LPNMHDR) lParam)->hwndFrom == GetDlgItem(hwndDlg, IDC_LST_REGISTERED)) {
+ switch (((LPNMHDR) lParam)->code) {
+ case NM_CLICK:
+ if (((LPNMLISTVIEW)lParam)->iSubItem == 1) {
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_PARAM;
+ lvi.iItem = ((LPNMLISTVIEW)lParam)->iItem;
+ lvi.iSubItem = 0;
+ SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), LVM_GETITEM, 0, (LPARAM)&lvi);
+ if(((int)lvi.lParam & 4) == 0) {
+ lvi.lParam ^= 2;
+ ListView_SetItem(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), &lvi);
+
+ lvi.iSubItem = 1;
+ lvi.mask = LVIF_TEXT;
+ if(((int)lvi.lParam & 4) == 4) {
+ lvi.pszText = (((int)lvi.lParam & 2) == 2 ? TranslateT("FORCED") : TranslateT("N/A"));
+ } else {
+ lvi.pszText = (((int)lvi.lParam & 2) == 2 ? TranslateT("TRUE") : TranslateT("FALSE"));
+ }
+ ListView_SetItem(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), &lvi);
+
+ ListView_RedrawItems(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), lvi.iItem, lvi.iItem);
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ return 0;
+ case LVN_ITEMCHANGED:
+ {
+ NMLISTVIEW *nmlv = (NMLISTVIEW *)lParam;
+
+ if(IsWindowVisible(GetDlgItem(hwndDlg, IDC_LST_REGISTERED)) && ((nmlv->uNewState ^ nmlv->uOldState) & LVIS_STATEIMAGEMASK))
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ break;
+ case LVN_GETDISPINFO:
+ {
+ LVITEM lvi = {0};
+ lvi.mask = LVIF_PARAM;
+ lvi.iItem = ((NMLVDISPINFO *)lParam)->item.iItem;
+ lvi.iSubItem = 0;
+ SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), LVM_GETITEM, 0, (LPARAM)&lvi);
+ switch (((NMLVDISPINFO *)lParam)->item.iSubItem) {
+ case 0:
+ MessageBox(0, _T("LVN_GETDISPINFO (0)"), _T("msg"), MB_OK);
+ break;
+ case 1:
+ if(((int)lvi.lParam & 4) == 4) {
+ ((NMLVDISPINFO *)lParam)->item.pszText = (((int)lvi.lParam & 2) == 2 ? TranslateT("FORCED") : TranslateT("N/A"));
+ ((NMLVDISPINFO *)lParam)->item.cchTextMax = _tcslen(((NMLVDISPINFO *)lParam)->item.pszText);
+ } else {
+ ((NMLVDISPINFO *)lParam)->item.pszText = (((int)lvi.lParam & 2) == 2 ? TranslateT("TRUE") : TranslateT("FALSE"));
+ ((NMLVDISPINFO *)lParam)->item.cchTextMax = _tcslen(((NMLVDISPINFO *)lParam)->item.pszText);
+ }
+ break;
+ }
+ }
+ return 0;
+ }
+ } else
+ if (((LPNMHDR)lParam)->code == (unsigned)PSN_APPLY ) {
+ options.check_on_startup = (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONSTART) ? true : false);
+ options.check_once = (IsDlgButtonChecked(hwndDlg, IDC_CHK_ONCE) ? true : false);
+ options.check_daily = (IsDlgButtonChecked(hwndDlg, IDC_CHK_DAILY) ? true : false);
+ options.no_conf_idle = (IsDlgButtonChecked(hwndDlg, IDC_CHK_NOCONFIDLE) ? true : false);
+ options.backup = (IsDlgButtonChecked(hwndDlg, IDC_CHK_BACKUP) ? true : false);
+ options.start_offline = (IsDlgButtonChecked(hwndDlg, IDC_CHK_STARTOFFLINE) ? true : false);
+ options.popup_notify = (IsDlgButtonChecked(hwndDlg, IDC_CHK_POPUP) ? true : false);
+ options.ver_req = (VersionRequirement)SendDlgItemMessage(hwndDlg, IDC_SLID_VERREQ, TBM_GETPOS, 0, 0);
+ options.save_zips = (IsDlgButtonChecked(hwndDlg, IDC_CHK_SAVEZIPS) ? true : false);
+ options.auto_dll_only = (IsDlgButtonChecked(hwndDlg, IDC_CHK_DLLSONLY) ? true : false);
+
+ bool restart_menu_item = (IsDlgButtonChecked(hwndDlg, IDC_CHK_RESTART) ? true : false);
+ if(options.restart_menu_item != restart_menu_item) {
+ options.restart_menu_item = restart_menu_item;
+ if(options.restart_menu_item) add_restart_menu_item();
+ else remove_restart_menu_item();
+ }
+
+ bool update_and_exit_menu_item = (IsDlgButtonChecked(hwndDlg, IDC_CHK_UPDATEANDEXIT) ? true : false);
+ if(options.update_and_exit_menu_item != update_and_exit_menu_item) {
+ options.update_and_exit_menu_item = update_and_exit_menu_item;
+ if(options.update_and_exit_menu_item) add_update_and_exit_menu_item();
+ else remove_update_and_exit_menu_item();
+ }
+
+ int count = ListView_GetItemCount(GetDlgItem(hwndDlg, IDC_LST_REGISTERED));
+ UpdateOptions uo;
+ LVITEM lvi;
+ lvi.mask = LVIF_TEXT | LVIF_PARAM;
+ TCHAR buff[256];
+ lvi.pszText = buff;
+ lvi.cchTextMax = 256;
+ lvi.iSubItem = 0;
+ for(int i = 0; i < count; i++) {
+ lvi.iItem = i;
+ SendMessage(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), LVM_GETITEM, 0, (LPARAM)&lvi);
+
+ uo.enabled = (ListView_GetCheckState(GetDlgItem(hwndDlg, IDC_LST_REGISTERED), lvi.iItem) == TRUE);
+ uo.use_beta = (((int)lvi.lParam & 2) == 2);
+ uo.fixed = (((int)lvi.lParam & 4) == 4);
+
+ CallService(MS_UPDATE_SETUPDATEOPTIONS, (WPARAM)lvi.pszText, (LPARAM)&uo);
+ }
+
+ SaveOptions();
+ return TRUE;
+ }
+ break;
+ case WM_DESTROY:
+ hwndOptions = 0;
+ break;
+ }
+
+ return FALSE;
+}
+
+static BOOL CALLBACK DlgProcOpts2(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
+
+ switch ( msg ) {
+ case WM_INITDIALOG:
+ TranslateDialogDefault( hwndDlg );
+
+ SetDlgItemText(hwndDlg, IDC_ED_UPDATES, options.temp_folder);
+ SetDlgItemText(hwndDlg, IDC_ED_DATA, options.data_folder);
+ SetDlgItemText(hwndDlg, IDC_ED_BACKUPS, options.backup_folder);
+ SetDlgItemText(hwndDlg, IDC_ED_ZIPS, options.zip_folder);
+
+ return FALSE;
+ case WM_COMMAND:
+ if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus()) {
+ switch( LOWORD( wParam )) {
+ case IDC_ED_UPDATES:
+ case IDC_ED_DATA:
+ case IDC_ED_BACKUPS:
+ case IDC_ED_ZIPS:
+ SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ }
+ }
+ if ( HIWORD( wParam ) == BN_CLICKED ) {
+
+ TCHAR folder_buff[MAX_PATH];
+ BROWSEINFO bi = {0};
+ LPCITEMIDLIST pidl;
+
+ bi.hwndOwner = hwndDlg;
+ bi.pidlRoot = 0;
+ bi.pszDisplayName = folder_buff;
+ bi.lpszTitle = TranslateT("Select Updates Folder");
+ bi.ulFlags = 0;
+ bi.lpfn = 0;
+ bi.lParam = 0;
+ bi.iImage = 0;
+
+ if((pidl = SHBrowseForFolder(&bi)) != 0) {
+ SHGetPathFromIDList(pidl, folder_buff);
+ CoTaskMemFree((void *)pidl);
+
+ switch( LOWORD( wParam )) {
+ case IDC_BTN_BRUPDATES:
+ SetDlgItemText(hwndDlg, IDC_ED_UPDATES, folder_buff);
+ SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 );
+ break;
+ case IDC_BTN_BRDATA:
+ SetDlgItemText(hwndDlg, IDC_ED_DATA, folder_buff);
+ SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 );
+ break;
+ case IDC_BTN_BRBACKUPS:
+ SetDlgItemText(hwndDlg, IDC_ED_BACKUPS, folder_buff);
+ SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 );
+ break;
+ case IDC_BTN_BRZIPS:
+ SetDlgItemText(hwndDlg, IDC_ED_ZIPS, folder_buff);
+ SendMessage( GetParent( hwndDlg ), PSM_CHANGED, 0, 0 );
+ break;
+ }
+
+
+ return TRUE;
+ }
+ }
+ return FALSE;
+ case WM_NOTIFY:
+ if (((LPNMHDR)lParam)->code == (unsigned)PSN_APPLY ) {
+ GetDlgItemText(hwndDlg, IDC_ED_UPDATES, options.temp_folder, MAX_PATH);
+
+
+ if(!FolderIsEmpty(options.temp_folder)) {
+ MessageBox(hwndDlg, TranslateT("The folder you have chosen for temporary files is not empty.\nALL FILES in this folder will be REMOVED during the update process."), TranslateT("Updater Warning"), MB_ICONWARNING | MB_OK);
+ }
+
+ GetDlgItemText(hwndDlg, IDC_ED_DATA, options.data_folder, MAX_PATH);
+ GetDlgItemText(hwndDlg, IDC_ED_BACKUPS, options.backup_folder, MAX_PATH);
+ GetDlgItemText(hwndDlg, IDC_ED_ZIPS, options.zip_folder, MAX_PATH);
+
+ SaveOptions();
+
+ return TRUE;
+ }
+ break;
+ }
+ return FALSE;
+}
+
+int OptInit(WPARAM wParam,LPARAM lParam)
+{
+#define OPTIONPAGE_OLD_SIZE2 60
+ DWORD mirVir = (DWORD)CallService(MS_SYSTEM_GETVERSION, 0, 0);
+
+ OPTIONSDIALOGPAGE odp = { 0 };
+ odp.cbSize = (mirVir >= 0x00060000 ? sizeof(odp) : OPTIONPAGE_OLD_SIZE2);
+ odp.flags = ODPF_BOLDGROUPS | ODPF_TCHAR;
+ odp.position = -790000000;
+ odp.hInstance = hInst;
+
+ if(ServiceExists(MS_FOLDERS_GET_PATH)) {
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT1);
+ //odp.pszTitle = Translate("Settings");
+ //odp.pszGroup = Translate("Updates");
+ odp.ptszTitle = TranslateT("Updater");
+ odp.ptszGroup = TranslateT("Services");
+ odp.nIDBottomSimpleControl = 0;
+ odp.pfnDlgProc = DlgProcOpts1;
+ CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp );
+ } else {
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT1);
+ //odp.pszTitle = Translate("Settings");
+ //odp.pszGroup = Translate("Updates");
+ odp.ptszTitle = (mirVir >= 0x00060000 ? TranslateT("Updater") : TranslateT("Settings"));
+ odp.ptszGroup = (mirVir >= 0x00060000 ? TranslateT("Services") : TranslateT("Updates"));
+ odp.nIDBottomSimpleControl = 0;
+ odp.pfnDlgProc = DlgProcOpts1;
+ odp.ptszTab = TranslateT("Settings");
+ CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp );
+
+ odp.pszTemplate = MAKEINTRESOURCEA(IDD_OPT2);
+ //odp.pszTitle = Translate("Folders");
+ //odp.pszGroup = Translate("Updates");
+ odp.ptszTitle = (mirVir >= 0x00060000 ? TranslateT("Updater") : TranslateT("Folders"));
+ odp.ptszGroup = (mirVir >= 0x00060000 ? TranslateT("Services") : TranslateT("Updates"));
+ odp.nIDBottomSimpleControl = 0;
+ odp.pfnDlgProc = DlgProcOpts2;
+ odp.ptszTab = TranslateT("Folders");
+ CallService( MS_OPT_ADDPAGE, wParam,( LPARAM )&odp );
+ }
+
+ return 0;
+}
+
+#ifdef _UNICODE
+#define DBGetString DBGetContactSettingTString
+#define DBWriteString DBWriteContactSettingTString
+#else
+#define DBGetString DBGetContactSetting
+#define DBWriteString DBWriteContactSettingString
+#endif
+
+void InitOptionsMenuItems() {
+ if(options.restart_menu_item)
+ add_restart_menu_item();
+ if(options.update_and_exit_menu_item)
+ add_update_and_exit_menu_item();
+}
+
+int FoldersPathChanged(WPARAM wParam, LPARAM lParam) {
+ FOLDERSGETDATA fgd = {0};
+ fgd.cbSize = sizeof(fgd);
+ fgd.nMaxPathSize = MAX_PATH;
+
+ fgd.szPathT = options.temp_folder;
+ CallService(MS_FOLDERS_GET_PATH, (WPARAM)hTempPath, (WPARAM)&fgd);
+
+ if(!FolderIsEmpty(options.temp_folder)) {
+ MessageBox(0, TranslateT("The folder you have chosen for temporary files is not empty.\nALL FILES in this folder will be REMOVED during the update process."), TranslateT("Updater Warning"), MB_ICONWARNING | MB_OK);
+ }
+
+ fgd.szPathT = options.backup_folder;
+ CallService(MS_FOLDERS_GET_PATH, (WPARAM)hBackupPath, (WPARAM)&fgd);
+
+ fgd.szPathT = options.data_folder;
+ CallService(MS_FOLDERS_GET_PATH, (WPARAM)hDataPath, (WPARAM)&fgd);
+
+ fgd.szPathT = options.zip_folder;
+ CallService(MS_FOLDERS_GET_PATH, (WPARAM)hArchivePath, (WPARAM)&fgd);
+
+ return 0;
+}
+
+void LoadOptions() {
+ options.check_on_startup = (DBGetContactSettingByte(0, MODULE, "CheckOnStartup", 1) == 1);
+ options.check_once = (DBGetContactSettingByte(0, MODULE, "CheckOnce", 1) == 1);
+ options.check_daily = (DBGetContactSettingByte(0, MODULE, "CheckDaily", 1) == 1);
+ options.no_conf_idle = (DBGetContactSettingByte(0, MODULE, "NoConfIdle", 0) == 1);
+ options.backup = (DBGetContactSettingByte(0, MODULE, "Backup", 1) == 1);
+ //options.use_xml_backend = (DBGetContactSettingByte(0, MODULE, "UseXML", 1) == 1);
+ options.use_xml_backend = true;
+ options.start_offline = (DBGetContactSettingByte(0, MODULE, "StartOffline", 1) == 1);
+ options.popup_notify = (DBGetContactSettingByte(0, MODULE, "PopupNotify", 0) == 1);
+ options.restart_menu_item = (DBGetContactSettingByte(0, MODULE, "RestartMenuItem", 0) == 1);
+ options.update_and_exit_menu_item = (DBGetContactSettingByte(0, MODULE, "UpdateAndExitMenuItem", 0) == 1);
+ options.save_zips = (DBGetContactSettingByte(0, MODULE, "SaveZips", 0) == 1);
+
+ options.set_colours = false; // = (DBGetContactSettingByte(0, MODULE, "PopupSetColours", 0) == 1); // popup colours - not implemented
+ options.bkCol = DBGetContactSettingDword(0, MODULE, "PopupBkCol", 0);
+ options.textCol = DBGetContactSettingDword(0, MODULE, "PopupTextCol", 0x00FFFFFF);
+
+ options.ver_req = (VersionRequirement)DBGetContactSettingByte(0, MODULE, "VersionRequirement", VR_BUILD);
+ options.auto_dll_only = (DBGetContactSettingByte(0, MODULE, "AutoDLLOnly", 0) == 1);
+
+ if(ServiceExists(MS_FOLDERS_GET_PATH)) {
+ FOLDERSDATA fd = {0};
+ fd.cbSize = sizeof(fd);
+#ifdef _UNICODE
+ fd.flags = FF_UNICODE;
+#endif
+ strncpy(fd.szSection, Translate("Updates"), 64);
+
+ strncpy(fd.szName, Translate("Temporary Files"), 64);
+ fd.szFormatT = _T(MIRANDA_PATH) _T("\\updater\\temp");
+ hTempPath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);
+
+ if(hTempPath) {
+ strncpy(fd.szName, Translate("Backups"), 64);
+ fd.szFormatT = _T(MIRANDA_PATH) _T("\\updater\\backups");
+ hBackupPath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);
+
+ strncpy(fd.szName, Translate("Data"), 64);
+ fd.szFormatT = _T(MIRANDA_PATH) _T("\\updater\\data");
+ hDataPath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);
+
+ strncpy(fd.szName, Translate("Saved Archives"), 64);
+ fd.szFormatT = _T(MIRANDA_PATH) _T("\\updater\\archives");
+ hArchivePath = (HANDLE)CallService(MS_FOLDERS_REGISTER_PATH, 0, (LPARAM)&fd);
+
+ HookEvent(ME_FOLDERS_PATH_CHANGED, FoldersPathChanged);
+ FoldersPathChanged(0, 0);
+
+ return;
+ }
+ }
+
+ TCHAR mir_path[MAX_PATH];
+ GetModuleFileName(0, mir_path, MAX_PATH);
+ TCHAR *p = _tcsrchr(mir_path, _T('\\'));
+ if(p) *p = 0;
+ else {
+ p = _tcsrchr(mir_path, _T('/'));
+ if(p) *p = 0;
+ }
+
+ DBVARIANT dbv;
+ if(!DBGetString(0, MODULE, "TempFolder", &dbv)) {
+ if(_tcslen(dbv.ptszVal) >= 2 && dbv.ptszVal[1] == _T(':')) // detect an absolute path?
+ _tcsncpy(options.temp_folder, dbv.ptszVal, MAX_PATH);
+ else {
+ _tcscpy(options.temp_folder, mir_path);
+ _tcscat(options.temp_folder, dbv.ptszVal);
+ }
+ DBFreeVariant(&dbv);
+ } else {
+
+ _tcscpy(options.temp_folder, mir_path);
+ _tcscat(options.temp_folder, _T("\\Updater"));
+ _tcscat(options.temp_folder, _T("\\Temp"));
+ }
+
+ if(!DBGetString(0, MODULE, "BackupFolder", &dbv)) {
+ if(_tcslen(dbv.ptszVal) >= 2 && dbv.ptszVal[1] == _T(':')) // detect an absolute path?
+ _tcsncpy(options.backup_folder, dbv.ptszVal, MAX_PATH);
+ else {
+ _tcscpy(options.backup_folder, mir_path);
+ _tcscat(options.backup_folder, dbv.ptszVal);
+ }
+ DBFreeVariant(&dbv);
+ } else {
+
+ _tcscpy(options.backup_folder, mir_path);
+ _tcscat(options.backup_folder, _T("\\Updater"));
+ _tcscat(options.backup_folder, _T("\\Backups"));
+ }
+
+ if(!DBGetString(0, MODULE, "DataFolder", &dbv)) {
+ if(_tcslen(dbv.ptszVal) >= 2 && dbv.ptszVal[1] == _T(':')) // detect an absolute path?
+ _tcsncpy(options.data_folder, dbv.ptszVal, MAX_PATH);
+ else {
+ _tcscpy(options.data_folder, mir_path);
+ _tcscat(options.data_folder, dbv.ptszVal);
+ }
+ DBFreeVariant(&dbv);
+ } else {
+
+ _tcscpy(options.data_folder, mir_path);
+ _tcscat(options.data_folder, _T("\\Updater"));
+ _tcscat(options.data_folder, _T("\\Data"));
+ }
+
+ if(!DBGetString(0, MODULE, "ZipFolder", &dbv)) {
+ if(_tcslen(dbv.ptszVal) >= 2 && dbv.ptszVal[1] == _T(':')) // detect an absolute path?
+ _tcsncpy(options.zip_folder, dbv.ptszVal, MAX_PATH);
+ else {
+ _tcscpy(options.zip_folder, mir_path);
+ _tcscat(options.zip_folder, dbv.ptszVal);
+ }
+ DBFreeVariant(&dbv);
+ } else {
+
+ _tcscpy(options.zip_folder, mir_path);
+ _tcscat(options.zip_folder, _T("\\Updater"));
+ _tcscat(options.zip_folder, _T("\\Archives"));
+ }
+}
+
+void SaveOptions() {
+ DBWriteContactSettingByte(0, MODULE, "CheckOnStartup", options.check_on_startup ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "CheckOnce", options.check_once ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "CheckDaily", options.check_daily ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "NoConfIdle", options.no_conf_idle ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "Backup", options.backup ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "UseXML", options.use_xml_backend ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "StartOffline", options.start_offline ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "PopupNotify", options.popup_notify ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "RestartMenuItem", options.restart_menu_item ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "UpdateAndExitMenuItem", options.update_and_exit_menu_item ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "VersionRequirement", (int)options.ver_req);
+ DBWriteContactSettingByte(0, MODULE, "SaveZips", (int)options.save_zips);
+ DBWriteContactSettingByte(0, MODULE, "AutoDLLOnly", options.auto_dll_only ? 1 : 0);
+
+ TCHAR mir_path[MAX_PATH];
+ GetModuleFileName(0, mir_path, MAX_PATH);
+ TCHAR *p = _tcsrchr(mir_path, _T('\\'));
+ if(p) *p = 0;
+ else {
+ p = _tcsrchr(mir_path, _T('/'));
+ if(p) *p = 0;
+ }
+
+ unsigned int mp_len = _tcslen(mir_path);
+
+ // remove mir_path from the front of folder names, so that profile can be moved
+ if(_tcslen(options.temp_folder) > mp_len && _tcsncmp(options.temp_folder, mir_path, mp_len) == 0) {
+ p = options.temp_folder + mp_len;
+ DBWriteString(0, MODULE, "TempFolder", p);
+ } else {
+ DBWriteString(0, MODULE, "TempFolder", options.temp_folder);
+ }
+
+ if(_tcslen(options.backup_folder) > mp_len && _tcsncmp(options.backup_folder, mir_path, mp_len) == 0) {
+ p = options.backup_folder + mp_len;
+ DBWriteString(0, MODULE, "BackupFolder", p);
+ } else {
+ DBWriteString(0, MODULE, "BackupFolder", options.backup_folder);
+ }
+
+ if(_tcslen(options.data_folder) > mp_len && _tcsncmp(options.data_folder, mir_path, mp_len) == 0) {
+ p = options.data_folder + mp_len;
+ DBWriteString(0, MODULE, "DataFolder", p);
+ } else {
+ DBWriteString(0, MODULE, "DataFolder", options.data_folder);
+ }
+
+ if(_tcslen(options.zip_folder) > mp_len && _tcsncmp(options.zip_folder, mir_path, mp_len) == 0) {
+ p = options.zip_folder + mp_len;
+ DBWriteString(0, MODULE, "ZipFolder", p);
+ } else {
+ DBWriteString(0, MODULE, "ZipFolder", options.zip_folder);
+ }
+}
+
+