hxnetif.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:9k
源码类别:

Symbian

开发平台:

Visual C++

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