#include "stdafx.h" #include "unpage.h" #pragma hdrstop HRESULT ValidateName(LPCTSTR pszName) { // We need to use illegal fat chars, says SBurns TCHAR* pszBadChars = ILLEGAL_FAT_CHARS; HRESULT hrStringOK = S_OK; while ((NULL != *pszBadChars) && (hrStringOK == S_OK)) { if (NULL != StrChr(pszName, *pszBadChars)) { hrStringOK = E_FAIL; } else { pszBadChars = CharNext(pszBadChars); } } if (SUCCEEDED(hrStringOK)) { // See if the whole string is dots TCHAR* pszChar = const_cast(pszName); BOOL fAllDots = TRUE; while (fAllDots && (0 != *pszChar)) { if (TEXT('.') == *pszChar) { pszChar = CharNext(pszChar); } else { fAllDots = FALSE; } } if (fAllDots) { hrStringOK = E_FAIL; } } return hrStringOK; } /************************************* CUsernamePageBase Implementation *************************************/ BOOL CUsernamePageBase::OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { // Limit the text of the username, fullname and description fields HWND hwndUsername = GetDlgItem(hwnd, IDC_USER); HWND hwndFullName = GetDlgItem(hwnd, IDC_FULLNAME); HWND hwndDescription = GetDlgItem(hwnd, IDC_DESCRIPTION); Edit_LimitText(hwndUsername, ARRAYSIZE(m_pUserInfo->m_szUsername) - 1); SetWindowText(hwndUsername, m_pUserInfo->m_szUsername); Edit_LimitText(hwndFullName, ARRAYSIZE(m_pUserInfo->m_szFullName) - 1); SetWindowText(hwndFullName, m_pUserInfo->m_szFullName); Edit_LimitText(hwndDescription, ARRAYSIZE(m_pUserInfo->m_szComment) - 1); SetWindowText(hwndDescription, m_pUserInfo->m_szComment); return TRUE; } /************************************* CUsernameWizardPage Implementation *************************************/ INT_PTR CUsernameWizardPage::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog); HANDLE_MSG(hwndDlg, WM_NOTIFY, OnNotify); HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand); } return FALSE; } BOOL CUsernameWizardPage::OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh) { switch (pnmh->code) { case PSN_SETACTIVE: SetWizardButtons(hwnd, GetParent(hwnd)); SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0); return TRUE; case PSN_WIZNEXT: // Save the data the user has entered FetchText(hwnd, IDC_USER, m_pUserInfo->m_szUsername, ARRAYSIZE(m_pUserInfo->m_szUsername)); FetchText(hwnd, IDC_FULLNAME, m_pUserInfo->m_szFullName, ARRAYSIZE(m_pUserInfo->m_szFullName)); FetchText(hwnd, IDC_DESCRIPTION, m_pUserInfo->m_szComment, ARRAYSIZE(m_pUserInfo->m_szComment)); if (S_OK != ValidateName(m_pUserInfo->m_szUsername)) { // Username is invalid. warn now ::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION, IDS_ERR_BADUSERNAME, MB_ICONERROR | MB_OK); SetWindowLongPtr(hwnd, DWLP_MSGRESULT, -1); } else if (::UserAlreadyHasPermission(m_pUserInfo, hwnd)) { // Don't let the user continue if the user they've selected already // has permission to use this machine SetWindowLongPtr(hwnd, DWLP_MSGRESULT, -1); } else { // We have a username (otherwise next would be disabled) SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0); } return TRUE; } return FALSE; } BOOL CUsernameWizardPage::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { if (codeNotify == EN_CHANGE) { SetWizardButtons(hwnd, GetParent(hwnd)); return TRUE; } return FALSE; } void CUsernameWizardPage::SetWizardButtons(HWND hwnd, HWND hwndPropSheet) { HWND hwndEdit = GetDlgItem(hwnd, IDC_USER); DWORD dwUNLength = GetWindowTextLength(hwndEdit); PropSheet_SetWizButtons(hwndPropSheet, (dwUNLength == 0) ? 0 : PSWIZB_NEXT); } /************************************* CUsernamePropertyPage Implementation *************************************/ INT_PTR CUsernamePropertyPage::DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { HANDLE_MSG(hwndDlg, WM_INITDIALOG, OnInitDialog); HANDLE_MSG(hwndDlg, WM_NOTIFY, OnNotify); HANDLE_MSG(hwndDlg, WM_COMMAND, OnCommand); } return FALSE; } BOOL CUsernamePropertyPage::OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { if (codeNotify == EN_CHANGE) { PropSheet_Changed(GetParent(hwnd), hwnd); return TRUE; } return FALSE; } BOOL CUsernamePropertyPage::OnNotify(HWND hwnd, int idCtrl, LPNMHDR pnmh) { switch (pnmh->code) { case PSN_APPLY: { TCHAR szTemp[256]; HRESULT hr; LONG lResult = PSNRET_NOERROR; // Try to update the username FetchText(hwnd, IDC_USER, szTemp, ARRAYSIZE(szTemp)); TCHAR szDomainUser[MAX_DOMAIN + MAX_USER + 2]; ::MakeDomainUserString(m_pUserInfo->m_szDomain, m_pUserInfo->m_szUsername, szDomainUser, ARRAYSIZE(szDomainUser)); if (StrCmp(szTemp, m_pUserInfo->m_szUsername) != 0) { hr = m_pUserInfo->UpdateUsername(szTemp); if (FAILED(hr)) { ::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION, IDS_USR_UPDATE_USERNAME_ERROR, MB_ICONERROR | MB_OK, szDomainUser); lResult = PSNRET_INVALID_NOCHANGEPAGE; } } // Try to update the full name FetchText(hwnd, IDC_FULLNAME, szTemp, ARRAYSIZE(szTemp)); if (StrCmp(szTemp, m_pUserInfo->m_szFullName) != 0) { hr = m_pUserInfo->UpdateFullName(szTemp); if (FAILED(hr)) { ::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION, IDS_USR_UPDATE_FULLNAME_ERROR, MB_ICONERROR | MB_OK, szDomainUser); lResult = PSNRET_INVALID_NOCHANGEPAGE; } } // Try to update the description FetchText(hwnd, IDC_DESCRIPTION, szTemp, ARRAYSIZE(szTemp)); if (StrCmp(szTemp, m_pUserInfo->m_szComment) != 0) { hr = m_pUserInfo->UpdateDescription(szTemp); if (FAILED(hr)) { ::DisplayFormatMessage(hwnd, IDS_USR_APPLET_CAPTION, IDS_USR_UPDATE_DESCRIPTION_ERROR, MB_ICONERROR | MB_OK, szDomainUser); lResult = PSNRET_INVALID_NOCHANGEPAGE; } } SetWindowLongPtr(hwnd, DWLP_MSGRESULT, lResult); return TRUE; } default: break; } return FALSE; }