1276 lines
28 KiB
C
1276 lines
28 KiB
C
/*++
|
||
|
||
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;
|
||
}
|
||
|
||
|