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