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

  1. /////////////////////////////////////////////////////////////////////////////
  2. // FILE : OutboundRoutingDevice.cpp //
  3. // //
  4. // DESCRIPTION : Implementation of the Outbound Routing Device node. //
  5. // //
  6. // AUTHOR : yossg //
  7. // //
  8. // HISTORY : //
  9. // Dec 23 1999 yossg Create //
  10. // Oct 17 2000 yossg //
  11. // //
  12. // Copyright (C) 1999 Microsoft Corporation All Rights Reserved //
  13. // //
  14. /////////////////////////////////////////////////////////////////////////////
  15. #include "StdAfx.h"
  16. #include "snapin.h"
  17. #include "OutboundDevice.h"
  18. #include "OutboundGroup.h" //parent
  19. #include "FaxServer.h"
  20. #include "FaxServerNode.h"
  21. #include "oaidl.h"
  22. #include "urlmon.h"
  23. #include "mshtmhst.h"
  24. #include "exdisp.h"
  25. /////////////////////////////////////////////////////////////////////////////
  26. // {2E8B6DD2-6E87-407e-AF70-ABC50A2671EF}
  27. static const GUID CFaxOutboundRoutingDeviceNodeGUID_NODETYPE =
  28. { 0x2e8b6dd2, 0x6e87, 0x407e, { 0xaf, 0x70, 0xab, 0xc5, 0xa, 0x26, 0x71, 0xef } };
  29. const GUID* CFaxOutboundRoutingDeviceNode::m_NODETYPE = &CFaxOutboundRoutingDeviceNodeGUID_NODETYPE;
  30. const OLECHAR* CFaxOutboundRoutingDeviceNode::m_SZNODETYPE = OLESTR("2E8B6DD2-6E87-407e-AF70-ABC50A2671EF");
  31. //const OLECHAR* CFaxOutboundRoutingDeviceNode::m_SZDISPLAY_NAME = OLESTR("Device of Outbound Routing Group");
  32. const CLSID* CFaxOutboundRoutingDeviceNode::m_SNAPIN_CLASSID = &CLSID_Snapin;
  33. /*
  34. - CFaxOutboundRoutingDeviceNode::InitRPC
  35. -
  36. * Purpose:
  37. * Initiates the configuration structure from RPC get Call.
  38. *
  39. * Arguments:
  40. *
  41. * Return:
  42. * OLE error code
  43. */
  44. HRESULT CFaxOutboundRoutingDeviceNode::InitRPC( PFAX_PORT_INFO_EX * pFaxDeviceConfig )
  45. {
  46. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::InitRPC"));
  47. ATLASSERT(NULL == (*pFaxDeviceConfig) );
  48. HRESULT hRc = S_OK;
  49. DWORD ec = ERROR_SUCCESS;
  50. CFaxServer * pFaxServer = NULL;
  51. //
  52. // get RPC Handle
  53. //
  54. pFaxServer = ((CFaxServerNode *)GetRootNode())->GetFaxServer();
  55. ATLASSERT(pFaxServer);
  56. if (!pFaxServer->GetFaxServerHandle())
  57. {
  58. ec= GetLastError();
  59. DebugPrintEx(
  60. DEBUG_ERR,
  61. _T("Failed to GetFaxServerHandle. (ec: %ld)"),
  62. ec);
  63. goto Error;
  64. }
  65. //
  66. // Retrieve the Device configuration
  67. //
  68. if (!FaxGetPortEx(pFaxServer->GetFaxServerHandle(),
  69. m_dwDeviceID,
  70. &( *pFaxDeviceConfig)))
  71. {
  72. ec = GetLastError();
  73. DebugPrintEx(
  74. DEBUG_ERR,
  75. _T("Fail to get device configuration. (ec: %ld)"),
  76. ec);
  77. if (IsNetworkError(ec))
  78. {
  79. DebugPrintEx(
  80. DEBUG_ERR,
  81. _T("Network Error was found. (ec: %ld)"),
  82. ec);
  83. pFaxServer->Disconnect();
  84. }
  85. goto Error;
  86. }
  87. //For max verification
  88. ATLASSERT(*pFaxDeviceConfig);
  89. ATLASSERT(ERROR_SUCCESS == ec);
  90. DebugPrintEx( DEBUG_MSG,
  91. _T("Succeed to get device configuration."));
  92. goto Exit;
  93. Error:
  94. ATLASSERT(ERROR_SUCCESS != ec);
  95. hRc = HRESULT_FROM_WIN32(ec);
  96. //Important!!!
  97. *pFaxDeviceConfig = NULL;
  98. if (ERROR_BAD_UNIT != ec)
  99. {
  100. NodeMsgBox(GetFaxServerErrorMsg(ec));
  101. }
  102. else
  103. {
  104. NodeMsgBox(IDS_FAIL_TO_DISCOVERDEVICEFORGROUP);
  105. }
  106. Exit:
  107. return (hRc);
  108. }
  109. /*
  110. - CFaxOutboundRoutingDeviceNode::InitMembers
  111. -
  112. * Purpose:
  113. * Private method to initiate members
  114. * Must be called after init of m_pParentNode
  115. *
  116. * Arguments:
  117. * [in] dwDeviceID - unique device ID
  118. * [in] uiOrd - the device usage order
  119. *
  120. * Return:
  121. * OLE error code
  122. */
  123. HRESULT
  124. CFaxOutboundRoutingDeviceNode::InitMembers(
  125. PFAX_PORT_INFO_EX * pDeviceConfig,
  126. DWORD dwDeviceID,
  127. UINT uiOrd,
  128. UINT uiMaxOrd)
  129. {
  130. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::InitMembers"));
  131. HRESULT hRc = S_OK;
  132. ATLASSERT(pDeviceConfig);
  133. ATLASSERT(uiMaxOrd >= uiOrd);
  134. // done in calling function - to be safe (avoid later bug creation)
  135. m_dwDeviceID = dwDeviceID;
  136. m_uiMaxOrder = uiMaxOrd;
  137. m_uiOrder = uiOrd;
  138. m_bstrDisplayName = (*pDeviceConfig)->lpctstrDeviceName;
  139. if (!m_bstrDisplayName)
  140. {
  141. hRc = E_OUTOFMEMORY;
  142. goto Error;
  143. }
  144. m_bstrDeviceName = (*pDeviceConfig)->lpctstrDeviceName;
  145. if (!m_bstrDeviceName)
  146. {
  147. hRc = E_OUTOFMEMORY;
  148. goto Error;
  149. }
  150. m_bstrProviderName = (*pDeviceConfig)->lpctstrProviderName;
  151. if (!m_bstrProviderName)
  152. {
  153. hRc = E_OUTOFMEMORY;
  154. goto Error;
  155. }
  156. if (NULL != (*pDeviceConfig)->lptstrDescription )
  157. {
  158. m_bstrDescription = (*pDeviceConfig)->lptstrDescription;
  159. if (!m_bstrDescription)
  160. {
  161. hRc = E_OUTOFMEMORY;
  162. goto Error;
  163. }
  164. }
  165. else
  166. {
  167. m_bstrDescription = L"";
  168. DebugPrintEx(
  169. DEBUG_ERR,
  170. _T("Description value supplied by service is NULL"));
  171. }
  172. ATLASSERT(S_OK == hRc);
  173. goto Exit;
  174. Error:
  175. ATLASSERT(S_OK != hRc);
  176. DebugPrintEx(
  177. DEBUG_ERR,
  178. _T("Failed to allocate string - out of memory"));
  179. ATLASSERT(NULL != m_pParentNode);
  180. if (NULL != m_pParentNode)
  181. {
  182. m_pParentNode->NodeMsgBox(IDS_MEMORY);
  183. }
  184. Exit:
  185. return (hRc);
  186. }
  187. /*
  188. - CFaxOutboundRoutingDeviceNode::Init
  189. -
  190. * Purpose:
  191. * This method reterives the from RPC device's data
  192. * and inits the private members with it.
  193. *
  194. * Arguments:
  195. * [in] dwDeviceID - the unique device ID
  196. * [in] uiOrd - order index
  197. * [in] uiMaxOrd - the maximal order in the group
  198. * [in] pParentNode - pointer to parent node
  199. *
  200. * Return:
  201. * OLE error code
  202. */
  203. HRESULT
  204. CFaxOutboundRoutingDeviceNode::Init(
  205. DWORD dwDeviceID,
  206. UINT uiOrd,
  207. UINT uiMaxOrd,
  208. CFaxOutboundRoutingGroupNode * pParentNode)
  209. {
  210. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::Init"));
  211. HRESULT hRc = S_OK;
  212. FAX_SERVER_ICONS enumIcon;
  213. ATLASSERT(pParentNode);
  214. ATLASSERT(uiMaxOrd >= uiOrd);
  215. PFAX_PORT_INFO_EX pFaxDeviceConfig = NULL ;
  216. //
  217. // init from function parametrs
  218. //
  219. m_dwDeviceID = dwDeviceID;
  220. m_uiOrder = uiOrd;
  221. m_uiMaxOrder = uiMaxOrd;
  222. InitParentNode(pParentNode);
  223. //
  224. // Icon - optimistic start point
  225. //
  226. enumIcon = IMAGE_DEVICE;
  227. //
  228. // Get the Config. structure with FaxGetPortEx
  229. //
  230. hRc = InitRPC(&pFaxDeviceConfig);
  231. if (FAILED(hRc))
  232. {
  233. if( ERROR_BAD_UNIT != HRESULT_CODE(hRc) )
  234. {
  235. //DebugPrint and MsgBox by called func.
  236. //to be safe actually done by InitRPC on error.
  237. pFaxDeviceConfig = NULL;
  238. goto Error;
  239. }
  240. else
  241. {
  242. DebugPrintEx(
  243. DEBUG_MSG,
  244. TEXT("+++ +++ System can not find one device from the group. (hRc: %08X) +++ +++"),
  245. hRc);
  246. // Continue !!!
  247. // we will show the bad device
  248. // but skip it's init-members function
  249. // the strings to show on error were configured in the constractor
  250. enumIcon = IMAGE_DEVICE_ERROR;
  251. goto Error;
  252. }
  253. }
  254. ATLASSERT(NULL != pFaxDeviceConfig);
  255. hRc = InitMembers(&pFaxDeviceConfig, dwDeviceID, uiOrd, uiMaxOrd );
  256. if (FAILED(hRc))
  257. {
  258. DebugPrintEx(
  259. DEBUG_ERR,
  260. _T("Failed to InitMembers"));
  261. //NodeMsgBox done by called func.
  262. goto Error;
  263. }
  264. ATLASSERT(S_OK == hRc);
  265. goto Exit;
  266. Error:
  267. ATLASSERT(S_OK != hRc);
  268. if ( FAILED(hRc) )
  269. {
  270. DebugPrintEx(
  271. DEBUG_ERR,
  272. _T("Failed to init (hRc : %08X)"),
  273. hRc);
  274. }
  275. Exit:
  276. //
  277. // Icon
  278. //
  279. m_resultDataItem.nImage = enumIcon;
  280. if (NULL != pFaxDeviceConfig)
  281. {
  282. FaxFreeBuffer(pFaxDeviceConfig);
  283. pFaxDeviceConfig = NULL;
  284. }//any way function quits with memory allocation freed
  285. return hRc;
  286. }
  287. /*
  288. - CFaxOutboundRoutingDeviceNode::GetResultPaneColInfo
  289. -
  290. * Purpose:
  291. * Return the text for specific column
  292. * Called for each column in the result pane
  293. *
  294. * Arguments:
  295. * [in] nCol - column number
  296. *
  297. * Return:
  298. * String to be displayed in the specific column
  299. */
  300. LPOLESTR CFaxOutboundRoutingDeviceNode::GetResultPaneColInfo(int nCol)
  301. {
  302. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::GetResultPaneColInfo"));
  303. HRESULT hRc = S_OK;
  304. int iCount;
  305. WCHAR buff[FXS_MAX_NUM_OF_DEVICES_LEN+1];
  306. m_buf.Empty();
  307. switch (nCol)
  308. {
  309. case 0:
  310. //
  311. // Name
  312. //
  313. if (!m_bstrDeviceName)
  314. {
  315. DebugPrintEx(
  316. DEBUG_ERR,
  317. TEXT("Null memeber BSTR - m_bstrDeviceName."));
  318. goto Error;
  319. }
  320. else
  321. {
  322. return (m_bstrDeviceName);
  323. }
  324. case 1:
  325. //
  326. // Order
  327. //
  328. iCount = swprintf(buff, L"%ld", m_uiOrder);
  329. if( iCount <= 0 )
  330. {
  331. DebugPrintEx(
  332. DEBUG_ERR,
  333. TEXT("Fail to read member - m_uiOrder."));
  334. goto Error;
  335. }
  336. else
  337. {
  338. m_buf = buff;
  339. return (m_buf);
  340. }
  341. case 2:
  342. //
  343. // Description
  344. //
  345. if (!m_bstrDescription)
  346. {
  347. DebugPrintEx(
  348. DEBUG_ERR,
  349. TEXT("Null memeber BSTR - m_bstrDescription."));
  350. goto Error;
  351. }
  352. else
  353. {
  354. return (m_bstrDescription);
  355. }
  356. case 3:
  357. //
  358. // Provider
  359. //
  360. if (!m_bstrProviderName)
  361. {
  362. DebugPrintEx(
  363. DEBUG_ERR,
  364. TEXT("Null memeber BSTR - m_bstrProviderName."));
  365. goto Error;
  366. }
  367. else
  368. {
  369. return (m_bstrProviderName);
  370. }
  371. default:
  372. ATLASSERT(0); // "this number of column is not supported "
  373. return(L"");
  374. } // endswitch (nCol)
  375. Error:
  376. return(L"???");
  377. }
  378. /*
  379. - CFaxOutboundRoutingDeviceNode::SetVerbs
  380. -
  381. * Purpose:
  382. * What verbs to enable/disable when this object is selected
  383. *
  384. * Arguments:
  385. * [in] pConsoleVerb - MMC ConsoleVerb interface
  386. *
  387. * Return:
  388. * OLE Error code
  389. */
  390. HRESULT CFaxOutboundRoutingDeviceNode::SetVerbs(IConsoleVerb *pConsoleVerb)
  391. {
  392. HRESULT hRc = S_OK;
  393. //
  394. // Display verbs that we support:
  395. // 1. Delete
  396. // 2. Refresh
  397. //
  398. if (m_fIsChildOfAllDevicesGroup)
  399. {
  400. hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, HIDDEN, FALSE);
  401. hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, INDETERMINATE, TRUE);
  402. }
  403. else
  404. {
  405. hRc = pConsoleVerb->SetVerbState(MMC_VERB_DELETE, ENABLED, TRUE);
  406. }
  407. //
  408. // leaf node
  409. //
  410. hRc = pConsoleVerb->SetDefaultVerb(MMC_VERB_NONE);
  411. return hRc;
  412. }
  413. /*
  414. - CFaxOutboundRoutingDeviceNode::OnMoveDown
  415. -
  416. * Purpose:
  417. * Call to move down device
  418. *
  419. * Arguments:
  420. *
  421. * Return:
  422. * OLE error code
  423. */
  424. HRESULT CFaxOutboundRoutingDeviceNode::OnMoveDown(bool &bHandled, CSnapInObjectRootBase *pRoot)
  425. {
  426. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::OnMoveDown"));
  427. DWORD dwMaxOrder;
  428. ATLASSERT(m_pParentNode);
  429. //
  430. // Validity Check
  431. //
  432. dwMaxOrder = m_pParentNode->GetMaxOrder();
  433. if (
  434. ( 0 == dwMaxOrder ) // list was not populated successfully
  435. ||
  436. ( 1 > (DWORD)m_uiOrder )
  437. ||
  438. ( dwMaxOrder < (DWORD)(m_uiOrder+1) )
  439. )
  440. {
  441. DebugPrintEx(
  442. DEBUG_ERR,
  443. _T("Invalid operation. Can not move device order down."));
  444. return (S_FALSE);
  445. }
  446. else
  447. {
  448. return(m_pParentNode->ChangeDeviceOrder(
  449. (DWORD)m_uiOrder,
  450. (DWORD)(m_uiOrder+1),
  451. m_dwDeviceID,
  452. pRoot) );
  453. }
  454. }
  455. /*
  456. - CFaxOutboundRoutingDeviceNode::OnMoveUp
  457. -
  458. * Purpose:
  459. * To move up in the view the device
  460. *
  461. * Arguments:
  462. *
  463. * Return:
  464. * OLE error code
  465. */
  466. HRESULT CFaxOutboundRoutingDeviceNode::OnMoveUp(bool &bHandled, CSnapInObjectRootBase *pRoot)
  467. {
  468. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::OnMoveUp"));
  469. DWORD dwMaxOrder;
  470. ATLASSERT(m_pParentNode);
  471. //
  472. // Validity Check
  473. //
  474. dwMaxOrder = m_pParentNode->GetMaxOrder();
  475. if (
  476. ( 0 == dwMaxOrder ) // list was not populated successfully
  477. ||
  478. ( dwMaxOrder < (DWORD)m_uiOrder )
  479. ||
  480. ( 1 > (DWORD)(m_uiOrder-1) )
  481. )
  482. {
  483. DebugPrintEx(
  484. DEBUG_ERR,
  485. _T("Invalid operation. Can not move device order up."));
  486. return (S_FALSE);
  487. }
  488. else
  489. {
  490. return (m_pParentNode->ChangeDeviceOrder( (DWORD)m_uiOrder,
  491. (DWORD)(m_uiOrder-1),
  492. m_dwDeviceID,
  493. pRoot) );
  494. }
  495. }
  496. /*
  497. - CFaxOutboundRoutingDeviceNode::ReselectItemInView
  498. -
  499. * Purpose:
  500. * Reselect the node to redraw toolbar buttons
  501. *
  502. * Arguments:
  503. * [in] pConsole - the console interface
  504. *
  505. * Return: OLE error code
  506. */
  507. HRESULT CFaxOutboundRoutingDeviceNode::ReselectItemInView(IConsole *pConsole)
  508. {
  509. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::ReselectItemInView"));
  510. HRESULT hRc = S_OK;
  511. //
  512. // Need IResultData
  513. //
  514. CComQIPtr<IResultData, &IID_IResultData> pResultData(pConsole);
  515. ATLASSERT(pResultData != NULL);
  516. //
  517. // Reselect the node to redraw toolbar buttons.
  518. //
  519. hRc = pResultData->ModifyItemState( 0, m_resultDataItem.itemID, LVIS_SELECTED | LVIS_FOCUSED, 0 );
  520. if ( S_OK != hRc )
  521. {
  522. DebugPrintEx(
  523. DEBUG_ERR,
  524. TEXT("Failure on pResultData->UpdateItem, (hRc: %08X)"),
  525. hRc);
  526. NodeMsgBox(IDS_FAIL2REFRESH_THEVIEW);
  527. goto Exit;
  528. }
  529. Exit:
  530. return hRc;
  531. }
  532. /*
  533. - CFaxOutboundRoutingDeviceNode::OnDelete
  534. -
  535. * Purpose:
  536. * Called when deleting this node
  537. *
  538. * Arguments:
  539. *
  540. * Return:
  541. * OLE error code
  542. */
  543. HRESULT CFaxOutboundRoutingDeviceNode::OnDelete(
  544. LPARAM arg,
  545. LPARAM param,
  546. IComponentData *pComponentData,
  547. IComponent *pComponent,
  548. DATA_OBJECT_TYPES type,
  549. BOOL fSilent/* = FALSE*/
  550. )
  551. {
  552. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::OnDelete"));
  553. UNREFERENCED_PARAMETER (arg);
  554. UNREFERENCED_PARAMETER (param);
  555. UNREFERENCED_PARAMETER (type);
  556. HRESULT hRc = S_OK;
  557. CComPtr<IConsole> spConsole;
  558. //
  559. // Are you sure?
  560. //
  561. if (! fSilent)
  562. {
  563. //
  564. // Use pConsole as owner of the message box
  565. //
  566. int res;
  567. NodeMsgBox(IDS_CONFIRM, MB_YESNO | MB_ICONWARNING, &res);
  568. if (IDNO == res)
  569. {
  570. goto Cleanup;
  571. }
  572. }
  573. //
  574. // Delete it
  575. //
  576. ATLASSERT(m_pParentNode);
  577. hRc = m_pParentNode->DeleteDevice(m_dwDeviceID,
  578. this);
  579. if ( FAILED(hRc) )
  580. {
  581. goto Cleanup;
  582. }
  583. Cleanup:
  584. return hRc;
  585. }
  586. /*
  587. - CFaxOutboundRoutingDeviceNode::UpdateToolbarButton
  588. -
  589. * Purpose:
  590. * Overrides the ATL CSnapInItemImpl::UpdateToolbarButton
  591. * This function aloow us to decide if to the activate\grayed a toolbar button
  592. * It treating only the Enable state.
  593. *
  594. * Arguments:
  595. *
  596. * [in] id - unsigned int for the toolbar button ID
  597. * [in] fsState - state to be cosidered ENABLE ?HIDDEN etc.
  598. *
  599. * Return:
  600. * BOOL TRUE to activate state FALSE to disabled the state for this button
  601. */
  602. BOOL CFaxOutboundRoutingDeviceNode::UpdateToolbarButton(UINT id, BYTE fsState)
  603. {
  604. DEBUG_FUNCTION_NAME( _T("CFaxServerNode::UpdateToolbarButton"));
  605. BOOL bRet = FALSE;
  606. // Set whether the buttons should be enabled.
  607. if (fsState == ENABLED)
  608. {
  609. switch ( id )
  610. {
  611. case ID_MOVEUP_BUTTON:
  612. bRet = ( (FXS_FIRST_DEVICE_ORDER == m_uiOrder) ? FALSE : TRUE );
  613. break;
  614. case ID_MOVEDOWN_BUTTON:
  615. bRet = ( (m_uiMaxOrder == m_uiOrder) ? FALSE : TRUE);
  616. break;
  617. default:
  618. break;
  619. }
  620. }
  621. // For all other possible button ID's and states,
  622. // the correct answer here is FALSE.
  623. return bRet;
  624. }
  625. /*
  626. - CFaxOutboundRoutingDeviceNode::UpdateMenuState
  627. -
  628. * Purpose:
  629. * Overrides the ATL CSnapInItemImpl::UpdateMenuState
  630. * which only have one line inside it "return;"
  631. * This function implements the grayed\ungrayed view for the
  632. * the Enable and the Disable menus.
  633. *
  634. * Arguments:
  635. * [in] id - unsigned int with the menu IDM value
  636. * [out] pBuf - string
  637. * [out] flags - pointer to flags state combination unsigned int
  638. *
  639. * Return:
  640. * no return value - void function
  641. */
  642. void CFaxOutboundRoutingDeviceNode::UpdateMenuState(UINT id, LPTSTR pBuf, UINT *flags)
  643. {
  644. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::UpdateMenuState"));
  645. UNREFERENCED_PARAMETER (pBuf);
  646. switch (id)
  647. {
  648. case IDM_MOVEUP:
  649. *flags = ((FXS_FIRST_DEVICE_ORDER == m_uiOrder) ? MF_GRAYED : MF_ENABLED );
  650. break;
  651. case IDM_MOVEDOWN:
  652. *flags = ((m_uiMaxOrder == m_uiOrder) ? MF_GRAYED : MF_ENABLED );
  653. break;
  654. default:
  655. break;
  656. }
  657. return;
  658. }
  659. /*
  660. - CFaxOutboundRoutingDeviceNode::SetOrder
  661. -
  662. * Purpose:
  663. * Overload function which allow
  664. * re-setting the order and the MaxOrder
  665. *
  666. * Arguments:
  667. *
  668. * [in] uiNewOrder - Device's order.
  669. * [in] uiNewMaxOrder - Maximal order in the current list
  670. *
  671. * Return:
  672. * no return value - void function
  673. */
  674. VOID CFaxOutboundRoutingDeviceNode::SetOrder(UINT uiNewOrder, UINT uiNewMaxOrder)
  675. {
  676. DEBUG_FUNCTION_NAME( _T("CFaxOutboundRoutingDeviceNode::UpdateMenuState"));
  677. m_uiOrder = uiNewOrder;
  678. m_uiMaxOrder = uiNewMaxOrder;
  679. return;
  680. }
  681. /*
  682. +
  683. + CFaxOutboundRoutingDeviceNode::OnShowContextHelp
  684. *
  685. * Purpose:
  686. * Overrides CSnapinNode::OnShowContextHelp.
  687. *
  688. * Arguments:
  689. *
  690. * Return:
  691. - OLE error code
  692. -
  693. */
  694. HRESULT CFaxOutboundRoutingDeviceNode::OnShowContextHelp(
  695. IDisplayHelp* pDisplayHelp, LPOLESTR helpFile)
  696. {
  697. return DisplayContextHelp(pDisplayHelp, helpFile, HLP_GROUPS);
  698. }