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.
 
 
 
 
 
 

830 lines
20 KiB

/////////////////////////////////////////////////////////////////////////////
// FILE : OutboundRoutingDevice.cpp //
// //
// DESCRIPTION : Implementation of the Outbound Routing Device node. //
// //
// AUTHOR : yossg //
// //
// HISTORY : //
// Dec 23 1999 yossg Create //
// Oct 17 2000 yossg //
// //
// Copyright (C) 1999 Microsoft Corporation All Rights Reserved //
// //
/////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "snapin.h"
#include "OutboundDevice.h"
#include "OutboundGroup.h" //parent
#include "FaxServer.h"
#include "FaxServerNode.h"
#include "oaidl.h"
#include "urlmon.h"
#include "mshtmhst.h"
#include "exdisp.h"
/////////////////////////////////////////////////////////////////////////////
// {2E8B6DD2-6E87-407e-AF70-ABC50A2671EF}
static const GUID CFaxOutboundRoutingDeviceNodeGUID_NODETYPE =
{ 0x2e8b6dd2, 0x6e87, 0x407e, { 0xaf, 0x70, 0xab, 0xc5, 0xa, 0x26, 0x71, 0xef } };
const GUID* CFaxOutboundRoutingDeviceNode::m_NODETYPE = &CFaxOutboundRoutingDeviceNodeGUID_NODETYPE;
const OLECHAR* CFaxOutboundRoutingDeviceNode::m_SZNODETYPE = OLESTR("2E8B6DD2-6E87-407e-AF70-ABC50A2671EF");
//const OLECHAR* CFaxOutboundRoutingDeviceNode::m_SZDISPLAY_NAME = OLESTR("Device of Outbound Routing Group");
const CLSID* CFaxOutboundRoutingDeviceNode::m_SNAPIN_CLASSID = &CLSID_Snapin;
/*
- CFaxOutboundRoutingDeviceNode::InitRPC
-
* Purpose:
* Initiates the configuration structure from RPC get Call.
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CFaxOutboundRoutingDeviceNode::InitRPC( PFAX_PORT_INFO_EX * pFaxDeviceConfig )
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::InitRPC"));
ATLASSERT(NULL == (*pFaxDeviceConfig) );
HRESULT hRc = S_OK;
DWORD ec = ERROR_SUCCESS;
CFaxServer * pFaxServer = 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;
}
//
// Retrieve the Device configuration
//
if (!FaxGetPortEx(pFaxServer->GetFaxServerHandle(),
m_dwDeviceID,
&( *pFaxDeviceConfig)))
{
ec = GetLastError();
DebugPrintEx(
DEBUG_ERR,
_T("Fail to get device configuration. (ec: %ld)"),
ec);
if (IsNetworkError(ec))
{
DebugPrintEx(
DEBUG_ERR,
_T("Network Error was found. (ec: %ld)"),
ec);
pFaxServer->Disconnect();
}
goto Error;
}
//For max verification
ATLASSERT(*pFaxDeviceConfig);
ATLASSERT(ERROR_SUCCESS == ec);
DebugPrintEx( DEBUG_MSG,
_T("Succeed to get device configuration."));
goto Exit;
Error:
ATLASSERT(ERROR_SUCCESS != ec);
hRc = HRESULT_FROM_WIN32(ec);
//Important!!!
*pFaxDeviceConfig = NULL;
if (ERROR_BAD_UNIT != ec)
{
NodeMsgBox(GetFaxServerErrorMsg(ec));
}
else
{
NodeMsgBox(IDS_FAIL_TO_DISCOVERDEVICEFORGROUP);
}
Exit:
return (hRc);
}
/*
- CFaxOutboundRoutingDeviceNode::InitMembers
-
* Purpose:
* Private method to initiate members
* Must be called after init of m_pParentNode
*
* Arguments:
* [in] dwDeviceID - unique device ID
* [in] uiOrd - the device usage order
*
* Return:
* OLE error code
*/
HRESULT
CFaxOutboundRoutingDeviceNode::InitMembers(
PFAX_PORT_INFO_EX * pDeviceConfig,
DWORD dwDeviceID,
UINT uiOrd,
UINT uiMaxOrd)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::InitMembers"));
HRESULT hRc = S_OK;
ATLASSERT(pDeviceConfig);
ATLASSERT(uiMaxOrd >= uiOrd);
// done in calling function - to be safe (avoid later bug creation)
m_dwDeviceID = dwDeviceID;
m_uiMaxOrder = uiMaxOrd;
m_uiOrder = uiOrd;
m_bstrDisplayName = (*pDeviceConfig)->lpctstrDeviceName;
if (!m_bstrDisplayName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
m_bstrDeviceName = (*pDeviceConfig)->lpctstrDeviceName;
if (!m_bstrDeviceName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
m_bstrProviderName = (*pDeviceConfig)->lpctstrProviderName;
if (!m_bstrProviderName)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
if (NULL != (*pDeviceConfig)->lptstrDescription )
{
m_bstrDescription = (*pDeviceConfig)->lptstrDescription;
if (!m_bstrDescription)
{
hRc = E_OUTOFMEMORY;
goto Error;
}
}
else
{
m_bstrDescription = L"";
DebugPrintEx(
DEBUG_ERR,
_T("Description value supplied by service is NULL"));
}
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);
}
/*
- CFaxOutboundRoutingDeviceNode::Init
-
* Purpose:
* This method reterives the from RPC device's data
* and inits the private members with it.
*
* Arguments:
* [in] dwDeviceID - the unique device ID
* [in] uiOrd - order index
* [in] uiMaxOrd - the maximal order in the group
* [in] pParentNode - pointer to parent node
*
* Return:
* OLE error code
*/
HRESULT
CFaxOutboundRoutingDeviceNode::Init(
DWORD dwDeviceID,
UINT uiOrd,
UINT uiMaxOrd,
CFaxOutboundRoutingGroupNode * pParentNode)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::Init"));
HRESULT hRc = S_OK;
FAX_SERVER_ICONS enumIcon;
ATLASSERT(pParentNode);
ATLASSERT(uiMaxOrd >= uiOrd);
PFAX_PORT_INFO_EX pFaxDeviceConfig = NULL ;
//
// init from function parametrs
//
m_dwDeviceID = dwDeviceID;
m_uiOrder = uiOrd;
m_uiMaxOrder = uiMaxOrd;
InitParentNode(pParentNode);
//
// Icon - optimistic start point
//
enumIcon = IMAGE_DEVICE;
//
// Get the Config. structure with FaxGetPortEx
//
hRc = InitRPC(&pFaxDeviceConfig);
if (FAILED(hRc))
{
if( ERROR_BAD_UNIT != HRESULT_CODE(hRc) )
{
//DebugPrint and MsgBox by called func.
//to be safe actually done by InitRPC on error.
pFaxDeviceConfig = NULL;
goto Error;
}
else
{
DebugPrintEx(
DEBUG_MSG,
TEXT("+++ +++ System can not find one device from the group. (hRc: %08X) +++ +++"),
hRc);
// Continue !!!
// we will show the bad device
// but skip it's init-members function
// the strings to show on error were configured in the constractor
enumIcon = IMAGE_DEVICE_ERROR;
goto Error;
}
}
ATLASSERT(NULL != pFaxDeviceConfig);
hRc = InitMembers(&pFaxDeviceConfig, dwDeviceID, uiOrd, uiMaxOrd );
if (FAILED(hRc))
{
DebugPrintEx(
DEBUG_ERR,
_T("Failed to InitMembers"));
//NodeMsgBox done by called func.
goto Error;
}
ATLASSERT(S_OK == hRc);
goto Exit;
Error:
ATLASSERT(S_OK != hRc);
if ( FAILED(hRc) )
{
DebugPrintEx(
DEBUG_ERR,
_T("Failed to init (hRc : %08X)"),
hRc);
}
Exit:
//
// Icon
//
m_resultDataItem.nImage = enumIcon;
if (NULL != pFaxDeviceConfig)
{
FaxFreeBuffer(pFaxDeviceConfig);
pFaxDeviceConfig = NULL;
}//any way function quits with memory allocation freed
return hRc;
}
/*
- CFaxOutboundRoutingDeviceNode::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 CFaxOutboundRoutingDeviceNode::GetResultPaneColInfo(int nCol)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::GetResultPaneColInfo"));
HRESULT hRc = S_OK;
int iCount;
WCHAR buff[FXS_MAX_NUM_OF_DEVICES_LEN+1];
m_buf.Empty();
switch (nCol)
{
case 0:
//
// Name
//
if (!m_bstrDeviceName)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Null memeber BSTR - m_bstrDeviceName."));
goto Error;
}
else
{
return (m_bstrDeviceName);
}
case 1:
//
// Order
//
iCount = swprintf(buff, L"%ld", m_uiOrder);
if( iCount <= 0 )
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Fail to read member - m_uiOrder."));
goto Error;
}
else
{
m_buf = buff;
return (m_buf);
}
case 2:
//
// Description
//
if (!m_bstrDescription)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Null memeber BSTR - m_bstrDescription."));
goto Error;
}
else
{
return (m_bstrDescription);
}
case 3:
//
// Provider
//
if (!m_bstrProviderName)
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Null memeber BSTR - m_bstrProviderName."));
goto Error;
}
else
{
return (m_bstrProviderName);
}
default:
ATLASSERT(0); // "this number of column is not supported "
return(L"");
} // endswitch (nCol)
Error:
return(L"???");
}
/*
- CFaxOutboundRoutingDeviceNode::SetVerbs
-
* Purpose:
* What verbs to enable/disable when this object is selected
*
* Arguments:
* [in] pConsoleVerb - MMC ConsoleVerb interface
*
* Return:
* OLE Error code
*/
HRESULT CFaxOutboundRoutingDeviceNode::SetVerbs(IConsoleVerb *pConsoleVerb)
{
HRESULT hRc = S_OK;
//
// Display verbs that we support:
// 1. Delete
// 2. Refresh
//
if (m_fIsChildOfAllDevicesGroup)
{
hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, HIDDEN, FALSE);
hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, INDETERMINATE, TRUE);
}
else
{
hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, ENABLED, TRUE);
}
//
// leaf node
//
hRc = pConsoleVerb->SetDefaultVerb(MMC_VERB_NONE);
return hRc;
}
/*
- CFaxOutboundRoutingDeviceNode::OnMoveDown
-
* Purpose:
* Call to move down device
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CFaxOutboundRoutingDeviceNode::OnMoveDown(bool &bHandled, CSnapInObjectRootBase *pRoot)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::OnMoveDown"));
DWORD dwMaxOrder;
ATLASSERT(m_pParentNode);
//
// Validity Check
//
dwMaxOrder = m_pParentNode->GetMaxOrder();
if (
( 0 == dwMaxOrder ) // list was not populated successfully
||
( 1 > (DWORD)m_uiOrder )
||
( dwMaxOrder < (DWORD)(m_uiOrder+1) )
)
{
DebugPrintEx(
DEBUG_ERR,
_T("Invalid operation. Can not move device order down."));
return (S_FALSE);
}
else
{
return(m_pParentNode->ChangeDeviceOrder(
(DWORD)m_uiOrder,
(DWORD)(m_uiOrder+1),
m_dwDeviceID,
pRoot) );
}
}
/*
- CFaxOutboundRoutingDeviceNode::OnMoveUp
-
* Purpose:
* To move up in the view the device
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CFaxOutboundRoutingDeviceNode::OnMoveUp(bool &bHandled, CSnapInObjectRootBase *pRoot)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::OnMoveUp"));
DWORD dwMaxOrder;
ATLASSERT(m_pParentNode);
//
// Validity Check
//
dwMaxOrder = m_pParentNode->GetMaxOrder();
if (
( 0 == dwMaxOrder ) // list was not populated successfully
||
( dwMaxOrder < (DWORD)m_uiOrder )
||
( 1 > (DWORD)(m_uiOrder-1) )
)
{
DebugPrintEx(
DEBUG_ERR,
_T("Invalid operation. Can not move device order up."));
return (S_FALSE);
}
else
{
return (m_pParentNode->ChangeDeviceOrder( (DWORD)m_uiOrder,
(DWORD)(m_uiOrder-1),
m_dwDeviceID,
pRoot) );
}
}
/*
- CFaxOutboundRoutingDeviceNode::ReselectItemInView
-
* Purpose:
* Reselect the node to redraw toolbar buttons
*
* Arguments:
* [in] pConsole - the console interface
*
* Return: OLE error code
*/
HRESULT CFaxOutboundRoutingDeviceNode::ReselectItemInView(IConsole *pConsole)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::ReselectItemInView"));
HRESULT hRc = S_OK;
//
// Need IResultData
//
CComQIPtr<IResultData, &IID_IResultData> pResultData(pConsole);
ATLASSERT(pResultData != NULL);
//
// Reselect the node to redraw toolbar buttons.
//
hRc = pResultData->ModifyItemState( 0, m_resultDataItem.itemID, LVIS_SELECTED | LVIS_FOCUSED, 0 );
if ( S_OK != hRc )
{
DebugPrintEx(
DEBUG_ERR,
TEXT("Failure on pResultData->UpdateItem, (hRc: %08X)"),
hRc);
NodeMsgBox(IDS_FAIL2REFRESH_THEVIEW);
goto Exit;
}
Exit:
return hRc;
}
/*
- CFaxOutboundRoutingDeviceNode::OnDelete
-
* Purpose:
* Called when deleting this node
*
* Arguments:
*
* Return:
* OLE error code
*/
HRESULT CFaxOutboundRoutingDeviceNode::OnDelete(
LPARAM arg,
LPARAM param,
IComponentData *pComponentData,
IComponent *pComponent,
DATA_OBJECT_TYPES type,
BOOL fSilent/* = FALSE*/
)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::OnDelete"));
UNREFERENCED_PARAMETER (arg);
UNREFERENCED_PARAMETER (param);
UNREFERENCED_PARAMETER (type);
HRESULT hRc = S_OK;
CComPtr<IConsole> spConsole;
//
// Are you sure?
//
if (! fSilent)
{
//
// Use pConsole as owner of the message box
//
int res;
NodeMsgBox(IDS_CONFIRM, MB_YESNO | MB_ICONWARNING, &res);
if (IDNO == res)
{
goto Cleanup;
}
}
//
// Delete it
//
ATLASSERT(m_pParentNode);
hRc = m_pParentNode->DeleteDevice(m_dwDeviceID,
this);
if ( FAILED(hRc) )
{
goto Cleanup;
}
Cleanup:
return hRc;
}
/*
- CFaxOutboundRoutingDeviceNode::UpdateToolbarButton
-
* Purpose:
* Overrides the ATL CSnapInItemImpl::UpdateToolbarButton
* This function aloow us to decide if to the activate\grayed a toolbar button
* It treating only the Enable state.
*
* Arguments:
*
* [in] id - unsigned int for the toolbar button ID
* [in] fsState - state to be cosidered ENABLE ?HIDDEN etc.
*
* Return:
* BOOL TRUE to activate state FALSE to disabled the state for this button
*/
BOOL CFaxOutboundRoutingDeviceNode::UpdateToolbarButton(UINT id, BYTE fsState)
{
DEBUG_FUNCTION_NAME( _T("CFaxServerNode::UpdateToolbarButton"));
BOOL bRet = FALSE;
// Set whether the buttons should be enabled.
if (fsState == ENABLED)
{
switch ( id )
{
case ID_MOVEUP_BUTTON:
bRet = ( (FXS_FIRST_DEVICE_ORDER == m_uiOrder) ? FALSE : TRUE );
break;
case ID_MOVEDOWN_BUTTON:
bRet = ( (m_uiMaxOrder == m_uiOrder) ? FALSE : TRUE);
break;
default:
break;
}
}
// For all other possible button ID's and states,
// the correct answer here is FALSE.
return bRet;
}
/*
- CFaxOutboundRoutingDeviceNode::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 CFaxOutboundRoutingDeviceNode::UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::UpdateMenuState"));
UNREFERENCED_PARAMETER (pBuf);
switch (id)
{
case IDM_MOVEUP:
*flags = ((FXS_FIRST_DEVICE_ORDER == m_uiOrder) ? MF_GRAYED : MF_ENABLED );
break;
case IDM_MOVEDOWN:
*flags = ((m_uiMaxOrder == m_uiOrder) ? MF_GRAYED : MF_ENABLED );
break;
default:
break;
}
return;
}
/*
- CFaxOutboundRoutingDeviceNode::SetOrder
-
* Purpose:
* Overload function which allow
* re-setting the order and the MaxOrder
*
* Arguments:
*
* [in] uiNewOrder - Device's order.
* [in] uiNewMaxOrder - Maximal order in the current list
*
* Return:
* no return value - void function
*/
VOID CFaxOutboundRoutingDeviceNode::SetOrder(UINT uiNewOrder, UINT uiNewMaxOrder)
{
DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::UpdateMenuState"));
m_uiOrder = uiNewOrder;
m_uiMaxOrder = uiNewMaxOrder;
return;
}
/*
+
+ CFaxOutboundRoutingDeviceNode::OnShowContextHelp
*
* Purpose:
* Overrides CSnapinNode::OnShowContextHelp.
*
* Arguments:
*
* Return:
- OLE error code
-
*/
HRESULT CFaxOutboundRoutingDeviceNode::OnShowContextHelp(
IDisplayHelp* pDisplayHelp, LPOLESTR helpFile)
{
return DisplayContextHelp(pDisplayHelp, helpFile, HLP_GROUPS);
}