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.
 
 
 
 
 
 

713 lines
18 KiB

/////////////////////////////////////////////////////////////////////////////
// FILE : InboundRoutingMethod.cpp //
// //
// DESCRIPTION : Implementation of the Inbound Routing Method node. //
// //
// AUTHOR : yossg //
// //
// HISTORY : //
// Dec 1 1999 yossg Created //
// Dec 14 1999 yossg add basic functionality //
// Oct 17 2000 yossg //
// //
// Copyright (C) 1999 Microsoft Corporation All Rights Reserved //
// //
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "snapin.h"
#include "InboundRoutingMethod.h"
#include "InboundRoutingMethods.h"
#include "FaxServer.h"
#include "FaxServerNode.h"
#include "oaidl.h"
#include "urlmon.h"
#include "mshtmhst.h"
#include "exdisp.h"
#include "faxmmc.h"
/////////////////////////////////////////////////////////////////////////////
// {220D2CB0-85A9-4a43-B6E8-9D66B44F1AF5}
static const GUID CFaxInboundRoutingMethodNodeGUID_NODETYPE = FAXSRV_ROUTING_METHOD_NODETYPE_GUID;
const GUID* CFaxInboundRoutingMethodNode::m_NODETYPE = &CFaxInboundRoutingMethodNodeGUID_NODETYPE;
const OLECHAR* CFaxInboundRoutingMethodNode::m_SZNODETYPE = FAXSRV_ROUTING_METHOD_NODETYPE_GUID_STR;
//const OLECHAR* CnotImplemented::m_SZDISPLAY_NAME = OLESTR("Inbound Routing Methods");
const CLSID* CFaxInboundRoutingMethodNode::m_SNAPIN_CLASSID = &CLSID_Snapin;
CLIPFORMAT CFaxInboundRoutingMethodNode::m_CFExtensionName =
(CLIPFORMAT)RegisterClipboardFormat(CF_MSFAXSRV_ROUTEEXT_NAME);
CLIPFORMAT CFaxInboundRoutingMethodNode::m_CFMethodGuid =
(CLIPFORMAT)RegisterClipboardFormat(CF_MSFAXSRV_ROUTING_METHOD_GUID);
CLIPFORMAT CFaxInboundRoutingMethodNode::m_CFServerName =
(CLIPFORMAT)RegisterClipboardFormat(CF_MSFAXSRV_SERVER_NAME);
CLIPFORMAT CFaxInboundRoutingMethodNode::m_CFDeviceId =
(CLIPFORMAT)RegisterClipboardFormat(CF_MSFAXSRV_DEVICE_ID);
/*
- CFaxInboundRoutingMethodNode::Init
-
* Purpose:
* Init all members icon etc.
*
* Arguments:
* [in] pMethodConfig - PFAX_ROUTING_METHOD
*
* Return:
* OLE error code
*/
HRESULT CFaxInboundRoutingMethodNode::Init(PFAX_ROUTING_METHOD pMethodConfig)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::Init"));
HRESULT hRc = S_OK;
ATLASSERT(pMethodConfig);
hRc = InitMembers( pMethodConfig );
if (FAILED(hRc))
{
DebugPrintEx(
DEBUG_ERR,
_T("Failed to InitMembers"));
//NodeMsgBox done by called func.
goto Exit;
}
//
// Icon
//
m_resultDataItem.nImage = (m_fEnabled ? IMAGE_METHOD_ENABLE : IMAGE_METHOD_DISABLE );
Exit:
return hRc;
}
/*
- CFaxInboundRoutingMethodNode::InitMembers
-
* Purpose:
* Private method to initiate members
* Must be called after init of m_pParentNode
*
* Arguments:
* [in] pMethodConfig - PFAX_ROUTING_METHOD structure
*
* Return:
* OLE error code
*/
HRESULT CFaxInboundRoutingMethodNode::InitMembers(PFAX_ROUTING_METHOD pMethodConfig)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::InitMembers"));
HRESULT hRc = S_OK;
ATLASSERT(pMethodConfig);
m_dwDeviceID = pMethodConfig->DeviceId;
m_fEnabled = pMethodConfig->Enabled;
m_bstrDisplayName = pMethodConfig->FriendlyName;
if (!m_bstrDisplayName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
m_bstrFriendlyName = pMethodConfig->FriendlyName;
if (!m_bstrFriendlyName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
m_bstrMethodGUID = pMethodConfig->Guid;
if (!m_bstrMethodGUID)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
m_bstrExtensionFriendlyName
= pMethodConfig->ExtensionFriendlyName;
if (!m_bstrExtensionFriendlyName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
m_bstrExtensionImageName
= pMethodConfig->ExtensionImageName;
if (!m_bstrExtensionImageName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
ATLASSERT(S_OK == hRc);
goto Exit;
Error:
ATLASSERT(S_OK != hRc);
DebugPrintEx(
DEBUG_ERR,
_T("Failed to allocate string - out of memory"));
ATLASSERT(NULL != m_pParentNode);
if (NULL != m_pParentNode)
{
m_pParentNode->NodeMsgBox(IDS_MEMORY);
}
Exit:
return (hRc);
}
/*
- CFaxInboundRoutingMethodNode::GetResultPaneColInfo
-
* Purpose:
* Return the text for specific column
* Called for each column in the result pane
*
* Arguments:
* [in] nCol - column number
*
* Return:
* String to be displayed in the specific column
*/
LPOLESTR CFaxInboundRoutingMethodNode::GetResultPaneColInfo(int nCol)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::GetResultPaneColInfo"));
HRESULT hRc = S_OK;
UINT uiResourceId;
m_buf.Empty();
switch (nCol)
{
case 0:
//
// Name
//
if (!m_bstrFriendlyName)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Null memeber BSTR - m_bstrFriendlyName."));
goto Error;
}
else
{
return (m_bstrFriendlyName);
}
case 1:
//
// Enabled
//
uiResourceId = (m_fEnabled ? IDS_FXS_YES : IDS_FXS_NO);
if (!m_buf.LoadString(_Module.GetResourceInstance(), uiResourceId) )
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Fail to load string for the method enabled value."));
goto Error;
}
else
{
return (m_buf);
}
case 2:
//
// Extension
//
if (!m_bstrExtensionFriendlyName)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Null memeber BSTR - m_bstrExtensionFriendlyName."));
goto Error;
}
else
{
return (m_bstrExtensionFriendlyName);
}
default:
ATLASSERT(0); // "this number of column is not supported "
return(L"");
} // endswitch (nCol)
Error:
return(L"???");
}
/*
- CFaxInboundRoutingMethodNode::CreatePropertyPages
-
* Purpose:
* Called when creating a property page of the object
*
* Arguments:
* [in] lpProvider - The property sheet
* [in] handle - Handle for notification
* [in] pUnk - Pointer to the data object
* [in] type - CCT_* (SCOPE, RESULT, ...)
*
* Return:
* OLE error code
*/
HRESULT
CFaxInboundRoutingMethodNode::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle,
IUnknown *pUnk,
DATA_OBJECT_TYPES type)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::CreatePropertyPages"));
HRESULT hRc = S_OK;
ATLASSERT(lpProvider);
ATLASSERT(type == CCT_RESULT || type == CCT_SCOPE);
//
// Initiate
//
m_pInboundRoutingMethodGeneral = NULL;
//
// General
//
m_pInboundRoutingMethodGeneral = new CppFaxInboundRoutingMethod(
handle,
this,
TRUE,
_Module.GetResourceInstance());
if (!m_pInboundRoutingMethodGeneral)
{
hRc = E_OUTOFMEMORY;
NodeMsgBox(IDS_MEMORY_FAIL_TO_OPEN_PP);
goto Error;
}
/*
* not exists : m_pPP..->InitRPC();
*/
hRc = lpProvider->AddPage(m_pInboundRoutingMethodGeneral->Create());
if (FAILED(hRc))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Fail to add property page for General tab. (hRc: %08X)"),
hRc);
NodeMsgBox(IDS_FAIL_TO_OPEN_PROP_PAGE);
goto Error;
}
ATLASSERT(S_OK == hRc);
goto Exit;
Error:
ATLASSERT(S_OK != hRc);
if ( NULL != m_pInboundRoutingMethodGeneral )
{
delete m_pInboundRoutingMethodGeneral;
m_pInboundRoutingMethodGeneral = NULL;
}
Exit:
return hRc;
}
/*
- CFaxInboundRoutingMethodNode::SetVerbs
-
* Purpose:
* What verbs to enable/disable when this object is selected
*
* Arguments:
* [in] pConsoleVerb - MMC ConsoleVerb interface
*
* Return:
* OLE Error code
*/
HRESULT CFaxInboundRoutingMethodNode::SetVerbs(IConsoleVerb *pConsoleVerb)
{
HRESULT hRc = S_OK;
//
// Display verbs that we support:
// 1. Properties
//
hRc = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
//
// We want the default verb to be Properties
//
hRc = pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
return hRc;
}
/*
- CFaxInboundRoutingMethodNode::OnMethodEnabled
-
* Purpose:
* Called when Enable /Disable menu was pushed.
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CFaxInboundRoutingMethodNode::OnMethodEnabled (bool &bHandled, CSnapInObjectRootBase *pRoot)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::OnMethodEnabled"));
HRESULT hRc = S_OK;
BOOL fNewState;
fNewState = !m_fEnabled;
hRc = ChangeEnable( fNewState);
if ( S_OK != hRc )
{
//DebugPrint in the function layer
return S_FALSE;
}
//
// Service succeded. now change member
//
m_fEnabled = fNewState;
//
// Refresh the result pane view
//
m_resultDataItem.nImage = (m_fEnabled ? IMAGE_METHOD_ENABLE : IMAGE_METHOD_DISABLE );
hRc = RefreshSingleResultItem(pRoot);
if (FAILED(hRc))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Fail to RefreshSingleResultItem. (hRc: %08X)"),
hRc);
NodeMsgBox(IDS_FAIL_TOREFRESH_INMETHOD_NODE);
}
return hRc;
}
/*
- CFaxInboundRoutingMethodNode::ChangeEnable
-
* Purpose:
* .
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CFaxInboundRoutingMethodNode::ChangeEnable(BOOL fState)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::ChangeEnable"));
HRESULT hRc = S_OK;
DWORD ec = ERROR_SUCCESS;
CFaxServer * pFaxServer = NULL;
HANDLE hFaxPortHandle = NULL;
//
// Get RPC Handle
//
pFaxServer = ((CFaxServerNode *)GetRootNode())->GetFaxServer();
ATLASSERT(pFaxServer);
if (!pFaxServer->GetFaxServerHandle())
{
ec= GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Failed to GetFaxServerHandle. (ec: %ld)"),
ec);
goto Error;
}
//
// Get Fax Device Handle
//
ATLASSERT(m_pParentNode);
// only a valid handle with PORT_OPEN_MODIFY accepted here!
if (!FaxOpenPort( pFaxServer->GetFaxServerHandle(),
m_dwDeviceID,
PORT_OPEN_MODIFY | PORT_OPEN_QUERY,
&hFaxPortHandle ))
{
ec = GetLastError();
// if modification handle is currently shared
// ec == ERROR_INVALID_HANDLE
if (ERROR_INVALID_HANDLE == ec)
{
//Special case of ERROR_INVALID_HANDLE
DebugPrintEx(DEBUG_ERR,
_T("FaxOpenPort() failed with ERROR_INVALID_HANDLE. (ec:%ld)"),
ec);
NodeMsgBox(IDS_OPENPORT_INVALID_HANDLE);
hRc = HRESULT_FROM_WIN32(ec);
goto Exit;
}
DebugPrintEx(DEBUG_ERR,
_T("FaxOpenPort() failed with. (ec:%ld)"),
ec);
goto Error;
}
ATLASSERT(NULL != hFaxPortHandle);
//
// Set Enabled
//
if (!FaxEnableRoutingMethod(
hFaxPortHandle,
m_bstrMethodGUID,
fState))
{
ec = GetLastError();
//
// 1) Warning
//
if (ERROR_BAD_CONFIGURATION == ec && fState)
{
DebugPrintEx(
DEBUG_WRN,
_T("Cannot enable routing method. The method configuration has some invalid data.(ec: %ld)"),
ec);
hRc = HRESULT_FROM_WIN32(ec);
//
// The routing method is not configured.
// Suggest to configure it.
//
int nRes = IDNO;
NodeMsgBox(IDS_FAIL2ENABLE_METHOD, MB_YESNO | MB_ICONEXCLAMATION, &nRes);
if(IDYES == nRes)
{
InvokePropSheet(this, CCT_RESULT, reinterpret_cast<IUnknown*>(m_pComponentData), m_bstrFriendlyName, 1);
}
goto Exit;
}
//
// 2) Error
//
//
// a) Network Error
//
if (IsNetworkError(ec))
{
DebugPrintEx(
DEBUG_ERR,
_T("Network error was found. (ec: %ld)"),
ec);
pFaxServer->Disconnect();
goto Error;
}
//
// b) General Error
//
DebugPrintEx(
DEBUG_ERR,
_T("Fail to enable /disable routing method. (ec: %ld)"),
ec);
NodeMsgBox(IDS_FAIL2ENABLE_METHOD_ERR);
hRc = HRESULT_FROM_WIN32(ec);
goto Exit;
}
ATLASSERT(ERROR_SUCCESS == ec);
goto Exit;
Error:
ATLASSERT(ERROR_SUCCESS != ec);
hRc = HRESULT_FROM_WIN32(ec);
NodeMsgBox(GetFaxServerErrorMsg(ec));
Exit:
//
// Close Fax Port handle
//
if (NULL != hFaxPortHandle)
{
if (!FaxClose( hFaxPortHandle ))
{
DebugPrintEx(
DEBUG_ERR,
TEXT("FaxClose() on port handle failed (ec: %ld)"),
GetLastError());
}
}
return hRc;
}
/*
- CFaxInboundRoutingMethodNode::UpdateMenuState
-
* Purpose:
* Overrides the ATL CSnapInItemImpl::UpdateMenuState
* which only have one line inside it "return;"
* This function implements the grayed\ungrayed view for the
* the Enable and the Disable menus.
*
* Arguments:
* [in] id - unsigned int with the menu IDM value
* [out] pBuf - string
* [out] flags - pointer to flags state combination unsigned int
*
* Return:
* no return value - void function
*/
void CFaxInboundRoutingMethodNode::UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::UpdateMenuState"));
UNREFERENCED_PARAMETER (pBuf);
switch (id)
{
case IDM_FAX_INMETHOD_ENABLE:
*flags = (m_fEnabled ? MF_GRAYED : MF_ENABLED );
break;
case IDM_FAX_INMETHOD_DISABLE:
*flags = (m_fEnabled ? MF_ENABLED : MF_GRAYED );
break;
default:
break;
}
return;
}
/*
+
+
*
* CFaxInboundRoutingMethodNode::FillData
*
*
* Override CSnapInItem::FillData for private cliboard formats
*
*
* Parameters
*
* Return Values
*
-
-
*/
HRESULT CFaxInboundRoutingMethodNode::FillData(CLIPFORMAT cf, LPSTREAM pStream)
{
DEBUG_FUNCTION_NAME( _T("CFaxInboundRoutingMethodNode::FillData"));
HRESULT hr = DV_E_CLIPFORMAT;
ULONG uWritten;
if (cf == m_CFExtensionName)
{
hr = pStream->Write((VOID *)(LPWSTR)m_bstrExtensionImageName,
sizeof(WCHAR)*(m_bstrExtensionImageName.Length()+1),
&uWritten);
return hr;
}
if (cf == m_CFMethodGuid)
{
hr = pStream->Write((VOID *)(LPWSTR)m_bstrMethodGUID,
sizeof(WCHAR)*(m_bstrMethodGUID.Length()+1),
&uWritten);
return hr;
}
if (cf == m_CFServerName)
{
CComBSTR bstrServerName = ((CFaxServerNode *)GetRootNode())->GetServerName();
hr = pStream->Write((VOID *)(LPWSTR)bstrServerName,
sizeof(WCHAR)*(bstrServerName.Length()+1),
&uWritten);
return hr;
}
if (cf == m_CFDeviceId)
{
hr = pStream->Write((VOID *)&m_dwDeviceID, sizeof(DWORD), &uWritten);
return hr;
}
return CSnapInItemImpl<CFaxInboundRoutingMethodNode>::FillData(cf, pStream);
} // CFaxInboundRoutingMethodNode::FillData
/*
+
+ CFaxInboundRoutingMethodNode::OnShowContextHelp
*
* Purpose:
* Overrides CSnapinNode::OnShowContextHelp.
*
* Arguments:
*
* Return:
- OLE error code
-
*/
HRESULT CFaxInboundRoutingMethodNode::OnShowContextHelp(
IDisplayHelp* pDisplayHelp, LPOLESTR helpFile)
{
return DisplayContextHelp(pDisplayHelp, helpFile, HLP_INBOUND_ROUTING);
}