⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cookies.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                 cHostCopy.GetAt(cHostCopy.GetLength() - cDomainCopy.GetLength() - 1) != '.')
    {
       // no match
        goto cleanup;
    }
    bMatches = TRUE;

cleanup:
    return bMatches;
}


BOOL
HXCookies::IsCookieEnabled()
{
    BOOL	bResult = TRUE;
    IHXBuffer*	pBuffer = NULL;

    if (!m_pPreferences)
    {
	if (HXR_OK != m_pContext->QueryInterface(IID_IHXPreferences, (void**)&m_pPreferences))
	{
	    m_pPreferences = NULL;
	}
    }

    if (m_pPreferences &&
	m_pPreferences->ReadPref("CookiesEnabled", pBuffer) == HXR_OK)
    {
	if (strcmp((const char*)pBuffer->GetBuffer(), "0") == 0)
	{
	    bResult = FALSE;
	}

	HX_RELEASE(pBuffer);
    } 
    return bResult;
}

void	    
HXCookies::UpdateModificationTime(void)
{
#ifdef _OPENWAVE
    // XXXSAB implement this!!!
#else
    struct stat status;

    if (!m_pRMCookiesPath)
    {
	goto cleanup;
    }

#ifndef _VXWORKS
    if (0 == stat(m_pRMCookiesPath, &status))
    {
	m_lastModification = status.st_mtime;
    }
#endif /* _VXWORKS */

cleanup:

    return;
#endif
}

BOOL	    
HXCookies::IsCookieFileModified(void)
{
#ifdef _OPENWAVE
    // XXXSAB implement this!!!
    return FALSE;
#else
    BOOL	bResult = FALSE;
    struct stat	status;

    if (!m_pRMCookiesPath)
    {
	goto cleanup;
    }

#ifndef _VXWORKS
    if (0 == stat(m_pRMCookiesPath, &status) &&
	status.st_mtime != m_lastModification)
    {
	bResult = TRUE;
    }
#endif /* _VXWORKS */

cleanup:

    return bResult;
#endif
}

HX_RESULT
HXCookies::MergeCookieList(CHXSimpleList* pFromList, CHXSimpleList* pToList)
{
    HX_RESULT	    hr = HXR_OK;
    CookieStruct*   pCookie = NULL;
    CHXSimpleList::Iterator  i;

    if (!pFromList)
    {
	goto cleanup;
    }

    for (i = pFromList->Begin(); HXR_OK == hr && i != pFromList->End(); ++i)
    {
	pCookie = (CookieStruct*) (*i);
	
	if (pCookie->bMemoryOnly && !WasCookieAdded(pToList, pCookie))
	{
	    CookieStruct* pNewCookie = new CookieStruct;
	    pNewCookie->pPath = new CHXString(*pCookie->pPath);
	    pNewCookie->pHost = new CHXString(*pCookie->pHost);
	    pNewCookie->pCookieName = new CHXString(*pCookie->pCookieName);
	    pNewCookie->pCookieValue = new CHXString(*pCookie->pCookieValue);
	    pNewCookie->expires = pCookie->expires;
	    pNewCookie->bIsDomain = pCookie->bIsDomain;
	    pNewCookie->bMemoryOnly = pCookie->bMemoryOnly;
	    hr = AddCookie(pNewCookie, pToList);
	}
    }

cleanup:

    return hr;
}

