windows-nt/Source/XPSP1/NT/com/mobile/syncmgr/dll/cred.cxx
2020-09-26 16:20:57 +08:00

422 lines
13 KiB
C++

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1996.
//
// File: wizsel.cxx
//
// Contents: Task schedule credentials selection property page implementation.
//
// Classes: CCredentialsPage
//
// History: 05-22-1998 SusiA
//
//---------------------------------------------------------------------------
#include "precomp.h"
// temporariy define new mstask flag in case hasn't
// propogated to sdk\inc
//for CS help
#ifdef _CREDENTIALS
extern TCHAR szSyncMgrHelp[];
extern ULONG g_aContextHelpIds[];
extern DWORD g_dwPlatformId;
CCredentialsPage *g_pCredentialsPage = NULL;
//+-------------------------------------------------------------------------------
// FUNCTION: SchedWizardCredentialsDlgProc(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:
//
//--------------------------------------------------------------------------------
BOOL CALLBACK SchedWizardCredentialsDlgProc(HWND hDlg, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
WORD wNotifyCode = HIWORD(wParam); // notification code
switch (uMessage)
{
case WM_INITDIALOG:
if (g_pCredentialsPage)
g_pCredentialsPage->Initialize(hDlg);
InitPage(hDlg,lParam);
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_PAINT:
WmPaint(hDlg, uMessage, wParam, lParam);
break;
case WM_PALETTECHANGED:
WmPaletteChanged(hDlg, wParam);
break;
case WM_QUERYNEWPALETTE:
return( WmQueryNewPalette(hDlg) );
break;
case WM_ACTIVATE:
return( WmActivate(hDlg, wParam, lParam) );
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_USERNAME:
case IDC_PASSWORD:
case IDC_CONFIRMPASSWORD:
{
if (wNotifyCode == EN_CHANGE)
{
PropSheet_Changed(GetParent(hDlg), hDlg);
g_pCredentialsPage->SetDirty();
}
}
break;
case IDC_RUNLOGGEDON:
{
if (wNotifyCode == BN_CLICKED)
{
PropSheet_Changed(GetParent(hDlg), hDlg);
g_pCredentialsPage->SetDirty();
g_pCredentialsPage->SetEnabled(FALSE);
}
}
break;
case IDC_RUNALWAYS:
{
if (wNotifyCode == BN_CLICKED)
{
PropSheet_Changed(GetParent(hDlg), hDlg);
g_pCredentialsPage->SetDirty();
g_pCredentialsPage->SetEnabled(TRUE);
}
}
break;
default:
break;
}
break;
default:
return FALSE;
}
return TRUE;
}
//+--------------------------------------------------------------------------
//
// Member: CCredentialsPage::CCredentialsPage
//
// Synopsis: ctor
//
// [phPSP] - filled with prop page handle
//
// History: 11-21-1997 SusiA
//
//---------------------------------------------------------------------------
CCredentialsPage::CCredentialsPage(
HINSTANCE hinst,
BOOL *pfSaved,
ISyncSchedule *pISyncSched,
HPROPSHEETPAGE *phPSP)
{
ZeroMemory(&m_psp, sizeof(PROPSHEETPAGE));
m_psp.dwSize = sizeof (PROPSHEETPAGE);
m_psp.dwFlags = PSP_DEFAULT;
m_psp.hInstance = hinst;
m_psp.pszTemplate = MAKEINTRESOURCE(IDD_SCHEDPAGE_CREDENTIALS);
m_psp.pszIcon = NULL;
m_psp.pfnDlgProc = (DLGPROC) SchedWizardCredentialsDlgProc;
m_psp.lParam = 0;
g_pCredentialsPage = this;
m_pISyncSched = pISyncSched;
m_pISyncSched->AddRef();
m_pfSaved = pfSaved;
*m_pfSaved = FALSE;
m_fTaskAccountChange = FALSE;
#ifdef WIZARD97
m_psp.dwFlags |= PSP_HIDEHEADER;
#endif // WIZARD97
*phPSP = CreatePropertySheetPage(&m_psp);
}
//+--------------------------------------------------------------------------
//
// Member: CCredentialsPage::Initialize(HWND hwnd)
//
// Synopsis: initialize the credentials page
//
// History: 05-22-1998 SusiA
//
//---------------------------------------------------------------------------
BOOL CCredentialsPage::Initialize(HWND hwnd)
{
m_hwnd = hwnd;
ShowUserName();
//Set the default IDC_ONLY_WHEN_LOGGED_ON check state.
ITask *pITask;
m_pISyncSched->GetITask(&pITask);
DWORD dwFlags;
pITask->GetFlags(&dwFlags);
BOOL fOnlyWhenLoggedOn = dwFlags & TASK_FLAG_RUN_ONLY_IF_LOGGED_ON;
Button_SetCheck(GetDlgItem(m_hwnd,IDC_RUNLOGGEDON), fOnlyWhenLoggedOn);
Button_SetCheck(GetDlgItem(m_hwnd,IDC_RUNALWAYS), !fOnlyWhenLoggedOn);
Edit_LimitText(GetDlgItem(m_hwnd, IDC_PASSWORD), PWLEN);
Edit_LimitText(GetDlgItem(m_hwnd, IDC_CONFIRMPASSWORD), PWLEN);
Edit_LimitText(GetDlgItem(m_hwnd, IDC_USERNAME), MAX_DOMANDANDMACHINENAMESIZE -1);
SetEnabled(!fOnlyWhenLoggedOn);
pITask->Release();
ShowWindow(m_hwnd, /* nCmdShow */ SW_SHOWNORMAL );
UpdateWindow(m_hwnd);
return TRUE;
}
//--------------------------------------------------------------------------------
//
// FUNCTION: CCredentialsPage::SetDirty()
//
// PURPOSE: we have changed the account info
//
// COMMENTS: Only called frm prop sheet; not wizard
//
//--------------------------------------------------------------------------------
void CCredentialsPage::SetDirty()
{
m_fTaskAccountChange = TRUE;
}
//--------------------------------------------------------------------------------
//
// FUNCTION: CSelectItemsPage::ShowUserName()
//
// PURPOSE: change the task's user name
//
// COMMENTS: Only called frm prop sheet; not wizard
//
//--------------------------------------------------------------------------------
BOOL CCredentialsPage::ShowUserName()
{
Assert(m_pISyncSched);
WCHAR wszUserName[MAX_PATH + 1];
DWORD dwSize = MAX_PATH;
HWND hwndEdit = GetDlgItem(m_hwnd, IDC_USERNAME);
HRESULT hr = m_pISyncSched->GetAccountInformation(&dwSize, wszUserName);
if (FAILED(hr))
{
*wszUserName = L'\0';
}
Edit_SetText(hwndEdit, wszUserName);
//
// Need to set m_fTaskAccountChange here since doing a Edit_SetText causes
// a WM_COMMAND msg with EN_CHANGE to be called for edit boxes.
//
m_fTaskAccountChange = FALSE;
return TRUE;
}
//--------------------------------------------------------------------------------
//
// FUNCTION: CSelectItemsPage::CommitChanges()
//
// PURPOSE: Write all the current Schedule Settings to the registry
//
// COMMENTS: Implemented on main thread.
//
//--------------------------------------------------------------------------------
HRESULT CCredentialsPage::CommitChanges()
{
HRESULT hr = S_OK;
BOOL fAccountChanged = TRUE;
if (m_fTaskAccountChange)
{
BOOL fRunAlways = Button_GetCheck(GetDlgItem(m_hwnd,IDC_RUNALWAYS));
if (fRunAlways)
{
Assert(m_pISyncSched);
WCHAR wcUserBuffMAX_DOMANDANDMACHINENAMESIZE];
WCHAR wcPassword[PWLEN + 1];
WCHAR wcConfirmPassword[PWLEN + 1];
GetDlgItemText(m_hwnd,IDC_USERNAME,wcUserBuff,MAX_DOMANDANDMACHINENAMESIZE);
GetDlgItemText(m_hwnd,IDC_PASSWORD,wcPassword, PWLEN);
GetDlgItemText(m_hwnd,IDC_CONFIRMPASSWORD,wcConfirmPassword, PWLEN);
if (wcscmp(wcPassword, wcConfirmPassword) != 0)
{
// we return this to signal the controlling page not to
// dismiss the dialog.
return(ERROR_INVALID_PASSWORD);
}
ITask *pITask;
if (FAILED(hr = m_pISyncSched->GetITask(&pITask)))
{
return hr;
}
if (FAILED (hr = m_pISyncSched->SetAccountInformation(wcUserBuff,
wcPassword)))
{
AssertSz(0,"ISyncSched->SetAccountInformation failed");
return hr;
}
DWORD dwFlags;
pITask->GetFlags(&dwFlags);
if (FAILED(hr = pITask->SetFlags(dwFlags & (~TASK_FLAG_RUN_ONLY_IF_LOGGED_ON))))
{
AssertSz(0,"ITask->SetFlags failed");
return hr;
}
pITask->Release();
}
else
{
ITask *pITask;
if (FAILED(hr = m_pISyncSched->GetITask(&pITask)))
{
return hr;
}
WCHAR wszDomainAndUser[MAX_DOMANDANDMACHINENAMESIZE];
GetDefaultDomainAndUserName(wszDomainAndUser,TEXT("\\"),MAX_DOMANDANDMACHINENAMESIZE);
if (FAILED(hr = m_pISyncSched->SetAccountInformation(wszDomainAndUser, NULL)))
{
AssertSz(0,"ISyncSched->SetAccountInformation failed");
return hr;
}
DWORD dwFlags;
pITask->GetFlags(&dwFlags);
if (FAILED(hr = pITask->SetFlags(dwFlags | TASK_FLAG_RUN_ONLY_IF_LOGGED_ON)))
{
AssertSz(0,"ITask->SetFlags failed");
return hr;
}
pITask->Release();
}
//Now save the schedule
//NoteNote: optimize by moving the save from wizsel and cred to EditSyncSched
hr = m_pISyncSched->Save();
if (hr == S_OK)
{
*m_pfSaved = TRUE;
}
}
return hr;
}
//+-------------------------------------------------------------------------------
//
// FUNCTION: BOOL CSelectItemsPage::SetEnabled(BOOL fEnabled)
//
// PURPOSE: set the fields enabled according to the RB choice
//
// RETURN VALUE: return TRUE if we process it ok.
//
//+-------------------------------------------------------------------------------
BOOL CCredentialsPage::SetEnabled(BOOL fEnabled)
{
EnableWindow(GetDlgItem(m_hwnd, IDC_USERNAME), fEnabled);
EnableWindow(GetDlgItem(m_hwnd, IDC_PASSWORD), fEnabled);
EnableWindow(GetDlgItem(m_hwnd, IDC_CONFIRMPASSWORD), fEnabled);
EnableWindow(GetDlgItem(m_hwnd, IDC_RUNAS_TEXT), fEnabled);
EnableWindow(GetDlgItem(m_hwnd, IDC_PASSWORD_TEXT), fEnabled);
EnableWindow(GetDlgItem(m_hwnd, IDC_CONFIRMPASSWORD_TEXT), fEnabled);
return TRUE;
}
#endif // #ifdef _CREDENTIALS