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

Symbian

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Source last modified: $Id: cookhlpr.cpp,v 1.3.20.3 2004/07/09 01:48:15 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 "hlxclib/string.h"
  50. //#include <stdio.h>
  51. #include "hxcom.h"
  52. #include "hxtypes.h"
  53. #include "hxresult.h"
  54. #include "chxpckts.h"
  55. #include "hxstrutl.h"
  56. #include "ihxcookies.h"
  57. #include "cookhlpr.h"
  58. #if defined(_AIX )
  59. #include <ctype.h>      // for isspace()
  60. #endif
  61. HXCookiesHelper::HXCookiesHelper()
  62. : m_lRefCount(0)
  63. {    
  64. }
  65. HXCookiesHelper::~HXCookiesHelper()
  66. {
  67. }
  68. STDMETHODIMP
  69. HXCookiesHelper::QueryInterface(REFIID riid, void**ppvObj)
  70. {
  71. QInterfaceList qiList[] =
  72. {
  73. { GET_IIDHANDLE(IID_IUnknown), this },
  74. { GET_IIDHANDLE(IID_IHXCookiesHelper), (IHXCookiesHelper*) this },
  75. };
  76.     return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);
  77. }
  78. /////////////////////////////////////////////////////////////////////////
  79. //  Method:
  80. // IUnknown::AddRef
  81. //  Purpose:
  82. // Everyone usually implements this the same... feel free to use
  83. // this implementation.
  84. //
  85. STDMETHODIMP_(ULONG32) 
  86. HXCookiesHelper::AddRef()
  87. {
  88.     return InterlockedIncrement(&m_lRefCount);
  89. }
  90. /////////////////////////////////////////////////////////////////////////
  91. //  Method:
  92. // IUnknown::Release
  93. //  Purpose:
  94. // Everyone usually implements this the same... feel free to use
  95. // this implementation.
  96. //
  97. STDMETHODIMP_(ULONG32) 
  98. HXCookiesHelper::Release()
  99. {
  100.     if (InterlockedDecrement(&m_lRefCount) > 0)
  101.     {
  102.         return m_lRefCount;
  103.     }
  104.     delete this;
  105.     return 0;
  106. }
  107. STDMETHODIMP
  108. HXCookiesHelper::Pack(IHXBuffer* pCookies,
  109.        REF(IHXValues*) pCookiesHeader)
  110. {
  111.     HX_RESULT     hr = HXR_OK;
  112.     char*     ptr = NULL;
  113.     char*     semi_colon = NULL;
  114.     char*     set_cookie_header = NULL;
  115.     char*     slash = NULL;
  116.     char*     equal = NULL;    
  117.     char*     date = NULL;
  118.     char*     path_from_header = NULL;
  119.     char*     domain_from_header = NULL;
  120.     char*     name_from_header = NULL;
  121.     char*     cookie_from_header = NULL;
  122.     IHXBuffer*     pBuffer = NULL;
  123.     if (!pCookies)
  124.     {
  125. hr = HXR_FAILED;
  126. goto cleanup;
  127.     }
  128.     pCookiesHeader = new CHXHeader();
  129.     if (!pCookiesHeader)
  130.     {
  131. hr = HXR_FAILED;
  132. goto cleanup;
  133.     }
  134.     pCookiesHeader->AddRef();
  135.     set_cookie_header = (char*)pCookies->GetBuffer();
  136.     
  137.     // terminate at any carriage return or linefeed
  138.     for(ptr = set_cookie_header; *ptr; ptr++)
  139.     {
  140. if(*ptr == LF || *ptr == CR) 
  141. {
  142.     *ptr = '';
  143.     break;
  144. }
  145.     }
  146.     // parse path and expires attributes from header if
  147.     // present
  148.     semi_colon = strchr(set_cookie_header, ';');
  149.     if(semi_colon)
  150.     {
  151. // truncate at semi-colon and advance   
  152. *semi_colon++ = '';
  153. // look for the path attribute  
  154. ptr = StrStrCaseInsensitive(semi_colon, "path=");
  155. if(ptr) 
  156. {          
  157.     // allocate more than we need
  158.     ::StrAllocCopy(path_from_header, ::StripLine(ptr+5));
  159.     // terminate at first space or semi-colon      
  160.     for(ptr = path_from_header; *ptr != ''; ptr++)
  161.     {
  162. if(IS_SPACE(*ptr) || *ptr == ';' || *ptr == ',') 
  163. {
  164.     *ptr = '';
  165.     break;
  166. }
  167.     }
  168.     
  169.     hr = ::SaveStringToHeader(pCookiesHeader, "path", path_from_header);
  170.     if (HXR_OK != hr)
  171.     {
  172. goto cleanup;
  173.     }   
  174.      }
  175. // look for a domain attribute
  176.         ptr = StrStrCaseInsensitive(semi_colon, "domain=");
  177.         if(ptr) 
  178. {
  179.     // allocate more than we need
  180.     ::StrAllocCopy(domain_from_header, ::StripLine(ptr+7));
  181.             // terminate at first space or semi-colon
  182.             for(ptr = domain_from_header; *ptr != ''; ptr++)
  183.     {
  184.                 if(IS_SPACE(*ptr) || *ptr == ';' || *ptr == ',') 
  185. {
  186.                     *ptr = '';
  187.                     break;
  188. }
  189.     }
  190.     hr = ::SaveStringToHeader(pCookiesHeader, "domain", domain_from_header);
  191.     if (HXR_OK != hr)
  192.     {
  193. goto cleanup;
  194.     }   
  195. }
  196. // now search for the expires header 
  197. // NOTE: that this part of the parsing
  198. // destroys the original part of the string
  199. ptr = StrStrCaseInsensitive(semi_colon, "expires=");
  200. if(ptr) 
  201. {
  202.     date = ptr+8;
  203.     // terminate the string at the next semi-colon
  204.     for(ptr = date; *ptr != ''; ptr++)
  205.     {
  206. if(*ptr == ';') 
  207. {
  208.     *ptr = '';
  209.     break;
  210. }
  211.     }
  212.     hr = ::SaveStringToHeader(pCookiesHeader, "expires", date);
  213.     if (HXR_OK != hr)
  214.     {
  215. goto cleanup;
  216.     }   
  217. }
  218.     }
  219.     
  220.     // keep cookies under the max bytes limit
  221.     if(strlen(set_cookie_header) > MAX_BYTES_PER_COOKIE)
  222.     {
  223. set_cookie_header[MAX_BYTES_PER_COOKIE-1] = '';
  224.     }
  225.     // separate the name from the cookie
  226.     equal = strchr(set_cookie_header, '=');
  227.     if(equal) 
  228.     {
  229. *equal = '';
  230. ::StrAllocCopy(name_from_header, ::StripLine(set_cookie_header));
  231. ::StrAllocCopy(cookie_from_header, ::StripLine(equal+1));
  232.     } 
  233.     else 
  234.     {
  235. ::StrAllocCopy(name_from_header, "");
  236. ::StrAllocCopy(cookie_from_header, ::StripLine(set_cookie_header));  
  237.     }
  238.     hr = ::SaveStringToHeader(pCookiesHeader, "name", name_from_header);
  239.     if (HXR_OK != hr)
  240.     {
  241. goto cleanup;
  242.     }   
  243.     hr = ::SaveStringToHeader(pCookiesHeader, "value", cookie_from_header);
  244.     if (HXR_OK != hr)
  245.     {
  246. goto cleanup;
  247.     }   
  248. cleanup:
  249.     if (HXR_OK != hr)
  250.     {
  251. HX_RELEASE(pCookiesHeader);
  252.     }
  253.     HX_VECTOR_DELETE(path_from_header);
  254.     HX_VECTOR_DELETE(domain_from_header);
  255.     HX_VECTOR_DELETE(name_from_header);
  256.     HX_VECTOR_DELETE(cookie_from_header);
  257.     return hr;
  258. }
  259. STDMETHODIMP
  260. HXCookiesHelper::UnPack(IHXValues*     pCookiesHeader,
  261.  REF(IHXBuffer*)   pCookies)
  262. {
  263.     HX_RESULT hr = HXR_OK;
  264.     const char* pPropName=NULL;
  265.     CHXString* pCookiesValue = NULL;
  266.     IHXBuffer* pBuffer=NULL;
  267.     if (!pCookiesHeader)
  268.     {
  269. hr = HXR_FAILED;
  270. goto cleanup;
  271.     }
  272.     if (!(pCookiesValue = new CHXString()))
  273.     {
  274. hr = HXR_OUTOFMEMORY;
  275. goto cleanup;
  276.     }
  277.     if (HXR_OK == pCookiesHeader->GetFirstPropertyBuffer(pPropName, pBuffer) &&
  278. pPropName && pBuffer)
  279.     {
  280. *pCookiesValue += pPropName;
  281. *pCookiesValue += "=";
  282. *pCookiesValue += pBuffer->GetBuffer();
  283.     }    
  284.     HX_RELEASE(pBuffer);
  285.         
  286.     while (HXR_OK == pCookiesHeader->GetNextPropertyBuffer(pPropName, pBuffer) &&
  287.    pPropName && pBuffer)
  288.     {
  289. *pCookiesValue += "; ";
  290. *pCookiesValue += pPropName;
  291. *pCookiesValue += "=";
  292. *pCookiesValue += pBuffer->GetBuffer();
  293. HX_RELEASE(pBuffer);
  294.     }
  295.     if (pCookiesValue && pCookiesValue->GetLength())
  296.     {
  297. pCookies = new CHXBuffer();
  298. pCookies->AddRef();
  299. pCookies->Set((const unsigned char*)(const char*)*(pCookiesValue), pCookiesValue->GetLength() + 1);
  300.     }
  301. cleanup:
  302.     if (HXR_OK != hr)
  303.     {
  304. HX_RELEASE(pCookies);
  305.     }
  306.     HX_DELETE(pCookiesValue);
  307.     return hr;
  308. }