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

Symbian

开发平台:

Visual C++

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