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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: netchck.cpp,v 1.1.1.1.58.1 2004/07/09 02:07:37 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 "prefdefs.h"
  50. #include "netchck.h"
  51. #include "hxtick.h"
  52. #include "hxassert.h"
  53. CHXNetCheck::CHXNetCheck(UINT32 timeout) :
  54.     XHXNetCheck(timeout), 
  55.     m_phxNetServices(0),
  56.     m_phxTCPSocket(0),
  57.     m_pContext(0),
  58.     m_fConnected(FALSE),
  59.     m_fFailed(FALSE),
  60.     m_lRefCount(0)
  61. {
  62. }
  63. CHXNetCheck::~CHXNetCheck()
  64. {
  65.     if (m_pContext)
  66.         m_pContext->Release();
  67.     m_pContext = NULL;
  68.     
  69.     if (m_phxNetServices)
  70.         m_phxNetServices->Release();
  71.     m_phxNetServices = NULL;
  72.     if (m_phxTCPSocket)
  73.         m_phxTCPSocket->Release();
  74.     m_phxTCPSocket = NULL;
  75.     
  76. }
  77. /////////////////////////////////////////////////////////////////////////
  78. //  Method:
  79. //  IUnknown::QueryInterface
  80. //  Purpose:
  81. //  Implement this to export the interfaces supported by your 
  82. //  object.
  83. //
  84. STDMETHODIMP CHXNetCheck::QueryInterface(REFIID riid, void** ppvObj)
  85. {
  86.     if (IsEqualIID(riid, IID_IUnknown))
  87.     {
  88.         AddRef();
  89.         *ppvObj = this;
  90.         return HXR_OK;
  91.     }
  92.     if (IsEqualIID(riid, IID_IHXTCPResponse))
  93.     {
  94.         AddRef();
  95.         *ppvObj = (IHXTCPResponse*)this;
  96.         return HXR_OK;
  97.     }
  98.     *ppvObj = NULL;
  99.     return HXR_NOINTERFACE;
  100. }
  101. /////////////////////////////////////////////////////////////////////////
  102. //  Method:
  103. //  IUnknown::AddRef
  104. //  Purpose:
  105. //  Everyone usually implements this the same... feel free to use
  106. //  this implementation.
  107. //
  108. STDMETHODIMP_(UINT32) CHXNetCheck::AddRef()
  109. {
  110.     return InterlockedIncrement(&m_lRefCount);
  111. }
  112. /////////////////////////////////////////////////////////////////////////
  113. //  Method:
  114. //  IUnknown::Release
  115. //  Purpose:
  116. //  Everyone usually implements this the same... feel free to use
  117. //  this implementation.
  118. //
  119. STDMETHODIMP_(UINT32) CHXNetCheck::Release()
  120. {
  121.     if (InterlockedDecrement(&m_lRefCount) > 0)
  122.     {
  123.         return m_lRefCount;
  124.     }
  125.     delete this;
  126.     return 0;
  127. }
  128. /*
  129.  *  IHXTCPResponse methods
  130.  */
  131. /************************************************************************
  132.  *  Method:
  133.  *      IHXTCPResponse::ConnectDone
  134.  *  Purpose:
  135.  *      A Connect operation has been completed or an error has occurred.
  136.  */
  137. STDMETHODIMP CHXNetCheck::ConnectDone   (HX_RESULT      status)
  138. {
  139.     HX_ASSERT(m_fConnected == FALSE); // We shouldn't be getting called if 
  140.     // we aren't expecting it.
  141.     if (status == HXR_OK)
  142.         m_fConnected = TRUE;
  143.     else
  144.         m_fFailed = TRUE;
  145.     return HXR_OK;
  146. }
  147. /************************************************************************
  148.  *  Method:
  149.  *      IHXTCPResponse::ReadDone
  150.  *  Purpose:
  151.  *      A Read operation has been completed or an error has occurred.
  152.  *      The data is returned in the IHXBuffer.
  153.  */
  154. STDMETHODIMP CHXNetCheck::ReadDone      (HX_RESULT      status,
  155.                                          IHXBuffer*     pBuffer)
  156. {
  157.     HX_ASSERT(FALSE);
  158.     return HXR_OK;
  159. }
  160. /************************************************************************
  161.  *  Method:
  162.  *      IHXTCPResponse::WriteReady
  163.  *  Purpose:
  164.  *      This is the response method for WantWrite.
  165.  *      If HX_RESULT is ok, then the TCP channel is ok to Write to.
  166.  */
  167. STDMETHODIMP CHXNetCheck::WriteReady    (HX_RESULT      status)
  168. {
  169.     HX_ASSERT(FALSE);
  170.     return HXR_OK;
  171. }
  172. /************************************************************************
  173.  *  Method:
  174.  *      IHXTCPResponse::Closed
  175.  *  Purpose:
  176.  *      This method is called to inform you that the TCP channel has
  177.  *      been closed by the peer or closed due to error.
  178.  */
  179. STDMETHODIMP CHXNetCheck::Closed(HX_RESULT      status)
  180. {
  181.     m_fConnected = FALSE;
  182.     return HXR_OK;
  183. }
  184. //******************************************************************************
  185. //
  186. // Method:  CHXNetCheck::Init
  187. //
  188. // Purpose: Sets up the CHXNetCheck object with a context.
  189. //      
  190. //
  191. // Notes:   n/a
  192. //
  193. //******************************************************************************
  194. HX_RESULT 
  195. CHXNetCheck::Init(IUnknown *pContext)
  196. {
  197.     if (!pContext)
  198.         return HXR_FAILED;
  199.     m_pContext = pContext;
  200.     m_pContext->AddRef();
  201.     m_pContext->QueryInterface(IID_IHXNetworkServices, (void**)&m_phxNetServices);
  202.     return HXR_OK;
  203. }
  204. //******************************************************************************
  205. //
  206. // Method:  CHXNetCheck::FInternetAvailable
  207. //
  208. // Purpose: Checks to see if the internet is available.  Returns true if it is, 
  209. //          false otherwise.
  210. //      
  211. //
  212. // Notes:   n/a
  213. //
  214. //******************************************************************************
  215. BOOL 
  216. CHXNetCheck::FInternetAvailable(BOOL fPing,BOOL fProxy)
  217. {
  218.     BOOL fRet = TRUE;
  219.     UINT16  nPort = DEF_HTTP_PORT;
  220.     
  221. #ifdef UNIMPLEMENTED
  222.     HKEY hKey = 0 ;
  223.     DWORD fAutoDial = 0 ;
  224.     DWORD regType = 0 ;
  225.     DWORD cbBuf;
  226.     if (fProxy)
  227.         return TRUE;
  228.     //  check the autodial bit in the registry.
  229.     RegOpenKey(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Internet Settings",
  230.                &hKey);
  231.     cbBuf = sizeof(fAutoDial);
  232.     if (hKey)
  233.         RegQueryValueEx(hKey, "EnableAutodial", NULL, &regType, (BYTE *) &fAutoDial, &cbBuf);
  234.     if (!fAutoDial) //  if it's not set, go ahead and try the network
  235.     {
  236.         if (fPing)
  237.             fRet = Ping("209.66.98.23", nPort, FALSE);
  238.         else 
  239.             fRet = TRUE;
  240.         goto Ret;
  241.     }
  242.     else // See if we have an active RAS connection
  243.     {       
  244.         DWORD cRasConns = 0;
  245.         RASCONN rgRasConn[5];
  246.         DWORD cb = sizeof(rgRasConn);
  247.         
  248.         if (!m_hRasApiModule)
  249.             m_hRasApiModule= LoadLibrary("rasapi32.dll");
  250.         if (!m_hRasApiModule) // Dialup networking is not installed.
  251.         {
  252.             if (fPing)
  253.                 fRet = Ping("209.66.98.23", nPort, FALSE);
  254.             else 
  255.                 fRet = TRUE;
  256.             goto Ret;
  257.         }
  258.         if (!m_pRasEnumConnections)
  259.             m_pRasEnumConnections =
  260.                 (FPRASENUMCONNECTIONS)GetProcAddress(m_hRasApiModule, (LPCSTR) MAKELONG(565,0));
  261.         if (!m_pRasEnumConnections) // Dialup networking is not installed.
  262.         {
  263.             if (fPing)
  264.                 fRet = Ping("209.66.98.23", nPort, FALSE);
  265.             else 
  266.                 fRet = TRUE;
  267.             goto Ret;
  268.         }
  269.         rgRasConn[0].dwSize = sizeof(RASCONN);
  270.         m_pRasEnumConnections(rgRasConn, &cb, &cRasConns);
  271.         
  272.         if (cRasConns)
  273.         {
  274.             if (fPing)
  275.                 fRet = Ping("209.66.98.23", nPort, FALSE);
  276.             else 
  277.                 fRet = TRUE;
  278.             goto Ret;
  279.         }
  280.         else
  281.         {
  282.             fRet = FALSE;
  283.             goto Ret;
  284.         }
  285.     }
  286.   Ret:
  287. #endif
  288.     return (fRet);
  289. }
  290. //******************************************************************************
  291. //
  292. // Method:  CHXNetCheck::Ping
  293. //
  294. // Purpose: Tests to see if we can open a TCP connection to the given hostname. 
  295. //          if fAynchronous is true, we call back a response object provided by
  296. //          the caller (through Init).  Otherwise we block.
  297. //      
  298. //
  299. // Notes:   n/a
  300. //
  301. //******************************************************************************
  302. BOOL CHXNetCheck::Ping(const char *szHostName, UINT16 nPort, BOOL fAsynchronous)
  303. {
  304.     ULONG32 ulStartTime, ulCurrentTime, ulInterval, ulElapsedTime=0;
  305.     BOOL fRet = FALSE;
  306.     
  307.     if (!m_phxTCPSocket)
  308.         m_phxNetServices->CreateTCPSocket(&m_phxTCPSocket);
  309.     m_fFailed = m_fConnected = FALSE;
  310.     m_phxTCPSocket->Init(this);
  311.     
  312.     m_phxTCPSocket->Connect(szHostName, nPort);
  313.     ulInterval = 30000;
  314.     
  315.     // Get start time
  316.     ulStartTime = HX_GET_TICKCOUNT();
  317.     while (!m_fFailed && !m_fConnected && (ulElapsedTime < ulInterval))
  318.     {
  319.         SleepWell(1000);
  320.         ulCurrentTime = HX_GET_TICKCOUNT();
  321.         ulElapsedTime = CALCULATE_ELAPSED_TICKS(ulStartTime, ulCurrentTime);
  322.     }
  323.     fRet = m_fConnected;
  324.     m_phxTCPSocket->Release();
  325.     m_phxTCPSocket = NULL;
  326.     return (fRet);
  327. }
  328. //******************************************************************************
  329. //
  330. // Method:  CHXNetCheck::SleepWell
  331. //
  332. // Purpose: This method sleeps but continues to pump messages.  This allows us to 
  333. //          block properly, even under such platforms as Win16.
  334. //      
  335. //
  336. // Notes:   n/a
  337. //
  338. //******************************************************************************
  339. void CHXNetCheck::SleepWell(ULONG32 ulInterval)
  340. {
  341. #if 0
  342.     ULONG32 ulStartTime, ulCurrentTime;
  343.     MSG             msg;
  344.     
  345.     // Get start time
  346.     ulStartTime = HX_GET_TICKCOUNT();
  347.     do
  348.     {
  349.         // Keep pumping messages
  350.         if(PeekMessage(&msg, NULL,0,0,PM_REMOVE))
  351.         {
  352.             TranslateMessage(&msg);
  353.             DispatchMessage(&msg);
  354.         }
  355.         // If we have waited ulInterval time then drop out
  356.         ulCurrentTime = HX_GET_TICKCOUNT();
  357.     } while (CALCULATE_ELAPSED_TICKS(ulStartTime, ulCurrentTime) < ulInterval);
  358. #endif
  359. }
  360. BOOL 
  361. CHXNetCheck::SmartPing()
  362. {
  363.     HX_ASSERT(FALSE);
  364.     return FALSE;
  365. }