Leaked source code of windows server 2003
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

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