From d123e0ce94bf90b2adb0a4000930eb467e293226 Mon Sep 17 00:00:00 2001 From: sje Date: Wed, 1 Nov 2006 14:48:34 +0000 Subject: git-svn-id: https://server.scottellis.com.au/svn/mim_plugs@16 4f64403b-2f21-0410-a795-97e2b3489a10 --- updater/options.cpp | 714 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 714 insertions(+) create mode 100644 updater/options.cpp (limited to 'updater/options.cpp') 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); + } +} + + -- cgit v1.2.3