HX_RESULT	
HXCookies::SyncRMCookies(BOOL bSave)
{
    HX_RESULT	    hr = HXR_OK;
    CHXSimpleList*  pNewRMCookies = NULL;
    CHXSimpleList::Iterator i;
    CookieStruct* pCookie = NULL;
    BOOL bCookieFileModified = FALSE;

    if (!m_bInitialized)
    {
	hr = HXR_FAILED;
	goto cleanup;
    }

    bCookieFileModified = IsCookieFileModified();
    if (bCookieFileModified)
    {
	if (HXR_OK == OpenCookies(m_pRMCookiesPath, TRUE, pNewRMCookies))
	{
	    if (m_bSaveCookies)
	    {
		MergeCookieList(m_pRMCookies, pNewRMCookies);
	    }		
	     
	    ResetCookies(m_pRMCookies);
	    HX_DELETE(m_pRMCookies);

	    m_pRMCookies = pNewRMCookies;
	}	    	    
    }

    if (bSave && m_bSaveCookies)
    {
	if(m_pRMCookies && bCookieFileModified && pNewRMCookies == NULL)
	{
	    //this means there are no more cookies on disk, and we need to look at what's in memory, and keep
	    //only cookies that have bMemoryOnly set
	    pNewRMCookies = new CHXSimpleList;

	    while (m_pRMCookies && m_pRMCookies->GetCount() > 0 && pNewRMCookies)
	    {
	    	pCookie = (CookieStruct*) m_pRMCookies->RemoveHead();
		if(pCookie->bMemoryOnly)
		{
		    CookieStruct* pNewCookie = new CookieStruct;
		    pNewCookie->pPath = new CHXString(*pCookie->pPath);
		    pNewCookie->pHost = new CHXString(*pCookie->pHost);
		    pNewCookie->pCookieName = new CHXString(*pCookie->pCookieName);
		    pNewCookie->pCookieValue = new CHXString(*pCookie->pCookieValue);
		    pNewCookie->expires = pCookie->expires;
		    pNewCookie->bIsDomain = pCookie->bIsDomain;
		    pNewCookie->bMemoryOnly = pCookie->bMemoryOnly;
		    AddCookie(pNewCookie, pNewRMCookies);
		}
	    	HX_DELETE(pCookie);
	    }
	    HX_DELETE(m_pRMCookies);
	    m_pRMCookies = pNewRMCookies;
	}
	hr = SaveCookies();
    }

cleanup:

    return hr;
}

#ifdef _TEST
void
HXCookies::DumpCookies(void)
{
    CHXSimpleList* pCookies = NULL;
    CookieStruct*  pCookie = NULL;
    CHXSimpleList::Iterator  i;

    for (int l = 0; l < 2; l++)
    {
	switch (l)
	{
	case 0:
	    pCookies = m_pNSCookies;
	    break;
	case 1:
	    pCookies = m_pRMCookies;
	    break;
	default:
	    break;
	}

	if (pCookies)
	{
	    printf("Total cookies: %lu\n", pCookies->GetCount());
    
	    for (i = pCookies->Begin(); i != pCookies->End(); ++i)
	    {
		pCookie = (CookieStruct*) (*i);
		
		printf("%s\t%s\t%s\n",
		       (const char*)*(pCookie->pHost),
		       (const char*)*(pCookie->pCookieName),
		       (const char*)*(pCookie->pCookieValue));
	    }
	}
    }

    return;
}
#endif // _TEST




