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 + -
显示快捷键?