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.
715 lines
17 KiB
715 lines
17 KiB
/*++
|
|
|
|
Copyright (c) 1999 - 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sendwzrd.c
|
|
|
|
Abstract:
|
|
|
|
Fax wizard pages for sending configuration
|
|
plus the welcome and complete page for the wizard.
|
|
|
|
Environment:
|
|
|
|
Fax configuration wizard
|
|
|
|
Revision History:
|
|
|
|
03/13/00 -taoyuan-
|
|
Created it.
|
|
|
|
mm/dd/yy -author-
|
|
description
|
|
|
|
--*/
|
|
|
|
#include "faxcfgwz.h"
|
|
|
|
//
|
|
// functions which will be used only in this file
|
|
//
|
|
VOID DoInitSendDeviceList(HWND);
|
|
BOOL DoShowSendDevices(HWND);
|
|
VOID DoSaveSendDevices(HWND);
|
|
BOOL ValidateControl(HWND, INT);
|
|
BOOL ChangePriority(HWND, BOOL);
|
|
VOID CheckSendDevices(HWND hDlg);
|
|
|
|
|
|
BOOL
|
|
DoShowSendDevices(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Load the device information into the list view control
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Send Device" page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
{
|
|
LV_ITEM item;
|
|
INT iItem = 0;
|
|
INT iIndex;
|
|
DWORD dw;
|
|
int nDevInx;
|
|
HWND hwndLv;
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("DoShowSendDevices()"));
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST);
|
|
|
|
ListView_DeleteAllItems(hwndLv );
|
|
|
|
//
|
|
// Fill the list of devices and select the first item.
|
|
//
|
|
|
|
for (dw = 0; dw < g_wizData.dwDeviceCount; ++dw)
|
|
{
|
|
nDevInx = GetDevIndexByDevId(g_wizData.pdwSendDevOrder[dw]);
|
|
if(nDevInx < 0)
|
|
{
|
|
Assert(FALSE);
|
|
continue;
|
|
}
|
|
|
|
if(!(g_wizData.pDevInfo[nDevInx].bSelected))
|
|
{
|
|
//
|
|
// skip unselected device
|
|
//
|
|
continue;
|
|
}
|
|
|
|
ZeroMemory( &item, sizeof(item) );
|
|
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
|
|
item.iItem = iItem++;
|
|
item.pszText = g_wizData.pDevInfo[nDevInx].szDeviceName;
|
|
|
|
//
|
|
// we only support modem icon right now, if we can distinguish
|
|
// the type of a specific, add code here
|
|
//
|
|
item.iImage = DI_Modem;
|
|
item.lParam = nDevInx;
|
|
|
|
iIndex = ListView_InsertItem(hwndLv, &item );
|
|
|
|
ListView_SetCheckState(hwndLv,
|
|
iIndex,
|
|
g_wizData.pDevInfo[nDevInx].bSend);
|
|
}
|
|
|
|
//
|
|
// Select the first item and validate the buttons
|
|
//
|
|
ListView_SetItemState(hwndLv, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
|
|
|
|
ListView_SetColumnWidth(hwndLv, 0, LVSCW_AUTOSIZE_USEHEADER );
|
|
|
|
ValidateControl(hDlg, 0);
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
VOID
|
|
DoSaveSendDevices(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save the user's choice for fax sending devices
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Send Device" page
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if at least one device is selected or confirms for disable send
|
|
FALSE -- if no device is selected but user chooses to go back.
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD dw;
|
|
DWORD dwOrder;
|
|
LVITEM lv = {0}; // for getting info of device Id
|
|
DWORD dwDevInx;
|
|
DWORD dwDeviceCount;
|
|
HWND hwndLv;
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("DoSaveSendDevices()"));
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST);
|
|
|
|
dwDeviceCount = ListView_GetItemCount(hwndLv);
|
|
|
|
|
|
lv.mask = LVIF_PARAM;
|
|
|
|
|
|
//
|
|
// check selected devices
|
|
//
|
|
for(dwOrder = 0; dwOrder < dwDeviceCount; ++dwOrder)
|
|
{
|
|
//
|
|
// Get device index
|
|
//
|
|
lv.iItem = dwOrder;
|
|
ListView_GetItem(hwndLv, &lv);
|
|
dwDevInx = (DWORD)lv.lParam;
|
|
|
|
//
|
|
// get device selection
|
|
//
|
|
g_wizData.pDevInfo[dwDevInx].bSend = ListView_GetCheckState(hwndLv, dwOrder);
|
|
|
|
//
|
|
// save order info
|
|
//
|
|
g_wizData.pdwSendDevOrder[dwOrder] = g_wizData.pDevInfo[dwDevInx].dwDeviceId;
|
|
}
|
|
|
|
//
|
|
// Store unselected device order
|
|
//
|
|
for (dw=0; dw < g_wizData.dwDeviceCount && dwOrder < g_wizData.dwDeviceCount; ++dw)
|
|
{
|
|
if(!(g_wizData.pDevInfo[dw].bSelected))
|
|
{
|
|
g_wizData.pdwSendDevOrder[dwOrder] = g_wizData.pDevInfo[dw].dwDeviceId;
|
|
++dwOrder;
|
|
}
|
|
}
|
|
Assert(dwOrder == g_wizData.dwDeviceCount);
|
|
}
|
|
|
|
BOOL
|
|
ValidateControl(
|
|
HWND hDlg,
|
|
INT iItem
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Validate the up and down button in the device select page
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the Device Send Options property sheet page
|
|
iItem - index of the item being selected
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if no error
|
|
FALSE -- if error
|
|
|
|
--*/
|
|
|
|
{
|
|
|
|
DWORD dwDeviceCount = ListView_GetItemCount(GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST));
|
|
|
|
//
|
|
// if there is only one device or we don't click on any item
|
|
// up and down buttons are disabled
|
|
//
|
|
if(dwDeviceCount < 2 || iItem == -1)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_UP), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_DOWN), FALSE);
|
|
return TRUE;
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_UP), iItem > 0); // not the top one
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SENDPRI_DOWN), iItem < (INT)dwDeviceCount - 1 ); // not the last one
|
|
|
|
if (!IsWindowEnabled (GetFocus()))
|
|
{
|
|
//
|
|
// The currently selected control turned disabled - select the list control
|
|
//
|
|
SetFocus (GetDlgItem (hDlg, IDC_SEND_DEVICE_LIST));
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
ChangePriority(
|
|
HWND hDlg,
|
|
BOOL bMoveUp
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Validate the up and down button in the device select page
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the Device Send Options property sheet page
|
|
bMoveUp -- TRUE for moving up, FALSE for moving down
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if no error
|
|
FALSE -- if error
|
|
|
|
--*/
|
|
|
|
{
|
|
INT iItem;
|
|
BOOL rslt;
|
|
LVITEM lv={0};
|
|
HWND hwndLv;
|
|
BOOL bChecked;
|
|
TCHAR pszText[MAX_DEVICE_NAME];
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("ChangePriority()"));
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST);
|
|
|
|
iItem = ListView_GetNextItem(hwndLv, -1, LVNI_ALL | LVNI_SELECTED);
|
|
if(iItem == -1)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// get selected item information and then remove it
|
|
//
|
|
lv.iItem = iItem;
|
|
lv.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
|
|
lv.stateMask = LVIS_SELECTED;
|
|
lv.pszText = pszText;
|
|
lv.cchTextMax = MAX_DEVICE_NAME;
|
|
ListView_GetItem(hwndLv, &lv);
|
|
bChecked = ListView_GetCheckState(hwndLv, iItem);
|
|
|
|
rslt = ListView_DeleteItem(hwndLv, iItem);
|
|
|
|
//
|
|
// recalculate the item index;
|
|
//
|
|
if(bMoveUp)
|
|
{
|
|
lv.iItem--;
|
|
}
|
|
else
|
|
{
|
|
lv.iItem++;
|
|
}
|
|
|
|
//
|
|
// reinsert the item and validate button state
|
|
//
|
|
iItem = ListView_InsertItem(hwndLv, &lv);
|
|
ListView_SetCheckState(hwndLv, iItem, bChecked);
|
|
ListView_SetItemState(hwndLv, iItem, LVIS_SELECTED, LVIS_SELECTED);
|
|
ValidateControl(hDlg, iItem);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
VOID
|
|
CheckSendDevices(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Display a warning if no device is selected
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Send Device" page
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
HWND hwndLv; // list view windows
|
|
DWORD dwDeviceIndex;
|
|
DWORD dwDeviceCount;
|
|
BOOL bDeviceSelect = FALSE; // indicate whether we have at least one device selected.
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("CheckSendDevices()"));
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST);
|
|
|
|
dwDeviceCount = ListView_GetItemCount(hwndLv);
|
|
|
|
if(dwDeviceCount < 1) // if there isn't device in the list.
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
for(dwDeviceIndex = 0; dwDeviceIndex < dwDeviceCount; dwDeviceIndex++)
|
|
{
|
|
if(ListView_GetCheckState(hwndLv, dwDeviceIndex))
|
|
{
|
|
bDeviceSelect = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
exit:
|
|
|
|
ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_SEND_DEVICE), bDeviceSelect ? SW_HIDE : SW_SHOW);
|
|
ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_DEVICE_ERR), bDeviceSelect ? SW_HIDE : SW_SHOW);
|
|
|
|
return;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
SendDeviceDlgProc (
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "Send Device" page
|
|
|
|
Arguments:
|
|
|
|
hDlg - Identifies the property sheet page
|
|
uMsg - Specifies the message
|
|
wParam - Specifies additional message-specific information
|
|
lParam - Specifies additional message-specific information
|
|
|
|
Return Value:
|
|
|
|
Depends on the value of message parameter
|
|
|
|
--*/
|
|
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG :
|
|
{
|
|
// icon handles for up and down arrows.
|
|
HICON hIconUp, hIconDown;
|
|
|
|
hIconUp = LoadIcon(g_hResource, MAKEINTRESOURCE(IDI_Up));
|
|
hIconDown = LoadIcon(g_hResource, MAKEINTRESOURCE(IDI_Down));
|
|
|
|
SendDlgItemMessage(hDlg, IDC_SENDPRI_UP, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIconUp);
|
|
SendDlgItemMessage(hDlg, IDC_SENDPRI_DOWN, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIconDown);
|
|
|
|
//
|
|
// load device info
|
|
//
|
|
InitDeviceList(hDlg, IDC_SEND_DEVICE_LIST);
|
|
DoShowSendDevices(hDlg);
|
|
CheckSendDevices(hDlg);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_SENDPRI_UP:
|
|
|
|
ChangePriority(hDlg, TRUE);
|
|
break;
|
|
|
|
case IDC_SENDPRI_DOWN:
|
|
|
|
ChangePriority(hDlg, FALSE);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE :
|
|
|
|
DoShowSendDevices(hDlg);
|
|
|
|
// Enable the Back and Finish button
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
break;
|
|
|
|
case PSN_WIZBACK :
|
|
{
|
|
//
|
|
// Handle a Back button click here
|
|
//
|
|
DoSaveSendDevices(hDlg);
|
|
|
|
if(RemoveLastPage(hDlg))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case PSN_WIZNEXT :
|
|
//
|
|
// Handle a Next button click, if necessary
|
|
//
|
|
|
|
DoSaveSendDevices(hDlg);
|
|
|
|
//
|
|
// switch to appropriate page
|
|
//
|
|
if(!IsSendEnable())
|
|
{
|
|
//
|
|
// go to the receive configuration or completion page
|
|
//
|
|
if(g_bShowDevicePages)
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_RECV_SELECT_DEVICES);
|
|
}
|
|
else
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_COMPLETE);
|
|
}
|
|
|
|
SetLastPage(IDD_WIZARD_SEND_SELECT_DEVICES);
|
|
return TRUE;
|
|
}
|
|
|
|
SetLastPage(IDD_WIZARD_SEND_SELECT_DEVICES);
|
|
break;
|
|
|
|
case PSN_RESET :
|
|
{
|
|
// Handle a Cancel button click, if necessary
|
|
break;
|
|
}
|
|
|
|
case LVN_ITEMCHANGED:
|
|
{
|
|
//
|
|
// need to validate the control after changing selection by keyboard
|
|
//
|
|
|
|
LPNMLISTVIEW pnmv;
|
|
|
|
pnmv = (LPNMLISTVIEW) lParam;
|
|
ValidateControl(hDlg, pnmv->iItem);
|
|
CheckSendDevices(hDlg);
|
|
|
|
break;
|
|
}
|
|
|
|
case NM_DBLCLK:
|
|
|
|
{
|
|
//
|
|
// Handle a double click event
|
|
//
|
|
INT iItem;
|
|
HWND hwndLv;
|
|
hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST);
|
|
iItem = ((LPNMITEMACTIVATE) lParam)->iItem;
|
|
ListView_SetCheckState(hwndLv, iItem, !ListView_GetCheckState(hwndLv, iItem));
|
|
|
|
// we don't have break here because we'll go through NM_CLICK
|
|
}
|
|
|
|
case NM_CLICK:
|
|
{
|
|
//
|
|
// Handle a Click event
|
|
//
|
|
HWND hwndLv;
|
|
LPNMITEMACTIVATE lpnmitem;
|
|
|
|
lpnmitem = (LPNMITEMACTIVATE)lParam;
|
|
hwndLv = GetDlgItem(hDlg, IDC_SEND_DEVICE_LIST);
|
|
|
|
ListView_SetItemState(hwndLv, lpnmitem->iItem, LVIS_SELECTED, LVIS_SELECTED);
|
|
ValidateControl(hDlg, lpnmitem->iItem);
|
|
CheckSendDevices(hDlg);
|
|
|
|
break;
|
|
}
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
INT_PTR CALLBACK
|
|
SendTsidDlgProc (
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "TSID" page
|
|
|
|
Arguments:
|
|
|
|
hDlg - Identifies the property sheet page
|
|
uMsg - Specifies the message
|
|
wParam - Specifies additional message-specific information
|
|
lParam - Specifies additional message-specific information
|
|
|
|
Return Value:
|
|
|
|
Depends on the value of message parameter
|
|
|
|
--*/
|
|
|
|
{
|
|
switch (uMsg)
|
|
{
|
|
case WM_INITDIALOG :
|
|
{
|
|
//
|
|
// Maximum length for various text fields in the dialog
|
|
//
|
|
|
|
static INT textLimits[] =
|
|
{
|
|
IDC_TSID, FXS_TSID_CSID_MAX_LENGTH + 1,
|
|
0,
|
|
};
|
|
|
|
LimitTextFields(hDlg, textLimits);
|
|
|
|
if(g_wizData.szTsid)
|
|
{
|
|
SetDlgItemText(hDlg, IDC_TSID, g_wizData.szTsid);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE : //Enable the Back and Finish button
|
|
|
|
PropSheet_SetWizButtons(GetParent(hDlg), PSWIZB_BACK | PSWIZB_NEXT);
|
|
break;
|
|
|
|
case PSN_WIZBACK :
|
|
{
|
|
//
|
|
// Handle a Back button click here
|
|
//
|
|
if(RemoveLastPage(hDlg))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case PSN_WIZNEXT :
|
|
{
|
|
// Handle a Next button click, if necessary
|
|
LPTSTR pTsid;
|
|
|
|
pTsid = (LPTSTR)MemAlloc((FXS_TSID_CSID_MAX_LENGTH + 1) * sizeof(TCHAR));
|
|
Assert(pTsid);
|
|
|
|
if(pTsid)
|
|
{
|
|
pTsid[0] = '\0';
|
|
GetDlgItemText(hDlg, IDC_TSID, pTsid, FXS_TSID_CSID_MAX_LENGTH + 1);
|
|
|
|
MemFree(g_wizData.szTsid);
|
|
g_wizData.szTsid = NULL;
|
|
}
|
|
else
|
|
{
|
|
LPCTSTR faxDbgFunction = TEXT("SendTsidDlgProc()");
|
|
DebugPrintEx(DEBUG_ERR, TEXT("Can't allocate memory for TSID."));
|
|
}
|
|
g_wizData.szTsid = pTsid;
|
|
|
|
if(1 == g_wizData.dwDeviceLimit && !IsReceiveEnable())
|
|
{
|
|
//
|
|
// go to the completion page
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_COMPLETE);
|
|
SetLastPage(IDD_WIZARD_SEND_TSID);
|
|
return TRUE;
|
|
}
|
|
SetLastPage(IDD_WIZARD_SEND_TSID);
|
|
break;
|
|
}
|
|
|
|
case PSN_RESET :
|
|
{
|
|
// Handle a Cancel button click, if necessary
|
|
break;
|
|
}
|
|
|
|
default :
|
|
break;
|
|
}
|
|
|
|
break;
|
|
} // WM_NOTIFY
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|