You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
387 lines
12 KiB
387 lines
12 KiB
//*********************************************************************
|
|
//* Microsoft Windows **
|
|
//* Copyright(c) Microsoft Corp., 1994 **
|
|
//*********************************************************************
|
|
|
|
//
|
|
// ISPSEL.CPP - Functions for
|
|
//
|
|
|
|
// HISTORY:
|
|
//
|
|
// 05/13/98 donaldm Created.
|
|
//
|
|
//*********************************************************************
|
|
|
|
#include "pre.h"
|
|
#include "exdisp.h"
|
|
#include "shldisp.h"
|
|
#include <htiframe.h>
|
|
#include <mshtml.h>
|
|
|
|
const TCHAR cszISPINFOPath[] = TEXT("download\\ispinfo.csv");
|
|
int iNumOfAutoConfigOffers = 0;
|
|
BOOL g_bSkipSelPage = FALSE;
|
|
|
|
|
|
// Convert a supplied icon from it's GIF format to an ICO format
|
|
|
|
extern void ConvertISPIcon(LPTSTR lpszLogoPath, HICON* hIcon);
|
|
extern BOOL AddItemToISPList
|
|
(
|
|
HWND hListView,
|
|
int iItemIndex,
|
|
LPTSTR lpszIspName,
|
|
int iIspLogoIndex,
|
|
BOOL bCNS,
|
|
LPARAM lParam,
|
|
BOOL bFilterDupe
|
|
);
|
|
extern BOOL InitListView(HWND hListView);
|
|
extern BOOL ResetListView(HWND hListView);
|
|
extern BOOL CALLBACK ValidateISP(HWND hDlg);
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: ParseISPInfo
|
|
|
|
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 ParseISPInfo
|
|
(
|
|
HWND hDlg,
|
|
TCHAR *pszCSVFileName,
|
|
BOOL bCheckDupe
|
|
)
|
|
{
|
|
// On the first init, we will read the ISPINFO.CSV file, and populate the ISP LISTVIEW
|
|
|
|
CCSVFile far *pcCSVFile;
|
|
CISPCSV far *pcISPCSV;
|
|
BOOL bRet = TRUE;
|
|
BOOL bHaveCNSOffer = FALSE;
|
|
HICON hISPLogo;
|
|
int iImage;
|
|
HRESULT hr;
|
|
|
|
|
|
// Open and process the CSV file
|
|
pcCSVFile = new CCSVFile;
|
|
if (!pcCSVFile)
|
|
{
|
|
// BUGBUG: Show Error Message
|
|
|
|
return (FALSE);
|
|
}
|
|
|
|
if (!pcCSVFile->Open(pszCSVFileName))
|
|
{
|
|
// BUGBUG: Show Error Message
|
|
AssertMsg(0,"Can not open ISPINFO.CSV file");
|
|
delete pcCSVFile;
|
|
pcCSVFile = NULL;
|
|
|
|
return (FALSE);
|
|
}
|
|
|
|
// Read the first line, since it contains field headers
|
|
pcISPCSV = new CISPCSV;
|
|
if (!pcISPCSV)
|
|
{
|
|
// BUGBUG Show error message
|
|
delete pcCSVFile;
|
|
//iNumOfAutoConfigOffers = ISP_INFO_NO_VALIDOFFER;
|
|
return (FALSE);
|
|
}
|
|
|
|
if (ERROR_SUCCESS != (hr = pcISPCSV->ReadFirstLine(pcCSVFile)))
|
|
{
|
|
// Handle the error case
|
|
delete pcCSVFile;
|
|
//iNumOfAutoConfigOffers = ISP_INFO_NO_VALIDOFFER;
|
|
pcCSVFile = NULL;
|
|
|
|
return (FALSE);
|
|
}
|
|
delete pcISPCSV; // Don't need this one any more
|
|
|
|
do {
|
|
// Allocate a new ISP record
|
|
pcISPCSV = new CISPCSV;
|
|
if (!pcISPCSV)
|
|
{
|
|
// BUGBUG Show error message
|
|
bRet = FALSE;
|
|
//iNumOfAutoConfigOffers = ISP_INFO_NO_VALIDOFFER;
|
|
break;
|
|
|
|
}
|
|
|
|
// Read a line from the ISPINFO file
|
|
hr = pcISPCSV->ReadOneLine(pcCSVFile);
|
|
if (hr == ERROR_SUCCESS)
|
|
{
|
|
// If this line contains a nooffer flag, then leave now
|
|
if (!(pcISPCSV->get_dwCFGFlag() & ICW_CFGFLAG_OFFERS))
|
|
{
|
|
//iNumOfAutoConfigOffers = 0;
|
|
break;
|
|
}
|
|
if ((pcISPCSV->get_dwCFGFlag() & ICW_CFGFLAG_AUTOCONFIG) &&
|
|
(gpWizardState->bISDNMode ? (pcISPCSV->get_dwCFGFlag() & ICW_CFGFLAG_ISDN_OFFER) : TRUE) )
|
|
{
|
|
// Convert the ISP logo from a GIF to an ICON, and add it to the Image List
|
|
ConvertISPIcon(pcISPCSV->get_szISPLogoPath(), &hISPLogo);
|
|
iImage = ImageList_AddIcon(gpWizardState->himlIspSelect, hISPLogo);
|
|
|
|
DestroyIcon(hISPLogo);
|
|
pcISPCSV->set_ISPLogoImageIndex(iImage);
|
|
|
|
// Add the entry to the list view
|
|
if (AddItemToISPList( GetDlgItem(hDlg, IDC_ISPLIST),
|
|
iNumOfAutoConfigOffers,
|
|
pcISPCSV->get_szISPName(),
|
|
pcISPCSV->get_ISPLogoIndex(),
|
|
FALSE,
|
|
(LPARAM)pcISPCSV,
|
|
bCheckDupe))
|
|
{
|
|
++iNumOfAutoConfigOffers;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
delete pcISPCSV;
|
|
}
|
|
}
|
|
else if (hr == ERROR_NO_MORE_ITEMS)
|
|
{
|
|
delete pcISPCSV; // We don't need this one
|
|
break;
|
|
}
|
|
else if (hr == ERROR_FILE_NOT_FOUND)
|
|
{
|
|
// do not show this ISP when its data is invalid
|
|
// we don't want to halt everything. Just let it contine
|
|
delete pcISPCSV;
|
|
}
|
|
else
|
|
{
|
|
// Show error message Later
|
|
delete pcISPCSV;
|
|
//iNumOfAutoConfigOffers = ISP_INFO_NO_VALIDOFFER;
|
|
bRet = FALSE;
|
|
break;
|
|
}
|
|
|
|
} while (TRUE);
|
|
|
|
delete pcCSVFile;
|
|
|
|
return bRet;
|
|
}
|
|
/*******************************************************************
|
|
|
|
NAME: ISPAutoSelectInitProc
|
|
|
|
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 ISPAutoSelectInitProc
|
|
(
|
|
HWND hDlg,
|
|
BOOL fFirstInit,
|
|
UINT *puNextPage
|
|
)
|
|
{
|
|
if (fFirstInit)
|
|
{
|
|
// Initialize the List View
|
|
InitListView(GetDlgItem(hDlg, IDC_ISPLIST));
|
|
gpWizardState->cmnStateData.bParseIspinfo = TRUE;
|
|
}
|
|
else
|
|
{
|
|
gpWizardState->bISDNMode = gpWizardState->cmnStateData.bIsISDNDevice;
|
|
if (g_bSkipSelPage)
|
|
{
|
|
g_bSkipSelPage = FALSE;
|
|
*puNextPage = ORD_PAGE_ISP_AUTOCONFIG_NOOFFER;
|
|
}
|
|
if (gpWizardState->cmnStateData.bParseIspinfo)
|
|
{
|
|
// If there are items in the list view, clear them
|
|
ListView_DeleteAllItems(GetDlgItem(hDlg, IDC_ISPLIST));
|
|
|
|
// Initialize the number of autocfg offers to zero
|
|
iNumOfAutoConfigOffers = 0;
|
|
gpWizardState->lpSelectedISPInfo = NULL;
|
|
|
|
// Always try to parse offline folder. If there is nothing there,
|
|
// it will simple return FALSE.
|
|
if (gpWizardState->cmnStateData.bOEMOffline)
|
|
ParseISPInfo(hDlg, ICW_OEMINFOPath, TRUE);
|
|
|
|
// Read and parse the download folder.
|
|
ParseISPInfo(hDlg, ICW_ISPINFOPath, TRUE);
|
|
|
|
// Create a "other" selection in the list view for unlisted ISPs
|
|
if (iNumOfAutoConfigOffers > 0 )
|
|
{
|
|
// Adding Other
|
|
TCHAR szOther [MAX_RES_LEN+1] = TEXT("\0");
|
|
LoadString(ghInstanceResDll, IDS_ISP_AUTOCONFIG_OTHER, szOther, ARRAYSIZE(szOther));
|
|
AddItemToISPList( GetDlgItem(hDlg, IDC_ISPLIST),
|
|
iNumOfAutoConfigOffers,
|
|
szOther,
|
|
-1,
|
|
FALSE,
|
|
(LPARAM)NULL,
|
|
FALSE);
|
|
ResetListView(GetDlgItem(hDlg, IDC_ISPLIST));
|
|
}
|
|
}
|
|
// The following 3 Cases can happen at this point:
|
|
// 1) The ispinfo.csv contains a line says no offer, we go to nooffer page
|
|
// 2) The ispinfo.csv contains no line of valid offer and no no-offer entry
|
|
// This may happen in calling the old referral.dll that ICW 3 client calls
|
|
// 3) There are many offers but no ISDN offers, we go to ISDN offer pages
|
|
// 4) Normal situation, some valid offers where we're in ISDN or not
|
|
|
|
if (0 == iNumOfAutoConfigOffers)
|
|
{
|
|
*puNextPage = ORD_PAGE_ISP_AUTOCONFIG_NOOFFER;
|
|
}
|
|
else if (ISP_INFO_NO_VALIDOFFER == iNumOfAutoConfigOffers)
|
|
{
|
|
// Error in ISPINFO.CSV if there is no offers and no no-offer entry
|
|
// critical error
|
|
*puNextPage = g_uExternUINext;
|
|
gpWizardState->cmnStateData.bParseIspinfo = TRUE;
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
if (0 == ListView_GetSelectedCount(GetDlgItem(hDlg, IDC_ISPLIST)))
|
|
{
|
|
// Select the First Item in the Listview
|
|
ListView_SetItemState(GetDlgItem(hDlg, IDC_ISPLIST), 0, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
|
|
}
|
|
}
|
|
|
|
gpWizardState->cmnStateData.bParseIspinfo = FALSE;
|
|
gpWizardState->uCurrentPage = ORD_PAGE_ISP_AUTOCONFIG;
|
|
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
NAME: ISPAutoSelectOKProc
|
|
|
|
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 ISPAutoSelectOKProc
|
|
(
|
|
HWND hDlg,
|
|
BOOL fForward,
|
|
UINT *puNextPage,
|
|
BOOL *pfKeepHistory
|
|
)
|
|
{
|
|
ASSERT(puNextPage);
|
|
|
|
if (fForward)
|
|
{
|
|
if (gpWizardState->lpSelectedISPInfo == NULL)
|
|
{
|
|
*puNextPage = ORD_PAGE_ISP_AUTOCONFIG_NOOFFER;
|
|
return TRUE;
|
|
}
|
|
*puNextPage = ORD_PAGE_ISPDIAL;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL CALLBACK ISPAutoSelectNotifyProc
|
|
(
|
|
HWND hDlg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
CISPCSV *pcISPCSV;
|
|
|
|
// Process ListView notifications
|
|
switch(((LV_DISPINFO *)lParam)->hdr.code)
|
|
{
|
|
case NM_DBLCLK:
|
|
TraceMsg(TF_ISPSELECT, "ISPSELECT: WM_NOTIFY - NM_DBLCLK");
|
|
PropSheet_PressButton(GetParent(hDlg),PSBTN_NEXT);
|
|
break;
|
|
|
|
case NM_SETFOCUS:
|
|
case NM_KILLFOCUS:
|
|
// update list view
|
|
break;
|
|
|
|
case LVN_ITEMCHANGED:
|
|
TraceMsg(TF_ISPSELECT, "ISPSELECT: WM_NOTIFY - LVN_ITEMCHANGED");
|
|
|
|
if((((NM_LISTVIEW *)lParam)->uChanged & LVIF_STATE) &&
|
|
((NM_LISTVIEW *)lParam)->uNewState & (LVIS_FOCUSED | LVIS_SELECTED))
|
|
{
|
|
// IF an Item just became selected, then render it's HTML content
|
|
pcISPCSV = (CISPCSV *)((NM_LISTVIEW *)lParam)->lParam;
|
|
|
|
// Remember the selected item for later use
|
|
gpWizardState->lpSelectedISPInfo = pcISPCSV;
|
|
}
|
|
break;
|
|
// The listview is being emptied, or destroyed, either way, our lpSelectedISPInfo
|
|
// is no longer valid, since the list view underlying data will be freed.
|
|
case LVN_DELETEALLITEMS:
|
|
gpWizardState->lpSelectedISPInfo = NULL;
|
|
SetPropSheetResult(hDlg,TRUE);
|
|
break;
|
|
|
|
case LVN_DELETEITEM:
|
|
// We were notified that an item was deleted.
|
|
// so delete the underlying data that it is pointing
|
|
// to.
|
|
if (((NM_LISTVIEW*)lParam)->lParam)
|
|
delete (CISPCSV *)((NM_LISTVIEW *)lParam)->lParam;
|
|
break;
|
|
|
|
}
|
|
return TRUE;
|
|
}
|
|
|