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.
617 lines
16 KiB
617 lines
16 KiB
/*++
|
|
|
|
Copyright (c) 1999 - 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
recvwzrd.c
|
|
|
|
Abstract:
|
|
|
|
Fax wizard pages for receiving configuration
|
|
|
|
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 DoInitRecvDeviceList(HWND);
|
|
VOID DoShowRecvDevices(HWND);
|
|
VOID DoSaveRecvDevices(HWND);
|
|
VOID CheckAnswerOptions(HWND);
|
|
|
|
|
|
VOID
|
|
DoShowRecvDevices(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Load the device information into the list view control
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the Device Send Options property sheet page
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if failed.
|
|
|
|
--*/
|
|
{
|
|
LV_ITEM item = {0};
|
|
INT iItem = 0;
|
|
INT iIndex;
|
|
DWORD dw;
|
|
HWND hwndLv;
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("DoShowRecvDevices()"));
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_RECV_DEVICE_LIST);
|
|
|
|
ListView_DeleteAllItems(hwndLv);
|
|
|
|
//
|
|
// Fill the list of devices and select the first item.
|
|
//
|
|
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
|
|
item.iImage = DI_Modem;
|
|
|
|
for (dw = 0; dw < g_wizData.dwDeviceCount; ++dw)
|
|
{
|
|
if(!(g_wizData.pDevInfo[dw].bSelected))
|
|
{
|
|
//
|
|
// skip unselected device
|
|
//
|
|
continue;
|
|
}
|
|
|
|
item.iItem = iItem++;
|
|
item.pszText = g_wizData.pDevInfo[dw].szDeviceName;
|
|
item.lParam = dw;
|
|
|
|
iIndex = ListView_InsertItem(hwndLv, &item );
|
|
ListView_SetCheckState(hwndLv,
|
|
iIndex,
|
|
(FAX_DEVICE_RECEIVE_MODE_OFF != g_wizData.pDevInfo[dw].ReceiveMode));
|
|
}
|
|
|
|
//
|
|
// Select the first item.
|
|
//
|
|
ListView_SetItemState(hwndLv, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
|
|
|
|
ListView_SetColumnWidth(hwndLv, 0, LVSCW_AUTOSIZE_USEHEADER );
|
|
}
|
|
|
|
VOID
|
|
DoSaveRecvDevices(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save the user's choice for fax receiving devices
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Receive Device" page
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if at least one device is selected or confirms for not selecting any receive
|
|
FALSE -- if no device is selected but user chooses to go back.
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD dw;
|
|
DWORD dwDevInx;
|
|
DWORD dwDeviceCount;
|
|
HWND hwndLv;
|
|
LVITEM lv = {0};
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("DoSaveRecvDevices()"));
|
|
|
|
lv.mask = LVIF_PARAM;
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_RECV_DEVICE_LIST);
|
|
|
|
dwDeviceCount = ListView_GetItemCount(hwndLv);
|
|
|
|
//
|
|
// check selected devices
|
|
//
|
|
for(dw = 0; dw < dwDeviceCount; ++dw)
|
|
{
|
|
//
|
|
// Get device index
|
|
//
|
|
lv.iItem = dw;
|
|
ListView_GetItem(hwndLv, &lv);
|
|
dwDevInx = (DWORD)lv.lParam;
|
|
|
|
g_wizData.pDevInfo[dwDevInx].ReceiveMode = FAX_DEVICE_RECEIVE_MODE_OFF;
|
|
if(ListView_GetCheckState(hwndLv, dw))
|
|
{
|
|
if(IsDlgButtonChecked(hDlg,IDC_MANUAL_ANSWER) == BST_CHECKED)
|
|
{
|
|
g_wizData.pDevInfo[dwDevInx].ReceiveMode = FAX_DEVICE_RECEIVE_MODE_MANUAL;
|
|
}
|
|
else
|
|
{
|
|
g_wizData.pDevInfo[dwDevInx].ReceiveMode = FAX_DEVICE_RECEIVE_MODE_AUTO;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
CheckAnswerOptions(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Enable/disable the manual and auto answer radio button depending on the device
|
|
number to receive faxes
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Receive Device" page
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
HWND hwndLv; // list view windows
|
|
DWORD dwDeviceIndex;
|
|
DWORD dwDeviceCount;
|
|
DWORD dwSelectNum=0; // number of the selected devices
|
|
BOOL bManualAnswer = FALSE;
|
|
BOOL bAllowManualAnswer = TRUE;
|
|
BOOL bAllVirtual = TRUE; // Are all device virtual
|
|
|
|
DEBUG_FUNCTION_NAME(TEXT("CheckAnswerOptions()"));
|
|
|
|
hwndLv = GetDlgItem(hDlg, IDC_RECV_DEVICE_LIST);
|
|
|
|
dwDeviceCount = ListView_GetItemCount(hwndLv);
|
|
|
|
if(dwDeviceCount < 1) // if there isn't device in the list.
|
|
{
|
|
goto exit;
|
|
}
|
|
|
|
Assert (g_hFaxSvcHandle);
|
|
|
|
for(dwDeviceIndex = 0; dwDeviceIndex < dwDeviceCount; ++dwDeviceIndex)
|
|
{
|
|
if(ListView_GetCheckState(hwndLv, dwDeviceIndex))
|
|
{
|
|
DWORD dwRes;
|
|
BOOL bVirtual;
|
|
|
|
dwRes = IsDeviceVirtual (g_hFaxSvcHandle, g_wizData.pDevInfo[dwDeviceIndex].dwDeviceId, &bVirtual);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
//
|
|
// Assume device is virtual
|
|
//
|
|
bVirtual = TRUE;
|
|
}
|
|
if (!bVirtual)
|
|
{
|
|
bAllVirtual = FALSE;
|
|
}
|
|
|
|
++dwSelectNum;
|
|
|
|
if(FAX_DEVICE_RECEIVE_MODE_MANUAL == g_wizData.pDevInfo[dwDeviceIndex].ReceiveMode)
|
|
{
|
|
Assert(!bManualAnswer);
|
|
bManualAnswer = TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(dwSelectNum != 1)
|
|
{
|
|
bAllowManualAnswer = FALSE;
|
|
}
|
|
if (bAllVirtual && dwSelectNum)
|
|
{
|
|
//
|
|
// Virtual devices don't support manual-answer mode
|
|
//
|
|
bAllowManualAnswer = FALSE;
|
|
//
|
|
// Virtual devices always answer after one ring
|
|
//
|
|
SetDlgItemInt (hDlg, IDC_RING_COUNT, 1, FALSE);
|
|
}
|
|
|
|
if(IsDlgButtonChecked(hDlg,IDC_MANUAL_ANSWER) == BST_CHECKED)
|
|
{
|
|
if (!bAllowManualAnswer)
|
|
{
|
|
//
|
|
// Manual-answer is not a valid option, yet, it is selected.
|
|
// Change to auto-answer mode.
|
|
//
|
|
CheckDlgButton (hDlg, IDC_MANUAL_ANSWER, FALSE);
|
|
CheckDlgButton (hDlg, IDC_AUTO_ANSWER, TRUE);
|
|
bManualAnswer = FALSE;
|
|
}
|
|
else
|
|
{
|
|
bManualAnswer = TRUE;
|
|
}
|
|
}
|
|
|
|
exit:
|
|
// Show/hide answer mode controls
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_MANUAL_ANSWER), !bAllVirtual && (dwSelectNum == 1));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_AUTO_ANSWER), (dwSelectNum > 0));
|
|
EnableWindow(GetDlgItem(hDlg, IDCSTATIC_RINGS), (dwSelectNum > 0));
|
|
|
|
CheckDlgButton (hDlg, IDC_MANUAL_ANSWER, bManualAnswer ? BST_CHECKED : BST_UNCHECKED);
|
|
CheckDlgButton (hDlg, IDC_AUTO_ANSWER, (!bManualAnswer && (dwSelectNum > 0)) ? BST_CHECKED : BST_UNCHECKED);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_RING_COUNT), !bAllVirtual && (dwSelectNum > 0) && IsDlgButtonChecked(hDlg, IDC_AUTO_ANSWER));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SPIN_RING_COUNT), !bAllVirtual && (dwSelectNum > 0) && IsDlgButtonChecked(hDlg, IDC_AUTO_ANSWER));
|
|
|
|
ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_RECV_DEVICE), (dwSelectNum > 0) ? SW_HIDE : SW_SHOW);
|
|
ShowWindow(GetDlgItem(hDlg, IDCSTATIC_NO_DEVICE_ERR), (dwSelectNum > 0) ? SW_HIDE : SW_SHOW);
|
|
|
|
return;
|
|
} // CheckAnswerOptions
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
RecvDeviceDlgProc (
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "Receive 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 :
|
|
{
|
|
//
|
|
// Maximum length for various text fields in the dialog
|
|
//
|
|
static INT textLimits[] =
|
|
{
|
|
IDC_RING_COUNT, FXS_RINGS_LENGTH+1,
|
|
0,
|
|
};
|
|
|
|
LimitTextFields(hDlg, textLimits);
|
|
|
|
//
|
|
// Initiate the spin control.
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_SPIN_RING_COUNT, UDM_SETRANGE32,
|
|
(WPARAM)FXS_RINGS_LOWER, (LPARAM)FXS_RINGS_UPPER);
|
|
|
|
if(g_wizData.dwRingCount > FXS_RINGS_UPPER || (int)(g_wizData.dwRingCount) < FXS_RINGS_LOWER)
|
|
{
|
|
SetDlgItemInt(hDlg, IDC_RING_COUNT, FXS_RINGS_DEFAULT, FALSE);
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemInt(hDlg, IDC_RING_COUNT, g_wizData.dwRingCount, FALSE);
|
|
}
|
|
|
|
//
|
|
// init the list view and load device info
|
|
//
|
|
InitDeviceList(hDlg, IDC_RECV_DEVICE_LIST);
|
|
DoShowRecvDevices(hDlg);
|
|
CheckAnswerOptions(hDlg);
|
|
|
|
return TRUE;
|
|
}
|
|
case WM_COMMAND:
|
|
|
|
switch(LOWORD(wParam))
|
|
{
|
|
case IDC_MANUAL_ANSWER:
|
|
case IDC_AUTO_ANSWER:
|
|
|
|
// at this time, they must be enabled
|
|
EnableWindow(GetDlgItem(hDlg, IDC_RING_COUNT),
|
|
LOWORD(wParam)==IDC_AUTO_ANSWER);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SPIN_RING_COUNT),
|
|
LOWORD(wParam)==IDC_AUTO_ANSWER);
|
|
break;
|
|
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY :
|
|
{
|
|
LPNMHDR lpnm = (LPNMHDR) lParam;
|
|
|
|
switch (lpnm->code)
|
|
{
|
|
case PSN_SETACTIVE :
|
|
|
|
DoShowRecvDevices(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
|
|
//
|
|
DoSaveRecvDevices(hDlg);
|
|
|
|
if(RemoveLastPage(hDlg))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case PSN_WIZNEXT :
|
|
{
|
|
BOOL bRes;
|
|
|
|
//
|
|
// Handle a Next button click, if necessary
|
|
//
|
|
DoSaveRecvDevices(hDlg);
|
|
|
|
if(IsReceiveEnable() &&
|
|
(IsDlgButtonChecked(hDlg,IDC_AUTO_ANSWER) == BST_CHECKED) &&
|
|
(SendDlgItemMessage(hDlg, IDC_RING_COUNT, WM_GETTEXTLENGTH, 0, 0) == 0))
|
|
{
|
|
//
|
|
// If the rings field is empty
|
|
// go back to this page
|
|
//
|
|
DisplayMessageDialog(hDlg, MB_OK | MB_ICONSTOP, 0, IDS_ERR_NO_RINGS);
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, -1);
|
|
return TRUE;
|
|
}
|
|
|
|
g_wizData.dwRingCount = GetDlgItemInt(hDlg, IDC_RING_COUNT, &bRes, FALSE);
|
|
if(!bRes)
|
|
{
|
|
DEBUG_FUNCTION_NAME(TEXT("RecvDeviceDlgProc()"));
|
|
DebugPrintEx(DEBUG_ERR, TEXT("GetDlgItemInt failed: %d."), GetLastError());
|
|
}
|
|
|
|
if(!IsReceiveEnable())
|
|
{
|
|
//
|
|
// go to the completion page
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, IDD_WIZARD_COMPLETE);
|
|
SetLastPage(IDD_WIZARD_RECV_SELECT_DEVICES);
|
|
return TRUE;
|
|
}
|
|
|
|
SetLastPage(IDD_WIZARD_RECV_SELECT_DEVICES);
|
|
break;
|
|
}
|
|
|
|
case PSN_RESET :
|
|
{
|
|
// Handle a Cancel button click, if necessary
|
|
break;
|
|
}
|
|
|
|
case LVN_ITEMCHANGED:
|
|
{
|
|
CheckAnswerOptions(hDlg);
|
|
break;
|
|
}
|
|
|
|
case NM_DBLCLK:
|
|
{
|
|
INT iItem;
|
|
HWND hwndLv;
|
|
|
|
iItem = ((LPNMITEMACTIVATE)lParam)->iItem;
|
|
hwndLv = GetDlgItem(hDlg, IDC_RECV_DEVICE_LIST);
|
|
|
|
ListView_SetCheckState(hwndLv, iItem,
|
|
!ListView_GetCheckState(hwndLv, iItem));
|
|
|
|
// we don't have break here because we'll go through NM_CLICK
|
|
}
|
|
|
|
case NM_CLICK:
|
|
|
|
break;
|
|
|
|
default :
|
|
break;
|
|
}
|
|
} // end of case WM_NOTIFY
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
|
|
} // end of switch (uMsg)
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
RecvCsidDlgProc (
|
|
HWND hDlg,
|
|
UINT uMsg,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "CSID" 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_CSID, FXS_TSID_CSID_MAX_LENGTH + 1,
|
|
0,
|
|
};
|
|
|
|
LimitTextFields(hDlg, textLimits);
|
|
|
|
if(g_wizData.szCsid)
|
|
{
|
|
SetDlgItemText(hDlg, IDC_CSID, g_wizData.szCsid);
|
|
}
|
|
|
|
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 pCsid = NULL;
|
|
|
|
pCsid = (LPTSTR)MemAlloc((FXS_TSID_CSID_MAX_LENGTH + 1) * sizeof(TCHAR));
|
|
Assert(pCsid);
|
|
|
|
if(pCsid)
|
|
{
|
|
pCsid[0] = '\0';
|
|
GetDlgItemText(hDlg, IDC_CSID, pCsid, FXS_TSID_CSID_MAX_LENGTH + 1);
|
|
MemFree(g_wizData.szCsid);
|
|
g_wizData.szCsid = NULL;
|
|
}
|
|
else
|
|
{
|
|
LPCTSTR faxDbgFunction = TEXT("RecvCsidDlgProc()");
|
|
DebugPrintEx(DEBUG_ERR, TEXT("Can't allocate memory for CSID.") );
|
|
}
|
|
g_wizData.szCsid = pCsid;
|
|
SetLastPage(IDD_WIZARD_RECV_CSID);
|
|
break;
|
|
}
|
|
|
|
case PSN_RESET :
|
|
{
|
|
// Handle a Cancel button click, if necessary
|
|
break;
|
|
}
|
|
|
|
default :
|
|
break;
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|