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.
1792 lines
53 KiB
1792 lines
53 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
devinfo.c
|
|
|
|
Abstract:
|
|
|
|
Property sheet handler for "Device" page
|
|
|
|
Environment:
|
|
|
|
Fax driver user interface
|
|
|
|
Revision History:
|
|
|
|
04/09/00 -taoyuan-
|
|
Created it.
|
|
|
|
mm/dd/yy -author-
|
|
description
|
|
|
|
--*/
|
|
|
|
#include <stdio.h>
|
|
#include "faxui.h"
|
|
#include "resource.h"
|
|
#include "faxuiconstants.h"
|
|
|
|
//
|
|
// List of controls displayes for desktop SKUs only
|
|
//
|
|
DWORD
|
|
g_dwDesktopControls[] =
|
|
{
|
|
IDC_BRANDING_CHECK,
|
|
IDC_RETRIES_STATIC,
|
|
IDC_RETRIES_EDIT,
|
|
IDC_RETRIES_SPIN,
|
|
IDC_OUTB_RETRYDELAY_STATIC,
|
|
IDC_RETRYDELAY_EDIT,
|
|
IDC_RETRYDELAY_SPIN,
|
|
IDC_OUTB_MINUTES_STATIC,
|
|
IDC_OUTB_DIS_START_STATIC,
|
|
IDC_DISCOUNT_START_TIME,
|
|
IDC_OUTB_DIS_STOP_STATIC,
|
|
IDC_DISCOUNT_STOP_TIME,
|
|
0
|
|
};
|
|
|
|
static BOOL
|
|
SaveSendChanges(IN HWND hDlg);
|
|
|
|
PPRINTER_NAMES g_pPrinterNames = NULL;
|
|
DWORD g_dwNumPrinters = 0;
|
|
|
|
|
|
BOOL
|
|
ValidateSend(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Validate the check box and controls for send
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the property sheet page
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if no error
|
|
FALSE -- if error
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL bEnabled;
|
|
|
|
if(g_bUserCanChangeSettings)
|
|
{
|
|
bEnabled = IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_SEND) == BST_CHECKED;
|
|
|
|
//
|
|
// Enable/disable controls according to "Enable Send" check box
|
|
//
|
|
PageEnable(hDlg, bEnabled);
|
|
|
|
if(!bEnabled)
|
|
{
|
|
//
|
|
// Enable "Enable Send" check box
|
|
//
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_SEND), TRUE);
|
|
SetFocus(GetDlgItem(hDlg, IDC_DEVICE_PROP_SEND));
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_SEND_ICON), TRUE);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_SEND_OPTIONS), TRUE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_ICON_STORE_IN_FOLDER), SW_HIDE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_STATIC_STORE_IN_FOLDER), SW_HIDE);
|
|
}
|
|
else
|
|
{
|
|
ShowWindow (GetDlgItem(hDlg, IDC_ICON_STORE_IN_FOLDER), SW_SHOW);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_STATIC_STORE_IN_FOLDER), SW_SHOW);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PageEnable(hDlg, FALSE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_ICON_STORE_IN_FOLDER), SW_HIDE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_STATIC_STORE_IN_FOLDER), SW_HIDE);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DevSendDlgProc(
|
|
IN HWND hDlg,
|
|
IN UINT message,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dialog procedure for send settings
|
|
|
|
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:
|
|
|
|
Depending on specific message
|
|
|
|
--*/
|
|
{
|
|
BOOL fRet = FALSE;
|
|
PFAX_PORT_INFO_EX pFaxPortInfo = NULL; // receive port information
|
|
DWORD dwDeviceId;
|
|
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG:
|
|
{
|
|
SYSTEMTIME sTime = {0};
|
|
PFAX_OUTBOX_CONFIG pOutboxConfig = NULL;
|
|
TCHAR tszSecondsFreeTimeFormat[MAX_PATH];
|
|
//
|
|
//Get the shared data from PROPSHEETPAGE lParam value
|
|
//and load it into GWL_USERDATA
|
|
//
|
|
dwDeviceId = (DWORD)((LPPROPSHEETPAGE)lParam)->lParam;
|
|
|
|
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)dwDeviceId);
|
|
|
|
SendDlgItemMessage(hDlg, IDC_DEVICE_PROP_TSID, EM_SETLIMITTEXT, TSID_LIMIT, 0);
|
|
|
|
pFaxPortInfo = FindPortInfo(dwDeviceId);
|
|
if(!pFaxPortInfo)
|
|
{
|
|
Error(("FindPortInfo() failed.\n"));
|
|
Assert(FALSE);
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_SEND, pFaxPortInfo->bSend ? BST_CHECKED : BST_UNCHECKED);
|
|
|
|
SetDlgItemText(hDlg, IDC_DEVICE_PROP_TSID, pFaxPortInfo->lptstrTsid);
|
|
|
|
if(!IsDesktopSKU())
|
|
{
|
|
//
|
|
// Hide desktop controls for non desktop platform
|
|
//
|
|
DWORD dw;
|
|
for(dw=0; g_dwDesktopControls[dw] != 0; ++dw)
|
|
{
|
|
ShowWindow(GetDlgItem(hDlg, g_dwDesktopControls[dw]), SW_HIDE);
|
|
}
|
|
goto InitDlgExit;
|
|
}
|
|
|
|
//
|
|
// Update desktop controls
|
|
//
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
goto InitDlgExit;
|
|
}
|
|
|
|
if(!FaxGetOutboxConfiguration(g_hFaxSvcHandle, &pOutboxConfig))
|
|
{
|
|
Error(( "FaxGetOutboxConfiguration() failed with %d.\n", GetLastError()));
|
|
goto InitDlgExit;
|
|
}
|
|
|
|
//
|
|
// Branding
|
|
//
|
|
CheckDlgButton(hDlg, IDC_BRANDING_CHECK, pOutboxConfig->bBranding ? BST_CHECKED : BST_UNCHECKED);
|
|
//
|
|
// Retries
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_RETRIES_EDIT, EM_SETLIMITTEXT, FXS_RETRIES_LENGTH, 0);
|
|
|
|
#if FXS_RETRIES_LOWER > 0
|
|
if (pOutboxConfig->dwRetries < FXS_RETRIES_LOWER)
|
|
{
|
|
pOutboxConfig->dwRetries = FXS_RETRIES_LOWER;
|
|
}
|
|
#endif
|
|
if (pOutboxConfig->dwRetries > FXS_RETRIES_UPPER)
|
|
{
|
|
pOutboxConfig->dwRetries = FXS_RETRIES_UPPER;
|
|
}
|
|
SendDlgItemMessage(hDlg, IDC_RETRIES_SPIN, UDM_SETRANGE32, FXS_RETRIES_LOWER, FXS_RETRIES_UPPER);
|
|
SendDlgItemMessage(hDlg, IDC_RETRIES_SPIN, UDM_SETPOS32, 0, (LPARAM)pOutboxConfig->dwRetries);
|
|
|
|
SetDlgItemInt(hDlg, IDC_RETRIES_EDIT, pOutboxConfig->dwRetries, FALSE);
|
|
//
|
|
// Retry Delay
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_RETRYDELAY_EDIT, EM_SETLIMITTEXT, FXS_RETRYDELAY_LENGTH, 0);
|
|
|
|
#if FXS_RETRYDELAY_LOWER > 0
|
|
if (pOutboxConfig->dwRetryDelay < FXS_RETRYDELAY_LOWER)
|
|
{
|
|
pOutboxConfig->dwRetryDelay = FXS_RETRYDELAY_LOWER;
|
|
}
|
|
#endif
|
|
if (pOutboxConfig->dwRetryDelay > FXS_RETRYDELAY_UPPER)
|
|
{
|
|
pOutboxConfig->dwRetryDelay = FXS_RETRYDELAY_UPPER;
|
|
}
|
|
SendDlgItemMessage(hDlg, IDC_RETRYDELAY_SPIN, UDM_SETRANGE32, FXS_RETRYDELAY_LOWER, FXS_RETRYDELAY_UPPER);
|
|
SendDlgItemMessage(hDlg, IDC_RETRYDELAY_SPIN, UDM_SETPOS32, 0, (LPARAM)pOutboxConfig->dwRetryDelay);
|
|
|
|
SetDlgItemInt(hDlg, IDC_RETRYDELAY_EDIT, pOutboxConfig->dwRetryDelay, FALSE);
|
|
|
|
//
|
|
// Discount rate start time
|
|
//
|
|
GetSecondsFreeTimeFormat(tszSecondsFreeTimeFormat, MAX_PATH);
|
|
|
|
GetLocalTime(&sTime);
|
|
|
|
sTime.wHour = pOutboxConfig->dtDiscountStart.Hour;
|
|
sTime.wMinute = pOutboxConfig->dtDiscountStart.Minute;
|
|
|
|
SendDlgItemMessage(hDlg, IDC_DISCOUNT_START_TIME, DTM_SETFORMAT, 0, (LPARAM)tszSecondsFreeTimeFormat);
|
|
SendDlgItemMessage(hDlg, IDC_DISCOUNT_START_TIME, DTM_SETSYSTEMTIME, (WPARAM)GDT_VALID, (LPARAM)&sTime);
|
|
|
|
//
|
|
// Discount rate stop time
|
|
//
|
|
sTime.wHour = pOutboxConfig->dtDiscountEnd.Hour;
|
|
sTime.wMinute = pOutboxConfig->dtDiscountEnd.Minute;
|
|
|
|
SendDlgItemMessage(hDlg, IDC_DISCOUNT_STOP_TIME, DTM_SETFORMAT, 0, (LPARAM)tszSecondsFreeTimeFormat);
|
|
SendDlgItemMessage(hDlg, IDC_DISCOUNT_STOP_TIME, DTM_SETSYSTEMTIME, (WPARAM)GDT_VALID, (LPARAM)&sTime);
|
|
|
|
FaxFreeBuffer(pOutboxConfig);
|
|
|
|
InitDlgExit:
|
|
ValidateSend(hDlg);
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
// activate apply button
|
|
|
|
WORD wID = LOWORD( wParam );
|
|
|
|
switch( wID )
|
|
{
|
|
case IDC_DEVICE_PROP_TSID:
|
|
case IDC_RETRIES_EDIT:
|
|
case IDC_RETRYDELAY_EDIT:
|
|
case IDC_DISCOUNT_START_TIME:
|
|
case IDC_DISCOUNT_STOP_TIME:
|
|
if( HIWORD(wParam) == EN_CHANGE )
|
|
{ // notification code
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
fRet = TRUE;
|
|
break;
|
|
|
|
case IDC_DEVICE_PROP_SEND:
|
|
|
|
if ( HIWORD(wParam) == BN_CLICKED )
|
|
{
|
|
if(IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_SEND) == BST_CHECKED)
|
|
{
|
|
dwDeviceId = (DWORD)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
|
if(!IsDeviceInUse(dwDeviceId) &&
|
|
GetDeviceLimit() == CountUsedFaxDevices())
|
|
{
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_SEND, BST_UNCHECKED);
|
|
|
|
DisplayErrorMessage(hDlg,
|
|
MB_OK | MB_ICONSTOP,
|
|
FAXUI_ERROR_DEVICE_LIMIT,
|
|
GetDeviceLimit());
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// notification code
|
|
ValidateSend(hDlg);
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
fRet = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
} // switch
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
switch( ((LPNMHDR) lParam)->code )
|
|
{
|
|
case PSN_APPLY:
|
|
SaveSendChanges(hDlg);
|
|
fRet = TRUE;
|
|
break;
|
|
|
|
case DTN_DATETIMECHANGE: // Date/time picker has changed
|
|
Notify_Change(hDlg);
|
|
fRet = TRUE;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_HELP:
|
|
WinHelpContextPopup(((LPHELPINFO)lParam)->dwContextId, hDlg);
|
|
return TRUE;
|
|
|
|
} // switch
|
|
|
|
return fRet;
|
|
}
|
|
|
|
BOOL
|
|
ValidateReceive(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Validate the check box and controls for receive
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the property sheet page
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if no error
|
|
FALSE -- if error
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL bEnabled; // enable/disable controls
|
|
BOOL bManualAnswer;
|
|
BOOL bVirtual; // Is the device virtual?
|
|
|
|
// if g_bUserCanChangeSettings is FALSE, controls are disabled by default.
|
|
if(g_bUserCanChangeSettings)
|
|
{
|
|
DWORD dwDeviceId;
|
|
DWORD dwRes;
|
|
|
|
dwDeviceId = (DWORD)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
|
Assert (dwDeviceId);
|
|
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
dwRes = IsDeviceVirtual (g_hFaxSvcHandle, dwDeviceId, &bVirtual);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
return FALSE;
|
|
}
|
|
DisConnect ();
|
|
bEnabled = IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_RECEIVE) == BST_CHECKED;
|
|
|
|
if(bEnabled &&
|
|
IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_AUTO_ANSWER) != BST_CHECKED &&
|
|
IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_MANUAL_ANSWER) != BST_CHECKED)
|
|
{
|
|
//
|
|
// Set default to auto answer
|
|
//
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_AUTO_ANSWER, BST_CHECKED);
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_CSID), bEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_MANUAL_ANSWER), bEnabled && !bVirtual);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_AUTO_ANSWER), bEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_RINGS1), bEnabled);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_CSID1), bEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_CSID), bEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDCSTATIC_ANSWER_MODE), bEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_ROUTE), bEnabled);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDCSTATIC_AUTO_ANSWER), bEnabled);
|
|
|
|
bManualAnswer = IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_MANUAL_ANSWER);
|
|
Assert (!(bVirtual && bManualAnswer));
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_RINGS), bEnabled && !bManualAnswer && !bVirtual);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_SPIN_RINGS), bEnabled && !bManualAnswer && !bVirtual);
|
|
if (bVirtual)
|
|
{
|
|
//
|
|
// Virtual devices always answer after one ring
|
|
//
|
|
SetDlgItemInt (hDlg, IDC_DEVICE_PROP_RINGS, 1, FALSE);
|
|
}
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_PRINT), bEnabled);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_PRINT_TO), bEnabled
|
|
&& IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_PRINT));
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_SAVE), bEnabled);
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_DEST_FOLDER), bEnabled
|
|
&& IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_SAVE));
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_DEST_FOLDER_BR), bEnabled
|
|
&& IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_SAVE));
|
|
|
|
EnableWindow(GetDlgItem(hDlg, IDC_ICON_STORE_IN_FOLDER), bEnabled);
|
|
EnableWindow(GetDlgItem(hDlg, IDC_STATIC_STORE_IN_FOLDER), bEnabled);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_ICON_STORE_IN_FOLDER), bEnabled ? SW_SHOW : SW_HIDE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_STATIC_STORE_IN_FOLDER), bEnabled ? SW_SHOW : SW_HIDE);
|
|
}
|
|
else
|
|
{
|
|
PageEnable(hDlg, FALSE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_ICON_STORE_IN_FOLDER), SW_HIDE);
|
|
ShowWindow (GetDlgItem(hDlg, IDC_STATIC_STORE_IN_FOLDER), SW_HIDE);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
InitReceiveInfo(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize the routing information for specific device
|
|
|
|
Arguments:
|
|
|
|
hDlg - the dialog handle of the dialog
|
|
|
|
Return Value:
|
|
|
|
TRUE if success, FALSE otherwise
|
|
|
|
--*/
|
|
{
|
|
DWORD dwDeviceId;
|
|
HWND hControl;
|
|
PFAX_PORT_INFO_EX pFaxPortInfo;
|
|
LPBYTE pRoutingInfoBuffer;
|
|
DWORD dwRoutingInfoBufferSize;
|
|
DWORD dwCurrentRM;
|
|
BOOL bSuccessed = TRUE;
|
|
|
|
Verbose(("Entering InitReceiveInfo...\n"));
|
|
|
|
//
|
|
// Get device id from dialog page
|
|
//
|
|
|
|
dwDeviceId = (DWORD)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
|
|
|
pFaxPortInfo = FindPortInfo(dwDeviceId);
|
|
if(!pFaxPortInfo)
|
|
{
|
|
Error(("FindPortInfo() failed.\n"));
|
|
Assert(FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
// set up the check box
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_RECEIVE), g_bUserCanChangeSettings);
|
|
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_RECEIVE, pFaxPortInfo->ReceiveMode != FAX_DEVICE_RECEIVE_MODE_OFF);
|
|
|
|
// set up the CSID control
|
|
SetDlgItemText(hDlg, IDC_DEVICE_PROP_CSID, pFaxPortInfo->lptstrCsid);
|
|
|
|
// setup the ring count spinner control
|
|
hControl = GetDlgItem(hDlg, IDC_DEVICE_PROP_SPIN_RINGS);
|
|
|
|
if(MIN_RING_COUNT <= pFaxPortInfo->dwRings && pFaxPortInfo->dwRings <= MAX_RING_COUNT)
|
|
{
|
|
SetDlgItemInt(hDlg, IDC_DEVICE_PROP_RINGS, pFaxPortInfo->dwRings, FALSE);
|
|
SendMessage( hControl, UDM_SETPOS32, 0, (LPARAM) MAKELONG(pFaxPortInfo->dwRings, 0) );
|
|
}
|
|
else
|
|
{
|
|
SetDlgItemInt(hDlg, IDC_DEVICE_PROP_RINGS, DEFAULT_RING_COUNT, FALSE);
|
|
SendMessage( hControl, UDM_SETPOS32, 0, (LPARAM) MAKELONG(DEFAULT_RING_COUNT, 0) );
|
|
}
|
|
|
|
//
|
|
// Answer mode
|
|
//
|
|
if (FAX_DEVICE_RECEIVE_MODE_MANUAL == pFaxPortInfo->ReceiveMode)
|
|
{
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_MANUAL_ANSWER, TRUE);
|
|
}
|
|
else if (FAX_DEVICE_RECEIVE_MODE_AUTO == pFaxPortInfo->ReceiveMode)
|
|
{
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_AUTO_ANSWER, TRUE);
|
|
}
|
|
|
|
//
|
|
// Get the routing info
|
|
//
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
for (dwCurrentRM = 0; dwCurrentRM < RM_COUNT; dwCurrentRM++)
|
|
{
|
|
BOOL Enabled;
|
|
|
|
Enabled = FaxDeviceEnableRoutingMethod( g_hFaxSvcHandle,
|
|
dwDeviceId,
|
|
RoutingGuids[dwCurrentRM],
|
|
QUERY_STATUS );
|
|
//
|
|
// Show routing extension data
|
|
//
|
|
pRoutingInfoBuffer = NULL;
|
|
if(!FaxGetExtensionData(g_hFaxSvcHandle,
|
|
dwDeviceId,
|
|
RoutingGuids[dwCurrentRM],
|
|
&pRoutingInfoBuffer,
|
|
&dwRoutingInfoBufferSize))
|
|
{
|
|
Error(("FaxGetExtensionData failed with %ld.\n", GetLastError()));
|
|
pRoutingInfoBuffer = NULL;
|
|
}
|
|
|
|
switch (dwCurrentRM)
|
|
{
|
|
case RM_FOLDER:
|
|
|
|
CheckDlgButton( hDlg, IDC_DEVICE_PROP_SAVE, Enabled ? BST_CHECKED : BST_UNCHECKED );
|
|
|
|
// enable controls if the user has "modify" permission
|
|
if(g_bUserCanChangeSettings)
|
|
{
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_DEST_FOLDER ), Enabled );
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_DEST_FOLDER_BR ), Enabled );
|
|
}
|
|
if (pRoutingInfoBuffer && *pRoutingInfoBuffer)
|
|
{
|
|
SetDlgItemText( hDlg, IDC_DEVICE_PROP_DEST_FOLDER, (LPCTSTR)pRoutingInfoBuffer );
|
|
}
|
|
break;
|
|
|
|
case RM_PRINT:
|
|
|
|
hControl = GetDlgItem( hDlg, IDC_DEVICE_PROP_PRINT_TO );
|
|
|
|
//
|
|
// Now find out if we match the data the server has
|
|
//
|
|
if (pRoutingInfoBuffer && lstrlen((LPWSTR)pRoutingInfoBuffer))
|
|
{
|
|
//
|
|
// Server has some name for printer
|
|
//
|
|
LPCWSTR lpcwstrMatchingText = FindPrinterNameFromPath (g_pPrinterNames, g_dwNumPrinters, (LPWSTR)pRoutingInfoBuffer);
|
|
if (!lpcwstrMatchingText)
|
|
{
|
|
//
|
|
// No match, just fill in the text we got from the server
|
|
//
|
|
SendMessage(hControl, CB_SETCURSEL, -1, 0);
|
|
SetWindowText(hControl, (LPWSTR)pRoutingInfoBuffer);
|
|
}
|
|
else
|
|
{
|
|
SendMessage(hControl, CB_SELECTSTRING, -1, (LPARAM) lpcwstrMatchingText);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// No server configuation - Select nothing
|
|
//
|
|
}
|
|
|
|
CheckDlgButton( hDlg, IDC_DEVICE_PROP_PRINT, Enabled ? BST_CHECKED : BST_UNCHECKED );
|
|
//
|
|
// Enable controls if the user has "modify" permission
|
|
//
|
|
if(g_bUserCanChangeSettings)
|
|
{
|
|
EnableWindow(GetDlgItem(hDlg, IDC_DEVICE_PROP_PRINT), TRUE);
|
|
EnableWindow(hControl, Enabled);
|
|
}
|
|
break;
|
|
}
|
|
if (pRoutingInfoBuffer)
|
|
{
|
|
FaxFreeBuffer(pRoutingInfoBuffer);
|
|
}
|
|
}
|
|
|
|
DisConnect();
|
|
|
|
return bSuccessed;
|
|
}
|
|
|
|
BOOL
|
|
SaveReceiveInfo(
|
|
HWND hDlg
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save the receive routing info to the system
|
|
|
|
Arguments:
|
|
|
|
hDlg - Identifies the property sheet page
|
|
|
|
Return Value:
|
|
|
|
TRUE if successful, FALSE if failed
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD dwDeviceId;
|
|
PFAX_PORT_INFO_EX pFaxPortInfo = NULL;
|
|
DWORD dwCurrentRM;
|
|
BOOL bSuccessed = TRUE;
|
|
HWND hControl;
|
|
TCHAR szCsid[CSID_LIMIT + 1] = {0};
|
|
BYTE pRouteInfo[RM_COUNT][INFO_SIZE] = {0};
|
|
LPTSTR lpCurSel;
|
|
LPDWORD Enabled;
|
|
DWORD dwRingCount = 0; // default value is an invalid value
|
|
DWORD dwRes = 0;
|
|
|
|
Verbose(("Entering SaveReceiveInfo...\n"));
|
|
|
|
//
|
|
// check the validity of ring count
|
|
//
|
|
dwRingCount = GetDlgItemInt(hDlg, IDC_DEVICE_PROP_RINGS, &bSuccessed, FALSE);
|
|
if( dwRingCount < MIN_RING_COUNT || dwRingCount > MAX_RING_COUNT )
|
|
{
|
|
hControl = GetDlgItem(hDlg, IDC_DEVICE_PROP_RINGS);
|
|
DisplayErrorMessage(hDlg, 0, FAXUI_ERROR_INVALID_RING_COUNT, MIN_RING_COUNT, MAX_RING_COUNT);
|
|
SendMessage(hControl, EM_SETSEL, 0, -1);
|
|
SetFocus(hControl);
|
|
SetActiveWindow(hControl);
|
|
bSuccessed = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
//
|
|
// Check the validity first in the loop,
|
|
// then save the routing info
|
|
//
|
|
for (dwCurrentRM = 0; dwCurrentRM < RM_COUNT; dwCurrentRM++)
|
|
{
|
|
// initialize
|
|
lpCurSel = (LPTSTR)(pRouteInfo[dwCurrentRM] + sizeof(DWORD));
|
|
Enabled = (LPDWORD) pRouteInfo[dwCurrentRM];
|
|
*Enabled = 0;
|
|
|
|
switch (dwCurrentRM)
|
|
{
|
|
case RM_PRINT:
|
|
|
|
*Enabled = (IsDlgButtonChecked( hDlg, IDC_DEVICE_PROP_PRINT ) == BST_CHECKED);
|
|
lpCurSel[0] = TEXT('\0');
|
|
//
|
|
// Just read-in the selected printer display name
|
|
//
|
|
GetDlgItemText (hDlg, IDC_DEVICE_PROP_PRINT_TO, lpCurSel, MAX_PATH);
|
|
hControl = GetDlgItem(hDlg, IDC_DEVICE_PROP_PRINT_TO);
|
|
//
|
|
// we will check the validity only when this routing method is enabled
|
|
// but we will save the select change anyway.
|
|
//
|
|
if (*Enabled)
|
|
{
|
|
if (lpCurSel[0] == 0)
|
|
{
|
|
DisplayErrorMessage(hDlg, 0, FAXUI_ERROR_SELECT_PRINTER);
|
|
SetFocus(hControl);
|
|
SetActiveWindow(hControl);
|
|
bSuccessed = FALSE;
|
|
goto Exit;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case RM_FOLDER:
|
|
|
|
*Enabled = (IsDlgButtonChecked( hDlg, IDC_DEVICE_PROP_SAVE ) == BST_CHECKED);
|
|
hControl = GetDlgItem(hDlg, IDC_DEVICE_PROP_DEST_FOLDER);
|
|
|
|
//
|
|
// we will check the validity only when this routing method is enabled
|
|
// but we will save the text change anyway.
|
|
//
|
|
GetWindowText( hControl, lpCurSel, MAX_PATH - 1 );
|
|
|
|
if (*Enabled)
|
|
{
|
|
if((g_pPathIsRelativeW && g_pPathIsRelativeW (lpCurSel)) || !DirectoryExists(lpCurSel))
|
|
{
|
|
DisplayErrorMessage(hDlg, 0, ERROR_PATH_NOT_FOUND);
|
|
SetFocus(hControl);
|
|
SetActiveWindow(hControl);
|
|
bSuccessed = FALSE;
|
|
goto Exit;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//
|
|
// Now save the device and routing info
|
|
// Get device id from dialog page
|
|
//
|
|
dwDeviceId = (DWORD)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
|
//
|
|
// Save routing methods info
|
|
//
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
bSuccessed = FALSE;
|
|
goto Exit;
|
|
}
|
|
|
|
if(!FaxGetPortEx(g_hFaxSvcHandle, dwDeviceId, &pFaxPortInfo))
|
|
{
|
|
bSuccessed = FALSE;
|
|
dwRes = GetLastError();
|
|
Error(("Can't save routing information.\n"));
|
|
goto Exit;
|
|
}
|
|
//
|
|
// Save receive settings
|
|
//
|
|
if(IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_RECEIVE) == BST_CHECKED)
|
|
{
|
|
//
|
|
// Collect and verify TSID
|
|
//
|
|
GetDlgItemText(hDlg, IDC_DEVICE_PROP_CSID, szCsid, CSID_LIMIT + 1);
|
|
pFaxPortInfo->lptstrCsid = szCsid;
|
|
if(IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_AUTO_ANSWER) == BST_CHECKED)
|
|
{
|
|
pFaxPortInfo->ReceiveMode = FAX_DEVICE_RECEIVE_MODE_AUTO;
|
|
//
|
|
// save ring count info
|
|
//
|
|
pFaxPortInfo->dwRings = dwRingCount;
|
|
}
|
|
else if(IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_MANUAL_ANSWER) == BST_CHECKED)
|
|
{
|
|
//
|
|
// Turn off manual-answer for ALL devices.
|
|
//
|
|
DWORD dw;
|
|
for (dw = 0; dw < g_dwPortsNum; dw++)
|
|
{
|
|
if (FAX_DEVICE_RECEIVE_MODE_MANUAL == g_pFaxPortInfo[dw].ReceiveMode)
|
|
{
|
|
g_pFaxPortInfo[dw].ReceiveMode = FAX_DEVICE_RECEIVE_MODE_OFF;
|
|
}
|
|
}
|
|
//
|
|
// Turn on manual-answer for selected device only.
|
|
//
|
|
pFaxPortInfo->ReceiveMode = FAX_DEVICE_RECEIVE_MODE_MANUAL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pFaxPortInfo->ReceiveMode = FAX_DEVICE_RECEIVE_MODE_OFF;
|
|
}
|
|
|
|
if(!FaxSetPortEx(g_hFaxSvcHandle, dwDeviceId, pFaxPortInfo))
|
|
{
|
|
bSuccessed = FALSE;
|
|
dwRes = GetLastError();
|
|
Error(( "Set port information error in DoSaveDeviceList(), ec = %d.\n", dwRes));
|
|
goto Exit;
|
|
}
|
|
//
|
|
// save routing methods
|
|
//
|
|
for (dwCurrentRM = 0; dwCurrentRM < RM_COUNT; dwCurrentRM++)
|
|
{
|
|
lpCurSel = (LPTSTR)(pRouteInfo[dwCurrentRM] + sizeof(DWORD));
|
|
Enabled = (LPDWORD)pRouteInfo[dwCurrentRM];
|
|
|
|
if ((RM_PRINT == dwCurrentRM) && *Enabled)
|
|
{
|
|
//
|
|
// Attempt to convert printer display name to printer path before we pass it on to the server
|
|
//
|
|
LPCWSTR lpcwstrPrinterPath = FindPrinterPathFromName (g_pPrinterNames, g_dwNumPrinters, lpCurSel);
|
|
if (lpcwstrPrinterPath)
|
|
{
|
|
//
|
|
// We have a matching path - replace name with path.
|
|
//
|
|
lstrcpyn (lpCurSel, lpcwstrPrinterPath, MAX_PATH);
|
|
}
|
|
}
|
|
|
|
if(!FaxSetExtensionData(g_hFaxSvcHandle,
|
|
dwDeviceId,
|
|
RoutingGuids[dwCurrentRM],
|
|
(LPBYTE)lpCurSel,
|
|
sizeof(TCHAR) * MAX_PATH))
|
|
{
|
|
bSuccessed = FALSE;
|
|
dwRes = GetLastError();
|
|
Error(("FaxSetExtensionData() failed with %d.\n", dwRes));
|
|
goto Exit;
|
|
}
|
|
|
|
if(!FaxDeviceEnableRoutingMethod(g_hFaxSvcHandle,
|
|
dwDeviceId,
|
|
RoutingGuids[dwCurrentRM],
|
|
*Enabled ? STATUS_ENABLE : STATUS_DISABLE ))
|
|
{
|
|
bSuccessed = FALSE;
|
|
dwRes = GetLastError();
|
|
Error(("FaxDeviceEnableRoutingMethod() failed with %d.\n", dwRes));
|
|
goto Exit;
|
|
}
|
|
}
|
|
|
|
bSuccessed = TRUE;
|
|
|
|
Exit:
|
|
FaxFreeBuffer(pFaxPortInfo);
|
|
DisConnect();
|
|
|
|
switch (dwRes)
|
|
{
|
|
case ERROR_SUCCESS:
|
|
//
|
|
// Don't do nothing
|
|
//
|
|
break;
|
|
|
|
case FAXUI_ERROR_DEVICE_LIMIT:
|
|
case FAX_ERR_DEVICE_NUM_LIMIT_EXCEEDED:
|
|
//
|
|
// Some additional parameters are needed
|
|
//
|
|
DisplayErrorMessage(hDlg, 0, dwRes, GetDeviceLimit());
|
|
break;
|
|
|
|
default:
|
|
DisplayErrorMessage(hDlg, 0, dwRes);
|
|
break;
|
|
}
|
|
return bSuccessed;
|
|
}
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DevRecvDlgProc(
|
|
IN HWND hDlg,
|
|
IN UINT message,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dialog procedure for the receive settings
|
|
|
|
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:
|
|
|
|
Depending on specific message
|
|
|
|
--*/
|
|
{
|
|
BOOL fRet = FALSE;
|
|
HWND hControl;
|
|
DWORD dwDeviceId;
|
|
|
|
switch( message )
|
|
{
|
|
case WM_DESTROY:
|
|
if (g_pPrinterNames)
|
|
{
|
|
ReleasePrinterNames (g_pPrinterNames, g_dwNumPrinters);
|
|
g_pPrinterNames = NULL;
|
|
}
|
|
break;
|
|
|
|
case WM_INITDIALOG:
|
|
{
|
|
//
|
|
//Get the shared data from PROPSHEETPAGE lParam value
|
|
//and load it into GWL_USERDATA
|
|
//
|
|
dwDeviceId = (DWORD)((LPPROPSHEETPAGE)lParam)->lParam;
|
|
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)dwDeviceId);
|
|
|
|
//
|
|
// Initialize the list of destination printers
|
|
//
|
|
hControl = GetDlgItem(hDlg, IDC_DEVICE_PROP_PRINT_TO);
|
|
|
|
SetLTRComboBox(hDlg, IDC_DEVICE_PROP_PRINT_TO);
|
|
|
|
if (g_pPrinterNames)
|
|
{
|
|
ReleasePrinterNames (g_pPrinterNames, g_dwNumPrinters);
|
|
g_pPrinterNames = NULL;
|
|
}
|
|
g_pPrinterNames = CollectPrinterNames (&g_dwNumPrinters, TRUE);
|
|
if (!g_pPrinterNames)
|
|
{
|
|
if (ERROR_PRINTER_NOT_FOUND == GetLastError ())
|
|
{
|
|
//
|
|
// No printers
|
|
//
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Real error
|
|
//
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Success - fill in the combo-box
|
|
//
|
|
DWORD dw;
|
|
for (dw = 0; dw < g_dwNumPrinters; dw++)
|
|
{
|
|
SendMessage(hControl, CB_ADDSTRING, 0, (LPARAM) g_pPrinterNames[dw].lpcwstrDisplayName);
|
|
}
|
|
}
|
|
//
|
|
// We only allow two-digit phone ring answer
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_DEVICE_PROP_RINGS, EM_SETLIMITTEXT, 2, 0);
|
|
SendDlgItemMessage(hDlg, IDC_DEVICE_PROP_CSID, EM_SETLIMITTEXT, CSID_LIMIT, 0);
|
|
SendDlgItemMessage(hDlg, IDC_DEVICE_PROP_DEST_FOLDER, EM_SETLIMITTEXT, MAX_ARCHIVE_DIR - 1, 0);
|
|
//
|
|
// Initiate the spin control.
|
|
//
|
|
SendMessage( GetDlgItem(hDlg, IDC_DEVICE_PROP_SPIN_RINGS),
|
|
UDM_SETRANGE32, MIN_RING_COUNT, MAX_RING_COUNT );
|
|
|
|
SetLTREditDirection(hDlg, IDC_DEVICE_PROP_DEST_FOLDER);
|
|
if (g_pSHAutoComplete)
|
|
{
|
|
g_pSHAutoComplete (GetDlgItem(hDlg, IDC_DEVICE_PROP_DEST_FOLDER), SHACF_FILESYSTEM);
|
|
}
|
|
InitReceiveInfo(hDlg);
|
|
ValidateReceive(hDlg);
|
|
return TRUE;
|
|
}
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
// activate apply button
|
|
|
|
WORD wID = LOWORD( wParam );
|
|
|
|
switch( wID )
|
|
{
|
|
case IDC_DEVICE_PROP_RECEIVE:
|
|
|
|
if ( HIWORD(wParam) == BN_CLICKED ) // notification code
|
|
{
|
|
if(IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_RECEIVE) == BST_CHECKED)
|
|
{
|
|
dwDeviceId = (DWORD)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
|
if(!IsDeviceInUse(dwDeviceId) &&
|
|
GetDeviceLimit() <= CountUsedFaxDevices())
|
|
{
|
|
CheckDlgButton(hDlg, IDC_DEVICE_PROP_RECEIVE, BST_UNCHECKED);
|
|
|
|
DisplayErrorMessage(hDlg,
|
|
MB_OK | MB_ICONSTOP,
|
|
FAXUI_ERROR_DEVICE_LIMIT,
|
|
GetDeviceLimit());
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
ValidateReceive(hDlg);
|
|
Notify_Change(hDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_DEVICE_PROP_CSID:
|
|
case IDC_DEVICE_PROP_DEST_FOLDER:
|
|
if( HIWORD(wParam) == EN_CHANGE ) // notification code
|
|
{
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
if (IDC_DEVICE_PROP_DEST_FOLDER == wID && HIWORD(wParam) == EN_KILLFOCUS)
|
|
{
|
|
TCHAR szFolder[MAX_PATH * 2];
|
|
TCHAR szResult[MAX_PATH * 2];
|
|
//
|
|
// Edit control lost its focus
|
|
//
|
|
GetDlgItemText (hDlg, wID, szFolder, ARR_SIZE(szFolder));
|
|
if (lstrlen (szFolder))
|
|
{
|
|
if (GetFullPathName(szFolder, ARR_SIZE(szResult), szResult, NULL))
|
|
{
|
|
if (g_pPathMakePrettyW)
|
|
{
|
|
g_pPathMakePrettyW (szResult);
|
|
}
|
|
SetDlgItemText (hDlg, wID, szResult);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_DEVICE_PROP_MANUAL_ANSWER:
|
|
case IDC_DEVICE_PROP_AUTO_ANSWER:
|
|
|
|
if ( HIWORD(wParam) == BN_CLICKED ) // notification code
|
|
{
|
|
BOOL bEnabled = IsDlgButtonChecked( hDlg, IDC_DEVICE_PROP_AUTO_ANSWER );
|
|
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_RINGS ), bEnabled );
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_SPIN_RINGS ), bEnabled );
|
|
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
break;
|
|
|
|
case IDC_DEVICE_PROP_PRINT:
|
|
|
|
if ( HIWORD(wParam) == BN_CLICKED ) // notification code
|
|
{
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_PRINT_TO ), IsDlgButtonChecked( hDlg, IDC_DEVICE_PROP_PRINT ) );
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
break;
|
|
|
|
case IDC_DEVICE_PROP_SAVE:
|
|
|
|
if ( HIWORD(wParam) == BN_CLICKED ) // notification code
|
|
{
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_DEST_FOLDER ), IsDlgButtonChecked( hDlg, IDC_DEVICE_PROP_SAVE ) );
|
|
EnableWindow( GetDlgItem( hDlg, IDC_DEVICE_PROP_DEST_FOLDER_BR ), IsDlgButtonChecked( hDlg, IDC_DEVICE_PROP_SAVE ) );
|
|
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
break;
|
|
|
|
case IDC_DEVICE_PROP_DEST_FOLDER_BR:
|
|
{
|
|
TCHAR szTitle[MAX_TITLE_LEN];
|
|
|
|
if(!LoadString(g_hResource, IDS_BROWSE_FOLDER, szTitle, MAX_TITLE_LEN))
|
|
{
|
|
lstrcpy(szTitle, TEXT("Select a folder"));
|
|
}
|
|
|
|
if(BrowseForDirectory(hDlg, IDC_DEVICE_PROP_DEST_FOLDER, MAX_ARCHIVE_DIR, szTitle))
|
|
{
|
|
Notify_Change(hDlg);
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
case IDC_DEVICE_PROP_PRINT_TO:
|
|
|
|
if ((HIWORD(wParam) == CBN_SELCHANGE) || // notification code
|
|
(HIWORD(wParam) == CBN_EDITCHANGE))
|
|
{
|
|
Notify_Change(hDlg);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
} // switch
|
|
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
switch( ((LPNMHDR) lParam)->code )
|
|
{
|
|
case PSN_APPLY:
|
|
{
|
|
// if the user only has read permission, return immediately
|
|
if(!g_bUserCanChangeSettings)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if(!SaveReceiveInfo(hDlg))
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
}
|
|
else
|
|
{
|
|
Notify_UnChange(hDlg);
|
|
g_bPortInfoChanged = TRUE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
} // switch
|
|
|
|
break;
|
|
}
|
|
|
|
case WM_HELP:
|
|
WinHelpContextPopup(((LPHELPINFO)lParam)->dwContextId, hDlg);
|
|
return TRUE;
|
|
|
|
} // switch
|
|
|
|
return fRet;
|
|
} // DevRecvDlgProc
|
|
|
|
|
|
BOOL
|
|
InitCleanupInfo(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize the auto-cleanup information for a specific device
|
|
|
|
Arguments:
|
|
|
|
hDlg - the dialog handle of the dialog
|
|
|
|
Return Value:
|
|
|
|
TRUE if success, FALSE otherwise
|
|
|
|
--*/
|
|
{
|
|
PFAX_OUTBOX_CONFIG pOutboxConfig = NULL;
|
|
|
|
Verbose(("Entering InitCleanupInfo...\n"));
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
if(!FaxGetOutboxConfiguration(g_hFaxSvcHandle, &pOutboxConfig))
|
|
{
|
|
Error(( "FaxGetOutboxConfiguration() failed with %d.\n", GetLastError()));
|
|
return FALSE;
|
|
}
|
|
|
|
if (pOutboxConfig->dwAgeLimit)
|
|
{
|
|
if (pOutboxConfig->dwAgeLimit < FXS_DIRTYDAYS_LOWER)
|
|
{
|
|
pOutboxConfig->dwAgeLimit = FXS_DIRTYDAYS_LOWER;
|
|
}
|
|
if (pOutboxConfig->dwAgeLimit > FXS_DIRTYDAYS_UPPER)
|
|
{
|
|
pOutboxConfig->dwAgeLimit = FXS_DIRTYDAYS_UPPER;
|
|
}
|
|
//
|
|
// Age limit is active
|
|
//
|
|
CheckDlgButton(hDlg, IDC_DELETE_CHECK, BST_CHECKED);
|
|
SetDlgItemInt (hDlg, IDC_DAYS_EDIT, pOutboxConfig->dwAgeLimit, FALSE);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Age limit is inactive
|
|
//
|
|
CheckDlgButton(hDlg, IDC_DELETE_CHECK, BST_UNCHECKED);
|
|
SetDlgItemInt (hDlg, IDC_DAYS_EDIT, FXS_DIRTYDAYS_LOWER, FALSE);
|
|
}
|
|
DisConnect();
|
|
return TRUE;
|
|
} // InitCleanupInfo
|
|
|
|
BOOL
|
|
ValidateCleanup(
|
|
HWND hDlg
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Validate the check box and controls for cleanup
|
|
|
|
Arguments:
|
|
|
|
hDlg - Handle to the property sheet page
|
|
|
|
Return Value:
|
|
|
|
TRUE -- if no error
|
|
FALSE -- if error
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL bEnabled;
|
|
|
|
if(g_bUserCanChangeSettings)
|
|
{
|
|
bEnabled = IsDlgButtonChecked(hDlg, IDC_DELETE_CHECK) == BST_CHECKED;
|
|
}
|
|
else
|
|
{
|
|
bEnabled = FALSE;
|
|
EnableWindow (GetDlgItem(hDlg, IDC_DELETE_CHECK), bEnabled);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_STATIC_CLEANUP_ICON), bEnabled);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_STATIC_CLEANUP_OPTIONS), bEnabled);
|
|
}
|
|
//
|
|
// Enable/disable controls according to "Enable Send" check box
|
|
//
|
|
EnableWindow (GetDlgItem(hDlg, IDC_DAYS_EDIT), bEnabled);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_DAYS_SPIN), bEnabled);
|
|
EnableWindow (GetDlgItem(hDlg, IDC_DAYS_STATIC), bEnabled);
|
|
return TRUE;
|
|
} // ValidateCleanup
|
|
|
|
BOOL
|
|
SaveCleanupInfo(
|
|
IN HWND hDlg)
|
|
/*++
|
|
|
|
Routine name : SaveCleanupInfo
|
|
|
|
Routine description:
|
|
|
|
Process Apply Button
|
|
|
|
Author:
|
|
|
|
Eran Yraiv (EranY), April, 2001
|
|
|
|
Arguments:
|
|
|
|
hDlg [IN] - Handle to the Window
|
|
|
|
Return Value:
|
|
|
|
TRUE if Apply is succeeded, FALSE otherwise.
|
|
|
|
--*/
|
|
{
|
|
DWORD dwRes = 0;
|
|
BOOL bErrorDisplayed = FALSE;
|
|
|
|
PFAX_OUTBOX_CONFIG pOutboxConfig = NULL;
|
|
|
|
//
|
|
// if the user only has read permission, return immediately
|
|
//
|
|
if(!g_bUserCanChangeSettings)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
//
|
|
// Failed to connect to the Fax Service. Connect() showed the Error Message.
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
return FALSE;
|
|
}
|
|
|
|
if(!FaxGetOutboxConfiguration(g_hFaxSvcHandle, &pOutboxConfig))
|
|
{
|
|
//
|
|
// Show Error Message and return FALSE
|
|
//
|
|
dwRes = GetLastError();
|
|
Error(( "FaxGetOutboxConfiguration() failed with %d.\n", dwRes));
|
|
return FALSE;
|
|
}
|
|
Assert(pOutboxConfig);
|
|
if (BST_CHECKED == IsDlgButtonChecked(hDlg, IDC_DELETE_CHECK))
|
|
{
|
|
BOOL bRes;
|
|
int iAgeLimit = GetDlgItemInt (hDlg, IDC_DAYS_EDIT, &bRes, FALSE);
|
|
|
|
if (!bRes || (iAgeLimit > FXS_DIRTYDAYS_UPPER) || (iAgeLimit < FXS_DIRTYDAYS_LOWER))
|
|
{
|
|
//
|
|
// Bad data or out of range
|
|
//
|
|
HWND hControl = GetDlgItem(hDlg, IDC_DAYS_EDIT);
|
|
dwRes = ERROR_INVALID_DATA;
|
|
SetLastError (ERROR_INVALID_DATA);
|
|
DisplayErrorMessage(hDlg, 0, FAXUI_ERROR_INVALID_DIRTY_DAYS, FXS_DIRTYDAYS_LOWER, FXS_DIRTYDAYS_UPPER);
|
|
SendMessage(hControl, EM_SETSEL, 0, -1);
|
|
SetFocus(hControl);
|
|
SetActiveWindow(hControl);
|
|
bErrorDisplayed = TRUE;
|
|
goto ClearData;
|
|
}
|
|
pOutboxConfig->dwAgeLimit = iAgeLimit;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Age limit is disabled
|
|
//
|
|
pOutboxConfig->dwAgeLimit = 0;
|
|
}
|
|
if(!FaxSetOutboxConfiguration(g_hFaxSvcHandle, pOutboxConfig))
|
|
{
|
|
//
|
|
// Show Error Message and return FALSE
|
|
//
|
|
dwRes = GetLastError();
|
|
Error(("FaxSetOutboxConfiguration() failed with %d.\n", dwRes));
|
|
goto ClearData;
|
|
}
|
|
|
|
ClearData:
|
|
FaxFreeBuffer(pOutboxConfig);
|
|
DisConnect();
|
|
|
|
switch (dwRes)
|
|
{
|
|
case ERROR_SUCCESS:
|
|
//
|
|
// Don't do nothing
|
|
//
|
|
break;
|
|
|
|
case FAXUI_ERROR_DEVICE_LIMIT:
|
|
case FAX_ERR_DEVICE_NUM_LIMIT_EXCEEDED:
|
|
//
|
|
// Some additional parameters are needed
|
|
//
|
|
DisplayErrorMessage(hDlg, 0, dwRes, GetDeviceLimit());
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
break;
|
|
|
|
default:
|
|
DisplayErrorMessage(hDlg, 0, dwRes);
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
break;
|
|
}
|
|
return (dwRes == 0);
|
|
} // SaveCleanupInfo
|
|
|
|
INT_PTR
|
|
CALLBACK
|
|
DevCleanupDlgProc(
|
|
IN HWND hDlg,
|
|
IN UINT message,
|
|
IN WPARAM wParam,
|
|
IN LPARAM lParam
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Dialog procedure for the cleanup settings
|
|
|
|
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:
|
|
|
|
Depending on specific message
|
|
|
|
--*/
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
switch( message )
|
|
{
|
|
case WM_INITDIALOG:
|
|
//
|
|
// we only allow two-digit days
|
|
//
|
|
SendDlgItemMessage(hDlg,
|
|
IDC_DAYS_EDIT,
|
|
EM_SETLIMITTEXT,
|
|
FXS_DIRTYDAYS_LENGTH,
|
|
0);
|
|
//
|
|
// Initiate the spin control.
|
|
//
|
|
SendDlgItemMessage(hDlg,
|
|
IDC_DAYS_SPIN,
|
|
UDM_SETRANGE32,
|
|
FXS_DIRTYDAYS_LOWER,
|
|
FXS_DIRTYDAYS_UPPER);
|
|
|
|
InitCleanupInfo(hDlg);
|
|
ValidateCleanup(hDlg);
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
{
|
|
WORD wID = LOWORD( wParam );
|
|
switch( wID )
|
|
{
|
|
case IDC_DELETE_CHECK:
|
|
|
|
if (BN_CLICKED == HIWORD(wParam)) // notification code
|
|
{
|
|
//
|
|
// User checked / unchecked the checkbox
|
|
//
|
|
ValidateCleanup(hDlg);
|
|
Notify_Change(hDlg);
|
|
}
|
|
break;
|
|
|
|
case IDC_DAYS_EDIT:
|
|
if(EN_CHANGE == HIWORD(wParam)) // notification code
|
|
{
|
|
//
|
|
// User changed something in the edit control
|
|
//
|
|
Notify_Change(hDlg);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
} // switch
|
|
fRet = TRUE;
|
|
break;
|
|
}
|
|
|
|
case WM_NOTIFY:
|
|
{
|
|
switch( ((LPNMHDR) lParam)->code )
|
|
{
|
|
case PSN_APPLY:
|
|
{
|
|
// if the user only has read permission, return immediately
|
|
if(!g_bUserCanChangeSettings)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
if(!SaveCleanupInfo(hDlg))
|
|
{
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
}
|
|
else
|
|
{
|
|
Notify_UnChange(hDlg);
|
|
g_bPortInfoChanged = TRUE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
} // switch
|
|
break;
|
|
}
|
|
|
|
case WM_HELP:
|
|
WinHelpContextPopup(((LPHELPINFO)lParam)->dwContextId, hDlg);
|
|
return TRUE;
|
|
} // switch
|
|
return fRet;
|
|
} // DevCleanupDlgProc
|
|
|
|
|
|
BOOL
|
|
SaveSendChanges(
|
|
IN HWND hDlg)
|
|
/*++
|
|
|
|
Routine name : SaveSendChanges
|
|
|
|
Routine description:
|
|
|
|
Process Apply Button
|
|
|
|
Author:
|
|
|
|
Iv Garber (IvG), Feb, 2001
|
|
|
|
Arguments:
|
|
|
|
hDlg [TBD] - Handle to the Window
|
|
|
|
Return Value:
|
|
|
|
TRUE if Apply is succeeded, FALSE otherwise.
|
|
|
|
--*/
|
|
{
|
|
DWORD dwDeviceId = 0;
|
|
DWORD dwRes = 0;
|
|
DWORD dwData;
|
|
TCHAR szTsid[TSID_LIMIT + 1] = {0};
|
|
BOOL bRes;
|
|
BOOL bErrorDisplayed = FALSE;
|
|
|
|
SYSTEMTIME sTime = {0};
|
|
|
|
PFAX_PORT_INFO_EX pFaxPortInfo = NULL; // receive port information
|
|
PFAX_OUTBOX_CONFIG pOutboxConfig = NULL;
|
|
|
|
//
|
|
// if the user only has read permission, return immediately
|
|
//
|
|
if(!g_bUserCanChangeSettings)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// apply changes here!!
|
|
//
|
|
dwDeviceId = (DWORD)GetWindowLongPtr(hDlg, GWLP_USERDATA);
|
|
|
|
|
|
if(!Connect(hDlg, TRUE))
|
|
{
|
|
//
|
|
// Failed to connect to the Fax Service. Connect() showed the Error Message.
|
|
//
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
if(!FaxGetPortEx(g_hFaxSvcHandle, dwDeviceId, &pFaxPortInfo))
|
|
{
|
|
//
|
|
// Show the Error Message and return with FALSE
|
|
//
|
|
dwRes = GetLastError();
|
|
Error(( "FaxGetPortEx() failed with %d.\n", dwRes));
|
|
goto ClearData;
|
|
}
|
|
|
|
Assert(pFaxPortInfo);
|
|
|
|
//
|
|
// save settings
|
|
//
|
|
pFaxPortInfo->bSend = IsDlgButtonChecked(hDlg, IDC_DEVICE_PROP_SEND) == BST_CHECKED ? TRUE : FALSE;
|
|
if (pFaxPortInfo->bSend)
|
|
{
|
|
//
|
|
// Collect and verify TSID
|
|
//
|
|
GetDlgItemText(hDlg, IDC_DEVICE_PROP_TSID, szTsid, TSID_LIMIT);
|
|
pFaxPortInfo->lptstrTsid = szTsid;
|
|
}
|
|
if(!FaxSetPortEx(g_hFaxSvcHandle, dwDeviceId, pFaxPortInfo))
|
|
{
|
|
//
|
|
// Show the Error Message and return with FALSE
|
|
//
|
|
dwRes = GetLastError();
|
|
Error(( "FaxSetPortEx() failed with %d.\n", dwRes));
|
|
goto ClearData;
|
|
}
|
|
else
|
|
{
|
|
Notify_UnChange(hDlg);
|
|
g_bPortInfoChanged = TRUE;
|
|
}
|
|
|
|
if(!IsDesktopSKU())
|
|
{
|
|
goto ClearData;
|
|
}
|
|
|
|
//
|
|
// save desktop controls
|
|
//
|
|
if(!FaxGetOutboxConfiguration(g_hFaxSvcHandle, &pOutboxConfig))
|
|
{
|
|
//
|
|
// Show Error Message and return FALSE
|
|
//
|
|
dwRes = GetLastError();
|
|
Error(( "FaxGetOutboxConfiguration() failed with %d.\n", dwRes));
|
|
goto ClearData;
|
|
}
|
|
|
|
Assert(pOutboxConfig);
|
|
|
|
//
|
|
// Branding
|
|
//
|
|
pOutboxConfig->bBranding = (IsDlgButtonChecked(hDlg, IDC_BRANDING_CHECK) == BST_CHECKED);
|
|
|
|
//
|
|
// Retries
|
|
//
|
|
dwData = GetDlgItemInt(hDlg, IDC_RETRIES_EDIT, &bRes, FALSE);
|
|
if (!bRes ||
|
|
#if FXS_RETRIES_LOWER > 0
|
|
(dwData < FXS_RETRIES_LOWER) ||
|
|
#endif
|
|
(dwData > FXS_RETRIES_UPPER))
|
|
{
|
|
//
|
|
// Bad data or out of range
|
|
//
|
|
HWND hControl = GetDlgItem(hDlg, IDC_RETRIES_EDIT);
|
|
|
|
dwRes = ERROR_INVALID_DATA;
|
|
SetLastError (ERROR_INVALID_DATA);
|
|
DisplayErrorMessage(hDlg, 0, FAXUI_ERROR_INVALID_RETRIES, FXS_RETRIES_LOWER, FXS_RETRIES_UPPER);
|
|
SendMessage(hControl, EM_SETSEL, 0, -1);
|
|
SetFocus(hControl);
|
|
SetActiveWindow(hControl);
|
|
bErrorDisplayed = TRUE;
|
|
goto ClearData;
|
|
}
|
|
pOutboxConfig->dwRetries = dwData;
|
|
//
|
|
// Retry Delay
|
|
//
|
|
dwData = GetDlgItemInt(hDlg, IDC_RETRYDELAY_EDIT, &bRes, FALSE);
|
|
if (!bRes ||
|
|
#if FXS_RETRYDELAY_LOWER > 0
|
|
(dwData < FXS_RETRYDELAY_LOWER) ||
|
|
#endif
|
|
(dwData > FXS_RETRYDELAY_UPPER))
|
|
{
|
|
//
|
|
// Bad data or out of range
|
|
//
|
|
HWND hControl = GetDlgItem(hDlg, IDC_RETRYDELAY_EDIT);
|
|
|
|
dwRes = ERROR_INVALID_DATA;
|
|
SetLastError (ERROR_INVALID_DATA);
|
|
DisplayErrorMessage(hDlg, 0, FAXUI_ERROR_INVALID_RETRY_DELAY, FXS_RETRYDELAY_LOWER, FXS_RETRYDELAY_UPPER);
|
|
SendMessage(hControl, EM_SETSEL, 0, -1);
|
|
SetFocus(hControl);
|
|
SetActiveWindow(hControl);
|
|
bErrorDisplayed = TRUE;
|
|
goto ClearData;
|
|
}
|
|
pOutboxConfig->dwRetryDelay = dwData;
|
|
//
|
|
// Discount rate start time
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_DISCOUNT_START_TIME, DTM_GETSYSTEMTIME, 0, (LPARAM)&sTime);
|
|
pOutboxConfig->dtDiscountStart.Hour = sTime.wHour;
|
|
pOutboxConfig->dtDiscountStart.Minute = sTime.wMinute;
|
|
//
|
|
// Discount rate stop time
|
|
//
|
|
SendDlgItemMessage(hDlg, IDC_DISCOUNT_STOP_TIME, DTM_GETSYSTEMTIME, 0, (LPARAM)&sTime);
|
|
pOutboxConfig->dtDiscountEnd.Hour = sTime.wHour;
|
|
pOutboxConfig->dtDiscountEnd.Minute = sTime.wMinute;
|
|
|
|
if(!FaxSetOutboxConfiguration(g_hFaxSvcHandle, pOutboxConfig))
|
|
{
|
|
//
|
|
// Show Error Message and return FALSE
|
|
//
|
|
dwRes = GetLastError();
|
|
Error(("FaxSetOutboxConfiguration() failed with %d.\n", dwRes));
|
|
goto ClearData;
|
|
}
|
|
|
|
ClearData:
|
|
FaxFreeBuffer(pOutboxConfig);
|
|
FaxFreeBuffer(pFaxPortInfo);
|
|
DisConnect();
|
|
|
|
|
|
switch (dwRes)
|
|
{
|
|
case ERROR_SUCCESS:
|
|
//
|
|
// Don't do nothing
|
|
//
|
|
break;
|
|
|
|
case FAXUI_ERROR_DEVICE_LIMIT:
|
|
case FAX_ERR_DEVICE_NUM_LIMIT_EXCEEDED:
|
|
//
|
|
// Some additional parameters are needed
|
|
//
|
|
if (!bErrorDisplayed)
|
|
{
|
|
DisplayErrorMessage(hDlg, 0, dwRes, GetDeviceLimit());
|
|
}
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
break;
|
|
|
|
default:
|
|
if (!bErrorDisplayed)
|
|
{
|
|
DisplayErrorMessage(hDlg, 0, dwRes);
|
|
}
|
|
SetWindowLongPtr(hDlg, DWLP_MSGRESULT, PSNRET_INVALID);
|
|
break;
|
|
}
|
|
return (dwRes == 0);
|
|
} // SaveSendChanges
|