504 lines
16 KiB
C++
504 lines
16 KiB
C++
|
//*********************************************************************
|
||
|
//* 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;
|
||
|
}
|