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