|
|
/*++
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; }
|