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

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2003 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 "platform/symbian/hxsymbianresolv.h"
  36. #include "debug.h"
  37. #include "smartptr.h"
  38. #include "hlxclib/string.h"
  39. #include <in_sock.h>
  40. #define D_RESOLVER 0x10000000
  41. const ULONG32 DefaultRetryCount = 5;
  42. HXSymbianResolver::HXSymbianResolver(IUnknown* pContext) :
  43.     CActive(EPriorityStandard),
  44.     m_lRefCount(0),
  45.     m_pResponse(0),
  46.     m_pAPManager(0),
  47.     m_pAPResponse(0),
  48.     m_bInitialized(FALSE),
  49.     m_pHostname(0),
  50.     m_ulRetryCount(0)
  51. {
  52.     CActiveScheduler::Add(this);
  53.     if (pContext)
  54.     {
  55. pContext->QueryInterface(IID_IHXAccessPointManager,
  56.  (void**)&m_pAPManager);
  57. if (m_pAPManager)
  58. {
  59.     m_pAPResponse = new HXAccessPointConnectResp(this, 
  60.  static_APConnectDone);
  61.     HX_ADDREF(m_pAPResponse);
  62. }
  63.     }
  64.     if ((m_sockServ.Connect() == KErrNone) &&
  65. (m_resolver.Open(m_sockServ, KAfInet, KProtocolInetTcp) == KErrNone))
  66.     {
  67. m_bInitialized = TRUE;
  68.     }
  69. }
  70. HXSymbianResolver::~HXSymbianResolver()
  71. {
  72.     if (m_bInitialized)
  73.     {
  74. if (IsActive())
  75.     Cancel();
  76. m_resolver.Close();
  77. m_sockServ.Close();
  78.     }
  79.     
  80.     HX_DELETE(m_pHostname);
  81.     HX_RELEASE(m_pResponse);
  82.     HX_RELEASE(m_pAPManager);
  83.     if (m_pAPResponse)
  84.     {
  85. m_pAPResponse->ClearPointers();
  86.     }
  87.     HX_RELEASE(m_pAPResponse);
  88. }
  89.     /*
  90.      *  IUnknown methods
  91.      */
  92. STDMETHODIMP HXSymbianResolver::QueryInterface(THIS_
  93. REFIID riid,
  94. void** ppvObj)
  95. {
  96.     QInterfaceList qiList[] =
  97.     {
  98. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXResolver*)this },
  99. { GET_IIDHANDLE(IID_IHXResolver), (IHXResolver*) this },
  100.     };
  101.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  102. }
  103. STDMETHODIMP_(ULONG32) HXSymbianResolver::AddRef(THIS)
  104. {
  105.     return InterlockedIncrement(&m_lRefCount);
  106. }
  107. STDMETHODIMP_(ULONG32)HXSymbianResolver::Release(THIS)
  108. {
  109.     if (InterlockedDecrement(&m_lRefCount) > 0)
  110.     {
  111.         return m_lRefCount;
  112.     }
  113.     
  114.     delete this;
  115.     return 0;
  116. }
  117.     /*
  118.      * IHXResolver methods
  119.      */
  120. STDMETHODIMP HXSymbianResolver::Init(THIS_ IHXResolverResponse*  pResponse)
  121. {
  122.     DPRINTF(D_RESOLVER, ("HXSymbianResolver::Init()n"));
  123.     HX_RELEASE(m_pResponse);
  124.     
  125.     m_pResponse = pResponse;
  126.     if (m_pResponse)
  127. m_pResponse->AddRef();
  128.     return (m_bInitialized) ? HXR_OK : HXR_FAILED;
  129. }
  130. STDMETHODIMP HXSymbianResolver::GetHostByName(THIS_ const char* pHostName)
  131. {
  132.     DPRINTF(D_RESOLVER, ("HXSymbianResolver::GetHostByName(%s)n", pHostName));
  133.     HX_RESULT res = HXR_FAILED;
  134.     DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXResolver*)this);
  135.     if (m_bInitialized && pHostName && !m_pHostname)
  136.     {
  137. TInt length = strlen(pHostName);
  138. m_pHostname = HBufC::NewMax(length);
  139. if (m_pHostname)
  140. {
  141.     for (TInt i = 0; i < length; i++)
  142.     {
  143. m_pHostname->Des()[i] = pHostName[i];
  144.     }
  145.     if (m_pAPManager && m_pAPResponse)
  146.     {
  147. res = m_pAPManager->Connect(m_pAPResponse);
  148.     }
  149.     else
  150.     {
  151. // We don't have an access point manager so
  152. // we should just simulate it's call on the
  153. // response object.
  154. APConnectDone(HXR_OK);
  155. res = HXR_OK;
  156.     }
  157. }
  158. else
  159. {
  160.     res = HXR_OUTOFMEMORY;
  161. }
  162.     }
  163.     return res;
  164. }
  165. void HXSymbianResolver::RunL()
  166. {
  167.     DPRINTF(D_RESOLVER, ("HXSymbianResolver::RunL()n"));
  168.     ULONG32 ulAddr = 0;
  169.     HX_RESULT status = HXR_DNR;
  170.     BOOL bDoneResolving = TRUE;
  171.     DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXResolver*)this);
  172.     if (iStatus == KErrNone)
  173.     {
  174. TInetAddr ipAddr(m_nameEntry().iAddr);
  175. ulAddr = (ULONG32)ipAddr.Address();
  176. status = HXR_OK;
  177.     }
  178.     else if ((iStatus == KErrTimedOut) && (m_ulRetryCount > 0))
  179.     {
  180. // Decrement retry count and try again
  181. m_ulRetryCount--;
  182. StartResolve();
  183. bDoneResolving = FALSE;
  184.     }
  185.     
  186.     if (bDoneResolving)
  187.     {
  188. DispatchResponse(status, ulAddr);
  189.     }
  190. }
  191. void HXSymbianResolver::DoCancel()
  192. {}
  193. void HXSymbianResolver::static_APConnectDone(void* pObj, HX_RESULT status)
  194. {
  195.     HXSymbianResolver* pResolv = (HXSymbianResolver*)pObj;
  196.     if (pResolv)
  197.     {
  198. pResolv->APConnectDone(status);
  199.     }
  200. }
  201. void HXSymbianResolver::APConnectDone(HX_RESULT status)
  202. {
  203.     DPRINTF(D_RESOLVER, ("HXSymbianResolver::APConnectDone(%08x)n",
  204.  status));
  205.     if (HXR_OK == status)
  206.     {
  207. m_ulRetryCount = DefaultRetryCount;
  208. StartResolve();
  209.     }
  210.     else
  211.     {
  212. DispatchResponse(status, 0);
  213.     }
  214. }
  215. void HXSymbianResolver::StartResolve()
  216. {
  217.     DPRINTF(D_RESOLVER, ("HXSymbianResolver::StartResolve()n"));
  218.     m_resolver.GetByName(*m_pHostname, m_nameEntry, iStatus);
  219.     SetActive();
  220. }
  221. void HXSymbianResolver::DispatchResponse(HX_RESULT status, ULONG32 ulAddr)
  222. {
  223.     DPRINTF(D_RESOLVER, ("HXSymbianResolver::DispatchResponse(%08x, %08x)n",
  224.  status, ulAddr));
  225.     HX_DELETE(m_pHostname);
  226.     
  227.     if (m_pResponse)
  228.     {
  229. m_pResponse->GetHostByNameDone(status, ulAddr);
  230.     }
  231. }