windows-nt/Source/XPSP1/NT/printscan/fax/config/dll/recvopts.c
2020-09-26 16:20:57 +08:00

1276 lines
28 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
recvopts.c
Abstract:
Functions for handling events in the "Receive Options" tab of
the fax server configuration property sheet
Environment:
Fax configuration applet
Revision History:
03/13/96 -davidx-
Created it.
mm/dd/yy -author-
description
--*/
#include "faxcpl.h"
//
// Information about the fax device list view on "Receive Options" page
//
static COLUMNINFO faxDeviceListViewColumnInfo[] = {
{ COLUMN_DEVICE_NAME, 2 },
{ COLUMN_CSID, 1 },
{ 0, 0 },
};
VOID
EnumMapiProfiles(
HWND hwnd
)
/*++
Routine Description:
Put the mapi profiles in the combo box
Arguments:
hwnd - window handle to mapi profiles combo box
Return Value:
NONE
--*/
{
LPTSTR MapiProfiles;
MapiProfiles = gConfigData->pMapiProfiles;
while (MapiProfiles && *MapiProfiles) {
SendMessage(
hwnd,
CB_ADDSTRING,
0,
(LPARAM) MapiProfiles
);
MapiProfiles += _tcslen(MapiProfiles) + 1;
}
}
VOID
DoInitRecvOptions(
HWND hDlg
)
/*++
Routine Description:
Perform one-time initialization of "Receive Options" property page
Arguments:
hDlg - Window handle to the "Receive Options" property page
Return Value:
NONE
--*/
{
HWND hwnd;
TCHAR buffer[MAX_STRING_LEN];
//
// Maximum length for various text fields in the dialog
//
static INT textLimits[] = {
IDC_CSID, 21,
IDC_DEST_DIRPATH, MAX_ARCHIVE_DIR,
IDC_DEST_RINGS, 3,
0,
};
GetMapiProfiles();
LimitTextFields(hDlg, textLimits);
if (gConfigData->pMapiProfiles && (hwnd = GetDlgItem(hDlg, IDC_DEST_PROFILENAME))){
EnumMapiProfiles(hwnd);
LoadString(ghInstance, IDS_DEFAULT_PROFILE, buffer, MAX_STRING_LEN);
SendMessage(hwnd, CB_INSERTSTRING, 0, (LPARAM) buffer);
}
//
// Initialize the list of destination printers
//
if (hwnd = GetDlgItem(hDlg, IDC_DEST_PRINTERLIST)) {
PPRINTER_INFO_2 pPrinterInfo2, pSaved;
DWORD cPrinters, dwFlags;
dwFlags = gConfigData->pServerName ?
PRINTER_ENUM_NAME :
(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS);
pPrinterInfo2 = MyEnumPrinters(gConfigData->pServerName, 2, &cPrinters, dwFlags);
if (pSaved = pPrinterInfo2) {
//
// Filtering out fax printers from the list
//
for ( ; cPrinters--; pPrinterInfo2++) {
if (_tcsicmp(pPrinterInfo2->pDriverName, FAX_DRIVER_NAME) != EQUAL_STRING)
SendMessage(hwnd, CB_ADDSTRING, 0, (LPARAM) pPrinterInfo2->pPrinterName);
}
MemFree(pSaved);
}
//
// The first choice is always the system default printer
//
LoadString(ghInstance, IDS_DEFAULT_PRINTER, buffer, MAX_STRING_LEN);
SendMessage(hwnd, CB_INSERTSTRING, 0, (LPARAM) buffer);
}
//
// Connect to the fax service and retrieve the list of fax devices
//
GetFaxDeviceAndConfigInfo();
}
//
// Data structure and constants used for comparing two fax devices
//
typedef struct {
PCONFIG_PORT_INFO_2 pDevInfo;
DWORD match;
} MATCHINFO, *PMATCHINFO;
#define MATCH_DEST_PRINTER 0x0001
#define MATCH_DEST_DIR 0x0002
#define MATCH_DEST_EMAIL 0x0004
#define MATCH_DEST_MAILBOX 0x0008
#define MATCH_DEST_PRINTERNAME 0x0010
#define MATCH_DEST_DIRPATH 0x0020
#define MATCH_DEST_PROFILENAME 0x0040
#define MATCH_DEST_CSID 0x0080
#define MATCH_DEST_RINGS 0x0100
#define MATCH_ALL 0x0FFF
VOID
MatchFaxDevInfo(
PMATCHINFO pMatchInfo,
PCONFIG_PORT_INFO_2 pDevInfo
)
/*++
Routine Description:
Compare a fax device with another one and
figure out what attributes they have in common
Arguments:
pMatchInfo - Points to a MATCHINFO structure
pDevInfo - Specifies the fax device to match
Return Value:
NONE
--*/
#define MatchRoutingOption(matchFlag, routingFlag) { \
if ((pMatchInfo->match & (matchFlag)) && \
(pRefInfo->Mask & (routingFlag)) != (pDevInfo->Mask & (routingFlag))) \
{ \
pMatchInfo->match &= ~(matchFlag); \
} \
}
#define MatchDWORDField(matchFlag, FieldName) { \
if ((pMatchInfo->match & (matchFlag)) && \
(pRefInfo->FieldName != pDevInfo->FieldName)) \
{ \
pMatchInfo->match &= ~(matchFlag); \
} \
}
#define MatchTextField(matchFlag, pFieldName) { \
if ((pMatchInfo->match & (matchFlag)) && \
(! pRefInfo->pFieldName || \
! pDevInfo->pFieldName || \
_tcsicmp(pRefInfo->pFieldName, pDevInfo->pFieldName) != EQUAL_STRING)) \
{ \
pMatchInfo->match &= ~(matchFlag); \
} \
}
{
PCONFIG_PORT_INFO_2 pRefInfo;
//
// Remember the first fax device as the reference
//
if ((pRefInfo = pMatchInfo->pDevInfo) == NULL) {
pMatchInfo->pDevInfo = pDevInfo;
pMatchInfo->match = MATCH_ALL;
return;
}
//
// Match each attribute in turn
//
MatchRoutingOption(MATCH_DEST_PRINTER, LR_PRINT);
MatchRoutingOption(MATCH_DEST_EMAIL, LR_EMAIL);
MatchRoutingOption(MATCH_DEST_DIR, LR_STORE);
MatchRoutingOption(MATCH_DEST_MAILBOX, LR_INBOX);
MatchTextField(MATCH_DEST_PRINTERNAME, PrinterName);
MatchTextField(MATCH_DEST_DIRPATH, DirStore);
MatchTextField(MATCH_DEST_PROFILENAME, ProfileName);
MatchTextField(MATCH_DEST_CSID, CSID);
MatchDWORDField(MATCH_DEST_RINGS, Rings);
}
VOID
DoChangeRecvDeviceSel(
HWND hDlg,
HWND hwndLV
)
/*++
Routine Description:
Process selection change events in the fax device list
Arguments:
hDlg - Window handle to the "Receive Options" property page
hwndLV - Handle to the fax device list
Return Value:
NONE
--*/
#define SetMatchedCheckBox(matchFlag, routingFlag, itemId) \
CheckDlgButton(hDlg, itemId, \
(match & (matchFlag)) ? \
((pDevInfo->Mask & (routingFlag)) ? BST_CHECKED : BST_UNCHECKED) : \
BST_INDETERMINATE)
#define SetMatchedTextField(matchFlag, itemId, pFieldName) \
SetDlgItemText(hDlg, itemId, \
((match & (matchFlag)) && pDevInfo->pFieldName) ? \
pDevInfo->pFieldName : TEXT(""))
#define SetMatchedDWORDField(matchFlag, itemId, pFieldName) \
SetDlgItemInt(hDlg, itemId, \
(match & matchFlag) ? pDevInfo->pFieldName : 0, FALSE)
{
MATCHINFO matchInfo = { NULL, 0 };
INT index = -1;
DWORD match;
HWND hwndList;
PCONFIG_PORT_INFO_2 pDevInfo;
//
// Find the common attributes shared by selected devices
//
while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) {
Assert(index < gConfigData->cDevices);
MatchFaxDevInfo(&matchInfo, gConfigData->pDevInfo + index);
}
if ((pDevInfo = matchInfo.pDevInfo) == NULL)
return;
//
// Display the shared attributes at the bottom of the page
//
match = matchInfo.match;
SetMatchedCheckBox(MATCH_DEST_PRINTER, LR_PRINT, IDC_DEST_PRINTER);
SetMatchedCheckBox(MATCH_DEST_EMAIL, LR_EMAIL, IDC_DEST_EMAIL);
SetMatchedCheckBox(MATCH_DEST_DIR, LR_STORE, IDC_DEST_DIR);
SetMatchedCheckBox(MATCH_DEST_MAILBOX, LR_INBOX, IDC_DEST_MAILBOX);
if (hwndList = GetDlgItem(hDlg, IDC_DEST_PRINTERLIST)) {
if ((match & MATCH_DEST_PRINTERNAME) && pDevInfo->PrinterName) {
if (IsEmptyString(pDevInfo->PrinterName))
SendMessage(hwndList, CB_SETCURSEL, 0, 0);
else if (SendMessage(hwndList,
CB_SELECTSTRING,
(WPARAM) -1,
(LPARAM) pDevInfo->PrinterName) == CB_ERR)
{
DisplayMessageDialog(hDlg,
0,
IDS_WARNING_DLGTITLE,
IDS_NONEXISTENT_PRINTER,
pDevInfo->PrinterName);
}
} else
SendMessage(hwndList, CB_SETCURSEL, (WPARAM) -1, 0);
}
if (hwndList = GetDlgItem(hDlg, IDC_DEST_PROFILENAME)) {
if ((match & MATCH_DEST_PROFILENAME) && pDevInfo->ProfileName) {
if (IsEmptyString(pDevInfo->ProfileName) ||
! SendMessage(hwndList,
CB_SELECTSTRING,
(WPARAM) -1,
(LPARAM) pDevInfo->ProfileName))
{
SendMessage(hwndList, CB_SETCURSEL, 0, 0);
}
} else
SendMessage(hwndList, CB_SETCURSEL, (WPARAM) -1, 0);
}
//
// This is a real kluge. But we have no other way of telling whether
// EN_CHANGE message is caused by user action or was caused by
// us calling SetDlgItemText.
//
insideSetDlgItemText = TRUE;
SetMatchedTextField(MATCH_DEST_DIRPATH, IDC_DEST_DIRPATH, DirStore);
SetMatchedTextField(MATCH_DEST_CSID, IDC_CSID, CSID);
SetMatchedDWORDField(MATCH_DEST_RINGS, IDC_DEST_RINGS, Rings);
insideSetDlgItemText = FALSE;
}
BOOL
ValidateReceiveOptions(
HWND hDlg,
INT index
)
/*++
Routine Description:
Check the receive options for the specified fax device
Arguments:
hDlg - Window handle to the "Receive Options" property page
index - Specifies the index of the interested fax device
Return Value:
TRUE if successful, FALSE if there is an error
--*/
{
PCONFIG_PORT_INFO_2 pDevInfo;
INT errorId = 0;
//
// Sanity check
//
if (index >= gConfigData->cDevices || gConfigData->pDevInfo == NULL) {
Assert(FALSE);
return TRUE;
}
//
// Check if the specified device is not enabled for receiving fax
//
pDevInfo = gConfigData->pDevInfo + index;
if (! (pDevInfo->Flags & FPF_RECEIVE))
return TRUE;
if ((pDevInfo->Mask & (LR_PRINT|LR_STORE|LR_EMAIL|LR_INBOX)) == 0) {
//
// At least one inbound routing option must be selected
//
errorId = IDS_NO_INBOUND_ROUTING;
} else if ((pDevInfo->Mask & LR_STORE) &&
(pDevInfo->DirStore == NULL || *(pDevInfo->DirStore) == NUL))
{
//
// If the "Store In Directory" option is selected,
// a directory path must be specified.
//
errorId = IDS_MISSING_INBOUND_DIR;
}
//
// Display an error message the receive options are invalid
//
if (errorId != 0) {
DisplayMessageDialog(hDlg,
0,
IDS_INVALID_INBOUND_OPTIONS,
errorId,
pDevInfo->DeviceName);
}
return (errorId == 0);
}
BOOL
ValidateReceiveOptionsForSelectedDevices(
HWND hDlg,
HWND hwndLV
)
/*++
Routine Description:
Check if the receive options for the selected fax devices are valid
Arguments:
hDlg - Window handle to the "Receive Options" property page
hwndLV - Handle to the fax device list
Return Value:
TRUE if successful, FALSE otherwise
--*/
{
INT index = -1;
//
// Check the receive options for each selected device
//
while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) {
if (! ValidateReceiveOptions(hDlg, index))
return FALSE;
}
return TRUE;
}
VOID
ToggleFaxDeviceForReceive(
HWND hwndLV,
INT index
)
/*++
Routine Description:
Toggle a fax device for receiving
Arguments:
hwndLV - Handle to the fax device list view
index - Specifies the fax device to be toggled
Return Value:
NONE
--*/
{
Assert(index < gConfigData->cDevices);
if (IsListViewItemChecked(hwndLV, index)) {
UncheckListViewItem(hwndLV, index);
gConfigData->pDevInfo[index].Flags &= ~FPF_RECEIVE;
} else {
CheckListViewItem(hwndLV, index);
gConfigData->pDevInfo[index].Flags |= FPF_RECEIVE;
}
}
VOID
UpdateReceiveOptionControls(
HWND hDlg
)
/*++
Routine Description:
Enable/disable receive option controls
Arguments:
hDlg - Window handle to the "Receive Options" property page
Return Value:
NONE
--*/
{
HWND hwndLV;
//
// Check if something is selected in the fax device list view
//
if ((hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)) == NULL ||
ListView_GetNextItem(hwndLV, -1, LVNI_ALL|LVNI_SELECTED) == -1)
{
insideSetDlgItemText = TRUE;
SetDlgItemText(hDlg, IDC_DEST_DIRPATH, TEXT(""));
SetDlgItemText(hDlg, IDC_CSID, TEXT(""));
SetDlgItemInt(hDlg, IDC_DEST_RINGS, 0, FALSE);
insideSetDlgItemText = FALSE;
SendDlgItemMessage(hDlg, IDC_DEST_PRINTERLIST, CB_SETCURSEL, (WPARAM) -1, 0);
SendDlgItemMessage(hDlg, IDC_DEST_PROFILENAME, CB_SETCURSEL, (WPARAM) -1, 0);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_RINGS), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CSID), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_PRINTER), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_EMAIL), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_DIR), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_MAILBOX), FALSE);
CheckDlgButton(hDlg, IDC_DEST_PRINTER, BST_UNCHECKED);
CheckDlgButton(hDlg, IDC_DEST_EMAIL, BST_UNCHECKED);
CheckDlgButton(hDlg, IDC_DEST_DIR, BST_UNCHECKED);
CheckDlgButton(hDlg, IDC_DEST_MAILBOX, BST_UNCHECKED);
} else {
EnableWindow(GetDlgItem(hDlg, IDC_CSID), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_PRINTER), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_DIR), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_EMAIL), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_MAILBOX), gConfigData->pMapiProfiles != NULL);
if (!GetDlgItemInt(hDlg, IDC_DEST_RINGS, NULL, FALSE)) {
EnableWindow(GetDlgItem(hDlg, IDC_DEST_RINGS), FALSE);
} else {
EnableWindow(GetDlgItem(hDlg, IDC_DEST_RINGS), TRUE);
}
}
EnableWindow(GetDlgItem(hDlg, IDC_DEST_PRINTERLIST),
IsDlgButtonChecked(hDlg, IDC_DEST_PRINTER) == BST_CHECKED);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_DIRPATH),
IsDlgButtonChecked(hDlg, IDC_DEST_DIR) == BST_CHECKED);
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_DIR),
IsDlgButtonChecked(hDlg, IDC_DEST_DIR) == BST_CHECKED &&
gConfigData->pServerName == NULL);
if (gConfigData->pMapiProfiles && IsDlgButtonChecked(hDlg, IDC_DEST_MAILBOX) == BST_CHECKED) {
EnableWindow(GetDlgItem(hDlg, IDCSTATIC_PROFILE_NAME), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_PROFILENAME), TRUE);
} else {
if (gConfigData->pMapiProfiles == NULL)
CheckDlgButton(hDlg, IDC_DEST_MAILBOX, BST_UNCHECKED);
EnableWindow(GetDlgItem(hDlg, IDCSTATIC_PROFILE_NAME), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_DEST_PROFILENAME), FALSE);
}
}
BOOL
HandleRecvListViewMessage(
HWND hDlg,
LPNMHDR pNMHdr
)
/*++
Routine Description:
Handle notification events from the fax device list
Arguments:
hDlg - Window handle to the "Receive Options" property page
pNMHdr - Points to an NMHDR structure
Return Value:
FALSE if there is no device assigned to the current printer
TRUE otherwise
--*/
{
LV_HITTESTINFO hitTestInfo;
DWORD msgPos;
INT index;
NM_LISTVIEW *pnmlv;
HWND hwndLV = pNMHdr->hwndFrom;
switch (pNMHdr->code) {
case NM_CLICK:
//
// Figure out which item (if any) was clicked on
//
msgPos = GetMessagePos();
hitTestInfo.pt.x = LOWORD(msgPos);
hitTestInfo.pt.y = HIWORD(msgPos);
MapWindowPoints(HWND_DESKTOP, hwndLV, &hitTestInfo.pt, 1 );
index = ListView_HitTest(hwndLV, &hitTestInfo);
if (index == -1 || ! (hitTestInfo.flags & LVHT_ONITEMSTATEICON))
return FALSE;
//
// Toggle between checked and unchecked state
//
ToggleFaxDeviceForReceive(hwndLV, index);
return TRUE;
case LVN_KEYDOWN:
//
// Use space key to toggle check boxes
//
if (((LV_KEYDOWN *) pNMHdr)->wVKey == VK_SPACE) {
index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL|LVNI_SELECTED);
if (index != -1) {
ToggleFaxDeviceForReceive(hwndLV, index);
return TRUE;
}
}
break;
case LVN_ITEMCHANGING:
//
// Validate receive options before switch to another device
//
pnmlv = (NM_LISTVIEW *) pNMHdr;
if ((pnmlv->uChanged & LVIF_STATE) != 0 &&
(pnmlv->uOldState & LVIS_SELECTED) != (pnmlv->uNewState & LVIS_SELECTED) &&
! ValidateReceiveOptionsForSelectedDevices(hDlg, hwndLV))
{
return TRUE;
}
break;
case LVN_ITEMCHANGED:
//
// Update the contents at the bottom of the page
// when there is a selection change
//
pnmlv = (NM_LISTVIEW *) pNMHdr;
if ((pnmlv->uChanged & LVIF_STATE) != 0 &&
(pnmlv->uOldState & LVIS_SELECTED) != (pnmlv->uNewState & LVIS_SELECTED))
{
Verbose(("Selection change: %d\n", pnmlv->iItem));
DoChangeRecvDeviceSel(hDlg, hwndLV);
UpdateReceiveOptionControls(hDlg);
}
break;
}
return FALSE;
}
VOID
DoActivateRecvOptions(
HWND hDlg
)
/*++
Routine Description:
Called when the "Receive Options" property page is activated
Arguments:
hDlg - Window handle to the "Receive Options" property page
Return Value:
NONE
--*/
{
HWND hwndLV;
INT index;
//
// Reinitialize the fax device list view if necessary
//
if (!IsFaxDeviceListInSync(RECEIVE_OPTIONS_PAGE) &&
(hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)))
{
InitFaxDeviceListView(hwndLV, LV_HASCHECKBOX, faxDeviceListViewColumnInfo);
for (index=0; index < gConfigData->cDevices; index++) {
if (gConfigData->pDevInfo[index].Flags & FPF_RECEIVE) {
CheckListViewItem(hwndLV, index);
}
}
}
SetFaxDeviceListInSync(RECEIVE_OPTIONS_PAGE);
if (gConfigData->configType & FAXCONFIG_WORKSTATION) {
HideWindow( GetDlgItem( hDlg, IDC_DEST_EMAIL ) );
}
}
BOOL
DoSaveRecvOptions(
HWND hDlg
)
/*++
Routine Description:
Save the information on the "Receive Options" property page
Arguments:
hDlg - Handle to the "Receive Options" property page
Return Value:
TRUE if successful, FALSE if there is an error
--*/
{
INT index;
//
// Check if anything on this page was changed
//
Verbose(("Saving 'Receive Options' page ...\n"));
if (! GetChangedFlag(RECEIVE_OPTIONS_PAGE))
return TRUE;
//
// Validate the inbound routing options for all fax devics
//
for (index=0; index < gConfigData->cDevices; index++) {
if (! ValidateReceiveOptions(hDlg, index))
return FALSE;
}
//
// Save the fax device information if this is the last modified page
//
return SaveFaxDeviceAndConfigInfo(hDlg, RECEIVE_OPTIONS_PAGE);
}
BOOL
GetDestPrinterName(
HWND hwndList,
LPTSTR pBuffer,
INT cch
)
/*++
Routine Description:
Retrieve the name of the currently selected inbound destination printer.
Also used to get the mapi profile name.
Arguments:
hwndList - Specifies the inbound destination printer list box
pBuffer - Specifies a buffer for storing the selected printer name
cch - Size of the buffer in characters
Return Value:
TRUE if successful
FALSE if there is no selection or if there is an error
--*/
{
INT sel, length;
pBuffer[0] = NUL;
if (hwndList && (sel = SendMessage(hwndList, CB_GETCURSEL, 0, 0)) != CB_ERR) {
//
// Get the current selection index. The first item is special:
// It means to use the sytem default printer and not a specific printer name.
//
if ((sel == 0) ||
(length = SendMessage(hwndList, CB_GETLBTEXTLEN, sel, 0)) != CB_ERR &&
(length < cch) &&
SendMessage(hwndList, CB_GETLBTEXT, sel, (LPARAM) pBuffer) != CB_ERR)
{
return TRUE;
}
}
return FALSE;
}
VOID
DoChangeInboundRouting(
HWND hDlg,
INT itemId
)
/*++
Routine Description:
Called when the user changes any inbound routing options
Arguments:
hDlg - Handle to the "Receive Options" property page
itemId - Specifies which inbound routing option is changed
Return Value:
NONE
--*/
{
TCHAR buffer[MAX_STRING_LEN];
DWORD dwValue;
DWORD routing, routingMask = 0;
INT index;
HWND hwndLV;
if (! (hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)))
return;
//
// Figure out the new setting of the changing item
//
switch (itemId) {
case IDC_DEST_PRINTER:
routingMask = LR_PRINT;
break;
case IDC_DEST_DIR:
routingMask = LR_STORE;
break;
case IDC_DEST_EMAIL:
routingMask = LR_EMAIL;
break;
case IDC_DEST_PRINTERLIST:
if (! GetDestPrinterName(GetDlgItem(hDlg, IDC_DEST_PRINTERLIST), buffer, MAX_STRING_LEN))
return;
break;
case IDC_DEST_MAILBOX:
routingMask = LR_INBOX;
break;
case IDC_DEST_PROFILENAME:
if (! GetDestPrinterName(GetDlgItem(hDlg, IDC_DEST_PROFILENAME), buffer, MAX_STRING_LEN))
return;
break;
case IDC_DEST_DIRPATH:
case IDC_CSID:
if (! GetDlgItemText(hDlg, itemId, buffer, MAX_STRING_LEN))
buffer[0] = NUL;
break;
case IDC_DEST_RINGS:
dwValue = GetDlgItemInt( hDlg, itemId, NULL, FALSE );
break;
default:
Assert(FALSE);
return;
}
if (routingMask != 0)
routing = IsDlgButtonChecked(hDlg, itemId) ? routingMask : 0;
//
// Apply the change to selected fax device(s)
//
index = -1;
while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) {
PCONFIG_PORT_INFO_2 pDevInfo;
Assert(index < gConfigData->cDevices);
pDevInfo = gConfigData->pDevInfo + index;
if (routingMask) {
pDevInfo->Mask &= ~routingMask;
pDevInfo->Mask |= routing;
} else if (itemId == IDC_DEST_RINGS) {
pDevInfo->Rings = dwValue;
} else {
LPTSTR *ppStr;
switch (itemId) {
case IDC_DEST_PRINTERLIST:
ppStr = &pDevInfo->PrinterName;
break;
case IDC_DEST_DIRPATH:
ppStr = &pDevInfo->DirStore;
break;
case IDC_DEST_PROFILENAME:
ppStr = &pDevInfo->ProfileName;
break;
case IDC_CSID:
ppStr = &pDevInfo->CSID;
break;
default:
Assert(FALSE);
return;
}
MemFree(*ppStr);
*ppStr = DuplicateString(buffer);
}
}
}
BOOL
ReceiveOptionsProc(
HWND hDlg,
UINT message,
UINT wParam,
LONG lParam
)
/*++
Routine Description:
Procedure for handling the "Receive Options" tab
Arguments:
hDlg - Identifies the property sheet page
message - Specifies the message
wParam - Specifies additional message-specific information
lParam - Specifies additional message-specific information
Return Value:
Depends on the value of message parameter
--*/
{
INT cmdId;
LPNMHDR pNMHdr;
switch (message) {
case WM_INITDIALOG:
DoInitRecvOptions(hDlg);
return TRUE;
case WM_COMMAND:
switch (cmdId = GET_WM_COMMAND_ID(wParam, lParam)) {
case IDC_DEST_PRINTER:
case IDC_DEST_DIR:
case IDC_DEST_EMAIL:
case IDC_DEST_MAILBOX:
if (GET_WM_COMMAND_CMD(wParam, lParam) != BN_CLICKED)
return FALSE;
CheckDlgButton(hDlg, cmdId,
(IsDlgButtonChecked(hDlg, cmdId) == BST_CHECKED) ? BST_UNCHECKED : BST_CHECKED);
UpdateReceiveOptionControls(hDlg);
break;
case IDC_BROWSE_DIR:
if (! DoBrowseForDirectory(hDlg, IDC_DEST_DIRPATH, IDS_INBOUND_DIR))
return TRUE;
cmdId = IDC_DEST_DIRPATH;
break;
case IDC_DEST_PROFILENAME:
case IDC_DEST_PRINTERLIST:
if (GET_WM_COMMAND_CMD(wParam, lParam) != CBN_SELCHANGE)
return TRUE;
break;
case IDC_DEST_DIRPATH:
case IDC_DEST_RINGS:
//
// We would like to change our internal data only after EN_KILLFOCUS.
// But the list view control gets selection change message before
// the edit controls get kill focus message.
//
//
if (insideSetDlgItemText) {
return TRUE;
}
if (cmdId == IDC_DEST_RINGS && GET_WM_COMMAND_CMD(wParam, lParam) == EN_UPDATE) {
BOOL Rslt; DWORD Value;
Value = GetDlgItemInt(hDlg, IDC_DEST_RINGS, &Rslt, FALSE);
if (Rslt && Value == 0) {
SetDlgItemText(hDlg, IDC_DEST_RINGS, TEXT("") );
MessageBeep(0);
return TRUE;
}
}
if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_CHANGE) {
return TRUE;
}
break;
case IDC_CSID:
switch (GET_WM_COMMAND_CMD(wParam, lParam)) {
case EN_CHANGE:
if (insideSetDlgItemText)
return TRUE;
break;
case EN_KILLFOCUS:
UpdateFaxDeviceListViewColumns(GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST),
faxDeviceListViewColumnInfo,
1);
default:
return TRUE;
}
break;
default:
return FALSE;
}
DoChangeInboundRouting(hDlg, cmdId);
SetChangedFlag(hDlg, RECEIVE_OPTIONS_PAGE, TRUE);
return TRUE;
case WM_NOTIFY:
pNMHdr = (NMHDR *) lParam;
if (pNMHdr->hwndFrom == GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)) {
if (HandleRecvListViewMessage(hDlg, pNMHdr))
SetChangedFlag(hDlg, RECEIVE_OPTIONS_PAGE, TRUE);
} else switch (pNMHdr->code) {
case PSN_SETACTIVE:
DoActivateRecvOptions(hDlg);
break;
case PSN_APPLY:
//
// User pressed OK or Apply - validate inputs and save changes
//
if (! DoSaveRecvOptions(hDlg)) {
SetWindowLong(hDlg, DWL_MSGRESULT, -1);
return PSNRET_INVALID_NOCHANGEPAGE;
} else {
SetChangedFlag(hDlg, RECEIVE_OPTIONS_PAGE, FALSE);
return PSNRET_NOERROR;
}
}
break;
case WM_HELP:
case WM_CONTEXTMENU:
return HandleHelpPopup(hDlg, message, wParam, lParam, RECEIVE_OPTIONS_PAGE);
}
return FALSE;
}