hxnetif.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:8k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxcom.h"
  36. #include <string.h>
  37. #include <stdio.h>
  38. #include <time.h>
  39. #include "hxresult.h"
  40. #include "hxslist.h"
  41. #include "netbyte.h"
  42. #include "hxengin.h"
  43. #include "OT_net.h"
  44. #include "hxnetif.h"
  45. HXNetInterface::HXNetInterface(IUnknown* pContext)
  46. : m_lRefCount(0)
  47. , m_bInitialized(FALSE)
  48. , m_pNetInterfaceList(NULL)
  49. , m_pSinkList(NULL)
  50. {
  51. }
  52. HXNetInterface::~HXNetInterface()
  53. {
  54.     Close();
  55. }
  56. STDMETHODIMP
  57. HXNetInterface::QueryInterface(REFIID riid, void**ppvObj)
  58. {
  59.     if (IsEqualIID(riid, IID_IUnknown))
  60.     {
  61. AddRef();
  62. *ppvObj = this;
  63. return HXR_OK;
  64.     }
  65.     else if (IsEqualIID(riid, IID_IHXNetInterfaces))
  66.     {
  67. AddRef();
  68. *ppvObj = (IHXNetInterfaces*)this;
  69. return HXR_OK;
  70.     }
  71.     *ppvObj = NULL;
  72.     return HXR_NOINTERFACE;
  73. }
  74. /////////////////////////////////////////////////////////////////////////
  75. //  Method:
  76. // IUnknown::AddRef
  77. //  Purpose:
  78. // Everyone usually implements this the same... feel free to use
  79. // this implementation.
  80. //
  81. STDMETHODIMP_(ULONG32) 
  82. HXNetInterface::AddRef()
  83. {
  84.     return InterlockedIncrement(&m_lRefCount);
  85. }
  86. /////////////////////////////////////////////////////////////////////////
  87. //  Method:
  88. // IUnknown::Release
  89. //  Purpose:
  90. // Everyone usually implements this the same... feel free to use
  91. // this implementation.
  92. //
  93. STDMETHODIMP_(ULONG32) 
  94. HXNetInterface::Release()
  95. {
  96.     if (InterlockedDecrement(&m_lRefCount) > 0)
  97.     {
  98.         return m_lRefCount;
  99.     }
  100.     delete this;
  101.     return 0;
  102. }
  103. STDMETHODIMP
  104. HXNetInterface::UpdateNetInterfaces(void)
  105. {
  106.     HX_RESULT rc = HXR_OK;    
  107.     BOOL bChanged = FALSE;
  108.     bChanged = IsNetInterfaceChanged();
  109.     if (!m_bInitialized)
  110.     {
  111. m_bInitialized = TRUE;
  112.     }
  113.     else if (bChanged && m_pSinkList)
  114.     {
  115.         CHXSimpleList::Iterator ndx = m_pSinkList->Begin();
  116.         for (; ndx != m_pSinkList->End(); ++ndx)
  117.         {
  118.             IHXNetInterfacesAdviseSink* pSink = (IHXNetInterfacesAdviseSink*) (*ndx);
  119.             pSink->NetInterfacesUpdated();
  120.         }
  121.     }
  122.     
  123.     return rc;
  124. }
  125. STDMETHODIMP_(UINT32)
  126. HXNetInterface::GetNumOfNetInterfaces()
  127. {
  128.     if (!m_bInitialized)
  129.     {
  130. UpdateNetInterfaces();
  131.     }
  132.     return m_pNetInterfaceList ? m_pNetInterfaceList->GetCount() : 0;
  133. }
  134. STDMETHODIMP
  135. HXNetInterface::GetNetInterfaces(UINT16 lIndex,
  136.   REF(NIInfo*) pNIInfo)
  137. {
  138.     HX_RESULT  rc = HXR_OK;
  139.     int        i = 0;
  140.     CHXSimpleList::Iterator iter;
  141.     
  142.     pNIInfo = NULL;
  143.     
  144.     if (!m_bInitialized)
  145.     {
  146. UpdateNetInterfaces();
  147.     }
  148.     
  149.     if (m_pNetInterfaceList)
  150.     {
  151. iter = m_pNetInterfaceList->Begin();
  152. for (; iter != m_pNetInterfaceList->End(); ++iter, ++i)
  153. {
  154.     NIInfo* pInfo = (NIInfo*)(*iter);
  155.     if (i == lIndex)
  156.     {
  157. pNIInfo = pInfo;
  158. break;
  159.     }
  160. }
  161.     }
  162.     
  163.     if (!pNIInfo)
  164.     {
  165. rc = HXR_FAILED;
  166.     }
  167.     
  168.   cleanup:
  169.     
  170.     return rc;
  171. }
  172. STDMETHODIMP
  173. HXNetInterface::AddAdviseSink(IHXNetInterfacesAdviseSink* pSink)
  174. {
  175.     HX_RESULT rc = HXR_OK;
  176.     if (!m_pSinkList)
  177.     {
  178. m_pSinkList = new CHXSimpleList();
  179.     }
  180.     pSink->AddRef();
  181.     m_pSinkList->AddTail(pSink);
  182.     return rc;
  183. }
  184. STDMETHODIMP
  185. HXNetInterface::RemoveAdviseSink(IHXNetInterfacesAdviseSink* pSink)
  186. {
  187.     HX_RESULT rc = HXR_OK;
  188.     LISTPOSITION lPosition = m_pSinkList->Find(pSink);
  189.     if (!lPosition)
  190.     {
  191. rc = HXR_UNEXPECTED;
  192. goto cleanup;
  193.     }
  194.     m_pSinkList->RemoveAt(lPosition);
  195.     pSink->Release();
  196. cleanup:
  197.     return rc;
  198. }
  199. HX_RESULT
  200. HXNetInterface::RetrieveNetInterface(CHXSimpleList*& pNetInterfaceList)
  201. {
  202.     HX_RESULT      rc = HXR_OK;
  203.     NIInfo*        pNIInfo = NULL; 
  204.     InetInterfaceInfo info;
  205.     pNIInfo = new NIInfo;
  206.     
  207.     if (!pNIInfo)
  208.     {    
  209.      rc = HXR_OUTOFMEMORY;
  210.      goto cleanup;
  211.     }
  212.     
  213.     if (HXR_OK != OT_net::NetGetMyAddr(&pNIInfo->ulNetAddress) ||
  214.        HXR_OK != OT_net::NetGetIfaceInfo(&info))
  215.     {
  216. rc = HXR_FAILED;
  217. goto cleanup;
  218.     }
  219.             
  220.     pNIInfo->bActive = TRUE;
  221.     pNIInfo->ulNetMask = info.fNetmask;
  222.     if (!pNetInterfaceList)
  223.     {
  224. pNetInterfaceList = new CHXSimpleList;
  225.     }
  226.     pNetInterfaceList->AddTail(pNIInfo);
  227.  
  228.  cleanup:
  229.  
  230.     if (HXR_OK != rc)
  231.     {
  232. HX_DELETE(pNIInfo);
  233.     }
  234.   
  235.     return rc;
  236. }
  237. BOOL
  238. HXNetInterface::IsNetInterfaceChanged(void)
  239. {
  240.     BOOL            bResult = FALSE;
  241.     CHXSimpleList*  pTempNetInterfaceList = new CHXSimpleList();
  242.     RetrieveNetInterface(pTempNetInterfaceList);
  243.     
  244.     if (pTempNetInterfaceList && m_pNetInterfaceList)
  245.     {
  246. if (pTempNetInterfaceList->GetCount() != m_pNetInterfaceList->GetCount())
  247. {
  248.     bResult = TRUE;
  249. }
  250. else
  251. {
  252.     CHXSimpleList::Iterator ndx0 = pTempNetInterfaceList->Begin();
  253.     CHXSimpleList::Iterator ndx1 = m_pNetInterfaceList->Begin();
  254.     for (; ndx0 != pTempNetInterfaceList->End() && ndx1 != m_pNetInterfaceList->End(); ++ndx0, ++ndx1)
  255.     {
  256. NIInfo* pInfo0 = (NIInfo*)(*ndx0);
  257. NIInfo* pInfo1 = (NIInfo*)(*ndx1);
  258. if (pInfo0->ulNetAddress != pInfo1->ulNetAddress ||
  259.     pInfo0->ulNetMask != pInfo1->ulNetMask)
  260. {
  261.     bResult = TRUE;
  262. }
  263.     }
  264. }
  265.     }
  266.     else if (pTempNetInterfaceList != m_pNetInterfaceList)
  267.     {
  268. bResult = TRUE;
  269.     }
  270.     
  271.     if (bResult)
  272.     {
  273. Reset(m_pNetInterfaceList); 
  274. HX_DELETE(m_pNetInterfaceList);
  275. m_pNetInterfaceList = pTempNetInterfaceList;
  276.     }
  277.     else
  278.     {
  279. Reset(pTempNetInterfaceList);
  280. HX_DELETE(pTempNetInterfaceList);
  281.     }
  282.     
  283.     return bResult;
  284. }
  285.     
  286. void
  287. HXNetInterface::Reset(CHXSimpleList* pNetInterfaceList)
  288. {
  289.     if (pNetInterfaceList)
  290.     {
  291. while (pNetInterfaceList->GetCount())
  292. {
  293.     NIInfo* pNIInfo = (NIInfo*)pNetInterfaceList->RemoveHead();
  294.     HX_DELETE(pNIInfo);
  295. }
  296.     }
  297. }
  298. void
  299. HXNetInterface::Close(void)
  300. {
  301.     Reset(m_pNetInterfaceList);
  302.     HX_DELETE(m_pNetInterfaceList);
  303.     if (m_pSinkList)
  304.     {
  305. HX_ASSERT(m_pSinkList->GetCount() == 0);
  306. CHXSimpleList::Iterator ndx = m_pSinkList->Begin();
  307. for (; ndx != m_pSinkList->End(); ++ndx)
  308. {
  309.     IHXNetInterfacesAdviseSink* pSink = (IHXNetInterfacesAdviseSink*) (*ndx);
  310.     HX_RELEASE(pSink);
  311. }
  312. HX_DELETE(m_pSinkList);
  313.     }
  314. }