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
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);
|
|
}
|
|
|
|
|
|
|