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

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.  *                 Phil Dibowitz
  34.  *  
  35.  * ***** END LICENSE BLOCK ***** */ 
  36. #include "hxcom.h"
  37. #include "hxtypes.h"
  38. #include "hlxclib/string.h"
  39. // #include "hlxclib/stdio.h"
  40. #include "safestring.h"
  41. #ifdef _MACINTOSH
  42. #ifdef _CARBON
  43. #ifdef _MAC_MACHO
  44. #include <sys/stat.h>
  45. #else
  46. #include <stat.h>
  47. #endif
  48. #else /* _CARBON */
  49. #include <stat.mac.h>
  50. #endif /* _CARBON */
  51. #else /* _MACINTOSH */
  52. #include "hlxclib/sys/types.h"
  53. #include "hlxclib/sys/stat.h"
  54. #endif /* _MACINTOSH */
  55. #include "hlxclib/time.h"
  56. #if defined(_AIX)
  57. #include <ctype.h>
  58. #endif
  59. #ifdef _WINDOWS
  60. #include "hlxclib/windows.h"
  61. #include <wininet.h>
  62. #include "hlxclib/io.h"
  63. #endif /* _WINDOWS */
  64. #if defined(_CARBON) || defined(_MAC_MACHO)
  65. #include "hxver.h" // for HXVER_SDK_PRODUCT
  66. #endif
  67. #ifdef _CARBON
  68. #include "cfwrappers.h"
  69. #endif
  70. #include "hxresult.h"
  71. #include "hxslist.h"
  72. #include "chxpckts.h"
  73. #include "hxstrutl.h"
  74. #include "dbcs.h"
  75. #include "dllpath.h"
  76. #include "hxprefs.h"
  77. #include "hxthread.h"
  78. #include "ihxcookies.h"
  79. #include "cookhlpr.h"
  80. #include "ihxcookies2.h"
  81. #include "hxdate.h"
  82. #include "cookies.h"
  83. #include "md5.h"
  84. #include "filespecutils.h"
  85. #ifdef _UNIX
  86. #include <sys/types.h>
  87. #include <sys/stat.h>
  88. #endif
  89. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_OSF1)
  90. #include <sys/file.h>
  91. #endif /* UNIX */
  92. #define RM_COOKIE_CAPTION "# Helix Cookie Filen# http://www.netscape.com/newsref/std/cookie_spec.htmln# This is a generated file!  Do not edit.nn"
  93. #ifdef _UNIX
  94. #  define RM_COOKIE_FILE_NAME "Cookies_6_0"
  95. #else
  96. #  define RM_COOKIE_FILE_NAME "cookies.txt"
  97. #endif
  98. /* We should really define it in a common header file */
  99. #if defined (_WINDOWS ) || defined (WIN32) || defined(_SYMBIAN)
  100. #define OS_SEPARATOR_CHAR '\'
  101. #define OS_SEPARATOR_STRING "\"
  102. #elif defined (_UNIX) || defined (_OPENWAVE)
  103. #define OS_SEPARATOR_CHAR '/'
  104. #define OS_SEPARATOR_STRING "/"
  105. #elif defined (_MACINTOSH)
  106. #define OS_SEPARATOR_CHAR ':'
  107. #define OS_SEPARATOR_STRING ":"
  108. #endif /* defined (_WINDOWS ) || defined (WIN32) */
  109. HXCookies::HXCookies(IUnknown* pContext, BOOL bMemoryOnly)
  110. : m_lRefCount(0)
  111. , m_bSaveCookies(FALSE)
  112. , m_bMemoryOnly(bMemoryOnly)
  113. , m_pNSCookiesPath(NULL)
  114. , m_pNSCookies(NULL)
  115. , m_pRMCookiesPath(NULL)
  116. , m_pRMCookies(NULL)
  117. , m_pCookiesHelper(NULL)
  118. , m_pPreferences(NULL)
  119. , m_bInitialized(FALSE)
  120. , m_lastModification(0)
  121. , m_pContext(NULL)
  122. #ifdef _WINDOWS
  123. , m_hLib(NULL)
  124. , m_pLock(NULL)
  125. , _pInternetSetCookie(NULL)
  126. , _pInternetGetCookie(NULL)
  127. #elif _UNIX
  128. , m_fileID(0)
  129. #endif /* _WINDOWS */
  130. {    
  131.     if (pContext)
  132.     {
  133. m_pContext = pContext;
  134. m_pContext->AddRef();
  135.     }
  136. }
  137. HXCookies::~HXCookies()
  138. {
  139.     Close();
  140. }
  141. STDMETHODIMP
  142. HXCookies::QueryInterface(REFIID riid, void**ppvObj)
  143. {
  144.     QInterfaceList qiList[] =
  145.     {
  146. { GET_IIDHANDLE(IID_IUnknown), this },
  147. { GET_IIDHANDLE(IID_IHXCookies), (IHXCookies*) this },
  148. { GET_IIDHANDLE(IID_IHXCookies2), (IHXCookies2*) this }
  149.     };
  150.     if (QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj) == HXR_OK)
  151.     {
  152.         return HXR_OK;
  153.     }
  154.     else if (IsEqualIID(riid, IID_IHXCookiesHelper) && m_pCookiesHelper)
  155.     {
  156. return m_pCookiesHelper->QueryInterface(riid, ppvObj);
  157.     }
  158.     *ppvObj = NULL;
  159.     return HXR_NOINTERFACE;
  160. }
  161. /////////////////////////////////////////////////////////////////////////
  162. //  Method:
  163. // IUnknown::AddRef
  164. //  Purpose:
  165. // Everyone usually implements this the same... feel free to use
  166. // this implementation.
  167. //
  168. STDMETHODIMP_(ULONG32) 
  169. HXCookies::AddRef()
  170. {
  171.     return InterlockedIncrement(&m_lRefCount);
  172. }
  173. /////////////////////////////////////////////////////////////////////////
  174. //  Method:
  175. // IUnknown::Release
  176. //  Purpose:
  177. // Everyone usually implements this the same... feel free to use
  178. // this implementation.
  179. //
  180. STDMETHODIMP_(ULONG32) 
  181. HXCookies::Release()
  182. {
  183.     if (InterlockedDecrement(&m_lRefCount) > 0)
  184.     {
  185.         return m_lRefCount;
  186.     }
  187.     delete this;
  188.     return 0;
  189. }
  190. HX_RESULT    
  191. HXCookies::Initialize(void)
  192. {
  193.     HX_RESULT hr = HXR_OK;
  194.     
  195.     if (!m_pContext || !IsCookieEnabled())
  196.     {
  197. hr = HXR_FAILED;
  198. goto cleanup;
  199.     }
  200.     m_pContext->QueryInterface(IID_IHXCookiesHelper, (void**) &m_pCookiesHelper);
  201.     if (!m_pCookiesHelper)
  202.     {
  203.         HXCookiesHelper* pHelper = new HXCookiesHelper();
  204.         if (pHelper)
  205. {
  206.             pHelper->QueryInterface(IID_IHXCookiesHelper, (void**) &m_pCookiesHelper);
  207. }
  208.     }
  209.     if (!m_bMemoryOnly)
  210.     {
  211. #ifdef _WINDOWS
  212.         if (m_hLib = LoadLibrary(OS_STRING("wininet.dll")))
  213. {
  214.             _pInternetSetCookie = (INTERNETSETCOOKIE)GetProcAddress(m_hLib, OS_STRING("InternetSetCookieA"));
  215.     _pInternetGetCookie = (INTERNETGETCOOKIE)GetProcAddress(m_hLib, OS_STRING("InternetGetCookieA"));
  216. }
  217. #endif /* _WINDOWS */
  218.         PrepareCookiesPath();
  219.         if (m_pNSCookiesPath)
  220. {
  221.     OpenCookies(m_pNSCookiesPath, FALSE, m_pNSCookies);
  222. }
  223.         if (m_pRMCookiesPath)
  224. {
  225.     OpenCookies(m_pRMCookiesPath, TRUE, m_pRMCookies);
  226.         }
  227.     }
  228.     m_bInitialized = TRUE;
  229. cleanup:
  230.     return hr;
  231. }
  232. void
  233. HXCookies::Close(void)
  234. {
  235.     if (m_bSaveCookies && !m_bMemoryOnly)
  236.     {
  237. SaveCookies();
  238.     }
  239.     ResetCookies(m_pNSCookies);
  240.     ResetCookies(m_pRMCookies);
  241.     HX_DELETE(m_pNSCookies);
  242.     HX_DELETE(m_pRMCookies);
  243.     HX_VECTOR_DELETE(m_pNSCookiesPath);
  244.     HX_VECTOR_DELETE(m_pRMCookiesPath);
  245.     HX_RELEASE(m_pPreferences);
  246.     HX_RELEASE(m_pCookiesHelper);
  247.     HX_RELEASE(m_pContext);
  248.     m_bInitialized = FALSE;
  249. #ifdef _WINDOWS
  250.     if (m_hLib)
  251.     {
  252. FreeLibrary(m_hLib);
  253. m_hLib = NULL;
  254.     }
  255.     HX_DELETE(m_pLock);
  256. #endif /* _WINDOWS */
  257. }
  258. STDMETHODIMP 
  259. HXCookies::SetCookies(const char* pHost, const char* pPath, IHXBuffer* pCookies)
  260. {
  261.     HX_RESULT     hr = HXR_OK;
  262.     int     host_length = 0;
  263.     int     path_length = 0;
  264.     int     domain_length = 0;
  265.     char*     pURL = NULL;
  266.     char*     path_from_header = NULL;
  267.     char*     domain_from_header = NULL;
  268.     char*     name_from_header = NULL;
  269.     char*     cookie_from_header = NULL;
  270.     char*     dot = NULL;
  271.     char*     slash = NULL;
  272.     BOOL     bIsDomain = FALSE;
  273.     time_t     expires=0;
  274.     IHXBuffer*     pBuffer = NULL;
  275.     IHXValues*     pValues = NULL;    
  276.     CookieStruct*   pNewCookie = NULL;
  277.     
  278.     if (!IsCookieEnabled())
  279.     {
  280. goto cleanup;
  281.     }
  282.     if (!m_bInitialized)
  283.     {
  284. hr = Initialize();
  285. if (HXR_OK != hr)
  286. {
  287.     goto cleanup;
  288. }
  289.     }
  290.     if (!m_pCookiesHelper || !pCookies || !pHost)
  291.     {
  292. hr = HXR_FAILED;
  293. goto cleanup;
  294.     }
  295.     if (HXR_OK != m_pCookiesHelper->Pack(pCookies, pValues))
  296.     {
  297. hr = HXR_FAILED;
  298. goto cleanup;
  299.     }
  300.     if (HXR_OK == pValues->GetPropertyBuffer("path", pBuffer) && pBuffer)
  301.     {
  302. ::StrAllocCopy(path_from_header, (char*)pBuffer->GetBuffer());
  303.     }
  304.     HX_RELEASE(pBuffer);
  305.     if (HXR_OK == pValues->GetPropertyBuffer("domain", pBuffer) && pBuffer)
  306.     {
  307.         // verify that this host has the authority to set for
  308.         // this domain.   We do this by making sure that the
  309.         // host is in the domain
  310.         // We also require that a domain have at least two
  311.         // periods to prevent domains of the form ".com"
  312.         // and ".edu"
  313. //
  314. // also make sure that there is more stuff after
  315. // the second dot to prevent ".com."
  316. ::StrAllocCopy(domain_from_header, (char*)pBuffer->GetBuffer());
  317.         dot = strchr(domain_from_header, '.');
  318.     
  319. if(dot)
  320. {
  321.             dot = strchr(dot+1, '.');
  322. }
  323. if(!dot || *(dot+1) == '') 
  324. {
  325.     // did not pass two dot test. FAIL
  326.     hr = HXR_FAILED;
  327.     goto cleanup;
  328. }
  329. domain_length = strlen(domain_from_header);
  330. host_length = strlen(pHost);
  331. // check to see if the host is in the domain
  332. if(domain_length > host_length || 
  333.    strcasecmp(domain_from_header, &pHost[host_length-domain_length]))
  334. {
  335.     hr = HXR_FAILED;
  336.     goto cleanup;
  337. }
  338. bIsDomain = TRUE;
  339.     }
  340.     HX_RELEASE(pBuffer);
  341.     if (HXR_OK == pValues->GetPropertyBuffer("name", pBuffer) && pBuffer)
  342.     {
  343. ::StrAllocCopy(name_from_header, (char*)pBuffer->GetBuffer());
  344.     }
  345.     HX_RELEASE(pBuffer);
  346.     if (HXR_OK == pValues->GetPropertyBuffer("value", pBuffer) && pBuffer)
  347.     {
  348. ::StrAllocCopy(cookie_from_header, (char*)pBuffer->GetBuffer());
  349.     }
  350.     HX_RELEASE(pBuffer);
  351.     if (HXR_OK == pValues->GetPropertyBuffer("expires", pBuffer) && pBuffer)
  352.     {
  353. expires = ::ParseDate((char*)pBuffer->GetBuffer());
  354.     }
  355.     HX_RELEASE(pBuffer);
  356.     if(!path_from_header && pPath)
  357.     {
  358.         // strip down everything after the last slash
  359.         // to get the path.
  360. CHXString strPath = pPath;
  361. INT32 nIndex = strPath.ReverseFind('/');
  362. if (nIndex != -1)
  363. {
  364.     strPath = strPath.Left(nIndex + 1);
  365. }
  366. ::StrAllocCopy(path_from_header, (char*) (const char*) strPath);
  367.     }
  368.     if(!domain_from_header && pHost)
  369.     {
  370. ::StrAllocCopy(domain_from_header, (char*)pHost); 
  371.     }
  372.     
  373.     m_bSaveCookies = TRUE;
  374.     // We have decided we are going to insert a cookie into the list
  375.     // Get the cookie lock so that we can munge on the list
  376.     pNewCookie = CheckForPrevCookie(path_from_header, 
  377.     domain_from_header, 
  378.     name_from_header);
  379.     if(pNewCookie) 
  380.     {
  381. HX_DELETE(pNewCookie->pCookieValue);
  382. HX_DELETE(pNewCookie->pCookieName);
  383. HX_DELETE(pNewCookie->pPath);
  384.         HX_DELETE(pNewCookie->pHost);
  385.         
  386. pNewCookie->pCookieValue = new CHXString(cookie_from_header);
  387. pNewCookie->pCookieName = new CHXString(name_from_header);
  388.         pNewCookie->pPath = new CHXString(path_from_header);
  389.         pNewCookie->pHost = new CHXString(domain_from_header);
  390.         pNewCookie->expires = expires;
  391.         pNewCookie->bIsDomain = bIsDomain;
  392. pNewCookie->bMemoryOnly = TRUE;
  393.     }
  394.     else 
  395.     {
  396. pNewCookie = new CookieStruct;
  397.         // copy
  398. pNewCookie->pCookieValue = new CHXString(cookie_from_header);
  399. pNewCookie->pCookieName = new CHXString(name_from_header);
  400.         pNewCookie->pPath = new CHXString(path_from_header);
  401.         pNewCookie->pHost = new CHXString(domain_from_header);
  402.         pNewCookie->expires = expires;
  403.         pNewCookie->bIsDomain = bIsDomain;
  404. pNewCookie->bMemoryOnly = TRUE;
  405. if (!m_pRMCookies)
  406. {
  407.     m_pRMCookies = new CHXSimpleList();
  408. }
  409. hr = AddCookie(pNewCookie, m_pRMCookies);
  410.     }
  411. #ifdef _WINDOWS
  412.     if (!m_bMemoryOnly)
  413.     {
  414.         if (!_pInternetSetCookie)
  415. {
  416.     goto cleanup;
  417. }
  418. host_length = strlen(pHost);
  419. if (pPath)
  420. {
  421.     path_length = strlen(pPath);
  422. }
  423. pURL = new char[host_length + path_length + 8];
  424. sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */
  425. _pInternetSetCookie(pURL, NULL, (const char*)pCookies->GetBuffer());
  426.     }
  427. #endif /* _WINDOWS */
  428. cleanup:
  429.     HX_RELEASE(pBuffer);
  430.     HX_RELEASE(pValues);
  431.     HX_VECTOR_DELETE(pURL);
  432.     HX_VECTOR_DELETE(path_from_header);
  433.     HX_VECTOR_DELETE(domain_from_header);
  434.     HX_VECTOR_DELETE(name_from_header);
  435.     HX_VECTOR_DELETE(cookie_from_header);
  436.     
  437.     return hr;
  438. }
  439. STDMETHODIMP 
  440. HXCookies::GetCookies(const char* pHost, const char* pPath, REF(IHXBuffer*) pCookies)
  441. {
  442.     IHXBuffer* pPlayerCookies = NULL;
  443.     HX_RESULT res = GetCookiesInternal(pHost, pPath, pCookies, pPlayerCookies);
  444.     HX_RELEASE(pPlayerCookies);
  445.     return res;
  446. }
  447. STDMETHODIMP HXCookies::GetCookies(const char*     pHost,
  448.       const char*     pPath,
  449.       REF(IHXBuffer*)   pCookies,
  450.       REF(IHXBuffer*)   pPlayerCookies)
  451. {
  452.     return GetCookiesInternal(pHost, pPath, pCookies, pPlayerCookies);
  453. }
  454. #if defined(_CARBON) || defined(_MAC_MACH)
  455. #define REPORT_COOKIES 1
  456. #endif
  457. HX_RESULT HXCookies::GetCookiesInternal(const char* pHost,
  458.  const char*     pPath,
  459.  REF(IHXBuffer*)   pCookies,
  460.  REF(IHXBuffer*)   pPlayerCookies)
  461. {
  462.     HX_RESULT     hr = HXR_OK;
  463.     char*     cp = NULL;
  464.     char*     pComma = NULL;
  465.     char*     pEqualSign = NULL;
  466.     char*     pData = NULL;
  467.     char*     pURL = NULL;
  468.     int     l = 0;
  469.     int     host_length = 0;
  470.     int     path_length = 0;
  471.     BOOL     bAdded = FALSE;
  472. UINT32     dwSize = 0;    
  473.     time_t     cur_time = time(NULL);
  474.     CookieStruct*   pTempCookie = NULL;
  475.     CookieStruct*   pNewCookie = NULL;
  476.     CHXSimpleList*  pCookiesFound1 = NULL;
  477.     CHXSimpleList*  pCookiesFound2 = NULL;
  478.     CHXSimpleList*  pCookiesList = NULL;
  479.     IHXValues*     pValues = NULL;
  480.     CHXSimpleList::Iterator  i;
  481.     CHXString       cHostCopy;
  482.     INT32           lColon;
  483.     BOOL     bIsPlayerCookieList = FALSE;
  484.     CHXString     strPlayerCookies;
  485. #ifdef REPORT_COOKIES
  486.     CHXString strCookieReport;
  487. #endif
  488.     
  489.     pCookies = NULL;
  490.     pPlayerCookies = NULL;
  491.     if (!IsCookieEnabled())
  492.     {
  493. goto cleanup;
  494.     }
  495.     if (!m_bInitialized)
  496.     {
  497. hr = Initialize();
  498. if (HXR_OK != hr)
  499. {
  500.     goto cleanup;
  501. }
  502.     }
  503.     else
  504.     {
  505. SyncRMCookies(FALSE);
  506.     }
  507.     if (!pHost || !m_pCookiesHelper)
  508.     {
  509. hr = HXR_FAILED;
  510. goto cleanup;
  511.     }
  512.     // return string to build    
  513.     if (!(pValues = new CHXHeader()))
  514.     {
  515. hr = HXR_OUTOFMEMORY;
  516. goto cleanup;
  517.     }
  518.     pValues->AddRef();
  519.     cHostCopy = pHost;
  520.     lColon    = cHostCopy.Find(':');
  521.     if (lColon >= 0)
  522.     {
  523. cHostCopy = cHostCopy.Left(lColon);
  524.     }
  525.     cHostCopy.MakeLower();
  526.     // search for all cookies(Netscape only for now)
  527.     for (l = 0; l < 2; l++)
  528.     {
  529. switch (l)
  530. {
  531. case 0:
  532.     pCookiesList = m_pRMCookies;
  533.     bIsPlayerCookieList = TRUE;
  534.     break;
  535. case 1:
  536.     pCookiesList = m_pNSCookies;
  537.     bIsPlayerCookieList = FALSE;
  538.     break;
  539. default:
  540.     break;
  541. }
  542. if (!pCookiesList)
  543. {
  544.     continue;
  545. }
  546. for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
  547. {
  548.     pTempCookie = (CookieStruct*) (*i);
  549.     
  550.     if (!pTempCookie->pHost)
  551.     {
  552. continue;
  553.     }
  554.     
  555.     // check the host or domain first
  556.     if(pTempCookie->bIsDomain)
  557.     {
  558. if (!DoesDomainMatch(*pTempCookie->pHost, cHostCopy))
  559. {
  560.     continue;
  561. }
  562.     }
  563.     else if(strcasecmp((const char*)*(pTempCookie->pHost), pHost))
  564.     {
  565. // hostname matchup failed.
  566. continue;
  567.     }
  568.     // shorter strings always come last so there can be no
  569.     // ambiquity             
  570.     if(pTempCookie->pPath && 
  571.        !strncmp(pPath, (const char*)*(pTempCookie->pPath), pTempCookie->pPath->GetLength()))
  572.     {
  573. // check for expired cookies
  574. if(pTempCookie->expires && (pTempCookie->expires < cur_time))
  575. {
  576.     m_bSaveCookies = TRUE;
  577.     continue;
  578. }
  579. if (!pCookiesFound1)
  580. {
  581.     pCookiesFound1 = new CHXSimpleList();
  582.     pCookiesFound1->AddTail(pTempCookie);
  583. }
  584. else if (!WasCookieAdded(pCookiesFound1, pTempCookie))
  585. {
  586.     pCookiesFound1->AddTail(pTempCookie);
  587. }
  588. if(bIsPlayerCookieList)
  589. {
  590.     if(!strPlayerCookies.IsEmpty())
  591.     {
  592.         strPlayerCookies += "|";
  593.     }
  594.     strPlayerCookies += *pTempCookie->pCookieName;
  595. #ifdef REPORT_COOKIES
  596.     strCookieReport += (strCookieReport.IsEmpty() ? "" : ", ");
  597.     strCookieReport += *pTempCookie->pCookieName;
  598.     strCookieReport += "=";
  599.     strCookieReport += *pTempCookie->pCookieValue;
  600. #endif
  601. }
  602.     }
  603. }
  604.     }
  605. #ifdef _WINDOWS
  606.     if (!_pInternetGetCookie || m_bMemoryOnly)
  607.     {
  608. goto cleanup;
  609.     }
  610.     host_length = strlen(pHost);
  611.     if (pPath)
  612.     {
  613. path_length = strlen(pPath);
  614.     }
  615.     pURL = new char[host_length + path_length + 8];
  616.     sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */
  617.     if (_pInternetGetCookie(pURL, NULL, pData, &dwSize) && !pData && dwSize)
  618.     {
  619. pData = new char[dwSize+1];
  620. if (!_pInternetGetCookie(pURL, NULL, pData, &dwSize))
  621. {
  622.     goto cleanup;
  623. }
  624. cp = pData;
  625. while (pComma = (char*) ::HXFindChar(cp, ';'))
  626. {
  627.     *pComma = '';
  628.     pComma++;
  629.     if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  630.     {
  631. *pEqualSign = '';
  632. pEqualSign++;
  633.          pNewCookie = new CookieStruct;
  634. bAdded = FALSE;
  635. // copy
  636. pNewCookie->pCookieValue = new CHXString(pEqualSign);
  637. pNewCookie->pCookieName = new CHXString(cp);
  638. pNewCookie->pPath = new CHXString(pPath);
  639. pNewCookie->pHost = new CHXString(pHost);
  640. pNewCookie->expires = 0;
  641. pNewCookie->bIsDomain = FALSE;
  642. pNewCookie->bMemoryOnly = FALSE;
  643. if(pNewCookie->pCookieName)
  644. {
  645.     pNewCookie->pCookieName->TrimLeft();
  646.     pNewCookie->pCookieName->TrimRight();
  647. }
  648. if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  649. {
  650.     if (!pCookiesFound2)
  651.     {
  652. pCookiesFound2 = new CHXSimpleList();
  653. pCookiesFound2->AddTail(pNewCookie);
  654. bAdded = TRUE;
  655.     }
  656.     else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  657.     {
  658. pCookiesFound2->AddTail(pNewCookie);
  659. bAdded = TRUE;
  660.     }
  661. }
  662. if (!bAdded)
  663. {
  664.     HX_DELETE(pNewCookie);
  665. }
  666.     }
  667.     cp = pComma;
  668. }
  669. if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  670. {
  671.     *pEqualSign = '';
  672.     pEqualSign++;
  673.     pNewCookie = new CookieStruct;
  674.     bAdded = FALSE;
  675.     // copy
  676.     pNewCookie->pCookieValue = new CHXString(pEqualSign);
  677.     pNewCookie->pCookieName = new CHXString(cp);
  678.     pNewCookie->pPath = NULL;
  679.     pNewCookie->pHost = NULL;
  680.     pNewCookie->expires = 0;
  681.     pNewCookie->bIsDomain = FALSE;
  682.     pNewCookie->bMemoryOnly = FALSE;
  683.     if(pNewCookie->pCookieName)
  684.     {
  685.         pNewCookie->pCookieName->TrimLeft();
  686.         pNewCookie->pCookieName->TrimRight();
  687.     }
  688.     if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  689.     {
  690. if (!pCookiesFound2)
  691. {
  692.     pCookiesFound2 = new CHXSimpleList();
  693.     pCookiesFound2->AddTail(pNewCookie);
  694.     bAdded = TRUE;
  695. }
  696. else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  697. {
  698.     pCookiesFound2->AddTail(pNewCookie);
  699.     bAdded = TRUE;
  700. }
  701.     }
  702.     if (!bAdded)
  703.     {
  704. HX_DELETE(pNewCookie);
  705.     }
  706. }
  707.     }
  708. #endif /* _WINDOWS */
  709. cleanup:
  710.     if (pCookiesFound1)
  711.     {
  712. for (i = pCookiesFound1->Begin(); i != pCookiesFound1->End(); ++i)
  713. {
  714.     pTempCookie = (CookieStruct*) (*i);
  715.     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  716.     {
  717. ::SaveStringToHeader(pValues,
  718.      (const char*)*(pTempCookie->pCookieName),
  719.      (char*)(const char*)*(pTempCookie->pCookieValue));
  720.     }
  721. }
  722.     }
  723.     if (pCookiesFound2)
  724.     {
  725. for (i = pCookiesFound2->Begin(); i != pCookiesFound2->End(); ++i)
  726. {
  727.     pTempCookie = (CookieStruct*) (*i);
  728.     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  729.     {
  730. ::SaveStringToHeader(pValues,
  731.      (const char*)*(pTempCookie->pCookieName),
  732.      (char*)(const char*)*(pTempCookie->pCookieValue));
  733.     }
  734.     HX_DELETE(pTempCookie);
  735. }
  736.     }
  737.     if (m_pCookiesHelper)
  738.     {
  739. hr = m_pCookiesHelper->UnPack(pValues, pCookies);
  740.     }
  741. #ifdef REPORT_COOKIES
  742.     IHXBuffer* pBuff = NULL;
  743.     if (m_pPreferences
  744. && m_pPreferences->ReadPref("CookieData", pBuff) == HXR_OK
  745. && 0 == stricmp((const char*)pBuff->GetBuffer(), "console"))
  746.     {
  747. CHXString str;
  748. str.Format("Cookies requested, getting host: %s  path: %s  cookies: %s",
  749. pHost, pPath, 
  750. strCookieReport.IsEmpty() ? "<no player cookies>" : (const char *) strCookieReport);
  751. ::CFShow(CHXCFString(str));
  752.     }
  753.     HX_RELEASE(pBuff);
  754. #endif
  755.     if(!strPlayerCookies.IsEmpty())
  756.     {
  757. pPlayerCookies = new CHXBuffer;
  758. pPlayerCookies->AddRef();
  759. pPlayerCookies->Set((const UCHAR*)(const char*)strPlayerCookies, strPlayerCookies.GetLength() + 1);
  760.     }
  761.     HX_DELETE(pCookiesFound1);
  762.     HX_DELETE(pCookiesFound2);
  763.     HX_VECTOR_DELETE(pData);
  764.     HX_VECTOR_DELETE(pURL);
  765.     HX_RELEASE(pValues);
  766.    
  767.     return hr;
  768. }
  769. HX_RESULT     
  770. HXCookies::PrepareCookiesPath(void)
  771. {
  772.     HX_RESULT hr = HXR_OK;
  773. #ifndef _VXWORKS
  774.     const char* pRMCookiesPath = NULL;
  775.     IHXBuffer* pBuffer = NULL;
  776. #if !defined(_CARBON) && !defined(_MAC_MACHO) /* figured out every time at runtime on the Mac since paths are not stable between runs */
  777.     if (m_pPreferences && (m_pPreferences->ReadPref("CookiesPath", pBuffer) == HXR_OK))
  778.     {
  779. m_pRMCookiesPath = new char[pBuffer->GetSize() + 1];
  780. strcpy(m_pRMCookiesPath, (const char*)pBuffer->GetBuffer()); /* Flawfinder: ignore */
  781.     }
  782.     HX_RELEASE(pBuffer);
  783. #endif
  784.     if( !m_pRMCookiesPath )
  785.     {
  786. if (m_pPreferences && (m_pPreferences->ReadPref("UserSDKDataPath", pBuffer) == HXR_OK))
  787. {
  788.     pRMCookiesPath = (char*) pBuffer->GetBuffer();
  789. }
  790. else
  791. {
  792. #if defined(_CARBON) || defined(_MAC_MACHO)
  793. CHXString strSDKPath = CHXFileSpecUtils::GetAppDataDir(HXVER_SDK_PRODUCT).GetPathName();
  794. #elif defined(_UNIX)
  795.     pRMCookiesPath = getenv("HOME");
  796.     HX_ASSERT( pRMCookiesPath );     
  797. #else
  798.     pRMCookiesPath = GetDLLAccessPath()->GetPath(DLLTYPE_COMMON);
  799. #endif        
  800. }
  801.         if( pRMCookiesPath )
  802.         {
  803.         
  804.             m_pRMCookiesPath = new char[strlen(pRMCookiesPath) + strlen(RM_COOKIE_FILE_NAME)+2];
  805.     ::strcpy(m_pRMCookiesPath, pRMCookiesPath); /* Flawfinder: ignore */
  806.     if (m_pRMCookiesPath[::strlen(m_pRMCookiesPath)-1] != OS_SEPARATOR_CHAR)
  807.     {
  808. strcat(m_pRMCookiesPath, OS_SEPARATOR_STRING); /* Flawfinder: ignore */
  809.     }
  810.     strcat(m_pRMCookiesPath, RM_COOKIE_FILE_NAME); /* Flawfinder: ignore */
  811.             
  812.     HX_RELEASE(pBuffer);
  813.             pBuffer = new CHXBuffer();
  814.             pBuffer->AddRef();
  815.             
  816.             pBuffer->Set((const unsigned char*)m_pRMCookiesPath, strlen(m_pRMCookiesPath) + 1);    
  817.             
  818.             if (m_pPreferences)
  819.             {
  820.                 m_pPreferences->WritePref("CookiesPath", pBuffer);
  821.             }
  822.             HX_RELEASE(pBuffer);
  823.         }
  824.    }
  825. #endif
  826. #ifdef _WINDOWS
  827.     HKEY    hMainAppKey = NULL;
  828.     HKEY    hBiffKey = NULL;
  829.     HKEY    hUsersKey = NULL;
  830.     HKEY    hServersKey = NULL;
  831.     HKEY    hCookiesKey = NULL;
  832.     INT32   lSize = _MAX_PATH - 1;
  833.     UINT32  ulSize = _MAX_PATH - 1;
  834.     UINT32  ulType = 0;
  835.     char    regKey[_MAX_PATH] = {0}; /* Flawfinder: ignore */
  836.     char*   pPath = NULL;
  837.     char*   pUser = NULL;
  838.     char*   pValue = NULL;
  839.     char*   pCursor = NULL;
  840.     // Netscape Browser 4.0+
  841.     if (RegOpenKeyEx(HKEY_CURRENT_USER, 
  842.      OS_STRING("Software\Netscape\Netscape Navigator\biff"), 
  843.      0,
  844.      KEY_READ, &hBiffKey) == ERROR_SUCCESS) 
  845.     {
  846. pUser = new char[_MAX_PATH];
  847. memset(pUser, 0, _MAX_PATH);
  848. if (RegQueryValueEx(hBiffKey, OS_STRING("CurrentUser"), 0, &ulType, (LPBYTE)pUser, &ulSize) == ERROR_SUCCESS) 
  849. {
  850.     SafeSprintf(regKey, _MAX_PATH, "Software\Netscape\Netscape Navigator\biff\users\%s", pUser);
  851.     
  852.     if (RegOpenKeyEx(HKEY_CURRENT_USER, OS_STRING(regKey), 0, KEY_READ, &hUsersKey) == ERROR_SUCCESS)
  853.     {
  854. pValue = new char[_MAX_PATH];
  855. memset(pValue, 0, _MAX_PATH);
  856. ulSize = _MAX_PATH - 1;
  857. if (RegQueryValueEx(hUsersKey, OS_STRING("defaultServer"), 0, &ulType, (LPBYTE)pValue, &ulSize) == ERROR_SUCCESS)
  858. {
  859.     SafeSprintf(regKey, _MAX_PATH, "Software\Netscape\Netscape Navigator\biff\users\%s\servers\%s",
  860.     pUser, pValue);
  861.     if (RegOpenKeyEx(HKEY_CURRENT_USER, OS_STRING(regKey), 0, KEY_READ, &hServersKey) == ERROR_SUCCESS)
  862.     {
  863. pPath = new char[_MAX_PATH];
  864. memset(pPath, 0, _MAX_PATH);
  865. ulSize = _MAX_PATH - 1;
  866. if (RegQueryValueEx(hServersKey, OS_STRING("popstatePath"), 0, &ulType, (LPBYTE)pPath, &ulSize) == ERROR_SUCCESS)
  867. {
  868.     // pPath ="..mailpopstate.dat"
  869.     // the actual location of cookies is 1 level up
  870.     if (pCursor = ::HXReverseFindChar(pPath, '\'))
  871.     {
  872. *pCursor = '';
  873.     
  874. if (pCursor = ::HXReverseFindChar(pPath, '\'))
  875. {
  876.     *pCursor = '';
  877.     m_pNSCookiesPath = new char[strlen(pPath) + 13];
  878.     sprintf(m_pNSCookiesPath, "%s\%s", pPath, RM_COOKIE_FILE_NAME); /* Flawfinder: ignore */
  879.     goto cleanup;
  880. }
  881.     }
  882. }
  883.     }
  884. }
  885.     }
  886. }
  887.     }
  888.     // Netscape Browser 3.0+
  889.     if (RegOpenKeyEx(HKEY_CURRENT_USER, OS_STRING("Software\Netscape\Netscape Navigator\Cookies"), 0,
  890. KEY_READ, &hCookiesKey) == ERROR_SUCCESS) 
  891.     {
  892. HX_VECTOR_DELETE(pPath);
  893. pPath = new char[_MAX_PATH];
  894. memset(pPath, 0, _MAX_PATH);
  895. ulSize = _MAX_PATH - 1;
  896. if (RegQueryValueEx(hCookiesKey, OS_STRING("Cookie File"), 0, &ulType, (LPBYTE)pPath, &ulSize) == ERROR_SUCCESS)
  897. {
  898.     m_pNSCookiesPath = new char[strlen(pPath) + 1];
  899.     strcpy(m_pNSCookiesPath, pPath); /* Flawfinder: ignore */
  900. }
  901.     }
  902. cleanup:
  903.     HX_RELEASE(pBuffer);
  904.     if (hMainAppKey)
  905.     {
  906. RegCloseKey(hMainAppKey);
  907.     }
  908.     if (hBiffKey)
  909.     {
  910. RegCloseKey(hBiffKey);
  911.     }
  912.     if (hUsersKey)
  913.     {
  914. RegCloseKey(hUsersKey);
  915.     }
  916.     if (hServersKey)
  917.     {
  918. RegCloseKey(hServersKey);
  919.     }
  920.     if (hCookiesKey)
  921.     {
  922. RegCloseKey(hCookiesKey);
  923.     }
  924.     HX_VECTOR_DELETE(pUser);
  925.     HX_VECTOR_DELETE(pPath);
  926.     HX_VECTOR_DELETE(pValue);    
  927. #endif /* _WINDOWS */
  928.     return hr;
  929. }
  930. void
  931. HXCookies::ResetCookies(CHXSimpleList* pCookieList)
  932. {
  933.     CookieStruct*   pCookie = NULL;
  934.     while (pCookieList && pCookieList->GetCount() > 0)
  935.     {
  936. pCookie = (CookieStruct*) pCookieList->RemoveHead();
  937. HX_DELETE(pCookie);
  938.     }
  939. }
  940. HX_RESULT
  941. HXCookies::FileReadLine(FILE* fp, char* pLine, UINT32 ulLineBuf, UINT32* pBytesRead)
  942. {
  943. #ifdef _OPENWAVE
  944.     return HXR_NOTIMPL;
  945. #else
  946.     HX_RESULT hr = HXR_OK;
  947.     UINT32 i = 0;
  948.     UINT32 ulBytesRead = 0;
  949.     char* pTmpBuf = NULL;
  950.     if (!fp)
  951.     {
  952. hr = HXR_FAILED;
  953. goto cleanup;
  954.     }
  955.     if (ulLineBuf < 1) 
  956.     {
  957.         *pBytesRead = 0;
  958.         goto cleanup;
  959.     }
  960.     ulBytesRead = fread(pLine, sizeof(char), ulLineBuf, fp);
  961.     pTmpBuf = pLine;
  962.     if (ulBytesRead)
  963.     {
  964. while (i < ulBytesRead) 
  965. {
  966. #ifdef _MACINTOSH
  967.     if (pTmpBuf[i] == 10 || pTmpBuf[i] == 13)
  968. #else
  969.     if (pTmpBuf[i] == 10)
  970. #endif
  971.     {   // LF
  972. if (pTmpBuf[i+1])
  973. {
  974.     pTmpBuf[i+1] = '';
  975. }
  976. // Back the file pointer up.
  977. fseek(fp, (long)((i + 1) - ulBytesRead), SEEK_CUR);
  978. *pBytesRead = i + 1;
  979. break;
  980.     }
  981.     i++;
  982. }
  983.     }
  984.     else
  985.     {
  986. hr = HXR_FAILED;
  987.     }
  988.     
  989. cleanup:
  990.     return hr;
  991. #endif /* _OPENWAVE */
  992. }
  993. CookieStruct*
  994. HXCookies::CheckForPrevCookie(char * path,
  995.        char * hostname,
  996.        char * name)
  997. {
  998.     int     nResult = 0;
  999.     const char*     pValue = NULL;
  1000.     BOOL     bFound = FALSE;
  1001.     CookieStruct*   pCookie = NULL;
  1002.     CHXSimpleList::Iterator  i;
  1003.     if (!m_pRMCookies)
  1004.     {
  1005. goto cleanup;
  1006.     }
  1007.     for (i = m_pRMCookies->Begin(); i != m_pRMCookies->End(); ++i)
  1008.     {
  1009. pCookie = (CookieStruct*) (*i);
  1010.         if(path && hostname && 
  1011.    pCookie->pPath && 
  1012.    pCookie->pHost && 
  1013.    pCookie->pCookieName &&
  1014.    !pCookie->pCookieName->Compare(name) &&
  1015.    !pCookie->pPath->Compare(path) &&     
  1016.    !pCookie->pHost->CompareNoCase(hostname))
  1017. {
  1018.             bFound = TRUE;
  1019.     break;
  1020. }
  1021.     }
  1022. cleanup:    
  1023.     return bFound?pCookie:NULL;
  1024. }
  1025. HX_RESULT
  1026. HXCookies::OpenCookies(char* pCookieFile, BOOL bRMCookies, CHXSimpleList*& pCookiesList)
  1027. {
  1028. #ifdef _OPENWAVE
  1029.     return HXR_NOTIMPL;
  1030. #else
  1031.     HX_RESULT     hr = HXR_OK;
  1032.     char*     pHost = NULL;
  1033.     char*     pPath = NULL;
  1034.     char*     pCookieName = NULL; 
  1035.     char*     pCookieValue = NULL;
  1036.     char*     pIsDomain = NULL;
  1037.     char*     pXXX = NULL;
  1038.     char*     pExpires = NULL;
  1039.     char*     pBuffer = new char[LINE_BUFFER_SIZE]; /* Flawfinder: ignore */
  1040.     UINT32     ulBytesRead = 0;
  1041.     FILE*     fp = NULL;
  1042.     CookieStruct*   pNewCookie = NULL;
  1043.  
  1044.     pCookiesList = NULL;
  1045.     if (!pBuffer)
  1046.     {
  1047. hr = HXR_FAILED;
  1048. goto cleanup;
  1049.     }
  1050.     pBuffer[0] = '';
  1051.     if (!pCookieFile)
  1052.     {
  1053. hr = HXR_FAILED;
  1054. goto cleanup;
  1055.     }
  1056. #ifdef _WINDOWS
  1057.     if (bRMCookies)
  1058.     {
  1059. if (!m_pLock)
  1060. {
  1061. #ifdef THREADS_SUPPORTED            
  1062.     HXEvent::MakeEvent(m_pLock, "CookieFileLock", FALSE);
  1063. #else            
  1064.     HXEvent::MakeStubEvent(m_pLock, "CookieFileLock", FALSE);
  1065. #endif            
  1066. }
  1067. else
  1068. {
  1069.     m_pLock->Wait();
  1070. }
  1071.     }
  1072. #endif /* _WINDOWS */
  1073.     if (bRMCookies)
  1074.     {
  1075. if(CheckCookies() == HXR_FAIL)
  1076. {
  1077.           hr = HXR_FAILED;
  1078.     goto cleanup;
  1079. }
  1080.     }
  1081.     if (!(fp = fopen(pCookieFile, "r+b")))
  1082.     {
  1083. hr = HXR_FAILED;
  1084. goto cleanup;
  1085.     }
  1086. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1087.     if (bRMCookies)
  1088.     {
  1089. m_fileID = fileno(fp);    
  1090. flock(m_fileID, LOCK_EX);
  1091.     }
  1092. #endif /* _UNIX */
  1093.     /* format is:
  1094.      *
  1095.      * host t is_domain t path t xxx t expires t name t cookie
  1096.      *
  1097.      * if this format isn't respected we move onto the next line in the file.
  1098.      *
  1099.      * is_domain is TRUE or FALSE   -- defaulting to FALSE
  1100.      * xxx is TRUE or FALSE     -- should default to TRUE
  1101.      * expires is a time_t integer
  1102.      * cookie can have tabs
  1103.      */
  1104.     while(HXR_OK == FileReadLine(fp, &pBuffer[0], LINE_BUFFER_SIZE, &ulBytesRead))
  1105.     {
  1106. if (*pBuffer == '#' || *pBuffer == CR || *pBuffer == LF || *pBuffer == 0)
  1107. {
  1108.     continue;
  1109. }
  1110. pHost = pBuffer;
  1111.     
  1112. if(!(pIsDomain = strchr(pHost, 't')))
  1113. {
  1114.     continue;
  1115. }
  1116. *pIsDomain++ = '';
  1117. if(*pIsDomain == CR || *pIsDomain == LF || *pIsDomain == 0)
  1118. {
  1119.     continue;
  1120. }
  1121. if(!(pPath = strchr(pIsDomain, 't')))
  1122. {
  1123.     continue;
  1124. }
  1125. *pPath++ = '';
  1126. if(*pPath == CR || *pPath == LF || *pPath == 0)
  1127. {
  1128.     continue;
  1129. }
  1130. if(!(pXXX = strchr(pPath, 't')))
  1131. {
  1132.     continue;
  1133. }
  1134. *pXXX++ = '';
  1135. if(*pXXX == CR || *pXXX == LF || *pXXX == 0)
  1136. {
  1137.     continue;
  1138. }
  1139. if(!(pExpires = strchr(pXXX, 't')))
  1140. {
  1141.     continue;
  1142. }
  1143. *pExpires++ = '';
  1144. if(*pExpires == CR || *pExpires == LF || *pExpires == 0)
  1145. {
  1146.     continue;
  1147. }
  1148. if(!(pCookieName = strchr(pExpires, 't')))
  1149. {
  1150.     continue;
  1151. }
  1152. *pCookieName++ = '';
  1153. if(*pCookieName == CR || *pCookieName == LF || *pCookieName == 0)
  1154. {
  1155.     continue;
  1156. }
  1157. if(!(pCookieValue = strchr(pCookieName, 't')))
  1158. {
  1159.     continue;
  1160. }
  1161. *pCookieValue++ = '';
  1162. if(*pCookieValue == CR || *pCookieValue == LF || *pCookieValue == 0)
  1163. {
  1164.     continue;
  1165. }
  1166. // remove the 'n' from the end of the cookie
  1167. pCookieValue = ::StripLine(pCookieValue);
  1168. // construct a new cookie_struct
  1169. pNewCookie = new CookieStruct;
  1170. if(!pNewCookie)
  1171. {
  1172.     hr = HXR_OUTOFMEMORY;
  1173.     goto cleanup;
  1174. }
  1175. memset(pNewCookie, 0, sizeof(CookieStruct));
  1176. /* copy
  1177.  */
  1178. pNewCookie->pCookieValue = new CHXString(pCookieValue);
  1179. pNewCookie->pCookieName = new CHXString(pCookieName);
  1180. pNewCookie->pPath = new CHXString(pPath);
  1181. pNewCookie->pHost = new CHXString(pHost);
  1182. #ifdef _MACINTOSH
  1183. pNewCookie->expires = (time_t)atoi64(pExpires);
  1184. #else
  1185. pNewCookie->expires = atol(pExpires);
  1186. #endif
  1187. if(!strcasecmp(pIsDomain, "TRUE"))
  1188. {
  1189.     pNewCookie->bIsDomain = TRUE;
  1190. }
  1191. else
  1192. {
  1193.     pNewCookie->bIsDomain = FALSE;
  1194. }
  1195. pNewCookie->bMemoryOnly = FALSE;
  1196. if (!pCookiesList)
  1197. {
  1198.     pCookiesList = new CHXSimpleList();
  1199. }
  1200. hr = AddCookie(pNewCookie, pCookiesList);
  1201.     }
  1202.     UpdateModificationTime();
  1203. cleanup:
  1204. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1205.     if (bRMCookies)
  1206.     {
  1207. flock(m_fileID, LOCK_UN);
  1208.     }
  1209. #endif /* _UNIX */
  1210.     if (fp)
  1211.     {
  1212. fclose(fp);
  1213.     }
  1214. #ifdef _WINDOWS
  1215.     if (bRMCookies && m_pLock)
  1216.     {
  1217. m_pLock->SignalEvent();
  1218.     }
  1219. #endif /* _WINDOWS */
  1220.     delete [] pBuffer;
  1221.     
  1222.     return hr;
  1223. #endif /* _OPENWAVE */
  1224. }
  1225. HX_RESULT
  1226. HXCookies::SaveCookies(void)
  1227. {
  1228. #ifdef _OPENWAVE
  1229.     return HXR_NOTIMPL;
  1230. #else
  1231.     HX_RESULT     hr = HXR_OK;
  1232.     FILE*     fp = NULL;
  1233.     INT32     len = 0;
  1234.     char     date_string[36] = {0}; /* Flawfinder: ignore */
  1235.     time_t     cur_date = time(NULL);
  1236.     CookieStruct*   pTempCookie = NULL;
  1237.     CHXSimpleList::Iterator  i;
  1238.     if (!m_pRMCookies || !m_pRMCookiesPath)
  1239.     {
  1240. goto cleanup;
  1241.     }
  1242. #ifdef _WINDOWS
  1243.     if (!m_pLock)
  1244.     {
  1245. #ifdef THREADS_SUPPORTED        
  1246. HXEvent::MakeEvent(m_pLock, "CookieFileLock", FALSE);
  1247. #else        
  1248. HXEvent::MakeStubEvent(m_pLock, "CookieFileLock", FALSE);
  1249. #endif
  1250.     }
  1251.     else
  1252.     {
  1253. m_pLock->Wait();
  1254.     }
  1255. #endif /* _WINDOWS */
  1256.     if (!(fp = fopen(m_pRMCookiesPath, "w")))
  1257.     {
  1258. hr = HXR_FAILED;
  1259. goto cleanup;
  1260.     }
  1261. #ifdef _UNIX
  1262.     //Make the permisions on the cookies file User read/write only.
  1263.     if( chmod( m_pRMCookiesPath, S_IRUSR | S_IWUSR ) != 0 )
  1264.     {
  1265.         HX_ASSERT( "Can't change permision on cookies file." == NULL );
  1266.     }
  1267.     
  1268. #endif    
  1269. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1270.     m_fileID = fileno(fp);    
  1271.     flock(m_fileID, LOCK_EX);
  1272. #endif /* _UNIX */
  1273.     fwrite(RM_COOKIE_CAPTION, sizeof(char), strlen(RM_COOKIE_CAPTION), fp);
  1274.     for (i = m_pRMCookies->Begin(); i != m_pRMCookies->End(); ++i)
  1275.     {
  1276. pTempCookie = (CookieStruct*) (*i);
  1277. /* format shall be:
  1278.    *
  1279.  * host t is_domain t path t secure t expires t name t cookie
  1280.  *
  1281.  * is_domain is TRUE or FALSE
  1282.  * secure is TRUE or FALSE  
  1283.  * expires is a time_t integer
  1284.  * cookie can have tabs
  1285.  */
  1286. if(pTempCookie->expires < cur_date)
  1287. {
  1288.     continue;  /* don't write entry if cookie has expired 
  1289. * or has no expiration date
  1290. */
  1291. }
  1292. len = fwrite((const char*)*(pTempCookie->pHost), sizeof(char), pTempCookie->pHost->GetLength(), fp);
  1293. if (len < 0)
  1294. {
  1295.     hr = HXR_FAILED;
  1296.     goto cleanup;
  1297. }
  1298. fwrite("t", sizeof(char), 1, fp);
  1299. if(pTempCookie->bIsDomain)
  1300. {
  1301.     fwrite("TRUE", sizeof(char), 4, fp);
  1302. }
  1303. else
  1304. {
  1305.     fwrite("FALSE", sizeof(char), 5, fp);
  1306. }     
  1307. fwrite("t", sizeof(char), 1, fp);
  1308. fwrite((const char*)*(pTempCookie->pPath), sizeof(char), pTempCookie->pPath->GetLength(), fp);
  1309. fwrite("t", sizeof(char), 1, fp);
  1310. fwrite("FALSE", sizeof(char), 5, fp);
  1311. fwrite("t", sizeof(char), 1, fp);
  1312. sprintf(date_string, "%lu", pTempCookie->expires); /* Flawfinder: ignore */
  1313. fwrite(date_string, sizeof(char), strlen(date_string), fp);
  1314. fwrite("t", sizeof(char), 1, fp);
  1315. fwrite((const char*)*(pTempCookie->pCookieName), sizeof(char), 
  1316. pTempCookie->pCookieName->GetLength(), fp);
  1317. fwrite("t", sizeof(char), 1, fp);
  1318. fwrite((const char*)*(pTempCookie->pCookieValue), sizeof(char), 
  1319. pTempCookie->pCookieValue->GetLength(), fp);
  1320. fwrite(LINEBREAK, sizeof(char), LINEBREAK_LEN, fp);
  1321. //once saved to disk, make sure the memory only flag is false
  1322. pTempCookie->bMemoryOnly = FALSE;
  1323.     }
  1324.     UpdateModificationTime();    
  1325.     m_bSaveCookies = FALSE;
  1326. cleanup:
  1327. #if defined (_UNIX) && !defined(_SUN) && !defined(_HPUX) && !defined(_IRIX) && !defined(_AIX) && !defined(_OSF1)
  1328.     flock(m_fileID, LOCK_UN);
  1329. #endif /* _UNIX */
  1330.     if (fp)
  1331.     {
  1332. fclose(fp);
  1333.     }
  1334. #ifdef _WINDOWS
  1335.     if (m_pLock)
  1336.     {
  1337. m_pLock->SignalEvent();
  1338.     }
  1339. #endif /* _WINDOWS */
  1340.     SecureCookies();
  1341.     return(hr);
  1342. #endif /* _OPENWAVE */
  1343. }
  1344. HX_RESULT
  1345. HXCookies::AddCookie(CookieStruct* pCookie, CHXSimpleList*& pCookiesList)
  1346. {
  1347.     HX_RESULT     hr = HXR_OK;
  1348.     BOOL     bShorterPathFound = FALSE;
  1349.     CookieStruct*   pTempCookie = NULL;
  1350.     LISTPOSITION    position;
  1351.     if (!pCookie || !pCookiesList)
  1352.     {
  1353. hr = HXR_FAILED;
  1354. goto cleanup;
  1355.     }
  1356.     /* add it to the list so that it is before any strings of
  1357.      * smaller length
  1358.      */
  1359.     position = pCookiesList->GetHeadPosition();
  1360.     while (position != NULL)
  1361.     {
  1362. pTempCookie = (CookieStruct*) pCookiesList->GetNext(position);
  1363. if (strlen(*pCookie->pPath) > strlen(*pTempCookie->pPath))
  1364. {
  1365.     // Remember that we found a shorter path
  1366.     bShorterPathFound = TRUE;
  1367.     // If the position is null, then event was the first
  1368.     // item in the list, and we need to do some fancy footwork...
  1369.     if (!position)
  1370.     {
  1371. POSITION theTail = pCookiesList->GetTailPosition();
  1372. pCookiesList->InsertBefore(theTail,(void*) pCookie);
  1373.     }
  1374.     // otherwise, roll after one...
  1375.     else
  1376.     {
  1377. pCookiesList->GetPrev(position);
  1378. if (!position)
  1379. {
  1380.     pCookiesList->AddHead((void*) pCookie);
  1381. }
  1382. else
  1383. {
  1384.     pCookiesList->InsertBefore(position,(void*) pCookie);
  1385. }
  1386.     }
  1387.     break;
  1388. }
  1389.     }
  1390.     // If we didn't find an earlier packet, then we should insert at
  1391.     // the head of the list...
  1392.     if (!bShorterPathFound)
  1393.     {
  1394. pCookiesList->AddTail((void*) pCookie);
  1395.     }
  1396. cleanup:
  1397.     return hr;
  1398. }
  1399. BOOL
  1400. HXCookies::WasCookieAdded(CHXSimpleList* pCookiesList, CookieStruct* pCookie)
  1401. {
  1402.     BOOL bResult = FALSE;
  1403.     CookieStruct*  pTempCookie = NULL;
  1404.     CHXSimpleList::Iterator  i;
  1405.     if (!pCookiesList || !pCookie)
  1406.     {
  1407. goto cleanup;
  1408.     }
  1409.     for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
  1410.     {
  1411. pTempCookie = (CookieStruct*) (*i);
  1412. if (pTempCookie->pCookieName && pCookie->pCookieName 
  1413. && *(pTempCookie->pCookieName) == *(pCookie->pCookieName) 
  1414. && pTempCookie->pHost && pCookie->pHost)
  1415. {
  1416.     if(DoesDomainMatch(*pTempCookie->pHost, *pCookie->pHost))
  1417.     {
  1418. bResult = TRUE;
  1419. break;
  1420.     }
  1421. }
  1422.     }
  1423. cleanup:
  1424.     return bResult;
  1425. }
  1426. BOOL HXCookies::DoesDomainMatch(const char* szDomain, const char* szDomainToParse)
  1427. {
  1428.     BOOL bMatches = FALSE;
  1429.     CHXString cHostCopy;
  1430.     CHXString cDomainCopy;
  1431.     CHXString cHostRight;
  1432.     if(!szDomain || !szDomainToParse || !strlen(szDomain) || !strlen(szDomainToParse))
  1433.     {
  1434. goto cleanup;
  1435.     }
  1436.     cHostCopy = szDomainToParse;
  1437.     cDomainCopy = szDomain;
  1438.     cDomainCopy.MakeLower();
  1439.     // Now we compare the domain (from the cookie itself) with
  1440.     // the rightmost characters of the host. For instance,
  1441.     // a domain of ".bar.com" would match with a host (passed in)
  1442.     // of "foo.bar.com", "www.bar.com", etc. but would NOT match
  1443.     // a host of "bar.com".
  1444.     cHostRight = cHostCopy.Right(cDomainCopy.GetLength());
  1445.     if (cHostRight != cDomainCopy)
  1446.     {
  1447.         // no match
  1448.         goto cleanup;
  1449.     }
  1450.     else if (cDomainCopy.GetAt(0) != '.' && cHostCopy.GetLength() > cDomainCopy.GetLength() &&
  1451.                  cHostCopy.GetAt(cHostCopy.GetLength() - cDomainCopy.GetLength() - 1) != '.')
  1452.     {
  1453.        // no match
  1454.         goto cleanup;
  1455.     }
  1456.     bMatches = TRUE;
  1457. cleanup:
  1458.     return bMatches;
  1459. }
  1460. BOOL
  1461. HXCookies::IsCookieEnabled()
  1462. {
  1463.     BOOL bResult = TRUE;
  1464.     IHXBuffer* pBuffer = NULL;
  1465.     if (!m_pPreferences)
  1466.     {
  1467. if (HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences))
  1468. {
  1469.     m_pPreferences = NULL;
  1470. }
  1471.     }
  1472.     if (m_pPreferences &&
  1473. m_pPreferences->ReadPref("CookiesEnabled", pBuffer) == HXR_OK)
  1474.     {
  1475. if (strcmp((const char*)pBuffer->GetBuffer(), "0") == 0)
  1476. {
  1477.     bResult = FALSE;
  1478. }
  1479. HX_RELEASE(pBuffer);
  1480.     } 
  1481.     return bResult;
  1482. }
  1483. void     
  1484. HXCookies::UpdateModificationTime(void)
  1485. {
  1486. #ifdef _OPENWAVE
  1487.     // XXXSAB implement this!!!
  1488. #else
  1489.     struct stat status;
  1490.     if (!m_pRMCookiesPath)
  1491.     {
  1492. goto cleanup;
  1493.     }
  1494. #ifndef _VXWORKS
  1495.     if (0 == stat(m_pRMCookiesPath, &status))
  1496.     {
  1497. m_lastModification = status.st_mtime;
  1498.     }
  1499. #endif /* _VXWORKS */
  1500. cleanup:
  1501.     return;
  1502. #endif
  1503. }
  1504. BOOL     
  1505. HXCookies::IsCookieFileModified(void)
  1506. {
  1507. #ifdef _OPENWAVE
  1508.     // XXXSAB implement this!!!
  1509.     return FALSE;
  1510. #else
  1511.     BOOL bResult = FALSE;
  1512.     struct stat status;
  1513.     if (!m_pRMCookiesPath)
  1514.     {
  1515. goto cleanup;
  1516.     }
  1517. #ifndef _VXWORKS
  1518.     if (0 == stat(m_pRMCookiesPath, &status) &&
  1519. status.st_mtime != m_lastModification)
  1520.     {
  1521. bResult = TRUE;
  1522.     }
  1523. #endif /* _VXWORKS */
  1524. cleanup:
  1525.     return bResult;
  1526. #endif
  1527. }
  1528. HX_RESULT
  1529. HXCookies::MergeCookieList(CHXSimpleList* pFromList, CHXSimpleList* pToList)
  1530. {
  1531.     HX_RESULT     hr = HXR_OK;
  1532.     CookieStruct*   pCookie = NULL;
  1533.     CHXSimpleList::Iterator  i;
  1534.     if (!pFromList)
  1535.     {
  1536. goto cleanup;
  1537.     }
  1538.     for (i = pFromList->Begin(); HXR_OK == hr && i != pFromList->End(); ++i)
  1539.     {
  1540. pCookie = (CookieStruct*) (*i);
  1541. if (pCookie->bMemoryOnly && !WasCookieAdded(pToList, pCookie))
  1542. {
  1543.     CookieStruct* pNewCookie = new CookieStruct;
  1544.     pNewCookie->pPath = new CHXString(*pCookie->pPath);
  1545.     pNewCookie->pHost = new CHXString(*pCookie->pHost);
  1546.     pNewCookie->pCookieName = new CHXString(*pCookie->pCookieName);
  1547.     pNewCookie->pCookieValue = new CHXString(*pCookie->pCookieValue);
  1548.     pNewCookie->expires = pCookie->expires;
  1549.     pNewCookie->bIsDomain = pCookie->bIsDomain;
  1550.     pNewCookie->bMemoryOnly = pCookie->bMemoryOnly;
  1551.     hr = AddCookie(pNewCookie, pToList);
  1552. }
  1553.     }
  1554. cleanup:
  1555.     return hr;
  1556. }
  1557. HX_RESULT
  1558. HXCookies::SyncRMCookies(BOOL bSave)
  1559. {
  1560.     HX_RESULT     hr = HXR_OK;
  1561.     CHXSimpleList*  pNewRMCookies = NULL;
  1562.     CHXSimpleList::Iterator i;
  1563.     CookieStruct* pCookie = NULL;
  1564.     BOOL bCookieFileModified = FALSE;
  1565.     if (!m_bInitialized)
  1566.     {
  1567. hr = HXR_FAILED;
  1568. goto cleanup;
  1569.     }
  1570.     bCookieFileModified = IsCookieFileModified();
  1571.     if (bCookieFileModified)
  1572.     {
  1573. if (HXR_OK == OpenCookies(m_pRMCookiesPath, TRUE, pNewRMCookies))
  1574. {
  1575.     if (m_bSaveCookies)
  1576.     {
  1577. MergeCookieList(m_pRMCookies, pNewRMCookies);
  1578.     }
  1579.      
  1580.     ResetCookies(m_pRMCookies);
  1581.     HX_DELETE(m_pRMCookies);
  1582.     m_pRMCookies = pNewRMCookies;
  1583. }          
  1584.     }
  1585.     if (bSave && m_bSaveCookies)
  1586.     {
  1587. if(m_pRMCookies && bCookieFileModified && pNewRMCookies == NULL)
  1588. {
  1589.     //this means there are no more cookies on disk, and we need to look at what's in memory, and keep
  1590.     //only cookies that have bMemoryOnly set
  1591.     pNewRMCookies = new CHXSimpleList;
  1592.     while (m_pRMCookies && m_pRMCookies->GetCount() > 0 && pNewRMCookies)
  1593.     {
  1594.      pCookie = (CookieStruct*) m_pRMCookies->RemoveHead();
  1595. if(pCookie->bMemoryOnly)
  1596. {
  1597.     CookieStruct* pNewCookie = new CookieStruct;
  1598.     pNewCookie->pPath = new CHXString(*pCookie->pPath);
  1599.     pNewCookie->pHost = new CHXString(*pCookie->pHost);
  1600.     pNewCookie->pCookieName = new CHXString(*pCookie->pCookieName);
  1601.     pNewCookie->pCookieValue = new CHXString(*pCookie->pCookieValue);
  1602.     pNewCookie->expires = pCookie->expires;
  1603.     pNewCookie->bIsDomain = pCookie->bIsDomain;
  1604.     pNewCookie->bMemoryOnly = pCookie->bMemoryOnly;
  1605.     AddCookie(pNewCookie, pNewRMCookies);
  1606. }
  1607.      HX_DELETE(pCookie);
  1608.     }
  1609.     HX_DELETE(m_pRMCookies);
  1610.     m_pRMCookies = pNewRMCookies;
  1611. }
  1612. hr = SaveCookies();
  1613.     }
  1614. cleanup:
  1615.     return hr;
  1616. }
  1617. #ifdef _TEST
  1618. void
  1619. HXCookies::DumpCookies(void)
  1620. {
  1621.     CHXSimpleList* pCookies = NULL;
  1622.     CookieStruct*  pCookie = NULL;
  1623.     CHXSimpleList::Iterator  i;
  1624.     for (int l = 0; l < 2; l++)
  1625.     {
  1626. switch (l)
  1627. {
  1628. case 0:
  1629.     pCookies = m_pNSCookies;
  1630.     break;
  1631. case 1:
  1632.     pCookies = m_pRMCookies;
  1633.     break;
  1634. default:
  1635.     break;
  1636. }
  1637. if (pCookies)
  1638. {
  1639.     printf("Total cookies: %lun", pCookies->GetCount());
  1640.     
  1641.     for (i = pCookies->Begin(); i != pCookies->End(); ++i)
  1642.     {
  1643. pCookie = (CookieStruct*) (*i);
  1644. printf("%st%st%sn",
  1645.        (const char*)*(pCookie->pHost),
  1646.        (const char*)*(pCookie->pCookieName),
  1647.        (const char*)*(pCookie->pCookieValue));
  1648.     }
  1649. }
  1650.     }
  1651.     return;
  1652. }
  1653. #endif // _TEST
  1654. //IRPCookies
  1655. STDMETHODIMP HXCookies::GetExpiredCookies(const char* pHost,
  1656.          const char*        pPath,
  1657.          REF(IHXBuffer*)   pCookies)
  1658. {
  1659.     HX_RESULT     hr = HXR_OK;
  1660.     char*     cp = NULL;
  1661.     char*     pComma = NULL;
  1662.     char*     pEqualSign = NULL;
  1663.     char*     pData = NULL;
  1664.     char*     pURL = NULL;
  1665.     int     l = 0;
  1666.     int     host_length = 0;
  1667.     int     path_length = 0;
  1668.     int     domain_length = 0;
  1669.     BOOL     bAdded = FALSE;
  1670.     UINT32     dwSize = 0;    
  1671.     time_t     cur_time = time(NULL);
  1672.     CookieStruct*   pTempCookie = NULL;
  1673.     CookieStruct*   pNewCookie = NULL;
  1674.     CHXSimpleList*  pCookiesFound1 = NULL;
  1675.     //CHXSimpleList*  pCookiesFound2 = NULL;
  1676.     CHXSimpleList*  pCookiesList = NULL;
  1677.     IHXValues*     pValues = NULL;
  1678.     CHXSimpleList::Iterator  i;
  1679.     CHXString       cHostCopy;
  1680.     INT32           lColon;
  1681.     
  1682.     pCookies = NULL;
  1683.     if (!IsCookieEnabled())
  1684.     {
  1685. goto cleanup;
  1686.     }
  1687.     if (!m_bInitialized)
  1688.     {
  1689. hr = Initialize();
  1690. if (HXR_OK != hr)
  1691. {
  1692.     goto cleanup;
  1693. }
  1694.     }
  1695.     else
  1696.     {
  1697. SyncRMCookies(FALSE);
  1698.     }
  1699.     if (!pHost || !m_pCookiesHelper)
  1700.     {
  1701. hr = HXR_FAILED;
  1702. goto cleanup;
  1703.     }
  1704.     // return string to build    
  1705.     if (!(pValues = new CHXHeader()))
  1706.     {
  1707. hr = HXR_OUTOFMEMORY;
  1708. goto cleanup;
  1709.     }
  1710.     pValues->AddRef();
  1711.     cHostCopy = pHost;
  1712.     lColon    = cHostCopy.Find(':');
  1713.     if (lColon >= 0)
  1714.     {
  1715. cHostCopy = cHostCopy.Left(lColon);
  1716.     }
  1717.     cHostCopy.MakeLower();
  1718.     // search for all cookies(Netscape only for now)
  1719.     for (l = 0; l < 2; l++)
  1720.     {
  1721. switch (l)
  1722. {
  1723. case 0:
  1724.     pCookiesList = m_pRMCookies;
  1725.     break;
  1726. case 1:
  1727.     pCookiesList = m_pNSCookies;
  1728.     break;
  1729. default:
  1730.     break;
  1731. }
  1732. if (!pCookiesList)
  1733. {
  1734.     continue;
  1735. }
  1736. for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
  1737. {
  1738.     pTempCookie = (CookieStruct*) (*i);
  1739.     
  1740.     if (!pTempCookie->pHost)
  1741.     {
  1742. continue;
  1743.     }
  1744.     // check the host or domain first
  1745.     if(pTempCookie->bIsDomain)
  1746.     {
  1747. domain_length = pTempCookie->pHost->GetLength();
  1748. CHXString cDomainCopy(*(pTempCookie->pHost));
  1749. cDomainCopy.MakeLower();
  1750. // Now we compare the domain (from the cookie itself) with
  1751. // the rightmost characters of the host. For instance,
  1752. // a domain of ".bar.com" would match with a host (passed in)
  1753. // of "foo.bar.com", "www.bar.com", etc. but would NOT match
  1754. // a host of "bar.com".
  1755. CHXString cHostRight = cHostCopy.Right(cDomainCopy.GetLength());
  1756. if (cHostRight != cDomainCopy)
  1757. {
  1758.     // no match
  1759.     continue;
  1760. }
  1761.     }
  1762.     else if(strcasecmp((const char*)*(pTempCookie->pHost), pHost))
  1763.     {
  1764. // hostname matchup failed.
  1765. continue;
  1766.     }
  1767.     // shorter strings always come last so there can be no
  1768.     // ambiquity             
  1769.     if(pTempCookie->pPath && 
  1770.        !strncmp(pPath, (const char*)*(pTempCookie->pPath), pTempCookie->pPath->GetLength()))
  1771.     {
  1772. // check for expired cookies
  1773. if(pTempCookie->expires && (pTempCookie->expires < cur_time))
  1774. {
  1775.     if (!pCookiesFound1)
  1776.     {
  1777.         pCookiesFound1 = new CHXSimpleList();
  1778.     }
  1779.     pCookiesFound1->AddTail(pTempCookie);
  1780. }
  1781.     }
  1782. }
  1783.     }
  1784. #ifdef _WINDOWS
  1785.     if (!_pInternetGetCookie || m_bMemoryOnly)
  1786.     {
  1787. goto cleanup;
  1788.     }
  1789.     host_length = strlen(pHost);
  1790.     if (pPath)
  1791.     {
  1792. path_length = strlen(pPath);
  1793.     }
  1794.     pURL = new char[host_length + path_length + 8];
  1795.     sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */
  1796.     if (_pInternetGetCookie(pURL, NULL, pData, &dwSize) && !pData && dwSize)
  1797.     {
  1798. pData = new char[dwSize+1];
  1799. if (!_pInternetGetCookie(pURL, NULL, pData, &dwSize))
  1800. {
  1801.     goto cleanup;
  1802. }
  1803. cp = pData;
  1804. while (pComma = (char*) ::HXFindChar(cp, ';'))
  1805. {
  1806.     *pComma = '';
  1807.     pComma++;
  1808.     if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  1809.     {
  1810. *pEqualSign = '';
  1811. pEqualSign++;
  1812. pNewCookie = new CookieStruct;
  1813. bAdded = FALSE;
  1814. // copy
  1815. pNewCookie->pCookieValue = new CHXString(pEqualSign);
  1816. pNewCookie->pCookieName = new CHXString(cp);
  1817. pNewCookie->pPath = NULL;
  1818. pNewCookie->pHost = NULL;
  1819. pNewCookie->expires = 0;
  1820. pNewCookie->bIsDomain = FALSE;
  1821. pNewCookie->bMemoryOnly = FALSE;
  1822. if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  1823. {
  1824.     //if (!pCookiesFound2)
  1825.     //{
  1826.     // pCookiesFound2 = new CHXSimpleList();
  1827.     // pCookiesFound2->AddTail(pNewCookie);
  1828.     // bAdded = TRUE;
  1829.     //}
  1830.     //else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  1831.     //{
  1832.     // pCookiesFound2->AddTail(pNewCookie);
  1833.     // bAdded = TRUE;
  1834.     //}
  1835. }
  1836. if (!bAdded)
  1837. {
  1838.     HX_DELETE(pNewCookie);
  1839. }
  1840.     }
  1841.     cp = pComma;
  1842. }
  1843. if (pEqualSign = (char*) ::HXFindChar(cp, '='))
  1844. {
  1845.     *pEqualSign = '';
  1846.     pEqualSign++;
  1847.     pNewCookie = new CookieStruct;
  1848.     bAdded = FALSE;
  1849.     // copy
  1850.     pNewCookie->pCookieValue = new CHXString(pEqualSign);
  1851.     pNewCookie->pCookieName = new CHXString(cp);
  1852.     pNewCookie->pPath = NULL;
  1853.     pNewCookie->pHost = NULL;
  1854.     pNewCookie->expires = 0;
  1855.     pNewCookie->bIsDomain = FALSE;
  1856.     pNewCookie->bMemoryOnly = FALSE;
  1857.     if (!WasCookieAdded(pCookiesFound1, pNewCookie))
  1858.     {
  1859. //if (!pCookiesFound2)
  1860. //{
  1861. //    pCookiesFound2 = new CHXSimpleList();
  1862. //    pCookiesFound2->AddTail(pNewCookie);
  1863. //    bAdded = TRUE;
  1864. //}
  1865. //else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
  1866. //{
  1867. //    pCookiesFound2->AddTail(pNewCookie);
  1868. //    bAdded = TRUE;
  1869. //}
  1870.     }
  1871.     if (!bAdded)
  1872.     {
  1873. HX_DELETE(pNewCookie);
  1874.     }
  1875. }
  1876.     }
  1877. #endif /* _WINDOWS */
  1878. cleanup:
  1879.     if (pCookiesFound1)
  1880.     {
  1881. for (i = pCookiesFound1->Begin(); i != pCookiesFound1->End(); ++i)
  1882. {
  1883.     pTempCookie = (CookieStruct*) (*i);
  1884.     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  1885.     {
  1886. ::SaveStringToHeader(pValues,
  1887.      (const char*)*(pTempCookie->pCookieName),
  1888.      (char*)(const char*)*(pTempCookie->pCookieValue));
  1889.     }
  1890. }
  1891.     }
  1892.     //if (pCookiesFound2)
  1893.     //{
  1894.     // for (i = pCookiesFound2->Begin(); i != pCookiesFound2->End(); ++i)
  1895.     // {
  1896.     //     pTempCookie = (CookieStruct*) (*i);
  1897.     //
  1898.     //     if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
  1899.     //     {
  1900.     // ::SaveStringToHeader(pValues,
  1901.     //      (const char*)*(pTempCookie->pCookieName),
  1902.     //      (char*)(const char*)*(pTempCookie->pCookieValue));
  1903.     //     }
  1904.     //
  1905.     //     HX_DELETE(pTempCookie);
  1906.     // }
  1907.     //}
  1908.     if (m_pCookiesHelper)
  1909.     {
  1910. hr = m_pCookiesHelper->UnPack(pValues, pCookies);
  1911.     }
  1912.     HX_DELETE(pCookiesFound1);
  1913.     //HX_DELETE(pCookiesFound2);
  1914.     HX_VECTOR_DELETE(pData);
  1915.     HX_VECTOR_DELETE(pURL);
  1916.     HX_RELEASE(pValues);
  1917.    
  1918.     return hr;
  1919. }
  1920. HX_RESULT HXCookies::SecureCookies()
  1921. {
  1922.     return HXR_OK;
  1923. }
  1924. HX_RESULT HXCookies::CheckCookies()
  1925. {
  1926.     return HXR_OK;
  1927. }