mirror of https://github.com/tongzx/nt5src
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.
767 lines
16 KiB
767 lines
16 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
sendopts.c
|
|
|
|
Abstract:
|
|
|
|
Functions for handling events in the "Send 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 "Send Options" page
|
|
//
|
|
|
|
static COLUMNINFO faxDeviceListViewColumnInfo[] = {
|
|
|
|
{ COLUMN_DEVICE_NAME, 2 },
|
|
{ COLUMN_TSID, 1 },
|
|
{ 0, 0 },
|
|
};
|
|
|
|
|
|
|
|
VOID
|
|
DoInitSendOptions(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Perform one-time initialization of "Send Options" property page
|
|
|
|
Arguments:
|
|
|
|
hDlg - Window handle to the "Send Options" property page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Maximum length for various text fields in the dialog
|
|
//
|
|
|
|
static INT textLimits[] = {
|
|
|
|
IDC_TSID, 21,
|
|
IDC_ARCHIVE_DIRECTORY, MAX_ARCHIVE_DIR,
|
|
0,
|
|
};
|
|
|
|
LimitTextFields(hDlg, textLimits);
|
|
|
|
//
|
|
// Connect to the fax service and retrieve the list of fax devices
|
|
//
|
|
|
|
GetFaxDeviceAndConfigInfo();
|
|
|
|
//
|
|
// Initialize the dialog appearance
|
|
//
|
|
|
|
if (gConfigData->configType != FAXCONFIG_SERVER) {
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_NEW_PRINTER), FALSE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DELETE_PRINTER), FALSE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
ToggleArchiveControls(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Enable/disable archive directory edit box and browse button
|
|
depending on whether archive outgoing fax checkbox is checked
|
|
|
|
Arguments:
|
|
|
|
hDlg - Window handle to the "Send Options" property page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL enabled = (IsDlgButtonChecked(hDlg, IDC_ARCHIVE_CHECKBOX) == BST_CHECKED);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ARCHIVE_DIRECTORY), enabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_BROWSE_DIR), enabled && gConfigData->pServerName == NULL);
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
DoActivateSendOptions(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called when the "Send Options" property page is activated
|
|
|
|
Arguments:
|
|
|
|
hDlg - Window handle to the "Send Options" property page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
{
|
|
//
|
|
// Controls on the "Send Options" page which may be enabled or disabled
|
|
//
|
|
|
|
static INT sendOptionsCtrls[] = {
|
|
|
|
IDC_FAX_DEVICE_LIST,
|
|
IDC_TSID,
|
|
IDC_ARCHIVE_CHECKBOX,
|
|
IDC_ARCHIVE_DIRECTORY,
|
|
IDC_BROWSE_DIR,
|
|
0,
|
|
};
|
|
|
|
BOOL enabled = FALSE;
|
|
LPTSTR pPortName = NULL;
|
|
BOOL devListInSync;
|
|
HWND hwndLV;
|
|
LPTSTR pArchiveDir;
|
|
INT index;
|
|
|
|
|
|
//
|
|
// Redisplay the fax device list if it's out-of-sync
|
|
//
|
|
|
|
hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST);
|
|
|
|
if (! (devListInSync = IsFaxDeviceListInSync(SEND_OPTIONS_PAGE))) {
|
|
|
|
InitFaxDeviceListView(hwndLV, LV_HASCHECKBOX, faxDeviceListViewColumnInfo);
|
|
SetFaxDeviceListInSync(SEND_OPTIONS_PAGE);
|
|
|
|
for (index=0; index < gConfigData->cDevices; index++) {
|
|
|
|
if (gConfigData->pDevInfo[index].Flags & FPF_SEND) {
|
|
|
|
CheckListViewItem(hwndLV, index);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, FALSE);
|
|
|
|
Verbose(("Updating 'Send Options' page ...\n"));
|
|
|
|
//
|
|
// Discount rate period
|
|
//
|
|
|
|
InitTimeControl(hDlg, IDC_TC_CHEAP_BEGIN, &gConfigData->pFaxConfig->StartCheapTime);
|
|
InitTimeControl(hDlg, IDC_TC_CHEAP_END, &gConfigData->pFaxConfig->StopCheapTime);
|
|
|
|
//
|
|
// Archive directory
|
|
//
|
|
|
|
pArchiveDir = gConfigData->pFaxConfig->ArchiveDirectory;
|
|
|
|
CheckDlgButton(
|
|
hDlg,
|
|
IDC_ARCHIVE_CHECKBOX,
|
|
gConfigData->pFaxConfig->ArchiveOutgoingFaxes ? BST_CHECKED : BST_UNCHECKED
|
|
);
|
|
|
|
MySetDlgItemText(hDlg, IDC_ARCHIVE_DIRECTORY, pArchiveDir ? pArchiveDir : TEXT(""));
|
|
|
|
enabled = TRUE;
|
|
|
|
//
|
|
// Disable or enable the controls depending on whether the user
|
|
// has privilege to perform printer administration.
|
|
//
|
|
|
|
EnableControls(hDlg, sendOptionsCtrls, enabled);
|
|
EnableTimeControl(hDlg, IDC_TC_CHEAP_BEGIN, enabled);
|
|
EnableTimeControl(hDlg, IDC_TC_CHEAP_END, enabled);
|
|
|
|
if (enabled) {
|
|
ToggleArchiveControls(hDlg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
DoSaveSendOptions(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save the information on the "Send Options" property page
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Send Options" property page
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if there is an error
|
|
|
|
--*/
|
|
|
|
#define FAIL_SAVE_SEND_OPTIONS(err) { errorId = err; goto ExitSaveSendOptions; }
|
|
|
|
{
|
|
INT errorId = 0;
|
|
LPTSTR pPortName = NULL;
|
|
FAX_TIME beginTime, endTime;
|
|
INT archiveFlag;
|
|
TCHAR archiveDir[MAX_PATH];
|
|
|
|
//
|
|
// Check if anything on this page was changed
|
|
//
|
|
|
|
Verbose(("Saving 'Send Options' page ...\n"));
|
|
|
|
if (! GetChangedFlag(SEND_OPTIONS_PAGE)) {
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// Save discount rate period and archive directory information
|
|
//
|
|
|
|
GetTimeControlValue(hDlg, IDC_TC_CHEAP_BEGIN, &beginTime);
|
|
GetTimeControlValue(hDlg, IDC_TC_CHEAP_END, &endTime);
|
|
|
|
archiveFlag = IsDlgButtonChecked(hDlg, IDC_ARCHIVE_CHECKBOX);
|
|
|
|
if (! GetDlgItemText(hDlg, IDC_ARCHIVE_DIRECTORY, archiveDir, MAX_PATH)) {
|
|
|
|
if (archiveFlag) {
|
|
FAIL_SAVE_SEND_OPTIONS(IDS_MISSING_ARCHIVEDIR);
|
|
}
|
|
|
|
archiveDir[0] = NUL;
|
|
}
|
|
|
|
gConfigData->pFaxConfig->StartCheapTime = beginTime;
|
|
gConfigData->pFaxConfig->StopCheapTime = endTime;
|
|
gConfigData->pFaxConfig->ArchiveOutgoingFaxes = archiveFlag;
|
|
|
|
if (gConfigData->pFaxConfig->ArchiveDirectory) {
|
|
MemFree( gConfigData->pFaxConfig->ArchiveDirectory );
|
|
gConfigData->pFaxConfig->ArchiveDirectory = NULL;
|
|
}
|
|
|
|
gConfigData->pFaxConfig->ArchiveDirectory = DuplicateString( archiveDir );
|
|
|
|
ExitSaveSendOptions:
|
|
|
|
MemFree(pPortName);
|
|
|
|
//
|
|
// Display a message box if an error is encountered
|
|
//
|
|
|
|
if (errorId != 0) {
|
|
|
|
DisplayMessageDialog(hDlg, 0, 0, errorId);
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Save the fax device information if this is the last modified page
|
|
//
|
|
|
|
return SaveFaxDeviceAndConfigInfo(hDlg, SEND_OPTIONS_PAGE);
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
DoChangeTSID(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called when the user changes sending station identifier (TSID)
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the "Send Options" property page
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
{
|
|
TCHAR buffer[MAX_STRING_LEN];
|
|
INT index = -1;
|
|
HWND hwndLV;
|
|
|
|
if (! (hwndLV = GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)))
|
|
return;
|
|
|
|
if (! GetDlgItemText(hDlg, IDC_TSID, buffer, MAX_STRING_LEN))
|
|
buffer[0] = NUL;
|
|
|
|
while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) {
|
|
|
|
Assert(index < gConfigData->cDevices);
|
|
|
|
MemFree(gConfigData->pDevInfo[index].TSID);
|
|
gConfigData->pDevInfo[index].TSID = DuplicateString(buffer);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
DoChangeSendDeviceSel(
|
|
HWND hDlg,
|
|
HWND hwndLV
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Process selection change events in the fax device list
|
|
|
|
Arguments:
|
|
|
|
hDlg - Window handle to the "Send Options" property page
|
|
hwndLV - Handle to the fax device list
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
{
|
|
LPTSTR tsid = NULL;
|
|
INT index;
|
|
|
|
//
|
|
// Find the common attributes shared by selected devices
|
|
//
|
|
|
|
if ((index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL|LVNI_SELECTED)) != -1) {
|
|
|
|
Assert(index < gConfigData->cDevices);
|
|
tsid = gConfigData->pDevInfo[index].TSID;
|
|
EnableWindow(GetDlgItem(hDlg, IDC_TSID), TRUE);
|
|
|
|
while ((index = ListView_GetNextItem(hwndLV, index, LVNI_ALL|LVNI_SELECTED)) != -1) {
|
|
|
|
Assert(index < gConfigData->cDevices);
|
|
|
|
if (! tsid ||
|
|
! gConfigData->pDevInfo[index].TSID ||
|
|
_tcscmp(tsid, gConfigData->pDevInfo[index].TSID) != EQUAL_STRING)
|
|
{
|
|
tsid = NULL;
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
EnableWindow(GetDlgItem(hDlg, IDC_TSID), FALSE);
|
|
}
|
|
|
|
MySetDlgItemText(hDlg, IDC_TSID, tsid ? tsid : TEXT(""));
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
ToggleFaxDeviceForSend(
|
|
HWND hwndLV,
|
|
INT index
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Toggle a fax device for sending
|
|
|
|
Arguments:
|
|
|
|
hwndLV - Handle to the fax device list view
|
|
index - Specifies the fax device to be toggled
|
|
|
|
Return Value:
|
|
|
|
NONE
|
|
|
|
--*/
|
|
|
|
{
|
|
if (IsListViewItemChecked(hwndLV, index)) {
|
|
|
|
UncheckListViewItem(hwndLV, index);
|
|
gConfigData->pDevInfo[index].Flags &= ~FPF_SEND;
|
|
|
|
} else {
|
|
|
|
CheckListViewItem(hwndLV, index);
|
|
gConfigData->pDevInfo[index].Flags |= FPF_SEND;
|
|
|
|
//
|
|
// NOTE: Since we allow at most one fax device for sending on workstation
|
|
// configuration, here we must make sure to disable all other fax devices.
|
|
//
|
|
|
|
if (gConfigData->configType == FAXCONFIG_WORKSTATION) {
|
|
|
|
INT count = ListView_GetItemCount(hwndLV);
|
|
|
|
while (count-- > 0) {
|
|
|
|
if (count != index) {
|
|
|
|
UncheckListViewItem(hwndLV, count);
|
|
gConfigData->pDevInfo[count].Flags &= ~FPF_SEND;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
HandleSendListViewMessage(
|
|
HWND hDlg,
|
|
LPNMHDR pNMHdr
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Handle notification events from the fax device list
|
|
|
|
Arguments:
|
|
|
|
hDlg - Window handle to the "Send Options" property page
|
|
pNMHdr - Points to an NMHDR structure
|
|
|
|
Return Value:
|
|
|
|
TRUE if any change was made to the fax device list
|
|
FALSE 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
|
|
//
|
|
|
|
if (! IsWindowEnabled(hwndLV))
|
|
break;
|
|
|
|
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)) {
|
|
|
|
//
|
|
// Toggle between checked and unchecked state
|
|
//
|
|
|
|
ToggleFaxDeviceForSend(hwndLV, index);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
case LVN_KEYDOWN:
|
|
|
|
//
|
|
// Use space key to toggle check boxes
|
|
//
|
|
|
|
if (! IsWindowEnabled(hwndLV))
|
|
break;
|
|
|
|
if (((LV_KEYDOWN *) pNMHdr)->wVKey == VK_SPACE) {
|
|
|
|
index = ListView_GetNextItem(hwndLV, -1, LVNI_ALL | LVNI_SELECTED);
|
|
|
|
if (index != -1) {
|
|
|
|
ToggleFaxDeviceForSend(hwndLV, index);
|
|
return TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case LVN_ITEMCHANGED:
|
|
|
|
//
|
|
// Update the TSID field when the currently selected fax device has changed
|
|
//
|
|
|
|
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));
|
|
DoChangeSendDeviceSel(hDlg, hwndLV);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
SendOptionsProc(
|
|
HWND hDlg,
|
|
UINT message,
|
|
UINT wParam,
|
|
LONG lParam
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Procedure for handling the "Send 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;
|
|
BOOL result;
|
|
LPNMHDR pNMHdr;
|
|
|
|
switch (message) {
|
|
|
|
case WM_INITDIALOG:
|
|
|
|
DoInitSendOptions(hDlg);
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
|
|
switch (cmdId = GET_WM_COMMAND_ID(wParam, lParam)) {
|
|
|
|
case IDC_TC_CHEAP_BEGIN+TC_HOUR:
|
|
case IDC_TC_CHEAP_BEGIN+TC_MINUTE:
|
|
case IDC_TC_CHEAP_BEGIN+TC_AMPM:
|
|
|
|
//
|
|
// Handle user actions inside the time control
|
|
//
|
|
|
|
result = HandleTimeControl(hDlg, message, wParam, lParam,
|
|
IDC_TC_CHEAP_BEGIN,
|
|
cmdId - IDC_TC_CHEAP_BEGIN);
|
|
break;
|
|
|
|
case IDC_TC_CHEAP_END+TC_HOUR:
|
|
case IDC_TC_CHEAP_END+TC_MINUTE:
|
|
case IDC_TC_CHEAP_END+TC_AMPM:
|
|
|
|
result = HandleTimeControl(hDlg, message, wParam, lParam,
|
|
IDC_TC_CHEAP_END,
|
|
cmdId - IDC_TC_CHEAP_END);
|
|
break;
|
|
|
|
case IDC_ARCHIVE_CHECKBOX:
|
|
|
|
ToggleArchiveControls(hDlg);
|
|
break;
|
|
|
|
case IDC_ARCHIVE_DIRECTORY:
|
|
|
|
if (GET_WM_COMMAND_CMD(wParam, lParam) != EN_CHANGE || insideSetDlgItemText)
|
|
return TRUE;
|
|
|
|
break;
|
|
|
|
case IDC_TSID:
|
|
|
|
switch (GET_WM_COMMAND_CMD(wParam, lParam)) {
|
|
|
|
case EN_CHANGE:
|
|
|
|
if (! insideSetDlgItemText) {
|
|
|
|
DoChangeTSID(hDlg);
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case EN_KILLFOCUS:
|
|
|
|
UpdateFaxDeviceListViewColumns(GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST),
|
|
faxDeviceListViewColumnInfo,
|
|
1);
|
|
|
|
default:
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
break;
|
|
|
|
case IDC_BROWSE_DIR:
|
|
|
|
if (! DoBrowseForDirectory(hDlg, IDC_ARCHIVE_DIRECTORY, IDS_ARCHIVE_DIR))
|
|
return TRUE;
|
|
|
|
break;
|
|
|
|
default:
|
|
return FALSE;
|
|
}
|
|
|
|
SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, TRUE);
|
|
return TRUE;
|
|
|
|
case WM_CTLCOLORLISTBOX:
|
|
case WM_CTLCOLORSTATIC:
|
|
case WM_CTLCOLOREDIT:
|
|
case WM_CTLCOLOR:
|
|
|
|
//
|
|
// Deal with color changes in various time control fields
|
|
//
|
|
|
|
if ((result = HandleTimeControl(hDlg, message, wParam, lParam, IDC_TC_CHEAP_BEGIN, TRUE)) ||
|
|
(result = HandleTimeControl(hDlg, message, wParam, lParam, IDC_TC_CHEAP_END, TRUE)))
|
|
{
|
|
return result;
|
|
}
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
|
|
pNMHdr = (NMHDR *) lParam;
|
|
|
|
if (pNMHdr->hwndFrom == GetDlgItem(hDlg, IDC_FAX_DEVICE_LIST)) {
|
|
|
|
if (HandleSendListViewMessage(hDlg, pNMHdr))
|
|
SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, TRUE);
|
|
|
|
} else switch (pNMHdr->code) {
|
|
|
|
case PSN_SETACTIVE:
|
|
|
|
DoActivateSendOptions(hDlg);
|
|
break;
|
|
|
|
case PSN_APPLY:
|
|
|
|
//
|
|
// User pressed OK or Apply - validate inputs and save changes
|
|
//
|
|
|
|
if (! DoSaveSendOptions(hDlg)) {
|
|
|
|
SetWindowLong(hDlg, DWL_MSGRESULT, -1);
|
|
return PSNRET_INVALID_NOCHANGEPAGE;
|
|
|
|
} else {
|
|
|
|
SetChangedFlag(hDlg, SEND_OPTIONS_PAGE, FALSE);
|
|
return PSNRET_NOERROR;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case WM_HELP:
|
|
case WM_CONTEXTMENU:
|
|
|
|
return HandleHelpPopup(hDlg, message, wParam, lParam, SEND_OPTIONS_PAGE);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|