//********************************************************************* //* Microsoft Windows ** //* Copyright(c) Microsoft Corp., 1994 ** //********************************************************************* // // USERINFO.CPP - Functions for // // HISTORY: // // 05/13/98 donaldm Created. // 08/19/98 donaldm BUGBUG: The code to collect and save the user // entered data is not optimal in terms of size // and can/should be cleaned up at some future time // //********************************************************************* #include "pre.h" #define BACK 0 #define NEXT 1 enum DlgLayout { LAYOUT_FE = 0, LAYOUT_JPN, LAYOUT_US }; HWND hDlgUserInfoCompany = NULL; HWND hDlgUserInfoNoCompany = NULL; HWND hDlgCurrentUserInfo = NULL; WORD g_DlgLayout; // This function will initialize the data in the user information dialog edit controls. // The data used to initalize comes from the UserInfo object in ICWHELP.DLL void InitUserInformation ( HWND hDlg ) { BOOL bRetVal; IUserInfo *pUserInfo = gpWizardState->pUserInfo; BSTR bstr; // Get initial user info data values from the ICWHELP user info object, and // set the value in the ISPDATA object // we only need to do this 1 time per ICW session if(!gpWizardState->bUserEnteredData) { pUserInfo->CollectRegisteredUserInfo(&bRetVal); // Set this state varialbe, since the user has seen the user info page gpWizardState->bUserEnteredData = TRUE; } // The return value from CollectRegisteredUserInfo is FALSE if there is no data in the // registry. In this case we set bWasNoUserInfo so that we can persist it later. We // only want to persis the user info it we complete sucessfully, and if there was // no user info. gpWizardState->bWasNoUserInfo = !bRetVal; // Put all the initial values, with no validation pUserInfo->get_FirstName(&bstr); if (GetDlgItem(hDlg, IDC_USERINFO_FE_NAME)) { SetDlgItemText(hDlg,IDC_USERINFO_FE_NAME, W2A(bstr)); } else { SetDlgItemText(hDlg, IDC_USERINFO_FIRSTNAME, W2A(bstr)); SysFreeString(bstr); pUserInfo->get_LastName(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_LASTNAME, W2A(bstr)); } SysFreeString(bstr); if (GetDlgItem(hDlg, IDC_USERINFO_COMPANYNAME)) { pUserInfo->get_Company(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_COMPANYNAME, W2A(bstr)); SysFreeString(bstr); } pUserInfo->get_Address1(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_ADDRESS1, W2A(bstr)); SysFreeString(bstr); pUserInfo->get_Address2(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_ADDRESS2, W2A(bstr)); SysFreeString(bstr); pUserInfo->get_City(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_CITY, W2A(bstr)); SysFreeString(bstr); pUserInfo->get_State(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_STATE, W2A(bstr)); SysFreeString(bstr); pUserInfo->get_ZIPCode(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_ZIP, W2A(bstr)); SysFreeString(bstr); pUserInfo->get_PhoneNumber(&bstr); SetDlgItemText(hDlg, IDC_USERINFO_PHONE, W2A(bstr)); SysFreeString(bstr); } BOOL bValidateSaveUserInformation (HWND hDlg, BOOL fForward) { UINT uCtrlID; BOOL bValid = FALSE; IUserInfo *pUserInfo = gpWizardState->pUserInfo; IICWISPData *pISPData = gpWizardState->pISPData; TCHAR szTemp[MAX_RES_LEN] = TEXT("\0"); WORD wPrevValidationValue = 0; if (fForward) wPrevValidationValue = ISPDATA_Validate_DataPresent; else wPrevValidationValue = ISPDATA_Validate_None; while (1) { if (GetDlgItem(hDlg, IDC_USERINFO_FE_NAME)) { uCtrlID = IDC_USERINFO_FE_NAME; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_FE_NAME, szTemp, wPrevValidationValue)) break; // Set the input data into the pUserInfo object pUserInfo->put_FirstName(A2W(szTemp)); // Since we used FE_NAME, we need to clear FIRSTNAME and LASTNAME, so they are not sent in the // query string pISPData->PutDataElement(ISPDATA_USER_FIRSTNAME, NULL, ISPDATA_Validate_None); pISPData->PutDataElement(ISPDATA_USER_LASTNAME, NULL, ISPDATA_Validate_None); } else { uCtrlID = IDC_USERINFO_FIRSTNAME; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_FIRSTNAME, szTemp, wPrevValidationValue)) break; pUserInfo->put_FirstName(A2W(szTemp)); uCtrlID = IDC_USERINFO_LASTNAME; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_LASTNAME, szTemp, wPrevValidationValue)) break; pUserInfo->put_LastName(A2W(szTemp)); // Since we did not use FE_NAME, we need to clear it pISPData->PutDataElement(ISPDATA_USER_FE_NAME, NULL, ISPDATA_Validate_None); } if (GetDlgItem(hDlg, IDC_USERINFO_COMPANYNAME)) { uCtrlID = IDC_USERINFO_COMPANYNAME; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_COMPANYNAME, szTemp, wPrevValidationValue)) break; pUserInfo->put_Company(A2W(szTemp)); } else { pISPData->PutDataElement(ISPDATA_USER_COMPANYNAME, NULL, ISPDATA_Validate_None); } uCtrlID = IDC_USERINFO_ADDRESS1; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_ADDRESS, szTemp, wPrevValidationValue)) break; pUserInfo->put_Address1(A2W(szTemp)); // Only validate address 2 if we are in Japanese layout, since FE and US layout // have this an on optional field uCtrlID = IDC_USERINFO_ADDRESS2; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_MOREADDRESS, szTemp, wPrevValidationValue)) break; pUserInfo->put_Address2(A2W(szTemp)); uCtrlID = IDC_USERINFO_CITY; GetDlgItemText(hDlg, uCtrlID , szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_CITY, szTemp, wPrevValidationValue)) break; pUserInfo->put_City(A2W(szTemp)); uCtrlID = IDC_USERINFO_STATE; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_STATE, szTemp, wPrevValidationValue)) break; pUserInfo->put_State(A2W(szTemp)); uCtrlID = IDC_USERINFO_ZIP; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_ZIP, szTemp, wPrevValidationValue)) break; pUserInfo->put_ZIPCode(A2W(szTemp)); uCtrlID = IDC_USERINFO_PHONE; GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp)); if (!pISPData->PutDataElement(ISPDATA_USER_PHONE, szTemp, wPrevValidationValue)) break; pUserInfo->put_PhoneNumber(A2W(szTemp)); // If we get here, then all fields are valid bValid = TRUE; break; } if (!bValid) SetFocus(GetDlgItem(hDlg, uCtrlID)); return (bValid); } INT_PTR CALLBACK UserInfoDlgProc ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_CTLCOLORDLG: case WM_CTLCOLORSTATIC: if(gpWizardState->cmnStateData.bOEMCustom) { SetTextColor((HDC)wParam, gpWizardState->cmnStateData.clrText); SetBkMode((HDC)wParam, TRANSPARENT); return (INT_PTR) GetStockObject(NULL_BRUSH); } break; case WM_SHOWWINDOW: { if((BOOL)wParam) InitUserInformation(hDlg); break; } // User clicked next, so we need to collect and validate dat case WM_USER_BACK: { if (bValidateSaveUserInformation(hDlg, BACK)) SetPropSheetResult(hDlg,TRUE); else SetPropSheetResult(hDlg, FALSE); return TRUE; } case WM_USER_NEXT: { if (bValidateSaveUserInformation(hDlg, NEXT)) SetPropSheetResult(hDlg,TRUE); else SetPropSheetResult(hDlg, FALSE); return TRUE; } } // Default return value if message is not handled return FALSE; } /******************************************************************* NAME: SwitchUserInfoType ********************************************************************/ void SwitchUserInfoDlg ( HWND hDlg, BOOL bNeedCompanyName ) { UINT idDlg; // Hide the current userinfo window if there is one if (hDlgCurrentUserInfo) ShowWindow(hDlgCurrentUserInfo, SW_HIDE); // Figure out which template to use switch(g_DlgLayout) { case LAYOUT_FE: if (bNeedCompanyName) idDlg = IDD_USERINFO_FE; else idDlg = IDD_USERINFO_FE_NO_COMPANY; break; case LAYOUT_JPN: if (bNeedCompanyName) idDlg = IDD_USERINFO_JPN; else idDlg = IDD_USERINFO_JPN_NO_COMPANY; break; case LAYOUT_US: if (bNeedCompanyName) idDlg = IDD_USERINFO_US; else idDlg = IDD_USERINFO_US_NO_COMPANY; break; } // Create the necessary dialog if (bNeedCompanyName) { if (NULL == hDlgUserInfoCompany) { hDlgUserInfoCompany = CreateDialog(ghInstanceResDll, MAKEINTRESOURCE(idDlg), hDlg, UserInfoDlgProc); } hDlgCurrentUserInfo = hDlgUserInfoCompany; } else { if (NULL == hDlgUserInfoNoCompany) { hDlgUserInfoNoCompany = CreateDialog(ghInstanceResDll, MAKEINTRESOURCE(idDlg), hDlg, UserInfoDlgProc); } hDlgCurrentUserInfo = hDlgUserInfoNoCompany; } // Show the new payment type window ShowWindowWithParentControl(hDlgCurrentUserInfo); } /******************************************************************* NAME: UserInfoInitProc SYNOPSIS: Called when page is displayed ENTRY: hDlg - dialog window fFirstInit - TRUE if this is the first time the dialog is initialized, FALSE if this InitProc has been called before (e.g. went past this page and backed up) ********************************************************************/ BOOL CALLBACK UserInfoInitProc ( HWND hDlg, BOOL fFirstInit, UINT *puNextPage ) { // Create a local reference for the ISPData object IICWISPData *pISPData = gpWizardState->pISPData; PAGEINFO *pPageInfo = (PAGEINFO *) GetWindowLongPtr(hDlg,DWLP_USER); if (fFirstInit) { // Figure out which dialog layout to use, FE or US // This is a 1 time calculation, since the user cannot change locales while running ICW switch (GetUserDefaultLCID()) { case LCID_JPN: g_DlgLayout = LAYOUT_JPN; // Load the appropriate nested dialog accelerator table pPageInfo->hAccelNested = LoadAccelerators(ghInstanceResDll, MAKEINTRESOURCE(IDA_USERINFO_JPN)); break; case LCID_CHT: case LCID_S_KOR: case LCID_N_KOR: case LCID_CHS: g_DlgLayout = LAYOUT_FE; pPageInfo->hAccelNested = LoadAccelerators(ghInstanceResDll, MAKEINTRESOURCE(IDA_USERINFO_FE)); break; default: g_DlgLayout = LAYOUT_US; pPageInfo->hAccelNested = LoadAccelerators(ghInstanceResDll, MAKEINTRESOURCE(IDA_USERINFO_US)); break; } } else { ASSERT(gpWizardState->lpSelectedISPInfo); // if we've travelled through external apprentice pages, // it's easy for our current page pointer to get munged, // so reset it here for sanity's sake. gpWizardState->uCurrentPage = ORD_PAGE_USERINFO; DWORD dwConfigFlags = gpWizardState->lpSelectedISPInfo->get_dwCFGFlag(); // Setup the ISPData object so that is can apply proper validation based on the selected ISP pISPData->PutValidationFlags(gpWizardState->lpSelectedISPInfo->get_dwRequiredUserInputFlags()); // Switch in the correct User Info Dialog template SwitchUserInfoDlg(hDlg, dwConfigFlags & ICW_CFGFLAG_USE_COMPANYNAME); } return TRUE; } /******************************************************************* NAME: UserInfoOKProc SYNOPSIS: Called when Next or Back btns pressed from page ENTRY: hDlg - dialog window fForward - TRUE if 'Next' was pressed, FALSE if 'Back' puNextPage - if 'Next' was pressed, proc can fill this in with next page to go to. This parameter is ingored if 'Back' was pressed. pfKeepHistory - page will not be kept in history if proc fills this in with FALSE. EXIT: returns TRUE to allow page to be turned, FALSE to keep the same page. ********************************************************************/ BOOL CALLBACK UserInfoOKProc ( HWND hDlg, BOOL fForward, UINT *puNextPage, BOOL *pfKeepHistory ) { // Create a local reference for the ISPData object IICWISPData* pISPData = gpWizardState->pISPData; DWORD dwConfigFlags = gpWizardState->lpSelectedISPInfo->get_dwCFGFlag(); if (fForward) { // Collect, valicate, and save user entered information if (dwConfigFlags & ICW_CFGFLAG_USE_COMPANYNAME) { if (!SendMessage(hDlgUserInfoCompany, WM_USER_NEXT, 0, 0l)) return FALSE; } else { if (!SendMessage(hDlgUserInfoNoCompany, WM_USER_NEXT, 0, 0l)) return FALSE; } // Figure out which page to goto next, based on the config flags while (1) { if (ICW_CFGFLAG_BILL & dwConfigFlags) { *puNextPage = ORD_PAGE_BILLINGOPT; break; } if (ICW_CFGFLAG_PAYMENT & dwConfigFlags) { *puNextPage = ORD_PAGE_PAYMENT; break; } // We need to skip both billing and payment pages, so goto the dial page *puNextPage = ORD_PAGE_ISPDIAL; break; } } else { // Collect, valicate, and save user entered information if (dwConfigFlags & ICW_CFGFLAG_USE_COMPANYNAME) { if (!SendMessage(hDlgUserInfoCompany, WM_USER_BACK, 0, 0l)) return FALSE; } else { if (!SendMessage(hDlgUserInfoNoCompany, WM_USER_BACK, 0, 0l)) return FALSE; } } return TRUE; }