From 4aed2c8219774f5d797760606b8489a92ddc5163 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kcontrol/kio/kcookiesmanagement.cpp | 489 ++++++++++++++++++++++++++++++++++++ 1 file changed, 489 insertions(+) create mode 100644 kcontrol/kio/kcookiesmanagement.cpp (limited to 'kcontrol/kio/kcookiesmanagement.cpp') diff --git a/kcontrol/kio/kcookiesmanagement.cpp b/kcontrol/kio/kcookiesmanagement.cpp new file mode 100644 index 000000000..58e983439 --- /dev/null +++ b/kcontrol/kio/kcookiesmanagement.cpp @@ -0,0 +1,489 @@ +/** + * kcookiesmanagement.cpp - Cookies manager + * + * Copyright 2000-2001 Marco Pinelli + * Copyright (c) 2000-2001 Dawit Alemayehu + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "kcookiesmain.h" +#include "kcookiespolicies.h" +#include "kcookiesmanagement.h" +#include "kcookiesmanagementdlg_ui.h" + +#include + +struct CookieProp +{ + QString host; + QString name; + QString value; + QString domain; + QString path; + QString expireDate; + QString secure; + bool allLoaded; +}; + +CookieListViewItem::CookieListViewItem(QListView *parent, QString dom) + :QListViewItem(parent) +{ + init( 0, dom ); +} + +CookieListViewItem::CookieListViewItem(QListViewItem *parent, CookieProp *cookie) + :QListViewItem(parent) +{ + init( cookie ); +} + +CookieListViewItem::~CookieListViewItem() +{ + delete mCookie; +} + +void CookieListViewItem::init( CookieProp* cookie, QString domain, + bool cookieLoaded ) +{ + mCookie = cookie; + mDomain = domain; + mCookiesLoaded = cookieLoaded; +} + +CookieProp* CookieListViewItem::leaveCookie() +{ + CookieProp *ret = mCookie; + mCookie = 0; + return ret; +} + +QString CookieListViewItem::text(int f) const +{ + if (mCookie) + return f == 0 ? QString::null : KIDNA::toUnicode(mCookie->host); + else + return f == 0 ? KIDNA::toUnicode(mDomain) : QString::null; +} + +KCookiesManagement::KCookiesManagement(QWidget *parent) + : KCModule(parent, "kcmkio") +{ + // Toplevel layout + QVBoxLayout* mainLayout = new QVBoxLayout(this, KDialog::marginHint(), + KDialog::spacingHint()); + + dlg = new KCookiesManagementDlgUI (this); + + dlg->tbClearSearchLine->setIconSet(SmallIconSet(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase")); + dlg->kListViewSearchLine->setListView(dlg->lvCookies); + + mainLayout->addWidget(dlg); + dlg->lvCookies->setSorting(0); + + connect(dlg->lvCookies, SIGNAL(expanded(QListViewItem*)), SLOT(getCookies(QListViewItem*)) ); + connect(dlg->lvCookies, SIGNAL(selectionChanged(QListViewItem*)), SLOT(showCookieDetails(QListViewItem*)) ); + + connect(dlg->pbDelete, SIGNAL(clicked()), SLOT(deleteCookie())); + connect(dlg->pbDeleteAll, SIGNAL(clicked()), SLOT(deleteAllCookies())); + connect(dlg->pbReload, SIGNAL(clicked()), SLOT(getDomains())); + connect(dlg->pbPolicy, SIGNAL(clicked()), SLOT(doPolicy())); + + connect(dlg->lvCookies, SIGNAL(doubleClicked (QListViewItem *)), SLOT(doPolicy())); + deletedCookies.setAutoDelete(true); + m_bDeleteAll = false; + mainWidget = parent; + + load(); +} + +KCookiesManagement::~KCookiesManagement() +{ +} + +void KCookiesManagement::load() +{ + reset(); + getDomains(); +} + +void KCookiesManagement::save() +{ + // If delete all cookies was requested! + if(m_bDeleteAll) + { + if(!DCOPRef("kded", "kcookiejar").send("deleteAllCookies")) + { + QString caption = i18n ("DCOP Communication Error"); + QString message = i18n ("Unable to delete all the cookies as requested."); + KMessageBox::sorry (this, message,caption); + return; + } + m_bDeleteAll = false; // deleted[Cookies|Domains] have been cleared yet + } + + // Certain groups of cookies were deleted... + QStringList::Iterator dIt = deletedDomains.begin(); + while( dIt != deletedDomains.end() ) + { + QByteArray call; + QByteArray reply; + QCString replyType; + QDataStream callStream(call, IO_WriteOnly); + callStream << *dIt; + + if( !DCOPRef("kded", "kcookiejar").send("deleteCookiesFromDomain", (*dIt)) ) + { + QString caption = i18n ("DCOP Communication Error"); + QString message = i18n ("Unable to delete cookies as requested."); + KMessageBox::sorry (this, message,caption); + return; + } + + dIt = deletedDomains.remove(dIt); + } + + // Individual cookies were deleted... + bool success = true; // Maybe we can go on... + QDictIterator cookiesDom(deletedCookies); + + while(cookiesDom.current()) + { + CookiePropList *list = cookiesDom.current(); + QPtrListIterator cookie(*list); + + while(*cookie) + { + if( !DCOPRef("kded", "kcookiejar").send("deleteCookie",(*cookie)->domain, + (*cookie)->host, (*cookie)->path, + (*cookie)->name) ) + { + success = false; + break; + } + + list->removeRef(*cookie); + } + + if(!success) + break; + + deletedCookies.remove(cookiesDom.currentKey()); + } + + emit changed( false ); +} + +void KCookiesManagement::defaults() +{ + reset(); + getDomains(); + emit changed (false); +} + +void KCookiesManagement::reset() +{ + m_bDeleteAll = false; + clearCookieDetails(); + dlg->lvCookies->clear(); + deletedDomains.clear(); + deletedCookies.clear(); + dlg->pbDelete->setEnabled(false); + dlg->pbDeleteAll->setEnabled(false); + dlg->pbPolicy->setEnabled(false); +} + +void KCookiesManagement::clearCookieDetails() +{ + dlg->leName->clear(); + dlg->leValue->clear(); + dlg->leDomain->clear(); + dlg->lePath->clear(); + dlg->leExpires->clear(); + dlg->leSecure->clear(); +} + +QString KCookiesManagement::quickHelp() const +{ + return i18n("

Cookies Management Quick Help

" ); +} + +void KCookiesManagement::getDomains() +{ + DCOPReply reply = DCOPRef("kded", "kcookiejar").call("findDomains"); + + if( !reply.isValid() ) + { + QString caption = i18n ("Information Lookup Failure"); + QString message = i18n ("Unable to retrieve information about the " + "cookies stored on your computer."); + KMessageBox::sorry (this, message, caption); + return; + } + + QStringList domains = reply; + + if ( dlg->lvCookies->childCount() ) + { + reset(); + dlg->lvCookies->setCurrentItem( 0L ); + } + + CookieListViewItem *dom; + for(QStringList::Iterator dIt = domains.begin(); dIt != domains.end(); dIt++) + { + dom = new CookieListViewItem(dlg->lvCookies, *dIt); + dom->setExpandable(true); + } + + // are ther any cookies? + dlg->pbDeleteAll->setEnabled(dlg->lvCookies->childCount()); +} + +void KCookiesManagement::getCookies(QListViewItem *cookieDom) +{ + CookieListViewItem* ckd = static_cast(cookieDom); + if ( ckd->cookiesLoaded() ) + return; + + QValueList fields; + fields << 0 << 1 << 2 << 3; + + DCOPReply reply = DCOPRef ("kded", "kcookiejar").call ("findCookies", + DCOPArg(fields, "QValueList"), + ckd->domain(), + QString::null, + QString::null, + QString::null); + if(reply.isValid()) + { + QStringList fieldVal = reply; + QStringList::Iterator fIt = fieldVal.begin(); + + while(fIt != fieldVal.end()) + { + CookieProp *details = new CookieProp; + details->domain = *fIt++; + details->path = *fIt++; + details->name = *fIt++; + details->host = *fIt++; + details->allLoaded = false; + new CookieListViewItem(cookieDom, details); + } + + static_cast(cookieDom)->setCookiesLoaded(); + } +} + +bool KCookiesManagement::cookieDetails(CookieProp *cookie) +{ + QValueList fields; + fields << 4 << 5 << 7; + + DCOPReply reply = DCOPRef ("kded", "kcookiejar").call ("findCookies", + DCOPArg(fields, "QValueList"), + cookie->domain, + cookie->host, + cookie->path, + cookie->name); + if( !reply.isValid() ) + return false; + + QStringList fieldVal = reply; + + QStringList::Iterator c = fieldVal.begin(); + cookie->value = *c++; + unsigned tmp = (*c++).toUInt(); + + if( tmp == 0 ) + cookie->expireDate = i18n("End of session"); + else + { + QDateTime expDate; + expDate.setTime_t(tmp); + cookie->expireDate = KGlobal::locale()->formatDateTime(expDate); + } + + tmp = (*c).toUInt(); + cookie->secure = i18n(tmp ? "Yes" : "No"); + cookie->allLoaded = true; + return true; +} + +void KCookiesManagement::showCookieDetails(QListViewItem* item) +{ + kdDebug () << "::showCookieDetails... " << endl; + CookieProp *cookie = static_cast(item)->cookie(); + if( cookie ) + { + if( cookie->allLoaded || cookieDetails(cookie) ) + { + dlg->leName->validateAndSet(cookie->name,0,0,0); + dlg->leValue->validateAndSet(cookie->value,0,0,0); + dlg->leDomain->validateAndSet(cookie->domain,0,0,0); + dlg->lePath->validateAndSet(cookie->path,0,0,0); + dlg->leExpires->validateAndSet(cookie->expireDate,0,0,0); + dlg->leSecure->validateAndSet(cookie->secure,0,0,0); + } + + dlg->pbPolicy->setEnabled (true); + } + else + { + clearCookieDetails(); + dlg->pbPolicy->setEnabled(false); + } + + dlg->pbDelete->setEnabled(true); +} + +void KCookiesManagement::doPolicy() +{ + // Get current item + CookieListViewItem *item = static_cast( dlg->lvCookies->currentItem() ); + + if( item && item->cookie()) + { + CookieProp *cookie = item->cookie(); + + QString domain = cookie->domain; + + if( domain.isEmpty() ) + { + CookieListViewItem *parent = static_cast( item->parent() ); + + if ( parent ) + domain = parent->domain (); + } + + KCookiesMain* mainDlg =static_cast( mainWidget ); + // must be present or something is really wrong. + assert (mainDlg); + + KCookiesPolicies* policyDlg = mainDlg->policyDlg(); + // must be present unless someone rewrote the widget in which case + // this needs to be re-written as well. + assert (policyDlg); + policyDlg->addNewPolicy(domain); + } +} + + +void KCookiesManagement::deleteCookie(QListViewItem* deleteItem) +{ + CookieListViewItem *item = static_cast( deleteItem ); + if( item->cookie() ) + { + CookieListViewItem *parent = static_cast(item->parent()); + CookiePropList *list = deletedCookies.find(parent->domain()); + if(!list) + { + list = new CookiePropList; + list->setAutoDelete(true); + deletedCookies.insert(parent->domain(), list); + } + + list->append(item->leaveCookie()); + delete item; + + if(parent->childCount() == 0) + delete parent; + } + else + { + deletedDomains.append(item->domain()); + delete item; + } +} + +void KCookiesManagement::deleteCookie() +{ + deleteCookie(dlg->lvCookies->currentItem()); + + QListViewItem* currentItem = dlg->lvCookies->currentItem(); + + if ( currentItem ) + { + dlg->lvCookies->setSelected( currentItem, true ); + showCookieDetails( currentItem ); + } + else + clearCookieDetails(); + + dlg->pbDeleteAll->setEnabled(dlg->lvCookies->childCount()); + + const bool hasSelectedItem = dlg->lvCookies->selectedItem(); + dlg->pbDelete->setEnabled(hasSelectedItem); + dlg->pbPolicy->setEnabled(hasSelectedItem); + + emit changed( true ); +} + +void KCookiesManagement::deleteAllCookies() +{ + if ( dlg->kListViewSearchLine->text().isEmpty()) + { + reset(); + m_bDeleteAll = true; + } + else + { + QListViewItem* item = dlg->lvCookies->firstChild(); + + while (item) + { + if (item->isVisible()) + { + deleteCookie(item); + item = dlg->lvCookies->currentItem(); + } + else + item = item->nextSibling(); + } + + const int count = dlg->lvCookies->childCount(); + m_bDeleteAll = (count == 0); + dlg->pbDeleteAll->setEnabled(count); + + const bool hasSelectedItem = dlg->lvCookies->selectedItem(); + dlg->pbDelete->setEnabled(hasSelectedItem); + dlg->pbPolicy->setEnabled(hasSelectedItem); + } + + emit changed( true ); +} + +#include "kcookiesmanagement.moc" -- cgit v1.2.1