829 lines
30 KiB
C++
829 lines
30 KiB
C++
|
//*********************************************************************
|
||
|
//* Microsoft Windows **
|
||
|
//* Copyright(c) Microsoft Corp., 1994 **
|
||
|
//*********************************************************************
|
||
|
|
||
|
//
|
||
|
// PAYMENT.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"
|
||
|
|
||
|
// Dialog handles for the different payment methods, which will be nested into our mail dialog
|
||
|
HWND hDlgCreditCard = NULL;
|
||
|
HWND hDlgInvoice = NULL;
|
||
|
HWND hDlgPhoneBill = NULL;
|
||
|
HWND hDlgCustom = NULL;
|
||
|
HWND hDlgCurrentPaymentType = NULL;
|
||
|
BOOL g_bCustomPaymentActive = FALSE;
|
||
|
WORD wCurrentPaymentType = PAYMENT_TYPE_INVALID; // NOTE: this must be initialize to a value
|
||
|
|
||
|
HACCEL hAccelCreditCard = NULL;
|
||
|
HACCEL hAccelInvoice = NULL;
|
||
|
HACCEL hAccelPhoneBill = NULL;
|
||
|
|
||
|
#define NUM_EXPIRE_YEARS 38
|
||
|
#define BASE_YEAR 1998
|
||
|
#define MAX_YEAR_LEN 5
|
||
|
#define NUM_EXPIRE_MONTHS 12
|
||
|
|
||
|
const TCHAR cszCustomPayment[] = TEXT("CUSTOMPAYMENT");
|
||
|
|
||
|
INT_PTR CALLBACK CreditCardPaymentDlgProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
// Create a local reference for the ISPData object
|
||
|
IICWISPData *pISPData = gpWizardState->pISPData;
|
||
|
// in order not to corrupt mem this guy must be big enough to hold
|
||
|
// fmax_firstname + "" + max last name
|
||
|
TCHAR szTemp[MAX_RES_LEN*2 + 4] = TEXT("\0");
|
||
|
|
||
|
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_INITDIALOG:
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
// Initialize the fields we know about
|
||
|
SYSTEMTIME SystemTime; // system time structure
|
||
|
GetLocalTime(&SystemTime);
|
||
|
|
||
|
// Populate the Expires year listbox
|
||
|
ComboBox_ResetContent(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREYEAR));
|
||
|
TCHAR szYear[MAX_YEAR_LEN];
|
||
|
for (i = 0; i < NUM_EXPIRE_YEARS; i++)
|
||
|
{
|
||
|
wsprintf (szYear, TEXT("%4d"), i + BASE_YEAR);
|
||
|
ComboBox_AddString(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREYEAR), szYear);
|
||
|
}
|
||
|
// Select the first year in the list if unselected
|
||
|
if (ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREYEAR)) == -1)
|
||
|
{
|
||
|
ComboBox_SetCurSel( GetDlgItem(hDlg, IDC_PAYMENT_EXPIREYEAR),
|
||
|
SystemTime.wYear - BASE_YEAR);
|
||
|
}
|
||
|
|
||
|
// Populate the Expires Month listbox
|
||
|
ComboBox_ResetContent(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREMONTH));
|
||
|
for (i = 0; i < NUM_EXPIRE_MONTHS; i++)
|
||
|
{
|
||
|
LoadString(ghInstanceResDll, IDS_JANUARY + i, szTemp, ARRAYSIZE(szTemp));
|
||
|
ComboBox_AddString(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREMONTH), szTemp);
|
||
|
}
|
||
|
// Select the first Month in the list if unselected
|
||
|
if (ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREMONTH)) == -1)
|
||
|
{
|
||
|
ComboBox_SetCurSel(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREMONTH), SystemTime.wMonth - 1);
|
||
|
}
|
||
|
|
||
|
if (pISPData->GetDataElement(ISPDATA_USER_FE_NAME))
|
||
|
{
|
||
|
lstrcpy(szTemp, pISPData->GetDataElement(ISPDATA_USER_FE_NAME));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_CCNAME, szTemp);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
lstrcpy(szTemp, pISPData->GetDataElement(ISPDATA_USER_FIRSTNAME));
|
||
|
lstrcat(szTemp, TEXT(" "));
|
||
|
lstrcat(szTemp, pISPData->GetDataElement(ISPDATA_USER_LASTNAME));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_CCNAME, szTemp);
|
||
|
}
|
||
|
|
||
|
lstrcpy(szTemp, pISPData->GetDataElement(ISPDATA_USER_ADDRESS));
|
||
|
|
||
|
if (LCID_JPN != GetUserDefaultLCID())
|
||
|
{
|
||
|
lstrcat(szTemp, TEXT(" "));
|
||
|
lstrcat(szTemp, pISPData->GetDataElement(ISPDATA_USER_MOREADDRESS));
|
||
|
}
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_CCADDRESS, szTemp);
|
||
|
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_CCZIP, pISPData->GetDataElement(ISPDATA_USER_ZIP));
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// User clicked next, so we need to collect and validate dat
|
||
|
case WM_USER_NEXT:
|
||
|
{
|
||
|
CPAYCSV far *pcPAYCSV = (CPAYCSV far *)lParam;
|
||
|
UINT uCtrlID;
|
||
|
|
||
|
// If the ISP support LUHN, validate the content
|
||
|
if (pcPAYCSV->get_bLUHNCheck())
|
||
|
{
|
||
|
uCtrlID = IDC_PAYMENT_CCNUMBER;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_CARDNUMBER, szTemp, ISPDATA_Validate_Content))
|
||
|
goto CreditCardPaymentOKError;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// no content validate, so just do data present validation
|
||
|
uCtrlID = IDC_PAYMENT_CCNUMBER;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_CARDNUMBER, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto CreditCardPaymentOKError;
|
||
|
}
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_CCNAME;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_CARDHOLDER, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto CreditCardPaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_CCADDRESS;
|
||
|
GetDlgItemText(hDlg, IDC_PAYMENT_CCADDRESS, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLADDRESS, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto CreditCardPaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_CCZIP;
|
||
|
GetDlgItemText(hDlg, IDC_PAYMENT_CCZIP, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLZIP, szTemp , ISPDATA_Validate_DataPresent))
|
||
|
goto CreditCardPaymentOKError;
|
||
|
|
||
|
// Month must be converted into numeric equivalent
|
||
|
_itot(ComboBox_GetCurSel(GetDlgItem(hDlg, IDC_PAYMENT_EXPIREMONTH)) + 1, szTemp, 10);
|
||
|
pISPData->PutDataElement(ISPDATA_PAYMENT_EXMONTH, szTemp , ISPDATA_Validate_None);
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_EXPIREYEAR;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_EXYEAR, szTemp , ISPDATA_Validate_Content))
|
||
|
goto CreditCardPaymentOKError;
|
||
|
|
||
|
// OK to move on
|
||
|
SetPropSheetResult(hDlg,TRUE);
|
||
|
return TRUE;
|
||
|
|
||
|
CreditCardPaymentOKError:
|
||
|
SetFocus(GetDlgItem(hDlg, uCtrlID));
|
||
|
SetPropSheetResult(hDlg, FALSE);
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default return value if message is not handled
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK InvoicePaymentDlgProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
// Create a local reference for the ISPData object
|
||
|
IICWISPData *pISPData = gpWizardState->pISPData;
|
||
|
TCHAR szTemp[MAX_RES_LEN] = TEXT("\0");
|
||
|
|
||
|
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_INITDIALOG:
|
||
|
{
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_IVADDRESS1, pISPData->GetDataElement(ISPDATA_USER_ADDRESS));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_IVADDRESS2, pISPData->GetDataElement(ISPDATA_USER_MOREADDRESS));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_IVCITY, pISPData->GetDataElement(ISPDATA_USER_CITY));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_IVSTATE, pISPData->GetDataElement(ISPDATA_USER_STATE));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_IVZIP, pISPData->GetDataElement(ISPDATA_USER_ZIP));
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
// User clicked next, so we need to collect entered data
|
||
|
case WM_USER_NEXT:
|
||
|
{
|
||
|
UINT uCtrlID;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_IVADDRESS1;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLADDRESS, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto InvoicePaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_IVADDRESS2;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLEXADDRESS, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto InvoicePaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_IVCITY;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLCITY, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto InvoicePaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_IVSTATE;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLSTATE, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto InvoicePaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_IVZIP;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLZIP, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto InvoicePaymentOKError;
|
||
|
|
||
|
SetPropSheetResult(hDlg,TRUE);
|
||
|
return TRUE;
|
||
|
|
||
|
InvoicePaymentOKError:
|
||
|
SetFocus(GetDlgItem(hDlg, uCtrlID));
|
||
|
SetPropSheetResult(hDlg, FALSE);
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default return value if message is not handled
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK PhoneBillPaymentDlgProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
// Create a local reference for the ISPData object
|
||
|
IICWISPData *pISPData = gpWizardState->pISPData;
|
||
|
TCHAR szTemp[MAX_RES_LEN] = TEXT("\0");
|
||
|
|
||
|
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_INITDIALOG:
|
||
|
{
|
||
|
TCHAR szTemp[MAX_RES_LEN];
|
||
|
|
||
|
lstrcpy(szTemp, pISPData->GetDataElement(ISPDATA_USER_FIRSTNAME));
|
||
|
lstrcat(szTemp, TEXT(" "));
|
||
|
lstrcat(szTemp, pISPData->GetDataElement(ISPDATA_USER_LASTNAME));
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_PHONEIV_BILLNAME, szTemp);
|
||
|
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_PHONEIV_ACCNUM, pISPData->GetDataElement(ISPDATA_USER_PHONE));
|
||
|
break;
|
||
|
}
|
||
|
// User clicked next, so we need to collect and validate dat
|
||
|
case WM_USER_NEXT:
|
||
|
{
|
||
|
UINT uCtrlID;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_PHONEIV_BILLNAME;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLNAME, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto PhoneBillPaymentOKError;
|
||
|
|
||
|
uCtrlID = IDC_PAYMENT_PHONEIV_ACCNUM;
|
||
|
GetDlgItemText(hDlg, uCtrlID, szTemp, ARRAYSIZE(szTemp));
|
||
|
if (!pISPData->PutDataElement(ISPDATA_PAYMENT_BILLPHONE, szTemp, ISPDATA_Validate_DataPresent))
|
||
|
goto PhoneBillPaymentOKError;
|
||
|
|
||
|
SetPropSheetResult(hDlg,TRUE);
|
||
|
return TRUE;
|
||
|
|
||
|
PhoneBillPaymentOKError:
|
||
|
SetFocus(GetDlgItem(hDlg, uCtrlID));
|
||
|
SetPropSheetResult(hDlg, FALSE);
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default return value if message is not handled
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK CustomPaymentDlgProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
UINT uMsg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
switch (uMsg)
|
||
|
{
|
||
|
// This is custom, because for the custom page, we must connect to the window
|
||
|
// and browse everytime the custom pay page is activated, since an intervening
|
||
|
// step may have connected the browser to a different window
|
||
|
case WM_USER_CUSTOMINIT:
|
||
|
{
|
||
|
CPAYCSV far *pcPAYCSV = (CPAYCSV far *)lParam;
|
||
|
|
||
|
gpWizardState->pICWWebView->ConnectToWindow(GetDlgItem(hDlg, IDC_PAYMENT_CUSTOM_INV), PAGETYPE_CUSTOMPAY);
|
||
|
|
||
|
// Navigate to the Custom Payment HTML
|
||
|
gpWizardState->lpSelectedISPInfo->DisplayHTML(pcPAYCSV->get_szCustomPayURLPath());
|
||
|
|
||
|
// Load any persisted data
|
||
|
gpWizardState->lpSelectedISPInfo->LoadHistory((BSTR)A2W(cszCustomPayment));
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
// User clicked next, so we need to collect and validate dat
|
||
|
case WM_USER_NEXT:
|
||
|
{
|
||
|
TCHAR szQuery[INTERNET_MAX_URL_LENGTH];
|
||
|
|
||
|
memset(szQuery, 0, sizeof(szQuery));
|
||
|
|
||
|
// Attach the walker to the curent page
|
||
|
// Use the Walker to get the query string
|
||
|
IWebBrowser2 *lpWebBrowser;
|
||
|
|
||
|
gpWizardState->pICWWebView->get_BrowserObject(&lpWebBrowser);
|
||
|
gpWizardState->pHTMLWalker->AttachToDocument(lpWebBrowser);
|
||
|
|
||
|
gpWizardState->pHTMLWalker->get_FirstFormQueryString(szQuery);
|
||
|
|
||
|
gpWizardState->pISPData->PutDataElement(ISPDATA_PAYMENT_CUSTOMDATA, szQuery, ISPDATA_Validate_None);
|
||
|
|
||
|
// detach the walker
|
||
|
gpWizardState->pHTMLWalker->Detach();
|
||
|
|
||
|
SetPropSheetResult(hDlg,TRUE);
|
||
|
return TRUE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Default return value if message is not handled
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: SwitchPaymentType
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
void SwitchPaymentType
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
WORD wPaymentType
|
||
|
)
|
||
|
{
|
||
|
TCHAR szTemp[MAX_RES_LEN];
|
||
|
PAGEINFO *pPageInfo = (PAGEINFO *) GetWindowLongPtr(hDlg,DWLP_USER);
|
||
|
|
||
|
|
||
|
// nothing to do if the payment type has not changed
|
||
|
if (wPaymentType == wCurrentPaymentType)
|
||
|
return;
|
||
|
|
||
|
// set the current payment type
|
||
|
wCurrentPaymentType = wPaymentType;
|
||
|
|
||
|
// If the custom payment DLG is currently active, then we
|
||
|
// need to persist any data the user may have entered.
|
||
|
if (g_bCustomPaymentActive && IsWindowVisible(hDlgCurrentPaymentType))
|
||
|
{
|
||
|
gpWizardState->lpSelectedISPInfo->SaveHistory((BSTR)A2W(cszCustomPayment));
|
||
|
}
|
||
|
|
||
|
// Hide the current payment type window if there is one
|
||
|
if (hDlgCurrentPaymentType)
|
||
|
{
|
||
|
ShowWindow(hDlgCurrentPaymentType, SW_HIDE);
|
||
|
}
|
||
|
//assume false for the weboc event handling
|
||
|
g_bCustomPaymentActive = FALSE;
|
||
|
gpWizardState->pISPData->PutDataElement(ISPDATA_PAYMENT_CUSTOMDATA, NULL, ISPDATA_Validate_None);
|
||
|
|
||
|
// Create a new payment type DLG if necessary
|
||
|
switch (wPaymentType)
|
||
|
{
|
||
|
case PAYMENT_TYPE_CREDITCARD:
|
||
|
{
|
||
|
if (NULL == hDlgCreditCard)
|
||
|
{
|
||
|
hDlgCreditCard = CreateDialog(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDD_PAYMENTTYPE_CREDITCARD),
|
||
|
hDlg,
|
||
|
CreditCardPaymentDlgProc);
|
||
|
// Also load the accelerator
|
||
|
hAccelCreditCard = LoadAccelerators(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDA_PAYMENTTYPE_CREDITCARD));
|
||
|
}
|
||
|
hDlgCurrentPaymentType = hDlgCreditCard;
|
||
|
// Set the acclerator table to the nested dialog
|
||
|
pPageInfo->hAccelNested = hAccelCreditCard;
|
||
|
LoadString(ghInstanceResDll, IDS_PAYMENT_CREDITCARD, szTemp, ARRAYSIZE(szTemp));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case PAYMENT_TYPE_INVOICE:
|
||
|
{
|
||
|
if (NULL == hDlgInvoice)
|
||
|
{
|
||
|
hDlgInvoice = CreateDialog(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDD_PAYMENTTYPE_INVOICE),
|
||
|
hDlg,
|
||
|
InvoicePaymentDlgProc);
|
||
|
// Also load the accelerator
|
||
|
hAccelInvoice = LoadAccelerators(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDA_PAYMENTTYPE_INVOICE));
|
||
|
|
||
|
}
|
||
|
hDlgCurrentPaymentType = hDlgInvoice;
|
||
|
// Set the acclerator table to the nested dialog
|
||
|
pPageInfo->hAccelNested = hAccelInvoice;
|
||
|
LoadString(ghInstanceResDll, IDS_PAYMENT_INVOICE, szTemp, ARRAYSIZE(szTemp));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case PAYMENT_TYPE_PHONEBILL:
|
||
|
{
|
||
|
if (NULL == hDlgPhoneBill)
|
||
|
{
|
||
|
hDlgPhoneBill = CreateDialog(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDD_PAYMENTTYPE_PHONEBILL),
|
||
|
hDlg,
|
||
|
PhoneBillPaymentDlgProc);
|
||
|
// Also load the accelerator
|
||
|
hAccelPhoneBill = LoadAccelerators(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDA_PAYMENTTYPE_PHONEBILL));
|
||
|
}
|
||
|
hDlgCurrentPaymentType = hDlgPhoneBill;
|
||
|
// Set the acclerator table to the nested dialog
|
||
|
pPageInfo->hAccelNested = hAccelPhoneBill;
|
||
|
LoadString(ghInstanceResDll, IDS_PAYMENT_PHONE, szTemp, ARRAYSIZE(szTemp));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
case PAYMENT_TYPE_CUSTOM:
|
||
|
{
|
||
|
g_bCustomPaymentActive = TRUE;
|
||
|
|
||
|
if (NULL == hDlgCustom)
|
||
|
{
|
||
|
hDlgCustom = CreateDialog(ghInstanceResDll,
|
||
|
MAKEINTRESOURCE(IDD_PAYMENTTYPE_CUSTOM),
|
||
|
hDlg,
|
||
|
CustomPaymentDlgProc);
|
||
|
}
|
||
|
hDlgCurrentPaymentType = hDlgCustom;
|
||
|
// Set the acclerator table to the nested dialog. There is not one
|
||
|
// in this case
|
||
|
pPageInfo->hAccelNested = NULL;
|
||
|
|
||
|
// We must force the custom payment type dialog to connect and browse
|
||
|
CPAYCSV far *pcPAYCSV;
|
||
|
HWND hWndPayment = GetDlgItem(hDlg, IDC_PAYMENTTYPE);
|
||
|
|
||
|
// Get the currently selected item's PAYCSV obhect
|
||
|
pcPAYCSV = (CPAYCSV *)ComboBox_GetItemData(hWndPayment, ComboBox_GetCurSel( hWndPayment ));
|
||
|
ASSERT(pcPAYCSV);
|
||
|
|
||
|
SendMessage(hDlgCustom, WM_USER_CUSTOMINIT, 0, (LPARAM)pcPAYCSV);
|
||
|
LoadString(ghInstanceResDll, IDS_PAYMENT_CUSTOM, szTemp, ARRAYSIZE(szTemp));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Set the combo box string
|
||
|
SetDlgItemText(hDlg, IDC_PAYMENT_GROUP, szTemp);
|
||
|
|
||
|
// Show the new payment type window
|
||
|
ShowWindowWithParentControl(hDlgCurrentPaymentType);
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: PaymentInitProc
|
||
|
|
||
|
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 PaymentInitProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
BOOL fFirstInit,
|
||
|
UINT *puNextPage
|
||
|
)
|
||
|
{
|
||
|
BOOL bRet = TRUE;
|
||
|
BOOL bLUHN = FALSE;
|
||
|
HWND hWndPayment = GetDlgItem(hDlg, IDC_PAYMENTTYPE);
|
||
|
CPAYCSV far *pcPAYCSV;
|
||
|
|
||
|
// 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_PAYMENT;
|
||
|
ASSERT(gpWizardState->lpSelectedISPInfo);
|
||
|
|
||
|
// invalidate the current payment type, so that we refresh everthing
|
||
|
// in the event that we are reloading this page
|
||
|
wCurrentPaymentType = PAYMENT_TYPE_INVALID;
|
||
|
|
||
|
if (fFirstInit || !(gpWizardState->pStorage->Compare(ICW_PAYMENT,
|
||
|
gpWizardState->lpSelectedISPInfo->get_szPayCSVPath(),
|
||
|
MAX_PATH)))
|
||
|
{
|
||
|
CCSVFile far *pcCSVFile;
|
||
|
HRESULT hr;
|
||
|
int iIndex;
|
||
|
|
||
|
// Read the payment .CSV file.
|
||
|
pcCSVFile = new CCSVFile;
|
||
|
if (!pcCSVFile)
|
||
|
{
|
||
|
MsgBox(hDlg, IDS_ERR_OUTOFMEMORY, MB_ICONEXCLAMATION,MB_OK);
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
gpWizardState->pStorage->Set(ICW_PAYMENT, gpWizardState->lpSelectedISPInfo->get_szPayCSVPath(), MAX_PATH);
|
||
|
|
||
|
if (!pcCSVFile->Open(gpWizardState->lpSelectedISPInfo->get_szPayCSVPath()))
|
||
|
{
|
||
|
AssertMsg(0, "Cannot open payment .CSV file");
|
||
|
delete pcCSVFile;
|
||
|
pcCSVFile = NULL;
|
||
|
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
// Read the first line, since it contains field headers
|
||
|
pcPAYCSV = new CPAYCSV;
|
||
|
if (!pcPAYCSV)
|
||
|
{
|
||
|
// BUGBUG Show error message
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
// Reading the first line also determines whether the csv file is contains
|
||
|
// the LUHN format. If it does, we need to keep a record of bLUHN so that the
|
||
|
// subsequent line can be read correctly.
|
||
|
if (ERROR_SUCCESS != (hr = pcPAYCSV->ReadFirstLine(pcCSVFile, &bLUHN)))
|
||
|
{
|
||
|
// Handle the error case
|
||
|
delete pcCSVFile;
|
||
|
pcCSVFile = NULL;
|
||
|
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
delete pcPAYCSV; // Don't need this one any more
|
||
|
|
||
|
ComboBox_ResetContent(hWndPayment);
|
||
|
|
||
|
// Read the Payment CSV file
|
||
|
do {
|
||
|
// Allocate a new Payment record
|
||
|
pcPAYCSV = new CPAYCSV;
|
||
|
if (!pcPAYCSV)
|
||
|
{
|
||
|
// BUGBUG Show error message
|
||
|
bRet = FALSE;
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
|
||
|
// Read a line from the ISPINFO file
|
||
|
hr = pcPAYCSV->ReadOneLine(pcCSVFile, bLUHN);
|
||
|
if (hr == ERROR_NO_MORE_ITEMS)
|
||
|
{
|
||
|
delete pcPAYCSV; // We don't need this one
|
||
|
break;
|
||
|
}
|
||
|
else if (hr == ERROR_FILE_NOT_FOUND)
|
||
|
{
|
||
|
// BUGBUG Show error message
|
||
|
delete pcPAYCSV;
|
||
|
pcPAYCSV = NULL;
|
||
|
}
|
||
|
else if (hr != ERROR_SUCCESS)
|
||
|
{
|
||
|
// BUGBUG Show error message
|
||
|
delete pcPAYCSV;
|
||
|
bRet = FALSE;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
// Add the entry to the comboBox
|
||
|
if (pcPAYCSV)
|
||
|
{
|
||
|
iIndex = ComboBox_AddString(hWndPayment, pcPAYCSV->get_szDisplayName());
|
||
|
ComboBox_SetItemData(hWndPayment, iIndex, pcPAYCSV);
|
||
|
}
|
||
|
} while (TRUE);
|
||
|
|
||
|
// Select the first payment type in the list
|
||
|
ComboBox_SetCurSel(hWndPayment, 0);
|
||
|
|
||
|
pcPAYCSV = (CPAYCSV *)ComboBox_GetItemData(hWndPayment, 0);
|
||
|
ASSERT(pcPAYCSV);
|
||
|
SwitchPaymentType(hDlg, pcPAYCSV->get_wPaymentType());
|
||
|
|
||
|
pcCSVFile->Close();
|
||
|
delete pcCSVFile;
|
||
|
pcCSVFile = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Get the currently selected item
|
||
|
int iIndex = ComboBox_GetCurSel( hWndPayment );
|
||
|
|
||
|
// Get the payment type, and update the payment area
|
||
|
pcPAYCSV = (CPAYCSV *)ComboBox_GetItemData(hWndPayment, iIndex);
|
||
|
|
||
|
ASSERT(pcPAYCSV);
|
||
|
|
||
|
SwitchPaymentType(hDlg, pcPAYCSV->get_wPaymentType());
|
||
|
|
||
|
// Setup the ISPData object so that is can apply proper validation based on the selected ISP
|
||
|
// this is necessary here, because the user info page might have been skiped
|
||
|
gpWizardState->pISPData->PutValidationFlags(gpWizardState->lpSelectedISPInfo->get_dwRequiredUserInputFlags());
|
||
|
|
||
|
}
|
||
|
|
||
|
if (!fFirstInit)
|
||
|
{
|
||
|
TCHAR szTemp[MAX_RES_LEN];
|
||
|
if (LoadString(ghInstanceResDll,
|
||
|
((gpWizardState->lpSelectedISPInfo->get_dwCFGFlag() & ICW_CFGFLAG_SECURE) ? IDS_PAYMENT_SECURE : IDS_PAYMENT_UNSECURE),
|
||
|
szTemp,
|
||
|
MAX_RES_LEN))
|
||
|
{
|
||
|
SetWindowText (GetDlgItem(hDlg,IDC_PAYMENT_SECURE), szTemp);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: PaymentOKProc
|
||
|
|
||
|
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 PaymentOKProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
BOOL fForward,
|
||
|
UINT *puNextPage,
|
||
|
BOOL *pfKeepHistory
|
||
|
)
|
||
|
{
|
||
|
// If the custom payment DLG has been shown, then we
|
||
|
// need to persist any data the user may have entered.
|
||
|
// We have shown the custom payment DLG, it hDlgCustom is not NULL
|
||
|
if (NULL != hDlgCustom && IsWindowVisible(hDlgCustom))
|
||
|
{
|
||
|
gpWizardState->lpSelectedISPInfo->SaveHistory((BSTR)A2W(cszCustomPayment));
|
||
|
}
|
||
|
|
||
|
// NOTE that we are leaving the payment page, so the custom payment
|
||
|
// WEBOC is no longer active
|
||
|
g_bCustomPaymentActive = FALSE;
|
||
|
|
||
|
if (fForward)
|
||
|
{
|
||
|
TCHAR szTemp[MAX_RES_LEN];
|
||
|
HWND hWndPayment = GetDlgItem(hDlg, IDC_PAYMENTTYPE);
|
||
|
CPAYCSV far *pcPAYCSV;
|
||
|
int iIndex;
|
||
|
|
||
|
// Create a local reference for the ISPData object
|
||
|
IICWISPData *pISPData = gpWizardState->pISPData;
|
||
|
|
||
|
// Get the payment type
|
||
|
iIndex = ComboBox_GetCurSel(hWndPayment);
|
||
|
pcPAYCSV = (CPAYCSV *)ComboBox_GetItemData(hWndPayment, iIndex);
|
||
|
wsprintf (szTemp, TEXT("%d"), pcPAYCSV->get_wPaymentType());
|
||
|
pISPData->PutDataElement(ISPDATA_PAYMENT_TYPE, szTemp, ISPDATA_Validate_None);
|
||
|
|
||
|
// Set the display name
|
||
|
pISPData->PutDataElement(ISPDATA_PAYMENT_DISPLAYNAME, pcPAYCSV->get_szDisplayName(), ISPDATA_Validate_None);
|
||
|
|
||
|
switch(pcPAYCSV->get_wPaymentType())
|
||
|
{
|
||
|
case PAYMENT_TYPE_CREDITCARD:
|
||
|
if (!SendMessage(hDlgCreditCard, WM_USER_NEXT, 0, (LPARAM)pcPAYCSV))
|
||
|
return FALSE;
|
||
|
break;
|
||
|
|
||
|
case PAYMENT_TYPE_INVOICE:
|
||
|
if (!SendMessage(hDlgInvoice, WM_USER_NEXT, 0, (LPARAM)pcPAYCSV))
|
||
|
return FALSE;
|
||
|
break;
|
||
|
|
||
|
case PAYMENT_TYPE_PHONEBILL:
|
||
|
if (!SendMessage(hDlgPhoneBill, WM_USER_NEXT, 0, (LPARAM)pcPAYCSV))
|
||
|
return FALSE;
|
||
|
break;
|
||
|
|
||
|
case PAYMENT_TYPE_CUSTOM:
|
||
|
if (!SendMessage(hDlgCustom, WM_USER_NEXT, 0, (LPARAM)pcPAYCSV))
|
||
|
return FALSE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/*******************************************************************
|
||
|
|
||
|
NAME: PaymentCmdProc
|
||
|
|
||
|
********************************************************************/
|
||
|
BOOL CALLBACK PaymentCmdProc
|
||
|
(
|
||
|
HWND hDlg,
|
||
|
WPARAM wParam,
|
||
|
LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
WORD wNotifyCode = HIWORD (wParam);
|
||
|
|
||
|
switch(LOWORD(wParam))
|
||
|
{
|
||
|
case IDC_PAYMENTTYPE:
|
||
|
{
|
||
|
if (wNotifyCode == CBN_SELENDOK || wNotifyCode == CBN_CLOSEUP)
|
||
|
{
|
||
|
// Get the currently selected item
|
||
|
CPAYCSV far *pcPAYCSV;
|
||
|
HWND hWndPayment = GetDlgItem(hDlg, IDC_PAYMENTTYPE);
|
||
|
int iIndex = ComboBox_GetCurSel( hWndPayment );
|
||
|
|
||
|
// Get the payment type, and update the payment are
|
||
|
pcPAYCSV = (CPAYCSV *)ComboBox_GetItemData(hWndPayment, iIndex);
|
||
|
ASSERT(pcPAYCSV);
|
||
|
SwitchPaymentType(hDlg, pcPAYCSV->get_wPaymentType());
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
|