1115 lines
32 KiB
C++
1115 lines
32 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1998.
|
|
//
|
|
// File: Settings.cpp
|
|
//
|
|
// Contents: Onestop settings routines
|
|
//
|
|
// Classes:
|
|
//
|
|
// Notes:
|
|
//
|
|
// History: 10-Nov-97 SusiA Created.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "precomp.h"
|
|
|
|
extern HINSTANCE g_hmodThisDll; // Handle to this DLL itself.
|
|
extern UINT g_cRefThisDll;
|
|
extern CRITICAL_SECTION g_DllCriticalSection; // Global Critical Section for this DLL
|
|
extern OSVERSIONINFOA g_OSVersionInfo; // osVersionInfo, setup by WinMain.
|
|
|
|
// items for context sensitive help
|
|
// Review -Should be string in resource.
|
|
TCHAR szSyncMgrHelp[] = TEXT("mobsync.hlp");
|
|
|
|
ULONG g_aContextHelpIds[] =
|
|
{
|
|
IDC_STATIC1, ((DWORD) -1),
|
|
IDC_STATIC2, ((DWORD) -1),
|
|
IDC_STATIC3, ((DWORD) -1),
|
|
IDC_STATIC4, ((DWORD) -1),
|
|
IDC_ADVANCEDIDLEOVERVIEWTEXT, ((DWORD) -1),
|
|
IDC_ADVANCEDIDLEWAITTEXT, ((DWORD) -1),
|
|
IDC_ADVANCEDIDLEMINUTESTEXT1, ((DWORD) -1),
|
|
IDC_ADVANCEDIDLEMINUTESTEXT2, ((DWORD) -1),
|
|
IDC_SP_SEPARATOR, ((DWORD) -1),
|
|
IDS_CONNECTDESCRIPTION, ((DWORD) -1),
|
|
IDC_SCHED_NAME, ((DWORD) -1),
|
|
IDC_SCHED_STRING, ((DWORD) -1),
|
|
IDC_LASTRUN, ((DWORD) -1),
|
|
IDC_NEXTRUN, ((DWORD) -1),
|
|
IDC_ConnectionText, ((DWORD) -1),
|
|
IDC_RUNLOGGEDON, HIDC_RUNLOGGEDON,
|
|
IDC_RUNALWAYS, HIDC_RUNALWAYS,
|
|
IDC_RUNAS_TEXT, HIDC_RUNAS_TEXT,
|
|
IDC_USERNAME, HIDC_USERNAME,
|
|
IDC_PASSWORD_TEXT, HIDC_PASSWORD_TEXT,
|
|
IDC_PASSWORD, HIDC_PASSWORD,
|
|
IDC_CONFIRMPASSWORD_TEXT, HIDC_CONFIRMPASSWORD_TEXT,
|
|
IDC_CONFIRMPASSWORD, HIDC_CONFIRMPASSWORD,
|
|
IDC_ADVANCEDIDLE, HIDC_ADVANCEDIDLE,
|
|
IDC_AUTOCONNECT, HIDC_AUTOCONNECT,
|
|
IDC_AUTOLOGOFF, HIDC_AUTOLOGOFF,
|
|
IDC_AUTOLOGON, HIDC_AUTOLOGON,
|
|
IDC_AUTOPROMPT_ME_FIRST, HIDC_AUTOPROMPT_ME_FIRST,
|
|
IDC_AUTOUPDATECOMBO, HIDC_AUTOUPDATECOMBO,
|
|
IDC_AUTOUPDATELIST, HIDC_AUTOUPDATELIST,
|
|
IDC_CHECKREPEATESYNC, HIDC_CHECKREPEATESYNC,
|
|
IDC_CHECKRUNONBATTERIES, HIDC_CHECKRUNONBATTERIES,
|
|
IDC_EDITIDLEREPEATMINUTES, HIDC_EDITIDLEREPEATMINUTES,
|
|
IDC_EDITIWAITMINUTES, HIDC_EDITIWAITMINUTES,
|
|
IDC_SPINIDLEREPEATMINUTES, HIDC_EDITIDLEREPEATMINUTES,
|
|
IDC_SPINIDLEWAITMINUTES, HIDC_EDITIWAITMINUTES,
|
|
IDC_IDLECHECKBOX, HIDC_IDLECHECKBOX,
|
|
IDC_SCHEDADD, HIDC_SCHEDADD,
|
|
IDC_SCHEDEDIT, HIDC_SCHEDEDIT,
|
|
IDC_SCHEDLIST, HIDC_SCHEDLIST,
|
|
IDC_SCHEDREMOVE, HIDC_SCHEDREMOVE,
|
|
IDC_SCHEDUPDATECOMBO, HIDC_SCHEDUPDATECOMBO,
|
|
IDC_SCHEDUPDATELIST, HIDC_SCHEDUPDATELIST,
|
|
IDC_SCHED_NAME_EDITBOX, HIDC_SCHED_NAME_EDITBOX,
|
|
0,0
|
|
};
|
|
|
|
|
|
INT_PTR CALLBACK AutoSyncDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR CALLBACK SchedSyncDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR CALLBACK IdleSyncDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
|
|
INT_PTR CALLBACK IdleAdvancedSettingsDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam);
|
|
|
|
int CALLBACK PropSheetProc( HWND hwndDlg, UINT uMsg, LPARAM lParam);
|
|
|
|
DWORD WINAPI SettingsThread( LPVOID lpArg );
|
|
|
|
DWORD g_SettingsThreadID = NULL;
|
|
HWND g_hwndPropSheet = NULL;
|
|
CAutoSyncPage *g_pAutoSyncPage = NULL; // shared by AutoSync and IdleSyncDlg Procs
|
|
CSchedSyncPage *g_pSchedSyncPage = NULL;
|
|
BOOL g_fInSettingsDialog = FALSE;
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
//
|
|
// FUNCTION: IsSchedulingInstalled()
|
|
//
|
|
// PURPOSE: Determines is there is a task scheduler on the current workstation
|
|
//
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
BOOL IsSchedulingInstalled()
|
|
{
|
|
BOOL fInstalled = FALSE;
|
|
ISchedulingAgent *pSchedAgent = NULL;
|
|
|
|
// Review if there is a better way to test this.
|
|
if (NOERROR == CoCreateInstance(CLSID_CSchedulingAgent,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_ISchedulingAgent,
|
|
(LPVOID*)&pSchedAgent) )
|
|
{
|
|
fInstalled = TRUE;
|
|
pSchedAgent->Release();
|
|
}
|
|
|
|
return fInstalled;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
//
|
|
// FUNCTION: IsIdleAvailable()
|
|
//
|
|
// PURPOSE: Determines is this machine supports can Idle
|
|
//
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
BOOL IsIdleAvailable()
|
|
{
|
|
BOOL fInstalled = FALSE;
|
|
ISchedulingAgent *pSchedAgent = NULL;
|
|
|
|
// Review if there is a better way to test this.
|
|
if (NOERROR == CoCreateInstance(CLSID_CSchedulingAgent,
|
|
NULL,
|
|
CLSCTX_INPROC_SERVER,
|
|
IID_ISchedulingAgent,
|
|
(LPVOID*)&pSchedAgent) )
|
|
{
|
|
fInstalled = TRUE;
|
|
pSchedAgent->Release();
|
|
}
|
|
|
|
return fInstalled;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
//
|
|
// FUNCTION: IsAutoSyncAvailable()
|
|
//
|
|
// PURPOSE: Determines is this machine supports AutoSync
|
|
//
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
BOOL IsAutoSyncAvailable()
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
//
|
|
// FUNCTION: DisplayOptions()
|
|
//
|
|
// PURPOSE: Display the Onestop autosync options
|
|
//
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
STDAPI DisplayOptions(HWND hwndOwner)
|
|
{
|
|
#define MAXNUMPROPSHEETS 3
|
|
|
|
int hr = E_FAIL;
|
|
DWORD dwError;
|
|
// always use ANSI versions since doesn't matter
|
|
PROPSHEETPAGE psp [MAXNUMPROPSHEETS];
|
|
HPROPSHEETPAGE hpsp [MAXNUMPROPSHEETS];
|
|
PROPSHEETHEADER psh;
|
|
int nPages = 0;
|
|
BOOL fIdleAvailable;
|
|
CCriticalSection cCritSect(&g_DllCriticalSection,GetCurrentThreadId());
|
|
|
|
cCritSect.Enter();
|
|
|
|
if (g_fInSettingsDialog) // IF ALREADY DISPLAYING A DIALOG BOX, THEN JUST RETURN
|
|
{
|
|
HWND hwndSettings = g_hwndPropSheet;
|
|
|
|
cCritSect.Leave();
|
|
|
|
if (hwndSettings)
|
|
{
|
|
SetForegroundWindow(hwndSettings);
|
|
}
|
|
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
g_fInSettingsDialog = TRUE;
|
|
cCritSect.Leave();
|
|
|
|
hr = CoInitialize(NULL);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
|
|
RegSetUserDefaults(); // Make Sure the UserDefaults are up to date
|
|
|
|
ZeroMemory(psp,sizeof(psp));
|
|
ZeroMemory(&psh, sizeof(psh));
|
|
|
|
|
|
if (IsAutoSyncAvailable())
|
|
{
|
|
psp[nPages].dwSize = sizeof (psp[0]);
|
|
psp[nPages].dwFlags = PSP_DEFAULT | PSP_USETITLE;
|
|
psp[nPages].hInstance = g_hmodThisDll;
|
|
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_AUTOSYNC);
|
|
psp[nPages].pszIcon = NULL;
|
|
psp[nPages].pfnDlgProc = AutoSyncDlgProc;
|
|
//Logon only on everything but NT5
|
|
if ((VER_PLATFORM_WIN32_WINDOWS == g_OSVersionInfo.dwPlatformId) ||
|
|
(g_OSVersionInfo.dwMajorVersion < 5))
|
|
{
|
|
psp[nPages].pszTitle = MAKEINTRESOURCE(IDS_LOGON_TAB);
|
|
}
|
|
else
|
|
{
|
|
psp[nPages].pszTitle = MAKEINTRESOURCE(IDS_LOGONLOGOFF_TAB);
|
|
}
|
|
psp[nPages].lParam = 0;
|
|
|
|
hpsp[nPages] = CreatePropertySheetPage(&(psp[nPages]));
|
|
++nPages;
|
|
}
|
|
|
|
if (fIdleAvailable = IsIdleAvailable())
|
|
{
|
|
|
|
psp[nPages].dwSize = sizeof (psp[0]);
|
|
psp[nPages].dwFlags = PSP_DEFAULT | PSP_USETITLE;
|
|
|
|
psp[nPages].hInstance = g_hmodThisDll;
|
|
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_IDLESETTINGS);
|
|
psp[nPages].pszIcon = NULL;
|
|
psp[nPages].pfnDlgProc = IdleSyncDlgProc;
|
|
psp[nPages].pszTitle = MAKEINTRESOURCE(IDS_ONIDLE_TAB);
|
|
psp[nPages].lParam = 0;
|
|
|
|
hpsp[nPages] = CreatePropertySheetPage(&(psp[nPages]));
|
|
|
|
++nPages;
|
|
}
|
|
|
|
|
|
// Review - if have idle have schedule, why not collapse
|
|
// all these IsxxxAvailable into one call.
|
|
if (fIdleAvailable /* IsSchedulingInstalled() */)
|
|
{
|
|
psp[nPages].dwSize = sizeof (psp[0]);
|
|
psp[nPages].dwFlags = PSP_DEFAULT | PSP_USETITLE;
|
|
psp[nPages].hInstance = g_hmodThisDll;
|
|
psp[nPages].pszTemplate = MAKEINTRESOURCE(IDD_SCHEDSYNC);
|
|
psp[nPages].pszIcon = NULL;
|
|
psp[nPages].pfnDlgProc = SchedSyncDlgProc;
|
|
psp[nPages].pszTitle = MAKEINTRESOURCE(IDS_SCHEDULED_TAB);
|
|
psp[nPages].lParam = 0;
|
|
|
|
hpsp[nPages] = CreatePropertySheetPage(&(psp[nPages]));
|
|
|
|
++nPages;
|
|
}
|
|
|
|
|
|
Assert(nPages <= MAXNUMPROPSHEETS);
|
|
|
|
psh.dwSize = sizeof (psh);
|
|
psh.dwFlags = PSH_DEFAULT | PSH_USECALLBACK | PSH_USEHICON;
|
|
psh.hwndParent = hwndOwner;
|
|
psh.hInstance = g_hmodThisDll;
|
|
psh.pszIcon = NULL;
|
|
psh.hIcon = LoadIcon(g_hmodThisDll, MAKEINTRESOURCE(IDI_SYNCMGR));
|
|
psh.pszCaption = MAKEINTRESOURCE(IDS_SCHEDULED_TITLE);
|
|
psh.nPages = nPages;
|
|
psh.phpage = hpsp;
|
|
psh.pfnCallback = PropSheetProc;
|
|
psh.nStartPage = 0;
|
|
|
|
hr = (int)PropertySheet(&psh);
|
|
|
|
// remove global classes
|
|
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
delete g_pAutoSyncPage;
|
|
g_pAutoSyncPage = NULL;
|
|
}
|
|
|
|
g_SettingsThreadID = NULL;
|
|
|
|
if (g_pSchedSyncPage)
|
|
{
|
|
delete g_pSchedSyncPage;
|
|
g_pSchedSyncPage = NULL;
|
|
}
|
|
|
|
g_hwndPropSheet = NULL;
|
|
|
|
CoFreeUnusedLibraries();
|
|
CoUninitialize();
|
|
}
|
|
|
|
if (hr == -1)
|
|
{
|
|
dwError = GetLastError();
|
|
}
|
|
|
|
cCritSect.Enter();
|
|
g_fInSettingsDialog = FALSE; // allow another settings to be created.
|
|
cCritSect.Leave();
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
// FUNCTION: AutoSyncDlgProc(HWND, UINT, WPARAM, LPARAM)
|
|
//
|
|
// PURPOSE: Callback dialog procedure for the property page
|
|
//
|
|
// PARAMETERS:
|
|
// hDlg - Dialog box window handle
|
|
// uMessage - current message
|
|
// wParam - depends on message
|
|
// lParam - depends on message
|
|
//
|
|
// RETURN VALUE:
|
|
//
|
|
// Depends on message. In general, return TRUE if we process it.
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
//+-------------------------------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK AutoSyncDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WORD wNotifyCode = HIWORD(wParam); // notification code
|
|
|
|
switch (uMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
// if on NT 4.0 or Win9x hide the logoff
|
|
// button
|
|
|
|
//!!! warning, if you change platform logic must also change
|
|
// logic for && out logoff flag in Register Interfaces.
|
|
|
|
if ((VER_PLATFORM_WIN32_WINDOWS == g_OSVersionInfo.dwPlatformId)
|
|
|| (VER_PLATFORM_WIN32_NT == g_OSVersionInfo.dwPlatformId
|
|
&& g_OSVersionInfo.dwMajorVersion < 5) )
|
|
{
|
|
HWND hwndLogoff = GetDlgItem(hDlg,IDC_AUTOLOGOFF);
|
|
|
|
if (hwndLogoff)
|
|
{
|
|
ShowWindow(hwndLogoff,SW_HIDE);
|
|
EnableWindow(hwndLogoff,FALSE);
|
|
}
|
|
|
|
}
|
|
|
|
if (NULL == g_pAutoSyncPage)
|
|
{
|
|
g_pAutoSyncPage = new CAutoSyncPage(g_hmodThisDll);
|
|
}
|
|
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
g_pAutoSyncPage->SetAutoSyncHwnd(hDlg);
|
|
g_pAutoSyncPage->InitializeHwnd(hDlg,SYNCTYPE_AUTOSYNC,0);
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
{
|
|
|
|
if (g_pAutoSyncPage && g_pAutoSyncPage->m_pItemListViewAutoSync)
|
|
{
|
|
delete g_pAutoSyncPage->m_pItemListViewAutoSync;
|
|
g_pAutoSyncPage->m_pItemListViewAutoSync = NULL;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_AUTOUPDATECOMBO:
|
|
{
|
|
if (wNotifyCode == CBN_SELCHANGE)
|
|
{
|
|
HWND hwndCombo = (HWND) lParam;
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
g_pAutoSyncPage->ShowItemsOnThisConnection
|
|
(hDlg,SYNCTYPE_AUTOSYNC,ComboBox_GetCurSel(hwndCombo));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_AUTOLOGON:
|
|
case IDC_AUTOLOGOFF:
|
|
case IDC_AUTOPROMPT_ME_FIRST:
|
|
{
|
|
if (wNotifyCode == BN_CLICKED)
|
|
{
|
|
PropSheet_Changed(g_hwndPropSheet, hDlg);
|
|
|
|
HWND hwndCtrl = (HWND) lParam;
|
|
g_pAutoSyncPage->SetConnectionCheck(hDlg,SYNCTYPE_AUTOSYNC,LOWORD(wParam),
|
|
Button_GetCheck(hwndCtrl));
|
|
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
}
|
|
break;
|
|
case WM_HELP:
|
|
{
|
|
LPHELPINFO lphi = (LPHELPINFO)lParam;
|
|
|
|
if (lphi->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
WinHelp ( (HWND) lphi->hItemHandle,
|
|
szSyncMgrHelp,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR) g_aContextHelpIds);
|
|
}
|
|
return TRUE;
|
|
}
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
|
|
WinHelp ((HWND)wParam,
|
|
szSyncMgrHelp,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)g_aContextHelpIds);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_NOTIFYLISTVIEWEX:
|
|
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
int idCtrl = (int) wParam;
|
|
LPNMHDR pnmhdr = (LPNMHDR) lParam;
|
|
|
|
if ( (IDC_AUTOUPDATELIST != idCtrl) || (NULL == g_pAutoSyncPage->m_pItemListViewAutoSync))
|
|
{
|
|
Assert(IDC_AUTOUPDATELIST == idCtrl);
|
|
Assert(g_pAutoSyncPage->m_pItemListViewAutoSync);
|
|
break;
|
|
}
|
|
|
|
switch (pnmhdr->code)
|
|
{
|
|
case LVNEX_ITEMCHECKCOUNT:
|
|
{
|
|
LPNMLISTVIEWEXITEMCHECKCOUNT pnmvCheckCount = (LPNMLISTVIEWEXITEMCHECKCOUNT) lParam;
|
|
|
|
// pass along notification only if listView is done being initialized
|
|
// since no need to set the CheckState or mark PSheet as Dirty
|
|
if (g_pAutoSyncPage->m_pItemListViewAutoSyncInitialized)
|
|
{
|
|
|
|
g_pAutoSyncPage->SetItemCheckState(hDlg,SYNCTYPE_AUTOSYNC,
|
|
pnmvCheckCount->iItemId,pnmvCheckCount->dwItemState
|
|
,pnmvCheckCount->iCheckCount);
|
|
|
|
PropSheet_Changed(g_hwndPropSheet, hDlg);
|
|
}
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
int idCtrl = (int) wParam;
|
|
LPNMHDR pnmhdr = (LPNMHDR) lParam;
|
|
|
|
|
|
// if notification for UpdateListPass it on.
|
|
if ((IDC_AUTOUPDATELIST == idCtrl) && g_pAutoSyncPage->m_pItemListViewAutoSync)
|
|
{
|
|
g_pAutoSyncPage->m_pItemListViewAutoSync->OnNotify(pnmhdr);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
switch (((NMHDR FAR *)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
//User has clicked the OK or Apply button so we'll
|
|
//Save the current selections
|
|
|
|
g_pAutoSyncPage->CommitAutoSyncChanges();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
// FUNCTION: IdleSyncDlgProc(HWND, UINT, WPARAM, LPARAM)
|
|
//
|
|
// PURPOSE: Callback dialog procedure for the iDLE property page
|
|
//
|
|
// PARAMETERS:
|
|
// hDlg - Dialog box window handle
|
|
// uMessage - current message
|
|
// wParam - depends on message
|
|
// lParam - depends on message
|
|
//
|
|
// RETURN VALUE:
|
|
//
|
|
// Depends on message. In general, return TRUE if we process it.
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
//+-------------------------------------------------------------------------------
|
|
|
|
INT_PTR CALLBACK IdleSyncDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WORD wNotifyCode = HIWORD(wParam); // notification code
|
|
|
|
switch (uMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
/*
|
|
RECT rc;
|
|
HRESULT hr;
|
|
|
|
|
|
hr = GetWindowRect(hDlg, &rc);
|
|
|
|
hr = SetWindowPos(hDlg,
|
|
NULL,
|
|
((GetSystemMetrics(SM_CXSCREEN) - (rc.right - rc.left)) / 2),
|
|
((GetSystemMetrics(SM_CYSCREEN) - (rc.bottom - rc.top)) / 2),
|
|
0,
|
|
0,
|
|
SWP_NOSIZE | SWP_NOACTIVATE); */
|
|
|
|
|
|
if (NULL == g_pAutoSyncPage)
|
|
{
|
|
g_pAutoSyncPage = new CAutoSyncPage(g_hmodThisDll);
|
|
}
|
|
|
|
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
BOOL fConnectionsAvailable;
|
|
|
|
g_pAutoSyncPage->SetIdleHwnd(hDlg);
|
|
g_pAutoSyncPage->InitializeHwnd(hDlg,SYNCTYPE_IDLE,0);
|
|
|
|
// there must be at least one connection or we disable
|
|
// the advanced button.
|
|
|
|
fConnectionsAvailable =
|
|
g_pAutoSyncPage->GetNumConnections(hDlg,SYNCTYPE_IDLE)
|
|
? TRUE : FALSE;
|
|
|
|
EnableWindow(GetDlgItem(hDlg,IDC_ADVANCEDIDLE),fConnectionsAvailable);
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
break;
|
|
case WM_DESTROY:
|
|
{
|
|
|
|
if (g_pAutoSyncPage && g_pAutoSyncPage->m_pItemListViewIdle)
|
|
{
|
|
delete g_pAutoSyncPage->m_pItemListViewIdle;
|
|
g_pAutoSyncPage->m_pItemListViewIdle = NULL;
|
|
}
|
|
|
|
// PostQuitMessage(0);
|
|
|
|
// PostQuitMessage(0);
|
|
}
|
|
break;
|
|
case WM_HELP:
|
|
{
|
|
LPHELPINFO lphi = (LPHELPINFO)lParam;
|
|
|
|
if (lphi->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
WinHelp ( (HWND) lphi->hItemHandle,
|
|
szSyncMgrHelp,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR) g_aContextHelpIds);
|
|
}
|
|
return TRUE;
|
|
}
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
|
|
WinHelp ((HWND)wParam,
|
|
szSyncMgrHelp,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)g_aContextHelpIds);
|
|
|
|
return TRUE;
|
|
}
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_AUTOUPDATECOMBO:
|
|
{
|
|
if (wNotifyCode == CBN_SELCHANGE)
|
|
{
|
|
HWND hwndCombo = (HWND) lParam;
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
g_pAutoSyncPage->ShowItemsOnThisConnection
|
|
(hDlg,SYNCTYPE_IDLE,ComboBox_GetCurSel(hwndCombo));
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case IDC_IDLECHECKBOX:
|
|
{
|
|
if (wNotifyCode == BN_CLICKED)
|
|
{
|
|
PropSheet_Changed(g_hwndPropSheet, hDlg);
|
|
|
|
HWND hwndCtrl = (HWND) lParam;
|
|
g_pAutoSyncPage->SetConnectionCheck(hDlg,SYNCTYPE_IDLE,LOWORD(wParam),
|
|
Button_GetCheck(hwndCtrl));
|
|
|
|
}
|
|
}
|
|
break;
|
|
case IDC_ADVANCEDIDLE:
|
|
{
|
|
if (wNotifyCode == BN_CLICKED)
|
|
{
|
|
// bring up the advanced idle dialog passing in the autoSyncPage class
|
|
// as the owning class.
|
|
DialogBoxParam(g_hmodThisDll,
|
|
MAKEINTRESOURCE(IDD_ADVANCEDIDLESETTINGS),hDlg, IdleAdvancedSettingsDlgProc,
|
|
(LPARAM) g_pAutoSyncPage);
|
|
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
break;
|
|
case WM_NOTIFYLISTVIEWEX:
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
int idCtrl = (int) wParam;
|
|
LPNMHDR pnmhdr = (LPNMHDR) lParam;
|
|
|
|
if ( (IDC_AUTOUPDATELIST != idCtrl) || (NULL == g_pAutoSyncPage->m_pItemListViewIdle))
|
|
{
|
|
Assert(IDC_AUTOUPDATELIST == idCtrl);
|
|
Assert(g_pAutoSyncPage->m_pItemListViewIdle);
|
|
break;
|
|
}
|
|
|
|
switch (pnmhdr->code)
|
|
{
|
|
case LVNEX_ITEMCHECKCOUNT:
|
|
{
|
|
LPNMLISTVIEWEXITEMCHECKCOUNT pnmvCheckCount = (LPNMLISTVIEWEXITEMCHECKCOUNT) lParam;
|
|
|
|
// pass along notification only if listView is done being initialized
|
|
// since no need to set the CheckState or mark PSheet as Dirty
|
|
if (g_pAutoSyncPage->m_fListViewIdleInitialized)
|
|
{
|
|
g_pAutoSyncPage->SetItemCheckState(hDlg,SYNCTYPE_IDLE,
|
|
pnmvCheckCount->iItemId,pnmvCheckCount->dwItemState
|
|
,pnmvCheckCount->iCheckCount);
|
|
|
|
PropSheet_Changed(g_hwndPropSheet, hDlg);
|
|
}
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
case WM_NOTIFY:
|
|
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
int idCtrl = (int) wParam;
|
|
LPNMHDR pnmhdr = (LPNMHDR) lParam;
|
|
|
|
// if notification for UpdateListPass it on.
|
|
if ((IDC_AUTOUPDATELIST == idCtrl) && g_pAutoSyncPage->m_pItemListViewIdle)
|
|
{
|
|
g_pAutoSyncPage->m_pItemListViewIdle->OnNotify(pnmhdr);
|
|
break;
|
|
}
|
|
|
|
switch (((NMHDR FAR *)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
break;
|
|
case PSN_APPLY:
|
|
//User has clicked the OK or Apply button so we'll
|
|
//Save the current selections
|
|
g_pAutoSyncPage->CommitIdleChanges();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
// FUNCTION: IdleAdvancedSettingsDlgProc(HWND, UINT, WPARAM, LPARAM)
|
|
//
|
|
// PURPOSE: Callback dialog procedure for the Advanced Idle Settings.
|
|
//
|
|
// PARAMETERS:
|
|
// hDlg - Dialog box window handle
|
|
// uMessage - current message
|
|
// wParam - depends on message
|
|
// lParam - depends on message
|
|
//
|
|
// RETURN VALUE:
|
|
//
|
|
// Depends on message. In general, return TRUE if we process it.
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
//+-------------------------------------------------------------------------------
|
|
|
|
|
|
INT_PTR CALLBACK IdleAdvancedSettingsDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
|
|
switch(uMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
CONNECTIONSETTINGS ConnectionSettings;
|
|
|
|
Assert(g_pAutoSyncPage);
|
|
|
|
if (NULL == g_pAutoSyncPage)
|
|
return FALSE;
|
|
|
|
UpDown_SetRange(GetDlgItem(hDlg,IDC_SPINIDLEWAITMINUTES), SPINDIALWAITMINUTES_MIN, SPINDIALWAITMINUTES_MAX);
|
|
Edit_LimitText(GetDlgItem(hDlg,IDC_EDITIWAITMINUTES), 3);
|
|
|
|
UpDown_SetRange(GetDlgItem(hDlg,IDC_SPINIDLEREPEATMINUTES), SPINDIALREPEATMINUTES_MIN, SPINDIALREPEATMINUTES_MAX);
|
|
Edit_LimitText(GetDlgItem(hDlg,IDC_EDITIDLEREPEATMINUTES), 3);
|
|
|
|
// initialize user specific preferences
|
|
// if can't get shouldn't show dialog
|
|
|
|
// EditText cannot accept DBCS characters on Win9x so disalbe IME for
|
|
// Edit Boxes.
|
|
|
|
ImmAssociateContext(GetDlgItem(hDlg,IDC_EDITIWAITMINUTES), NULL);
|
|
ImmAssociateContext(GetDlgItem(hDlg,IDC_EDITIDLEREPEATMINUTES), NULL);
|
|
|
|
if (NOERROR == g_pAutoSyncPage->GetAdvancedIdleSettings(&ConnectionSettings))
|
|
{
|
|
UpDown_SetPos(GetDlgItem(hDlg,IDC_SPINIDLEWAITMINUTES), ConnectionSettings.ulIdleWaitMinutes);
|
|
UpDown_SetPos(GetDlgItem(hDlg,IDC_SPINIDLEREPEATMINUTES),ConnectionSettings.ulIdleRetryMinutes);
|
|
|
|
Button_SetCheck(GetDlgItem(hDlg,IDC_CHECKREPEATESYNC),ConnectionSettings.dwRepeatSynchronization);
|
|
Button_SetCheck(GetDlgItem(hDlg,IDC_CHECKRUNONBATTERIES),!(ConnectionSettings.dwRunOnBatteries));
|
|
|
|
// if the repeat check state is selected then enable the edit box associated with it
|
|
EnableWindow(GetDlgItem(hDlg,IDC_SPINIDLEREPEATMINUTES),ConnectionSettings.dwRepeatSynchronization);
|
|
EnableWindow(GetDlgItem(hDlg,IDC_EDITIDLEREPEATMINUTES),ConnectionSettings.dwRepeatSynchronization);
|
|
EnableWindow(GetDlgItem(hDlg,IDC_ADVANCEDIDLEMINUTESTEXT2),ConnectionSettings.dwRepeatSynchronization);
|
|
|
|
}
|
|
|
|
ShowWindow(hDlg,SW_SHOW);
|
|
return TRUE;
|
|
break;
|
|
}
|
|
case WM_HELP:
|
|
{
|
|
LPHELPINFO lphi = (LPHELPINFO)lParam;
|
|
|
|
if (lphi->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
WinHelp ( (HWND) lphi->hItemHandle,
|
|
szSyncMgrHelp,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR) g_aContextHelpIds);
|
|
}
|
|
return TRUE;
|
|
}
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
|
|
WinHelp ((HWND)wParam,
|
|
szSyncMgrHelp,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)g_aContextHelpIds);
|
|
|
|
return TRUE;
|
|
}
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDCANCEL:
|
|
EndDialog(hDlg,FALSE);
|
|
break;
|
|
case IDOK:
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
CONNECTIONSETTINGS ConnectionSettings;
|
|
|
|
if (g_pAutoSyncPage)
|
|
{
|
|
|
|
ConnectionSettings.ulIdleWaitMinutes = GetDlgItemInt(hDlg, IDC_EDITIWAITMINUTES, NULL, FALSE);
|
|
ConnectionSettings.ulIdleRetryMinutes = GetDlgItemInt(hDlg, IDC_EDITIDLEREPEATMINUTES, NULL, FALSE);
|
|
|
|
ConnectionSettings.dwRepeatSynchronization = Button_GetCheck(GetDlgItem(hDlg,IDC_CHECKREPEATESYNC));
|
|
ConnectionSettings.dwRunOnBatteries = (!Button_GetCheck(GetDlgItem(hDlg,IDC_CHECKRUNONBATTERIES)));
|
|
|
|
g_pAutoSyncPage->SetAdvancedIdleSettings(&ConnectionSettings);
|
|
}
|
|
}
|
|
EndDialog(hDlg,FALSE);
|
|
break;
|
|
case IDC_EDITIWAITMINUTES:
|
|
{
|
|
WORD wNotifyCode = HIWORD(wParam);
|
|
INT iNewPos;
|
|
|
|
//
|
|
// If the user just pasted non-numeric text or an illegal numeric
|
|
// value, overwrite it and complain.
|
|
//
|
|
if (EN_KILLFOCUS == wNotifyCode)
|
|
{
|
|
iNewPos = GetDlgItemInt(hDlg, IDC_EDITIWAITMINUTES, NULL, FALSE);
|
|
if (iNewPos < SPINDIALWAITMINUTES_MIN || iNewPos > SPINDIALWAITMINUTES_MAX)
|
|
{
|
|
HWND hUD = GetDlgItem(hDlg,IDC_SPINIDLEWAITMINUTES);
|
|
|
|
if (iNewPos < SPINDIALWAITMINUTES_MIN)
|
|
{
|
|
UpDown_SetPos(hUD, SPINDIALWAITMINUTES_MIN);
|
|
}
|
|
else
|
|
{
|
|
UpDown_SetPos(hUD,SPINDIALWAITMINUTES_MAX);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
break;
|
|
}
|
|
case IDC_EDITIDLEREPEATMINUTES:
|
|
{
|
|
WORD wNotifyCode = HIWORD(wParam);
|
|
INT iNewPos;
|
|
|
|
//
|
|
// If the user just pasted non-numeric text or an illegal numeric
|
|
// value, overwrite it and complain.
|
|
//
|
|
|
|
// Review, redundant code with other spin control.
|
|
if (EN_KILLFOCUS == wNotifyCode)
|
|
{
|
|
iNewPos = GetDlgItemInt(hDlg, IDC_EDITIDLEREPEATMINUTES, NULL, FALSE);
|
|
if (iNewPos < SPINDIALREPEATMINUTES_MIN || iNewPos > SPINDIALREPEATMINUTES_MAX)
|
|
{
|
|
HWND hUD = GetDlgItem(hDlg,IDC_SPINIDLEREPEATMINUTES);
|
|
|
|
if (iNewPos < SPINDIALREPEATMINUTES_MIN)
|
|
{
|
|
UpDown_SetPos(hUD, SPINDIALREPEATMINUTES_MIN);
|
|
}
|
|
else
|
|
{
|
|
UpDown_SetPos(hUD,SPINDIALREPEATMINUTES_MAX);
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
}
|
|
case IDC_CHECKREPEATESYNC:
|
|
{
|
|
WORD wNotifyCode = HIWORD(wParam);
|
|
|
|
// if use clicked the repeat check box set set state of the other
|
|
// items associated with it.
|
|
|
|
if (BN_CLICKED == wNotifyCode)
|
|
{
|
|
BOOL fEnableState = Button_GetCheck(GetDlgItem(hDlg,IDC_CHECKREPEATESYNC));
|
|
|
|
// if the repeat check state is selected then enable the edit box associated with it
|
|
EnableWindow(GetDlgItem(hDlg,IDC_SPINIDLEREPEATMINUTES),fEnableState);
|
|
EnableWindow(GetDlgItem(hDlg,IDC_EDITIDLEREPEATMINUTES),fEnableState);
|
|
EnableWindow(GetDlgItem(hDlg,IDC_ADVANCEDIDLEMINUTESTEXT2),fEnableState);
|
|
}
|
|
|
|
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------------
|
|
// FUNCTION: SchedSyncDlgProc(HWND, UINT, WPARAM, LPARAM)
|
|
//
|
|
// PURPOSE: Callback dialog procedure for the property page
|
|
//
|
|
// PARAMETERS:
|
|
// hDlg - Dialog box window handle
|
|
// uMessage - current message
|
|
// wParam - depends on message
|
|
// lParam - depends on message
|
|
//
|
|
// RETURN VALUE:
|
|
//
|
|
// Depends on message. In general, return TRUE if we process it.
|
|
//
|
|
// COMMENTS:
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
|
INT_PTR CALLBACK SchedSyncDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
WORD wNotifyCode = HIWORD(wParam); // notification code
|
|
BOOL bResult = FALSE;
|
|
|
|
switch (uMessage)
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
|
|
g_pSchedSyncPage = new CSchedSyncPage(g_hmodThisDll, hDlg);
|
|
|
|
if (g_pSchedSyncPage)
|
|
{
|
|
bResult = g_pSchedSyncPage->Initialize();
|
|
}
|
|
|
|
}
|
|
break;
|
|
case WM_DESTROY:
|
|
{
|
|
g_pSchedSyncPage->FreeAllSchedules();
|
|
}
|
|
break;
|
|
case WM_HELP:
|
|
{
|
|
LPHELPINFO lphi = (LPHELPINFO)lParam;
|
|
|
|
if (lphi->iContextType == HELPINFO_WINDOW)
|
|
{
|
|
WinHelp ( (HWND) lphi->hItemHandle,
|
|
szSyncMgrHelp,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR) g_aContextHelpIds);
|
|
}
|
|
|
|
bResult = TRUE;
|
|
}
|
|
break;
|
|
case WM_CONTEXTMENU:
|
|
{
|
|
WinHelp ((HWND)wParam,
|
|
szSyncMgrHelp,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)g_aContextHelpIds);
|
|
|
|
bResult = TRUE;
|
|
}
|
|
break;
|
|
case WM_NOTIFY:
|
|
switch (((NMHDR FAR *)lParam)->code)
|
|
{
|
|
case PSN_SETACTIVE:
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
//User has clicked the OK or Apply button so we'll
|
|
//update the icon information in the .GAK file
|
|
break;
|
|
|
|
default:
|
|
bResult = g_pSchedSyncPage->OnNotify(hDlg,(int)wParam,(LPNMHDR)lParam);
|
|
break;
|
|
}
|
|
break;
|
|
case WM_COMMAND:
|
|
bResult = g_pSchedSyncPage->OnCommand(hDlg, HIWORD(wParam), LOWORD(wParam),
|
|
(HWND)lParam);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return bResult;
|
|
}
|
|
//+-------------------------------------------------------------------------------
|
|
//
|
|
// FUNCTION: CALLBACK PropSheetProc( HWND hwndDlg, UINT uMsg, LPARAM lParam);
|
|
//
|
|
// PURPOSE: Callback dialog init procedure the settings property dialog
|
|
//
|
|
// PARAMETERS:
|
|
// hwndDlg - Dialog box window handle
|
|
// uMsg - current message
|
|
// lParam - depends on message
|
|
//
|
|
//--------------------------------------------------------------------------------
|
|
|
|
int CALLBACK PropSheetProc( HWND hwndDlg, UINT uMsg, LPARAM lParam)
|
|
{
|
|
switch(uMsg)
|
|
{
|
|
case PSCB_INITIALIZED:
|
|
g_hwndPropSheet = hwndDlg;
|
|
return TRUE;
|
|
break;
|
|
default:
|
|
return TRUE;
|
|
}
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|