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

Symbian

开发平台:

Visual C++

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