kcookiejar.cpp

来自「将konqueror浏览器移植到ARM9 2410中」· C++ 代码 · 共 1,257 行 · 第 1/3 页

CPP
1,257
字号
        {           configChanged = true;           // domain is already known           cookieList->setAdvice( _advice);        }        if ((cookieList->isEmpty()) &&            (_advice == KCookieDunno))        {            // This deletes cookieList!            cookieDomains.remove(domain);			            domainList.remove(domain);        }    }    else    {        // domain is not yet known        if (_advice != KCookieDunno)        {            // We should create a domain entry            configChanged = true;            // Make a new cookie list            cookieList = new KHttpCookieList();            cookieList->setAdvice( _advice);            cookieDomains.insert( domain, cookieList);            // Update the list of domains            domainList.append( domain);        }    }}//// This function sets the advice for all cookies originating from// the same domain as _cookie//void KCookieJar::setDomainAdvice(KHttpCookiePtr cookiePtr, KCookieAdvice _advice){    QString domain = stripDomain(cookiePtr); // We file the cookie under this domain.    setDomainAdvice(domain, _advice);}//// This function sets the global advice for cookies//void KCookieJar::setGlobalAdvice(KCookieAdvice _advice){    if (globalAdvice != _advice)       configChanged = true;    globalAdvice = _advice;}//// Get a list of all domains known to the cookie jar.//const QStringList& KCookieJar::getDomainList(){    return domainList;}//// Get a list of all cookies in the cookie jar originating from _domain.//const KHttpCookieList *KCookieJar::getCookieList(const QString & _domain,                                                 const QString & _fqdn ){    QString domain;    if (_domain.isEmpty())        stripDomain( _fqdn, domain );    else        domain = _domain;    return cookieDomains[domain];}//// Eat a cookie out of the jar.// cookiePtr should be one of the cookies returned by getCookieList()//void KCookieJar::eatCookie(KHttpCookiePtr cookiePtr){    QString domain = stripDomain(cookiePtr); // We file the cookie under this domain.    KHttpCookieList *cookieList = cookieDomains[domain];    if (cookieList)    {        // This deletes cookiePtr!        if (cookieList->removeRef( cookiePtr ))           cookiesChanged = true;        if ((cookieList->isEmpty()) &&            (cookieList->getAdvice() == KCookieDunno))        {            // This deletes cookieList!            cookieDomains.remove(domain);            domainList.remove(domain);        }    }}void KCookieJar::eatCookiesForDomain(const QString &domain){   KHttpCookieList *cookieList = cookieDomains[domain];   if (!cookieList || cookieList->isEmpty()) return;   cookieList->clear();   if (cookieList->getAdvice() == KCookieDunno)   {       // This deletes cookieList!       cookieDomains.remove(domain);       domainList.remove(domain);   }   cookiesChanged = true;}void KCookieJar::eatSessionCookies( int winId ){    QStringList::Iterator it=domainList.begin();    for ( ; it != domainList.end(); ++it )        eatSessionCookies( *it, winId, false );}void KCookieJar::eatSessionCookies( const QString& fqdn, int winId,                                    bool isFQDN ){    KHttpCookieList* cookieList;    if ( isFQDN )    {        QString domain;        stripDomain( fqdn, domain );        cookieList = cookieDomains[domain];    }    else        cookieList = cookieDomains[fqdn];    if ( cookieList )    {        KHttpCookiePtr cookie=cookieList->first();        for (; cookie != 0;)        {            if (cookie->windowId() == winId &&                (cookie->expireDate() == 0))            {                KHttpCookiePtr old_cookie = cookie;                cookie = cookieList->next();                cookieList->removeRef( old_cookie );            }            else                cookie = cookieList->next();        }    }}void KCookieJar::eatAllCookies(){    for ( QStringList::Iterator it=domainList.begin();          it != domainList.end();)    {        QString domain = *it++;        eatCookiesForDomain(domain); // This might remove domain from domainList!    }}//// Saves all cookies to the file '_filename'.// On succes 'true' is returned.// On failure 'false' is returned.bool KCookieJar::saveCookies(const QString &_filename){    KSaveFile saveFile(_filename);    if (saveFile.status() != 0)       return false;    FILE *fStream = saveFile.fstream();    time_t curTime = time(0);    fprintf(fStream, "# KDE Cookie File\n#\n");    fprintf(fStream, "%-20s %-20s %-12s %-9s %-4s %-10s %s %-4s\n",    	"# Host", "Domain", "Path", "Exp.date", "Prot", "Name", "Value", "Secure");    for ( QStringList::Iterator it=domainList.begin();    	  it != domainList.end();    	  it++)    {        const QString &domain = *it;        bool domainPrinted = false;	KHttpCookieList *cookieList = cookieDomains[domain];        KHttpCookiePtr cookie=cookieList->first();	for (; cookie != 0;)        {            if (cookie->isExpired(curTime))	    {	    	// Delete expired cookies                KHttpCookiePtr old_cookie = cookie;                cookie = cookieList->next();                cookieList->removeRef( old_cookie );	    }	    else if (cookie->expireDate() != 0)            {                if (!domainPrinted)                {                    domainPrinted = true;                    fprintf(fStream, "[%s]\n", domain.local8Bit().data());                }                // Store persistent cookies                QString path("\"");                path += cookie->path();                path += "\"";                QString domain("\"");                domain += cookie->domain();                domain += "\"";                fprintf(fStream, "%-20s %-20s %-12s %9lu   %2d %-10s %s %-4i\n",		    cookie->host().local8Bit().data(), domain.local8Bit().data(), path.local8Bit().data(),		    (unsigned long) cookie->expireDate(), cookie->protocolVersion()+100,		    cookie->name().local8Bit().data(), cookie->value().local8Bit().data(),		    cookie->isSecure());		cookie = cookieList->next();	    }	    else	    {	    	// Skip session-only cookies		cookie = cookieList->next();	    }	}    }    return saveFile.close();}typedef char *charPtr;static const char *parseField(charPtr &buffer, bool keepQuotes=false){    char *result;    if (!keepQuotes && (*buffer == '\"'))    {    	// Find terminating "        buffer++;        result = buffer;        while((*buffer != '\"') && (*buffer))    	    buffer++;    }    else    {        // Find first white space        result = buffer;        while((*buffer != ' ') && (*buffer != '\t') && (*buffer != '\n') && (*buffer))    	    buffer++;    }    if (!*buffer)    	return result; //    *buffer++ = '\0';    // Skip white-space    while((*buffer == ' ') || (*buffer == '\t') || (*buffer == '\n'))    	buffer++;    return result;}//// Reloads all cookies from the file '_filename'.// On succes 'true' is returned.// On failure 'false' is returned.bool KCookieJar::loadCookies(const QString &_filename){    FILE *fStream = fopen( QFile::encodeName(_filename), "r");    if (fStream == 0)    {        return false;    }    time_t curTime = time(0);    char *buffer = new char[READ_BUFFER_SIZE];    bool err = false;    err = (fgets(buffer, READ_BUFFER_SIZE, fStream) == 0);    err = err || (strcmp(buffer, "# KDE Cookie File\n") != 0);    if (!err)    {        while(fgets(buffer, READ_BUFFER_SIZE, fStream) != 0)        {            char *line = buffer;            // Skip lines which begin with '#' or '['            if ((line[0] == '#') || (line[0] == '['))                continue;            const char *host( parseField(line) );            const char *domain( parseField(line) );            const char *path( parseField(line) );            const char *expStr( parseField(line) );            if (!expStr) continue;            int expDate  = (time_t) strtoul(expStr, 0, 10);            const char *verStr( parseField(line) );            if (!verStr) continue;            int protVer  = (time_t) strtoul(verStr, 0, 10);            const char *name( parseField(line) );            bool keepQuotes = false;            if (protVer >= 100)            {                protVer -= 100;                keepQuotes = true;            }            const char *value( parseField(line, keepQuotes) );            bool secure = atoi( parseField(line) );            // Parse error            if (!value) continue;            // Expired or parse error            if ((expDate == 0) || (expDate < curTime))                continue;            KHttpCookie *cookie = new KHttpCookie(host, domain, path, name,                                                  value, expDate, protVer,                                                  secure);            if ( cookieAdvice( cookie ) )                addCookie(cookie);        }    }    delete [] buffer;    cookiesChanged = false;    fclose( fStream);    return err;}//// Save the cookie configuration//void KCookieJar::saveConfig(KConfig *_config){    if (!configChanged)        return;    _config->setGroup(QString::null);    _config->writeEntry("DefaultRadioButton", defaultRadioButton);    _config->writeEntry("ShowCookieDetails", showCookieDetails );    QStringList domainSettings;    _config->setGroup("Cookie Policy");    _config->writeEntry("CookieGlobalAdvice", adviceToStr( globalAdvice));    for ( QStringList::Iterator it=domainList.begin();          it != domainList.end();          it++ )    {         const QString &domain = *it;         KCookieAdvice advice = getDomainAdvice( domain);         if (advice != KCookieDunno)         {             QString value(domain);             value += ':';             value += adviceToStr(advice);             domainSettings.append(value);         }    }    _config->writeEntry("CookieDomainAdvice", domainSettings);    _config->sync();}//// Load the cookie configuration//void KCookieJar::loadConfig(KConfig *_config, bool reparse ){    QString value;    QStringList domainSettings;    if ( reparse )        _config->reparseConfiguration();    _config->setGroup(QString::null);    defaultRadioButton = _config->readNumEntry( "DefaultRadioButton", 0 );    showCookieDetails = _config->readBoolEntry( "ShowCookieDetails" );    _config->setGroup("Cookie Policy");    value = _config->readEntry("CookieGlobalAdvice", "Ask");    globalAdvice = strToAdvice(value);    domainSettings = _config->readListEntry("CookieDomainAdvice");    // Reset current domain settings first.    for ( QStringList::Iterator it=domainList.begin(); it != domainList.end(); )    {         // Make sure to update iterator before calling setDomainAdvice()         // setDomainAdvice() might delete the domain from domainList.         QString domain = *it++;         setDomainAdvice(domain, KCookieDunno);    }    // Now apply the    for ( QStringList::Iterator it=domainSettings.begin();          it != domainSettings.end(); )    {        const QString &value = *it++;        int sepPos = value.find(':');        if (sepPos <= 0) { continue; }        QString domain(value.left(sepPos));        KCookieAdvice advice = strToAdvice( value.mid(sepPos + 1) );        setDomainAdvice(domain, advice);    }}

⌨️ 快捷键说明

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