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.
1579 lines
40 KiB
1579 lines
40 KiB
/////////////////////////////////////////////////////////////////////////////
|
|
// FILE : ppFaxServerReceipts.cpp //
|
|
// //
|
|
// DESCRIPTION : prop pages of Fax Receipts server defaults //
|
|
// //
|
|
// AUTHOR : yossg //
|
|
// //
|
|
// HISTORY : //
|
|
// Jul 20 2000 yossg New design - all delivery receipts options //
|
|
// Oct 17 2000 yossg //
|
|
// //
|
|
// Copyright (C) 2000 Microsoft Corporation All Rights Reserved //
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "MSFxsSnp.h"
|
|
|
|
#include "ppFaxServerReceipts.h"
|
|
|
|
#include "FaxServer.h"
|
|
#include "FaxServerNode.h"
|
|
|
|
#include "DlgSMTPConfig.h"
|
|
#include "BosSmtpConfigDlg.h"
|
|
|
|
#include "FxsValid.h"
|
|
#include "dlgutils.h"
|
|
#include <windns.h> //DNS_MAX_NAME_BUFFER_LENGTH
|
|
#include <htmlHelp.h> //HtmlHelp()
|
|
#include "resutil.h"
|
|
#include <shlobjp.h>
|
|
#include <shellapi.h>
|
|
#include <faxreg.h>
|
|
#include <faxres.h>
|
|
|
|
EXTERN_C BOOL WINAPI LinkWindow_RegisterClass() ;
|
|
EXTERN_C BOOL WINAPI LinkWindow_UnregisterClass( HINSTANCE ) ;
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
//
|
|
// Constructor
|
|
//
|
|
CppFaxServerReceipts::CppFaxServerReceipts(
|
|
LONG_PTR hNotificationHandle,
|
|
CSnapInItem *pNode,
|
|
BOOL bOwnsNotificationHandle,
|
|
HINSTANCE hInst)
|
|
: CPropertyPageExImpl<CppFaxServerReceipts>(pNode,NULL)
|
|
|
|
{
|
|
m_pParentNode = static_cast <CFaxServerNode *> (pNode);
|
|
m_pFaxReceiptsConfig = NULL;
|
|
|
|
m_fAllReadyToApply = FALSE;
|
|
m_fIsDialogInitiated = FALSE;
|
|
|
|
m_fIsDirty = FALSE;
|
|
|
|
m_enumSmtpAuthOption = FAX_SMTP_AUTH_ANONYMOUS;
|
|
m_bstrUserName = L"";
|
|
|
|
m_fLastGoodIsSMTPRouteConfigured = FALSE;
|
|
|
|
}
|
|
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
CppFaxServerReceipts::~CppFaxServerReceipts()
|
|
{
|
|
if (NULL != m_pFaxReceiptsConfig)
|
|
{
|
|
FaxFreeBuffer( m_pFaxReceiptsConfig );
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CppFaxServerReceipts message handlers
|
|
|
|
/*
|
|
- CppFaxServerReceipts::InitRPC
|
|
-
|
|
* Purpose:
|
|
* Initiates the configuration structure from RPC get Call.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CppFaxServerReceipts::InitRPC()
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::InitRPC"));
|
|
|
|
HRESULT hRc = S_OK;
|
|
DWORD ec = ERROR_SUCCESS;
|
|
|
|
//
|
|
// get RPC Handle
|
|
//
|
|
|
|
if (!m_pFaxServer->GetFaxServerHandle())
|
|
{
|
|
ec= GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
|
|
ec);
|
|
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Retrieve the fax SMTP configuration
|
|
//
|
|
if (!FaxGetReceiptsConfiguration(m_pFaxServer->GetFaxServerHandle(),
|
|
&m_pFaxReceiptsConfig))
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Fail to get mail configuration. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (IsNetworkError(ec))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Network Error was found. (ec: %ld)"),
|
|
ec);
|
|
|
|
m_pFaxServer->Disconnect();
|
|
}
|
|
|
|
goto Error;
|
|
}
|
|
//For max verification
|
|
ATLASSERT(m_pFaxReceiptsConfig);
|
|
|
|
|
|
//
|
|
// Init members - for advance dialog or save operation
|
|
//
|
|
m_enumSmtpAuthOption = m_pFaxReceiptsConfig->SMTPAuthOption;
|
|
|
|
m_bstrUserName = m_pFaxReceiptsConfig->lptstrSMTPUserName;
|
|
if ( !m_bstrUserName)
|
|
{
|
|
ec = ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
DebugPrintEx( DEBUG_ERR,
|
|
_T("Null bstr - out of memory."));
|
|
|
|
goto Error;
|
|
|
|
}
|
|
// m_pszPassword is NULL from the constructor
|
|
// there is no need to read from the server.
|
|
|
|
// init status for unselcting this feature
|
|
// with still assigned devices to this Microsoft SMTP method
|
|
if ( m_pFaxReceiptsConfig->bIsToUseForMSRouteThroughEmailMethod )
|
|
{
|
|
m_fLastGoodIsSMTPRouteConfigured = TRUE;
|
|
}
|
|
|
|
ATLASSERT(ERROR_SUCCESS == ec);
|
|
DebugPrintEx( DEBUG_MSG,
|
|
_T("Succeed to get mail configuration."));
|
|
goto Exit;
|
|
|
|
Error:
|
|
ATLASSERT(ERROR_SUCCESS != ec);
|
|
hRc = HRESULT_FROM_WIN32(ec);
|
|
|
|
ATLASSERT(NULL != m_pParentNode);
|
|
m_pParentNode->NodeMsgBox(GetFaxServerErrorMsg(ec));
|
|
|
|
Exit:
|
|
return (hRc);
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnInitDialog
|
|
-
|
|
* Purpose:
|
|
* Initiates all controls when dialog is called.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
*
|
|
*/
|
|
LRESULT CppFaxServerReceipts::OnInitDialog( UINT uiMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled )
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::OnInitDialog"));
|
|
|
|
UNREFERENCED_PARAMETER( uiMsg );
|
|
UNREFERENCED_PARAMETER( wParam );
|
|
UNREFERENCED_PARAMETER( lParam );
|
|
UNREFERENCED_PARAMETER( fHandled );
|
|
|
|
BOOL fIsUnderLocalUserAccount = FALSE;
|
|
|
|
WCHAR buff[100];
|
|
int count;
|
|
|
|
//
|
|
// Attach
|
|
//
|
|
m_SmtpBox.Attach(GetDlgItem(IDC_SMTP_EDIT));
|
|
m_PortBox.Attach(GetDlgItem(IDC_PORT_EDIT));
|
|
m_AddressBox.Attach(GetDlgItem(IDC_ADDRESS_EDIT));
|
|
|
|
//
|
|
// Limit text length
|
|
//
|
|
m_PortBox.SetLimitText(FXS_MAX_PORT_NUM_LEN);
|
|
m_SmtpBox.SetLimitText(DNS_MAX_NAME_BUFFER_LENGTH);
|
|
m_AddressBox.SetLimitText(FXS_MAX_EMAIL_ADDRESS);
|
|
|
|
//
|
|
// init controls
|
|
//
|
|
ATLASSERT(NULL != m_pFaxReceiptsConfig);
|
|
|
|
//
|
|
// Port
|
|
//
|
|
count = swprintf(buff,
|
|
L"%ld", m_pFaxReceiptsConfig->dwSMTPPort);
|
|
|
|
ATLASSERT(count > 0);
|
|
if( count > 0 )
|
|
{
|
|
m_PortBox.SetWindowText(buff);
|
|
}
|
|
|
|
//
|
|
//
|
|
//
|
|
m_SmtpBox.SetWindowText (m_pFaxReceiptsConfig->lptstrSMTPServer);
|
|
m_AddressBox.SetWindowText(m_pFaxReceiptsConfig->lptstrSMTPFrom);
|
|
|
|
if (m_fLastGoodIsSMTPRouteConfigured)
|
|
{
|
|
CheckDlgButton(IDC_SMTP_ROUTE_CHECK, BST_CHECKED);
|
|
}
|
|
|
|
DWORD dwReceiptsOptions = m_pFaxReceiptsConfig->dwAllowedReceipts;
|
|
if (DRT_NONE == dwReceiptsOptions && !m_fLastGoodIsSMTPRouteConfigured)
|
|
{
|
|
EnableSmtpFields(FALSE);
|
|
}
|
|
else
|
|
{
|
|
if( dwReceiptsOptions & DRT_EMAIL )
|
|
{
|
|
CheckDlgButton(IDC_RECEIPT_ENABLE_SMTP_CHECK, BST_CHECKED);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton(IDC_RECEIPT_ENABLE_SMTP_CHECK, BST_UNCHECKED);
|
|
if (!m_fLastGoodIsSMTPRouteConfigured)
|
|
{
|
|
EnableSmtpFields(FALSE);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton(IDC_SMTP_ROUTE_CHECK, BST_CHECKED);
|
|
}
|
|
}
|
|
|
|
if ( dwReceiptsOptions & DRT_MSGBOX )
|
|
{
|
|
CheckDlgButton(IDC_RECEIPT_ENABLE_MSGBOX_CHECK, BST_CHECKED);
|
|
}
|
|
else
|
|
{
|
|
CheckDlgButton(IDC_RECEIPT_ENABLE_MSGBOX_CHECK, BST_UNCHECKED);
|
|
}
|
|
}
|
|
|
|
m_fIsDialogInitiated = TRUE;
|
|
|
|
return(1);
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::SetProps
|
|
-
|
|
* Purpose:
|
|
* Sets properties on apply.
|
|
*
|
|
* Arguments:
|
|
* IN pCtrlFocus - focus pointer (int)
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CppFaxServerReceipts::SetProps(int *pCtrlFocus, UINT * puIds)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::SetProps"));
|
|
HRESULT hRc = S_OK;
|
|
DWORD ec = ERROR_SUCCESS;
|
|
|
|
BOOL fSkipMessage = FALSE;
|
|
|
|
|
|
CComBSTR bstrSmtpSever,
|
|
bstrPort,
|
|
bstrSenderAddress;
|
|
DWORD dwPort;
|
|
|
|
BOOL fIsSMTPRouteConfigured = FALSE;
|
|
BOOL fIsSMTPReceiptsConfigured = FALSE;
|
|
|
|
FAX_RECEIPTS_CONFIG FaxReceiptsConfig;
|
|
|
|
|
|
*pCtrlFocus = 0; //safty
|
|
|
|
|
|
ATLASSERT(TRUE == m_fAllReadyToApply);
|
|
m_fAllReadyToApply = FALSE;
|
|
|
|
|
|
//
|
|
// Collect all data and init the structure's fields
|
|
// uses Copy() to copy and also allocate before
|
|
//
|
|
|
|
//
|
|
// This operation is very important for the case of unchecked email option
|
|
// the service will neglect the SMTP fields.
|
|
//
|
|
ZeroMemory (&FaxReceiptsConfig, sizeof(FaxReceiptsConfig));
|
|
|
|
FaxReceiptsConfig.dwSizeOfStruct = sizeof(FAX_RECEIPTS_CONFIG);
|
|
|
|
FaxReceiptsConfig.dwAllowedReceipts = DRT_NONE; // 0x0000
|
|
|
|
fIsSMTPRouteConfigured = (IsDlgButtonChecked(IDC_SMTP_ROUTE_CHECK) == BST_CHECKED);
|
|
|
|
//
|
|
// While tring to sumbmit unchecking of IDC_SMTP_ROUTE_CHECK
|
|
// Special search for any left assigned devices' to Microsoft e-mail routing method
|
|
//
|
|
if ( !fIsSMTPRouteConfigured && m_fLastGoodIsSMTPRouteConfigured)
|
|
{
|
|
//Call function that will make loop on all FaxEnumPorts(/Ex) and FaxEnumRoutingMethods
|
|
//and will pop-up ErrMsgBox in case in any Device The SMTP Microsoft Route
|
|
//Through e-mail method is still enabled while the user tries to unchecked.
|
|
|
|
if (IsMsSMTPRoutingMethodStillAssigned())
|
|
{
|
|
PropSheet_SetCurSelByID( GetParent(), IDD);
|
|
ATLASSERT(::IsWindow(m_hWnd));
|
|
PageError(IDS_MS_SMTPROUTINGMETHOD_ASSIGNED, m_hWnd);
|
|
|
|
fSkipMessage = TRUE;
|
|
|
|
goto Error;
|
|
}
|
|
}
|
|
|
|
//
|
|
// SMTP server details
|
|
//
|
|
if ( IsDlgButtonChecked(IDC_RECEIPT_ENABLE_SMTP_CHECK) == BST_CHECKED )
|
|
{
|
|
fIsSMTPReceiptsConfigured = TRUE;
|
|
FaxReceiptsConfig.dwAllowedReceipts |= DRT_EMAIL;
|
|
}
|
|
|
|
if (
|
|
fIsSMTPReceiptsConfigured
|
|
||
|
|
fIsSMTPRouteConfigured
|
|
)
|
|
{
|
|
if ( !m_SmtpBox.GetWindowText(&bstrSmtpSever))
|
|
{
|
|
*pCtrlFocus = IDC_SMTP_EDIT;
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Failed to GetWindowText(&bstrSmtpSever)"));
|
|
ec = ERROR_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
if ( !m_PortBox.GetWindowText(&bstrPort))
|
|
{
|
|
*pCtrlFocus = IDC_PORT_EDIT;
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Failed to GetWindowText(&bstrPort)"));
|
|
ec = ERROR_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
if ( !m_AddressBox.GetWindowText(&bstrSenderAddress))
|
|
{
|
|
*pCtrlFocus = IDC_SMTP_EDIT;
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Failed to GetWindowText(&bstrSenderAddress)"));
|
|
ec = ERROR_OUTOFMEMORY;
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Validation
|
|
//
|
|
if (!IsValidData(bstrSmtpSever,
|
|
bstrPort,
|
|
&dwPort,
|
|
bstrSenderAddress,
|
|
pCtrlFocus,
|
|
puIds)
|
|
)
|
|
{
|
|
ATLASSERT(pCtrlFocus);
|
|
ATLASSERT(puIds);
|
|
ec = ERROR_INVALID_DATA;
|
|
|
|
//in this case detailed message box was given by the called functions
|
|
fSkipMessage = TRUE;
|
|
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// subtitute all data
|
|
//
|
|
FaxReceiptsConfig.lptstrSMTPServer = bstrSmtpSever;
|
|
|
|
FaxReceiptsConfig.dwSMTPPort = dwPort;
|
|
|
|
FaxReceiptsConfig.lptstrSMTPFrom = bstrSenderAddress;
|
|
|
|
FaxReceiptsConfig.SMTPAuthOption = m_enumSmtpAuthOption;
|
|
|
|
FaxReceiptsConfig.lptstrSMTPUserName = m_bstrUserName;
|
|
|
|
FaxReceiptsConfig.lptstrSMTPPassword = m_bstrPassword;
|
|
|
|
}
|
|
|
|
//
|
|
// Set dwAllowedReceipts
|
|
//
|
|
FaxReceiptsConfig.bIsToUseForMSRouteThroughEmailMethod = fIsSMTPRouteConfigured;
|
|
|
|
|
|
//
|
|
// Message box
|
|
//
|
|
if (IsDlgButtonChecked(IDC_RECEIPT_ENABLE_MSGBOX_CHECK) == BST_CHECKED)
|
|
{
|
|
FaxReceiptsConfig.dwAllowedReceipts |= DRT_MSGBOX;
|
|
}
|
|
|
|
//
|
|
// get RPC Handle
|
|
//
|
|
if (!m_pFaxServer->GetFaxServerHandle())
|
|
{
|
|
ec= GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
|
|
ec);
|
|
|
|
goto Error;
|
|
}
|
|
|
|
|
|
//
|
|
// Set Config
|
|
//
|
|
if (!FaxSetReceiptsConfiguration(
|
|
m_pFaxServer->GetFaxServerHandle(),
|
|
&FaxReceiptsConfig))
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Fail to Set receipts configuration. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (IsNetworkError(ec))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Network Error was found. (ec: %ld)"),
|
|
ec);
|
|
|
|
m_pFaxServer->Disconnect();
|
|
}
|
|
|
|
goto Error;
|
|
}
|
|
|
|
ATLASSERT(ERROR_SUCCESS == ec);
|
|
|
|
m_fLastGoodIsSMTPRouteConfigured = fIsSMTPRouteConfigured;
|
|
|
|
DebugPrintEx( DEBUG_MSG,
|
|
_T("Succeed to set receipts configuration."));
|
|
|
|
m_fIsDirty = FALSE;
|
|
|
|
goto Exit;
|
|
|
|
Error:
|
|
ATLASSERT(ERROR_SUCCESS != ec);
|
|
hRc = HRESULT_FROM_WIN32(ec);
|
|
|
|
if (!fSkipMessage)
|
|
{
|
|
PropSheet_SetCurSelByID( GetParent(), IDD);
|
|
ATLASSERT(::IsWindow(m_hWnd));
|
|
PageError(GetFaxServerErrorMsg(ec), m_hWnd);
|
|
}
|
|
|
|
Exit:
|
|
return hRc;
|
|
}
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::PreApply
|
|
-
|
|
* Purpose:
|
|
* Checks data validity before apply.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code
|
|
*/
|
|
HRESULT CppFaxServerReceipts::PreApply(int *pCtrlFocus, UINT * puIds)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::PreApply"));
|
|
HRESULT hRc = S_OK;
|
|
|
|
//
|
|
// PreApply Checks
|
|
//
|
|
if (!AllReadyToApply(/*fSilent =*/ FALSE, pCtrlFocus , puIds))
|
|
{
|
|
m_fAllReadyToApply = FALSE;
|
|
SetModified(FALSE);
|
|
hRc = E_FAIL ;
|
|
}
|
|
else
|
|
{
|
|
m_fAllReadyToApply = TRUE;
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
return(hRc);
|
|
}
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnApply
|
|
-
|
|
* Purpose:
|
|
* Calls PreApply and SetProp to Apply changes.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* TRUE or FALSE
|
|
*/
|
|
BOOL CppFaxServerReceipts::OnApply()
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::OnApply"));
|
|
HRESULT hRc = S_OK;
|
|
int CtrlFocus = 0;
|
|
UINT uIds = 0;
|
|
|
|
if (!m_fIsDirty)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
hRc = PreApply(&CtrlFocus, &uIds);
|
|
if (FAILED(hRc))
|
|
{
|
|
if (PropSheet_SetCurSelByID( GetParent(), IDD) )
|
|
{
|
|
PageError(uIds, m_hWnd, _Module.GetResourceInstance());
|
|
|
|
if (CtrlFocus)
|
|
{
|
|
GotoDlgCtrl(GetDlgItem(CtrlFocus));
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
else //(Succeeded(hRc))
|
|
{
|
|
hRc = SetProps(&CtrlFocus, &uIds);
|
|
if (FAILED(hRc))
|
|
{
|
|
if (uIds)
|
|
{
|
|
if (PropSheet_SetCurSelByID( GetParent(), IDD) )
|
|
{
|
|
PageError(uIds, m_hWnd, _Module.GetResourceInstance());
|
|
|
|
if (CtrlFocus)
|
|
{
|
|
GotoDlgCtrl(GetDlgItem(CtrlFocus));
|
|
}
|
|
}
|
|
}
|
|
//else Error Msg by called func.
|
|
return FALSE;
|
|
}
|
|
else //(Succeeded(hRc))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::SetApplyButton
|
|
-
|
|
* Purpose:
|
|
* set Apply buttom modified.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
LRESULT CppFaxServerReceipts::SetApplyButton(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
SetModified(TRUE);
|
|
bHandled = TRUE;
|
|
return(1);
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::EnableSmtpFields
|
|
-
|
|
* Purpose:
|
|
* Enable/dissable Authenticated Access dialog controls.
|
|
*
|
|
* Arguments:
|
|
* [in] state - boolean value to enable TRUE or FALSE to disable
|
|
*
|
|
* Return:
|
|
* void
|
|
*/
|
|
void CppFaxServerReceipts::EnableSmtpFields(BOOL state)
|
|
{
|
|
|
|
::EnableWindow(GetDlgItem(IDC_ADDRESS_STATIC), state);
|
|
::EnableWindow(GetDlgItem(IDC_ADDRESS_EDIT), state);
|
|
|
|
::EnableWindow(GetDlgItem(IDC_SMTP_STATIC), state);
|
|
::EnableWindow(GetDlgItem(IDC_SMTP_EDIT), state);
|
|
|
|
::EnableWindow(GetDlgItem(IDC_PORT_STATIC), state);
|
|
::EnableWindow(GetDlgItem(IDC_PORT_EDIT), state);
|
|
|
|
::EnableWindow(GetDlgItem(IDC_AUTHENTICATION_BUTTON), state);
|
|
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnMsgBoxDeliveryOptionChecked
|
|
-
|
|
* Purpose:
|
|
* Handles the checking/unchecking of the 'Msg box' receipt checkbox.
|
|
* Checks if the Messenger service is disabled.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
LRESULT CppFaxServerReceipts::OnMsgBoxDeliveryOptionChecked(
|
|
WORD wNotifyCode,
|
|
WORD wID,
|
|
HWND hWndCtl,
|
|
BOOL& bHandled)
|
|
{
|
|
if (!m_fIsDialogInitiated)
|
|
{
|
|
//
|
|
// Event receieved too early
|
|
//
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
m_fIsDirty = TRUE;
|
|
}
|
|
|
|
if (BST_CHECKED == IsDlgButtonChecked(IDC_RECEIPT_ENABLE_MSGBOX_CHECK))
|
|
{
|
|
//
|
|
// The 'Allow message boxes receipt' check-box was just checked
|
|
//
|
|
DWORD dwMessengerStartupType;
|
|
ATLASSERT(m_pParentNode);
|
|
CComBSTR bstrServerName = m_pParentNode->GetServerName();
|
|
if (ERROR_SUCCESS == GetServiceStartupType (bstrServerName, MESSENGER_SERVICE_NAME, &dwMessengerStartupType))
|
|
{
|
|
if (SERVICE_DISABLED == dwMessengerStartupType)
|
|
{
|
|
//
|
|
// Ooops. The Messenger service is disabled. We can't send message boxes.
|
|
// Ask the user if he want's us to enable the messenger service.
|
|
//
|
|
WCHAR wszTitle[MAX_PATH * 2];
|
|
WCHAR wszQuestion[MAX_PATH * 2];
|
|
|
|
if (LoadString( _Module.GetResourceInstance(),
|
|
IDS_FAX_WRN_MESSENGER_TITLE,
|
|
wszTitle,
|
|
ARR_SIZE (wszTitle)) &&
|
|
LoadString( _Module.GetResourceInstance(),
|
|
IDS_FAX_WRN_MESSENGER_DISABLED,
|
|
wszQuestion,
|
|
ARR_SIZE (wszQuestion)))
|
|
|
|
{
|
|
if (IDYES == AlignedMessageBox (m_hWnd, wszQuestion, wszTitle, MB_YESNO | MB_ICONWARNING))
|
|
{
|
|
//
|
|
// User chose to enble the Messenger service
|
|
//
|
|
HCURSOR hOldCursor = SetCursor (LoadCursor (NULL, IDC_WAIT));
|
|
DWORD dwRes = SetServiceStartupType (bstrServerName, MESSENGER_SERVICE_NAME, SERVICE_AUTO_START);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
PageError(GetErrorStringId(dwRes), m_hWnd, _Module.GetResourceInstance());
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Also start it
|
|
//
|
|
dwRes = StartServiceEx (bstrServerName, MESSENGER_SERVICE_NAME, 0, NULL, INFINITE);
|
|
if (ERROR_SUCCESS != dwRes)
|
|
{
|
|
PageError(GetErrorStringId(dwRes), m_hWnd, _Module.GetResourceInstance());
|
|
}
|
|
}
|
|
SetCursor (hOldCursor);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (AllReadyToApply(TRUE))
|
|
{
|
|
m_fAllReadyToApply = TRUE;
|
|
SetModified(TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_fAllReadyToApply = FALSE;
|
|
SetModified(FALSE);
|
|
}
|
|
|
|
return 1;
|
|
} // CppFaxServerReceipts::OnMsgBoxDeliveryOptionChecked
|
|
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnDeliveryOptionChecked
|
|
-
|
|
* Purpose:
|
|
* Gray/Ungray controls
|
|
* Enable apply button.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
LRESULT CppFaxServerReceipts::OnDeliveryOptionChecked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
BOOL fState;
|
|
|
|
if (!m_fIsDialogInitiated) //event receieved in too early stage
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
m_fIsDirty = TRUE;
|
|
}
|
|
|
|
|
|
fState = (
|
|
IsDlgButtonChecked(IDC_RECEIPT_ENABLE_SMTP_CHECK) == BST_CHECKED
|
|
||
|
|
IsDlgButtonChecked(IDC_SMTP_ROUTE_CHECK) == BST_CHECKED
|
|
);
|
|
|
|
EnableSmtpFields(fState);
|
|
|
|
if (AllReadyToApply(TRUE))
|
|
{
|
|
m_fAllReadyToApply = TRUE;
|
|
SetModified(TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_fAllReadyToApply = FALSE;
|
|
SetModified(FALSE);
|
|
}
|
|
|
|
return(1);
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnAuthenticationButtonClicked
|
|
-
|
|
* Purpose:
|
|
* To allow opening of the advance SMTP configuration server.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
LRESULT CppFaxServerReceipts::OnAuthenticationButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::OnAuthenticationButtonClicked"));
|
|
|
|
INT_PTR rc = IDCANCEL;
|
|
HRESULT hRc = S_OK;
|
|
DWORD dwRet = ERROR_SUCCESS;
|
|
|
|
if(m_pFaxServer->GetServerAPIVersion() == FAX_API_VERSION_0)
|
|
{
|
|
//
|
|
// The remote fax server is SBS/BOS 2000
|
|
// it uses different authentication mechanism
|
|
//
|
|
OpenBosAuthenticationDlg();
|
|
return 1;
|
|
}
|
|
|
|
CDlgSMTPConfig DlgSMTPConfig;
|
|
|
|
|
|
//
|
|
// Dialog to configure SMTP authentication mode
|
|
//
|
|
hRc = DlgSMTPConfig.InitSmtpDlg(
|
|
m_enumSmtpAuthOption,
|
|
m_bstrUserName);
|
|
if (FAILED(hRc))
|
|
{
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
goto Cleanup;
|
|
}
|
|
|
|
rc = DlgSMTPConfig.DoModal();
|
|
if (rc != IDOK)
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
//else
|
|
m_enumSmtpAuthOption = DlgSMTPConfig.GetAuthenticationOption();
|
|
|
|
if (
|
|
FAX_SMTP_AUTH_BASIC == m_enumSmtpAuthOption
|
|
||
|
|
FAX_SMTP_AUTH_NTLM == m_enumSmtpAuthOption
|
|
)
|
|
{
|
|
|
|
m_bstrUserName = DlgSMTPConfig.GetUserName();
|
|
if (!m_bstrUserName)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Null memeber BSTR - m_bstrUserName."));
|
|
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
|
|
goto Cleanup;
|
|
}
|
|
|
|
if ( DlgSMTPConfig.IsPasswordModified() )
|
|
{
|
|
m_bstrPassword = DlgSMTPConfig.GetPassword();
|
|
if (!m_bstrPassword)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory while setting m_bstrPassword"));
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_bstrPassword.Empty();
|
|
}
|
|
}
|
|
|
|
|
|
m_fIsDirty = TRUE;
|
|
|
|
|
|
if (AllReadyToApply(TRUE))
|
|
{
|
|
m_fAllReadyToApply = TRUE;
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
Cleanup:
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OpenBosAuthenticationDlg
|
|
-
|
|
* Purpose:
|
|
* Open the old (BOS/SBS 2000) version of Authentication dialog.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
LRESULT CppFaxServerReceipts::OpenBosAuthenticationDlg()
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::OnAuthenticationButtonClicked"));
|
|
|
|
INT_PTR rc = IDOK;
|
|
HRESULT hRc = S_OK;
|
|
DWORD dwRet = ERROR_SUCCESS;
|
|
|
|
CBosSmtpConfigDlg DlgSMTPConfig;
|
|
|
|
//
|
|
// IsUnderLocalUserAccount.
|
|
//
|
|
BOOL fIsUnderLocalUserAccount = FALSE;
|
|
|
|
hRc = IsUnderLocalUserAccount(&fIsUnderLocalUserAccount);
|
|
if ( S_OK != hRc )
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,
|
|
_T("IsUnderLocalUserAccount failed. (hRc: %08X)"),
|
|
hRc);
|
|
goto Cleanup;
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Dialog to configure SMTP authentication mode
|
|
//
|
|
hRc = DlgSMTPConfig.InitSmtpDlg(
|
|
m_enumSmtpAuthOption,
|
|
m_bstrUserName,
|
|
fIsUnderLocalUserAccount);
|
|
if (FAILED(hRc))
|
|
{
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
goto Cleanup;
|
|
}
|
|
|
|
rc = DlgSMTPConfig.DoModal();
|
|
if (rc != IDOK)
|
|
{
|
|
goto Cleanup;
|
|
}
|
|
|
|
//else
|
|
|
|
m_bstrUserName = DlgSMTPConfig.GetUserName();
|
|
if (!m_bstrUserName)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory while setting m_bstrUserName"));
|
|
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
|
|
goto Cleanup;
|
|
}
|
|
|
|
if (DlgSMTPConfig.IsPasswordModified())
|
|
{
|
|
m_bstrPassword = DlgSMTPConfig.GetPassword();
|
|
if (!m_bstrPassword)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory while setting m_bstrPassword"));
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_bstrPassword.Empty();
|
|
}
|
|
|
|
m_enumSmtpAuthOption = DlgSMTPConfig.GetAuthenticationOption();
|
|
|
|
m_fIsDirty = TRUE;
|
|
|
|
|
|
if (AllReadyToApply(TRUE))
|
|
{
|
|
m_fAllReadyToApply = TRUE;
|
|
SetModified(TRUE);
|
|
}
|
|
|
|
|
|
Cleanup:
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::IsUnderLocalUserAccount
|
|
-
|
|
* Purpose:
|
|
* Check if fax service Is running Under LocalUser Account.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* OLE error code.
|
|
*/
|
|
HRESULT CppFaxServerReceipts::IsUnderLocalUserAccount(OUT BOOL * pfIsUnderLocalUserAccount)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::IsUnderLocalUserAccount"));
|
|
|
|
HRESULT hRc = S_OK;
|
|
DWORD dwRet = ERROR_SUCCESS;
|
|
|
|
ATLASSERT(m_pParentNode);
|
|
CComBSTR bstrServerName = m_pParentNode->GetServerName();
|
|
if (!bstrServerName)
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("Out of memory. Failed to load server name string."));
|
|
|
|
m_pParentNode->NodeMsgBox(IDS_MEMORY);
|
|
|
|
hRc = E_OUTOFMEMORY;
|
|
|
|
goto Cleanup;
|
|
}
|
|
|
|
if (0 == bstrServerName.Length())
|
|
{
|
|
dwRet= IsFaxServiceRunningUnderLocalSystemAccount(NULL, pfIsUnderLocalUserAccount);
|
|
}
|
|
else
|
|
{
|
|
dwRet= IsFaxServiceRunningUnderLocalSystemAccount(bstrServerName.m_str, pfIsUnderLocalUserAccount);
|
|
}
|
|
if(ERROR_SUCCESS != dwRet)
|
|
{
|
|
DebugPrintEx(DEBUG_ERR,
|
|
_T("IsFaxServiceRunningUnderLocalSystemAccount failed: %d\n"),
|
|
dwRet);
|
|
|
|
hRc = HRESULT_FROM_WIN32(dwRet);
|
|
|
|
goto Cleanup;
|
|
}
|
|
ATLASSERT( S_OK == hRc);
|
|
|
|
Cleanup:
|
|
|
|
return hRc;
|
|
}
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::IsValidData
|
|
-
|
|
* Purpose:
|
|
* To validate all data types before save data.
|
|
* This level should be responsible that detailed
|
|
* error description will be shown to user.
|
|
*
|
|
* Arguments:
|
|
* [in] BSTRs and DWORDs
|
|
* [out] dwPort pointer to DWORD that
|
|
* was derived from the port bstr if validation success.
|
|
* [out] iFocus
|
|
*
|
|
* Return:
|
|
* BOOOLEAN
|
|
*/
|
|
BOOL CppFaxServerReceipts::IsValidData(BSTR bstrSmtpSever,
|
|
BSTR bstrPort,
|
|
DWORD *pdwPort,
|
|
BSTR bstrSenderAddress,
|
|
int *pCtrlFocus,
|
|
UINT *pIds)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::IsValidData"));
|
|
|
|
UINT uRetIDS = 0;
|
|
|
|
ATLASSERT(pdwPort);
|
|
|
|
if (!IsValidPortNumber(bstrPort, pdwPort, &uRetIDS))
|
|
{
|
|
ATLASSERT(0 != uRetIDS);
|
|
DebugPrintEx( DEBUG_ERR,
|
|
_T("Invalid port number."));
|
|
*pCtrlFocus = IDC_PORT_EDIT;
|
|
|
|
goto Error;
|
|
}
|
|
|
|
if (!IsValidServerNameString(bstrSmtpSever, &uRetIDS, TRUE /*DNS NAME LENGTH*/))
|
|
{
|
|
ATLASSERT(0 != uRetIDS);
|
|
DebugPrintEx( DEBUG_ERR,
|
|
_T("Invalid SMTP server name."));
|
|
*pCtrlFocus = IDC_SMTP_USERNAME_EDIT;
|
|
|
|
goto Error;
|
|
}
|
|
|
|
if (!IsNotEmptyString(bstrSenderAddress))
|
|
{
|
|
DebugPrintEx( DEBUG_ERR,
|
|
_T("Sender address string empty or spaces only."));
|
|
uRetIDS = IDS_SENDER_ADDRESS_EMPTY;
|
|
|
|
*pCtrlFocus = IDC_SMTP_PASSWORD_EDIT;
|
|
|
|
goto Error;
|
|
}
|
|
|
|
|
|
ATLASSERT(0 == uRetIDS);
|
|
goto Exit;
|
|
|
|
Error:
|
|
ATLASSERT(0 != uRetIDS);
|
|
|
|
*pIds = uRetIDS;
|
|
|
|
return FALSE;
|
|
|
|
Exit:
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::AllReadyToApply
|
|
-
|
|
* Purpose:
|
|
* This function validate that no zero length strings
|
|
* are found data areas that should be saved.
|
|
*
|
|
* Arguments:
|
|
* [in] fSilent - boolean who defines if to pop up messages (FALSE)
|
|
* or not.(TRUE)
|
|
*
|
|
* Return:
|
|
* BOOOLEAN
|
|
*/
|
|
BOOL CppFaxServerReceipts::AllReadyToApply(BOOL fSilent, int *pCtrlFocus, UINT *pIds)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::AllReadyToApply"));
|
|
|
|
DWORD ec = ERROR_SUCCESS;
|
|
|
|
if (
|
|
IsDlgButtonChecked(IDC_RECEIPT_ENABLE_SMTP_CHECK) == BST_CHECKED
|
|
||
|
|
IsDlgButtonChecked(IDC_SMTP_ROUTE_CHECK) == BST_CHECKED
|
|
)
|
|
{
|
|
if ( !m_SmtpBox.GetWindowTextLength() )
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Zero text length - m_SmtpBox. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (!fSilent)
|
|
{
|
|
*pIds = IDS_SERVERNAME_EMPTY_STRING;
|
|
*pCtrlFocus = IDC_SMTP_EDIT;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
if ( !m_PortBox.GetWindowTextLength() )
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Zero text length - m_PortBox. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (!fSilent)
|
|
{
|
|
*pIds = IDS_PORT_EMPTY_STRING;
|
|
*pCtrlFocus = IDC_PORT_EDIT;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
if ( !m_AddressBox.GetWindowTextLength() )
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Zero text length - m_AddressBox. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (!fSilent)
|
|
{
|
|
*pIds = IDS_SENDER_ADDRESS_EMPTY;
|
|
*pCtrlFocus = IDC_ADDRESS_EDIT;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
}
|
|
ATLASSERT(ERROR_SUCCESS == ec);
|
|
|
|
//
|
|
// Cheers!
|
|
// ...every thing ready to apply now.
|
|
//
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnTextChanged
|
|
-
|
|
* Purpose:
|
|
* Enable/Disable the submit button.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
LRESULT CppFaxServerReceipts::OnTextChanged(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::OnTextChanged"));
|
|
|
|
if (!m_fIsDialogInitiated) //event receieved in too early stage
|
|
{
|
|
return 0;
|
|
}
|
|
else
|
|
{
|
|
m_fIsDirty = TRUE;
|
|
}
|
|
|
|
if (AllReadyToApply(TRUE))
|
|
{
|
|
m_fAllReadyToApply = TRUE;
|
|
SetModified(TRUE);
|
|
}
|
|
else
|
|
{
|
|
m_fAllReadyToApply = FALSE;
|
|
SetModified(FALSE);
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::IsMsSMTPRoutingMethodStillAssigned
|
|
-
|
|
* Purpose:
|
|
* This function makes loop on all FaxEnumPortsEx and FaxEnumRoutingMethods
|
|
* and should pop-up ErrMsgBox in case in any Device The SMTP Microsoft Route
|
|
* Through e-mail method is still enabled while the user tries to unchecked.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* BOOOLEAN
|
|
*/
|
|
BOOL CppFaxServerReceipts::IsMsSMTPRoutingMethodStillAssigned()
|
|
{
|
|
DEBUG_FUNCTION_NAME( _T("CppFaxServerReceipts::IsMsSMTPRoutingMethodStillAssigned"));
|
|
|
|
DWORD ec = ERROR_SUCCESS;
|
|
|
|
PFAX_PORT_INFO_EX pFaxDevicesConfig;
|
|
DWORD dwNumOfDevices;
|
|
|
|
PFAX_ROUTING_METHOD pFaxInboundMethodsConfig;
|
|
DWORD dwNumOfInboundMethods;
|
|
|
|
DWORD dwIndex = 0;
|
|
|
|
//
|
|
// get Fax Handle
|
|
//
|
|
ATLASSERT(m_pFaxServer);
|
|
|
|
if (!m_pFaxServer->GetFaxServerHandle())
|
|
{
|
|
ec= GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
|
|
ec);
|
|
|
|
goto Error;
|
|
}
|
|
|
|
//
|
|
// Retrieve the fax devices configuration
|
|
//
|
|
if (!FaxEnumPortsEx(m_pFaxServer->GetFaxServerHandle(),
|
|
&pFaxDevicesConfig,
|
|
&dwNumOfDevices))
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Fail to get devices configuration. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (IsNetworkError(ec))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Network Error was found. (ec: %ld)"),
|
|
ec);
|
|
|
|
m_pFaxServer->Disconnect();
|
|
}
|
|
|
|
goto Error;
|
|
}
|
|
//For max verification
|
|
ATLASSERT(pFaxDevicesConfig);
|
|
|
|
for (dwIndex = 0; dwIndex < dwNumOfDevices; dwIndex++)
|
|
{
|
|
HANDLE hFaxPortHandle = NULL;
|
|
|
|
//
|
|
// only a PORT_OPEN_QUERY is needed to show the methods
|
|
// the handle with PORT_OPEN_MODIFY priviledge will be
|
|
// given for limited short period for opertion required it.
|
|
//
|
|
|
|
if (!FaxOpenPort( m_pFaxServer->GetFaxServerHandle(),
|
|
pFaxDevicesConfig[dwIndex].dwDeviceID,
|
|
PORT_OPEN_QUERY,
|
|
&hFaxPortHandle ))
|
|
{
|
|
ec = GetLastError();
|
|
|
|
if (ERROR_INVALID_HANDLE == ec)
|
|
{
|
|
//Special case of ERROR_INVALID_HANDLE
|
|
DebugPrintEx(DEBUG_ERR,
|
|
_T("FaxOpenPort() failed with ERROR_INVALID_HANDLE. (ec:%ld)"),
|
|
ec);
|
|
|
|
PropSheet_SetCurSelByID( GetParent(), IDD);
|
|
ATLASSERT(::IsWindow(m_hWnd));
|
|
PageError(IDS_OPENPORT_INVALID_HANDLE, m_hWnd);
|
|
|
|
goto Exit;
|
|
}
|
|
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("FaxOpenPort() failed. (ec:%ld)"),
|
|
ec);
|
|
|
|
goto Error;
|
|
}
|
|
ATLASSERT(NULL != hFaxPortHandle);
|
|
|
|
//
|
|
// Retrieve the fax Inbound Methods configuration
|
|
//
|
|
if (!FaxEnumRoutingMethods(hFaxPortHandle,
|
|
&pFaxInboundMethodsConfig,
|
|
&dwNumOfInboundMethods))
|
|
{
|
|
ec = GetLastError();
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Fail to get Inbound Methods configuration. (ec: %ld)"),
|
|
ec);
|
|
|
|
if (NULL != hFaxPortHandle)
|
|
{
|
|
if (!FaxClose( hFaxPortHandle ))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("FaxClose() on port handle failed (ec: %ld)"),
|
|
GetLastError());
|
|
}
|
|
}
|
|
|
|
|
|
if (IsNetworkError(ec))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
_T("Network Error was found. (ec: %ld)"),
|
|
ec);
|
|
|
|
m_pFaxServer->Disconnect();
|
|
}
|
|
|
|
goto Error;
|
|
}
|
|
//For max verification
|
|
ATLASSERT(pFaxInboundMethodsConfig);
|
|
|
|
//
|
|
// Close Fax Port handle
|
|
//
|
|
if (NULL != hFaxPortHandle)
|
|
{
|
|
if (!FaxClose( hFaxPortHandle ))
|
|
{
|
|
DebugPrintEx(
|
|
DEBUG_ERR,
|
|
TEXT("FaxClose() on port handle failed (ec: %ld)"),
|
|
GetLastError());
|
|
}
|
|
}
|
|
|
|
//
|
|
// Main loop search for MS email routing method's GUID
|
|
//
|
|
for ( DWORD dwMethodsIndex = 0; dwMethodsIndex < dwNumOfInboundMethods; dwMethodsIndex++ )
|
|
{
|
|
pFaxInboundMethodsConfig[dwMethodsIndex];
|
|
if (CSTR_EQUAL == CompareString(LOCALE_INVARIANT,
|
|
NORM_IGNORECASE,
|
|
pFaxInboundMethodsConfig[dwMethodsIndex].Guid,
|
|
-1,
|
|
REGVAL_RM_EMAIL_GUID,
|
|
-1))
|
|
{
|
|
if (pFaxInboundMethodsConfig[dwMethodsIndex].Enabled)
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
ATLASSERT(ERROR_SUCCESS == ec);
|
|
|
|
goto Exit;
|
|
|
|
Error:
|
|
|
|
|
|
PropSheet_SetCurSelByID( GetParent(), IDD);
|
|
ATLASSERT(::IsWindow(m_hWnd));
|
|
PageError(GetFaxServerErrorMsg(ec), m_hWnd);
|
|
|
|
Exit:
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
/*
|
|
- CppFaxServerReceipts::OnHelpLinkClicked
|
|
-
|
|
* Purpose:
|
|
* On HTML like link was clicked open chm help window.
|
|
*
|
|
* Arguments:
|
|
*
|
|
* Return:
|
|
* 1
|
|
*/
|
|
#define FAX_USER_ACCOUNT_HELP FAX_ADMIN_HELP_FILE TEXT("::/FaxS_H_UserAcct.htm")
|
|
LRESULT CppFaxServerReceipts::OnHelpLinkClicked(int idCtrl, LPNMHDR pNMHDR, BOOL& bHandled)
|
|
{
|
|
|
|
ATLASSERT( IDC_RECEIPTS_HELP_LINK == idCtrl);
|
|
|
|
if (!m_fIsDialogInitiated) //event receieved in too early stage
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
HtmlHelp(m_hWnd, FAX_USER_ACCOUNT_HELP, HH_DISPLAY_TOC, NULL);
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
/*++
|
|
|
|
CppFaxServerReceipts::OnHelpRequest
|
|
|
|
This is called in response to the WM_HELP Notify
|
|
message and to the WM_CONTEXTMENU Notify message.
|
|
|
|
WM_HELP Notify message.
|
|
This message is sent when the user presses F1 or <Shift>-F1
|
|
over an item or when the user clicks on the ? icon and then
|
|
presses the mouse over an item.
|
|
|
|
WM_CONTEXTMENU Notify message.
|
|
This message is sent when the user right clicks over an item
|
|
and then clicks "What's this?"
|
|
|
|
--*/
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
LRESULT
|
|
CppFaxServerReceipts::OnHelpRequest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
|
|
{
|
|
DEBUG_FUNCTION_NAME(_T("CppFaxServerReceipts::OnHelpRequest"));
|
|
|
|
switch (uMsg)
|
|
{
|
|
case WM_HELP:
|
|
WinContextHelp(((LPHELPINFO)lParam)->dwContextId, m_hWnd);
|
|
break;
|
|
|
|
case WM_CONTEXTMENU:
|
|
WinContextHelp(::GetWindowContextHelpId((HWND)wParam), m_hWnd);
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|