Leaked source code of windows server 2003
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

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