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

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 "hxtypes.h"
  36. #include "hxassert.h"
  37. #include "hxcom.h"
  38. #include "ihxpckts.h"
  39. #include "hxstrutl.h"
  40. #include "chxpckts.h"
  41. #include "hxrquest.h"
  42. #include "hxheap.h"
  43. #ifdef _DEBUG
  44. #undef HX_THIS_FILE
  45. static const char HX_THIS_FILE[] = __FILE__;
  46. #endif
  47. STDMETHODIMP_(ULONG32)
  48. CHXRequest::AddRef()
  49. {
  50.     return InterlockedIncrement(&m_lRefCount);
  51. }
  52. STDMETHODIMP_(ULONG32)
  53. CHXRequest::Release()
  54. {
  55.     if (InterlockedDecrement(&m_lRefCount) > 0)
  56.     {
  57.         return m_lRefCount;
  58.     }
  59.     delete this;
  60.     return 0;
  61. }
  62. STDMETHODIMP
  63. CHXRequest::QueryInterface(REFIID riid, void** ppvObj)
  64. {
  65. QInterfaceList qiList[] =
  66. {
  67. { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXRequest*)this },
  68. { GET_IIDHANDLE(IID_IHXRequest), (IHXRequest*) this },
  69. { GET_IIDHANDLE(IID_IHXRequestContext), (IHXRequestContext*) this },
  70. };
  71.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);   
  72. }
  73. CHXRequest::CHXRequest()
  74.     : m_lRefCount(0)
  75.     , m_pURL(NULL)
  76.     , m_pRequestHeaders(NULL)
  77.     , m_pResponseHeaders(NULL)
  78.     , m_pIUnknownUserContext(NULL)
  79.     , m_pIUnknownRequester(NULL)
  80. {
  81. }
  82. CHXRequest::~CHXRequest()
  83. {
  84.     if (m_pURL)
  85.     {
  86. delete[] m_pURL;
  87.     }
  88.     if (m_pRequestHeaders)
  89.     {
  90. m_pRequestHeaders->Release();
  91.     }
  92.     if (m_pResponseHeaders)
  93.     {
  94. m_pResponseHeaders->Release();
  95.     }
  96.     HX_RELEASE(m_pIUnknownUserContext);
  97.     HX_RELEASE(m_pIUnknownRequester);
  98. }
  99. STDMETHODIMP
  100. CHXRequest::SetRequestHeaders(IHXValues* pRequestHeaders)
  101. {
  102.     if (m_pRequestHeaders)
  103.     {
  104. m_pRequestHeaders->Release();
  105. m_pRequestHeaders = 0;
  106.     }
  107.     m_pRequestHeaders = pRequestHeaders;
  108.     if (m_pRequestHeaders)
  109.     {
  110. m_pRequestHeaders->AddRef();
  111.     }
  112.     return HXR_OK;
  113. }
  114. STDMETHODIMP
  115. CHXRequest::GetRequestHeaders(REF(IHXValues*) pRequestHeaders)
  116. {
  117.     if (m_pRequestHeaders)
  118.     {
  119. m_pRequestHeaders->AddRef();
  120.     }
  121.     pRequestHeaders = m_pRequestHeaders;
  122.     return HXR_OK;
  123. }
  124. STDMETHODIMP
  125. CHXRequest::SetResponseHeaders(IHXValues* pResponseHeaders)
  126. {
  127.     if (m_pResponseHeaders)
  128.     {
  129. m_pResponseHeaders->Release();
  130. m_pResponseHeaders = 0;
  131.     }
  132.     m_pResponseHeaders = pResponseHeaders;
  133.     if (m_pResponseHeaders)
  134.     {
  135. m_pResponseHeaders->AddRef();
  136.     }
  137.     return HXR_OK;
  138. }
  139. STDMETHODIMP
  140. CHXRequest::GetResponseHeaders(REF(IHXValues*) pResponseHeaders)
  141. {
  142.     if (m_pResponseHeaders)
  143.     {
  144. m_pResponseHeaders->AddRef();
  145.     }
  146.     pResponseHeaders = m_pResponseHeaders;
  147.     return HXR_OK;
  148. }
  149. STDMETHODIMP
  150. CHXRequest::SetURL(const char* pURL)
  151. {
  152.     if (m_pURL)
  153.     {
  154. delete[] m_pURL;
  155. m_pURL = 0;
  156.     }
  157.     if (pURL)
  158.     {
  159. m_pURL = new_string(pURL);
  160.     }
  161.     return HXR_OK;
  162. }
  163. STDMETHODIMP
  164. CHXRequest::GetURL(REF(const char*) pURL)
  165. {
  166.     pURL = m_pURL;
  167.     return HXR_OK;
  168. }
  169. /************************************************************************
  170.  * Method:
  171.  *     IHXRequest::SetUserContext
  172.  * Purpose:
  173.  *     Sets the Authenticated users Context.
  174.  */
  175. STDMETHODIMP
  176. CHXRequest::SetUserContext
  177. (
  178.     IUnknown* pIUnknownNewContext
  179. )
  180. {
  181.     HX_RELEASE(m_pIUnknownUserContext);
  182.     m_pIUnknownUserContext = pIUnknownNewContext;
  183.     if(m_pIUnknownUserContext)
  184.     {
  185. m_pIUnknownUserContext->AddRef();
  186.     }
  187.     return HXR_OK;
  188. }
  189. /************************************************************************
  190.  * Method:
  191.  *     IHXRequest::GetUserContext
  192.  * Purpose:
  193.  *     Gets the Authenticated users Context.
  194.  */
  195. STDMETHODIMP
  196. CHXRequest::GetUserContext
  197. (
  198.     REF(IUnknown*) pIUnknownCurrentContext
  199. )
  200. {
  201.     pIUnknownCurrentContext = m_pIUnknownUserContext;
  202.     if(pIUnknownCurrentContext)
  203.     {
  204. pIUnknownCurrentContext->AddRef();
  205. return HXR_OK;
  206.     }
  207.     return HXR_FAIL;
  208. }
  209. /************************************************************************
  210.  * Method:
  211.  *     IHXRequest::SetRequester
  212.  * Purpose:
  213.  *     Sets the Object that made the request.
  214.  */
  215. STDMETHODIMP
  216. CHXRequest::SetRequester
  217. (
  218.     IUnknown* pIUnknownNewRequester
  219. )
  220. {
  221.     // Don't allow the Requester object to be erased or reset.
  222.     if (!pIUnknownNewRequester || m_pIUnknownRequester)
  223.     {
  224. return HXR_FAIL;
  225.     }
  226.     m_pIUnknownRequester = pIUnknownNewRequester;
  227.     if(m_pIUnknownRequester)
  228.     {
  229. m_pIUnknownRequester->AddRef();
  230.     }
  231.     return HXR_OK;
  232. }
  233. /************************************************************************
  234.  * Method:
  235.  *     IHXRequest::GetRequester
  236.  * Purpose:
  237.  *     Gets the Object that made the request.
  238.  */
  239. STDMETHODIMP
  240. CHXRequest::GetRequester
  241. (
  242.     REF(IUnknown*) pIUnknownCurrentRequester
  243. )
  244. {
  245.     pIUnknownCurrentRequester = m_pIUnknownRequester;
  246.     if(pIUnknownCurrentRequester)
  247.     {
  248. pIUnknownCurrentRequester->AddRef();
  249. return HXR_OK;
  250.     }
  251.     return HXR_FAIL;
  252. }
  253. void
  254. CHXRequest::CreateFrom(IHXRequest* pRequestOld, IHXRequest** ppRequestNew)
  255. {
  256.     IHXRequestContext* pRequestContextOld = NULL;
  257.     CHXRequest* pRequestNew = new CHXRequest();
  258.     pRequestOld->GetRequestHeaders(pRequestNew->m_pRequestHeaders);
  259.     pRequestOld->GetResponseHeaders(pRequestNew->m_pResponseHeaders);
  260.     pRequestOld->QueryInterface
  261.     (
  262. IID_IHXRequestContext, 
  263. (void**)&pRequestContextOld
  264.     );
  265.     if (pRequestContextOld)
  266.     {
  267. pRequestContextOld->GetUserContext
  268. (
  269.     pRequestNew->m_pIUnknownUserContext
  270. );
  271. pRequestContextOld->GetRequester
  272. (
  273.     pRequestNew->m_pIUnknownRequester
  274. );
  275.     }
  276.     HX_RELEASE(pRequestContextOld);
  277.     (*ppRequestNew) = pRequestNew;
  278.     (*ppRequestNew)->AddRef();
  279. }
  280. void
  281. CHXRequest::CreateFromWithRequestHeaderOnly(IHXRequest* pRequestOld, IHXRequest** ppRequestNew)
  282. {
  283.     IHXValues*          pRequestHeaderSrc = NULL;
  284.     IHXRequestContext*  pRequestContextOld = NULL;
  285.     CHXRequest*         pRequestNew = new CHXRequest();
  286.     pRequestNew->m_pResponseHeaders = NULL;
  287.     if (HXR_OK == pRequestOld->GetRequestHeaders(pRequestHeaderSrc) &&
  288.         pRequestHeaderSrc)
  289.     {
  290.         pRequestNew->m_pRequestHeaders = new CHXHeader();
  291.         if (pRequestNew->m_pRequestHeaders)
  292.         {
  293.             pRequestNew->m_pRequestHeaders->AddRef();
  294.             CHXHeader::mergeHeaders(pRequestNew->m_pRequestHeaders,
  295.                                     pRequestHeaderSrc);
  296.         }
  297.         HX_RELEASE(pRequestHeaderSrc);
  298.     }
  299.     pRequestOld->QueryInterface
  300.     (
  301. IID_IHXRequestContext, 
  302. (void**)&pRequestContextOld
  303.     );
  304.     if (pRequestContextOld)
  305.     {
  306. pRequestContextOld->GetUserContext
  307. (
  308.     pRequestNew->m_pIUnknownUserContext
  309. );
  310. pRequestContextOld->GetRequester
  311. (
  312.     pRequestNew->m_pIUnknownRequester
  313. );
  314.     }
  315.     HX_RELEASE(pRequestContextOld);
  316.     (*ppRequestNew) = pRequestNew;
  317.     (*ppRequestNew)->AddRef();
  318. }