//IRPCookies
STDMETHODIMP HXCookies::GetExpiredCookies(const char* pHost,
    				    const char*	       pPath,
    				    REF(IHXBuffer*)   pCookies)
{
    HX_RESULT	    hr = HXR_OK;
    char*	    cp = NULL;
    char*	    pComma = NULL;
    char*	    pEqualSign = NULL;
    char*	    pData = NULL;
    char*	    pURL = NULL;
    int		    l = 0;
    int		    host_length = 0;
    int		    path_length = 0;
    int		    domain_length = 0;
    BOOL	    bAdded = FALSE;
    UINT32	    dwSize = 0;    
    time_t	    cur_time = time(NULL);
    CookieStruct*   pTempCookie = NULL;
    CookieStruct*   pNewCookie = NULL;
    CHXSimpleList*  pCookiesFound1 = NULL;
    //CHXSimpleList*  pCookiesFound2 = NULL;
    CHXSimpleList*  pCookiesList = NULL;
    IHXValues*	    pValues = NULL;
    CHXSimpleList::Iterator  i;
    CHXString       cHostCopy;
    INT32           lColon;
    
    pCookies = NULL;

    if (!IsCookieEnabled())
    {
	goto cleanup;
    }

    if (!m_bInitialized)
    {
	hr = Initialize();

	if (HXR_OK != hr)
	{
	    goto cleanup;
	}
    }
    else
    {
	SyncRMCookies(FALSE);
    }

    if (!pHost || !m_pCookiesHelper)
    {
	hr = HXR_FAILED;
	goto cleanup;
    }

    // return string to build    
    if (!(pValues = new CHXHeader()))
    {
	hr = HXR_OUTOFMEMORY;
	goto cleanup;
    }

    pValues->AddRef();

    cHostCopy = pHost;
    lColon    = cHostCopy.Find(':');
    if (lColon >= 0)
    {
	cHostCopy = cHostCopy.Left(lColon);
    }
    cHostCopy.MakeLower();

    // search for all cookies(Netscape only for now)
    for (l = 0; l < 2; l++)
    {
	switch (l)
	{
	case 0:
	    pCookiesList = m_pRMCookies;
	    break;
	case 1:
	    pCookiesList = m_pNSCookies;
	    break;
	default:
	    break;
	}

	if (!pCookiesList)
	{
	    continue;
	}

	for (i = pCookiesList->Begin(); i != pCookiesList->End(); ++i)
	{
	    pTempCookie = (CookieStruct*) (*i);
    
	    if (!pTempCookie->pHost)
	    {
		continue;
	    }

	    // check the host or domain first
	    if(pTempCookie->bIsDomain)
	    {
		domain_length = pTempCookie->pHost->GetLength();

		CHXString cDomainCopy(*(pTempCookie->pHost));
		cDomainCopy.MakeLower();

		// Now we compare the domain (from the cookie itself) with
		// the rightmost characters of the host. For instance,
		// a domain of ".bar.com" would match with a host (passed in)
		// of "foo.bar.com", "www.bar.com", etc. but would NOT match
		// a host of "bar.com".
		CHXString cHostRight = cHostCopy.Right(cDomainCopy.GetLength());
		if (cHostRight != cDomainCopy)
		{
		    // no match
		    continue;
		}
	    }
	    else if(strcasecmp((const char*)*(pTempCookie->pHost), pHost))
	    {
		// hostname matchup failed.
		continue;
	    }

	    // shorter strings always come last so there can be no
	    // ambiquity						     	      
	    if(pTempCookie->pPath && 
	       !strncmp(pPath, (const char*)*(pTempCookie->pPath), pTempCookie->pPath->GetLength()))
	    {
		// check for expired cookies
		if(pTempCookie->expires && (pTempCookie->expires < cur_time))
		{
		    if (!pCookiesFound1)
		    {
		        pCookiesFound1 = new CHXSimpleList();
		    }
		    pCookiesFound1->AddTail(pTempCookie);
		}
	    }
	}
    }

#ifdef _WINDOWS
    if (!_pInternetGetCookie || m_bMemoryOnly)
    {
	goto cleanup;
    }

    host_length = strlen(pHost);

    if (pPath)
    {
	path_length = strlen(pPath);
    }

    pURL = new char[host_length + path_length + 8];
    sprintf(pURL, "http://%s%s", pHost, pPath); /* Flawfinder: ignore */

    if (_pInternetGetCookie(pURL, NULL, pData, &dwSize) && !pData && dwSize)
    {
	pData = new char[dwSize+1];

	if (!_pInternetGetCookie(pURL, NULL, pData, &dwSize))
	{
	    goto cleanup;
	}

	cp = pData;

	while (pComma = (char*) ::HXFindChar(cp, ';'))
	{
	    *pComma = '\0';
	    pComma++;

	    if (pEqualSign = (char*) ::HXFindChar(cp, '='))
	    {
		*pEqualSign = '\0';
		pEqualSign++;

		pNewCookie = new CookieStruct;
		bAdded = FALSE;

		// copy
		pNewCookie->pCookieValue = new CHXString(pEqualSign);
		pNewCookie->pCookieName = new CHXString(cp);
		pNewCookie->pPath = NULL;
		pNewCookie->pHost = NULL;
		pNewCookie->expires = 0;
		pNewCookie->bIsDomain = FALSE;
		pNewCookie->bMemoryOnly = FALSE;

		if (!WasCookieAdded(pCookiesFound1, pNewCookie))
		{
		    //if (!pCookiesFound2)
		    //{
		    //	pCookiesFound2 = new CHXSimpleList();
		    //	pCookiesFound2->AddTail(pNewCookie);
		    //	bAdded = TRUE;
		    //}
		    //else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
		    //{
		    //	pCookiesFound2->AddTail(pNewCookie);
		    //	bAdded = TRUE;
		    //}
		}
		
		if (!bAdded)
		{
		    HX_DELETE(pNewCookie);
		}
	    }

	    cp = pComma;
	}

	if (pEqualSign = (char*) ::HXFindChar(cp, '='))
	{
	    *pEqualSign = '\0';
	    pEqualSign++;

	    pNewCookie = new CookieStruct;
	    bAdded = FALSE;

	    // copy
	    pNewCookie->pCookieValue = new CHXString(pEqualSign);
	    pNewCookie->pCookieName = new CHXString(cp);
	    pNewCookie->pPath = NULL;
	    pNewCookie->pHost = NULL;
	    pNewCookie->expires = 0;
	    pNewCookie->bIsDomain = FALSE;
	    pNewCookie->bMemoryOnly = FALSE;

	    if (!WasCookieAdded(pCookiesFound1, pNewCookie))
	    {
		//if (!pCookiesFound2)
		//{
		//    pCookiesFound2 = new CHXSimpleList();
		//    pCookiesFound2->AddTail(pNewCookie);
		//    bAdded = TRUE;
		//}
		//else if (!WasCookieAdded(pCookiesFound2, pNewCookie))
		//{
		//    pCookiesFound2->AddTail(pNewCookie);
		//    bAdded = TRUE;
		//}
	    }

	    if (!bAdded)
	    {
		HX_DELETE(pNewCookie);
	    }
	}
    }
#endif /* _WINDOWS */

cleanup:

    if (pCookiesFound1)
    {
	for (i = pCookiesFound1->Begin(); i != pCookiesFound1->End(); ++i)
	{
	    pTempCookie = (CookieStruct*) (*i);

	    if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
	    {
		::SaveStringToHeader(pValues,
				     (const char*)*(pTempCookie->pCookieName),
				     (char*)(const char*)*(pTempCookie->pCookieValue));
	    }
	}
    }

    //if (pCookiesFound2)
    //{
    //	for (i = pCookiesFound2->Begin(); i != pCookiesFound2->End(); ++i)
    //	{
    //	    pTempCookie = (CookieStruct*) (*i);
    //
    //	    if(pTempCookie->pCookieName && pTempCookie->pCookieValue)
    //	    {
    //		::SaveStringToHeader(pValues,
    //				     (const char*)*(pTempCookie->pCookieName),
    //				     (char*)(const char*)*(pTempCookie->pCookieValue));
    //	    }
    //
    //	    HX_DELETE(pTempCookie);
    //	}
    //}

    if (m_pCookiesHelper)
    {
	hr = m_pCookiesHelper->UnPack(pValues, pCookies);
    }

    HX_DELETE(pCookiesFound1);
    //HX_DELETE(pCookiesFound2);
    HX_VECTOR_DELETE(pData);
    HX_VECTOR_DELETE(pURL);

    HX_RELEASE(pValues);
   
    return hr;
}

HX_RESULT HXCookies::SecureCookies()
{
    return HXR_OK;
}

HX_RESULT HXCookies::CheckCookies()
{
    return HXR_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -