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

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