cookiejar.cpp
上传用户:huahtool
上传日期:2015-12-10
资源大小:1089k
文件大小:24k
源码类别:

浏览器

开发平台:

Visual C++

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the demonstration applications of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #include "cookiejar.h"
  38. #include "autosaver.h"
  39. #include <QtCore/QDateTime>
  40. #include <QtCore/QDir>
  41. #include <QtCore/QFile>
  42. #include <QtCore/QMetaEnum>
  43. #include <QtCore/QSettings>
  44. #include <QtCore/QUrl>
  45. #include <QtGui/QCompleter>
  46. #include <QtGui/QDesktopServices>
  47. #include <QtGui/QFont>
  48. #include <QtGui/QFontMetrics>
  49. #include <QtGui/QHeaderView>
  50. #include <QtGui/QKeyEvent>
  51. #include <QtGui/QSortFilterProxyModel>
  52. #include <QtWebKit/QWebSettings>
  53. #include <QtCore/QDebug>
  54. static const unsigned int JAR_VERSION = 23;
  55. QT_BEGIN_NAMESPACE
  56. QDataStream &operator<<(QDataStream &stream, const QList<QNetworkCookie> &list)
  57. {
  58.     stream << JAR_VERSION;
  59.     stream << quint32(list.size());
  60.     for (int i = 0; i < list.size(); ++i)
  61.         stream << list.at(i).toRawForm();
  62.     return stream;
  63. }
  64. QDataStream &operator>>(QDataStream &stream, QList<QNetworkCookie> &list)
  65. {
  66.     list.clear();
  67.     quint32 version;
  68.     stream >> version;
  69.     if (version != JAR_VERSION)
  70.         return stream;
  71.     quint32 count;
  72.     stream >> count;
  73.     for(quint32 i = 0; i < count; ++i)
  74.     {
  75.         QByteArray value;
  76.         stream >> value;
  77.         QList<QNetworkCookie> newCookies = QNetworkCookie::parseCookies(value);
  78.         if (newCookies.count() == 0 && value.length() != 0) {
  79.             qWarning() << "CookieJar: Unable to parse saved cookie:" << value;
  80.         }
  81.         for (int j = 0; j < newCookies.count(); ++j)
  82.             list.append(newCookies.at(j));
  83.         if (stream.atEnd())
  84.             break;
  85.     }
  86.     return stream;
  87. }
  88. QT_END_NAMESPACE
  89. CookieJar::CookieJar(QObject *parent)
  90.     : QNetworkCookieJar(parent)
  91.     , m_loaded(false)
  92.     , m_saveTimer(new AutoSaver(this))
  93.     , m_acceptCookies(AcceptOnlyFromSitesNavigatedTo)
  94. {
  95. }
  96. CookieJar::~CookieJar()
  97. {
  98.     if (m_keepCookies == KeepUntilExit)
  99.         clear();
  100.     m_saveTimer->saveIfNeccessary();
  101. }
  102. void CookieJar::clear()
  103. {
  104.     setAllCookies(QList<QNetworkCookie>());
  105.     m_saveTimer->changeOccurred();
  106.     emit cookiesChanged();
  107. }
  108. void CookieJar::load()
  109. {
  110.     if (m_loaded)
  111.         return;
  112.     // load cookies and exceptions
  113.     qRegisterMetaTypeStreamOperators<QList<QNetworkCookie> >("QList<QNetworkCookie>");
  114.     QSettings cookieSettings(QDesktopServices::storageLocation(QDesktopServices::DataLocation) + QLatin1String("/cookies.ini"), QSettings::IniFormat);
  115.     setAllCookies(qvariant_cast<QList<QNetworkCookie> >(cookieSettings.value(QLatin1String("cookies"))));
  116.     cookieSettings.beginGroup(QLatin1String("Exceptions"));
  117.     m_exceptions_block = cookieSettings.value(QLatin1String("block")).toStringList();
  118.     m_exceptions_allow = cookieSettings.value(QLatin1String("allow")).toStringList();
  119.     m_exceptions_allowForSession = cookieSettings.value(QLatin1String("allowForSession")).toStringList();
  120.     qSort(m_exceptions_block.begin(), m_exceptions_block.end());
  121.     qSort(m_exceptions_allow.begin(), m_exceptions_allow.end());
  122.     qSort(m_exceptions_allowForSession.begin(), m_exceptions_allowForSession.end());
  123.     loadSettings();
  124. }
  125. void CookieJar::loadSettings()
  126. {
  127.     QSettings settings;
  128.     settings.beginGroup(QLatin1String("cookies"));
  129.     QByteArray value = settings.value(QLatin1String("acceptCookies"),
  130.                         QLatin1String("AcceptOnlyFromSitesNavigatedTo")).toByteArray();
  131.     QMetaEnum acceptPolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("AcceptPolicy"));
  132.     m_acceptCookies = acceptPolicyEnum.keyToValue(value) == -1 ?
  133.                         AcceptOnlyFromSitesNavigatedTo :
  134.                         static_cast<AcceptPolicy>(acceptPolicyEnum.keyToValue(value));
  135.     value = settings.value(QLatin1String("keepCookiesUntil"), QLatin1String("KeepUntilExpire")).toByteArray();
  136.     QMetaEnum keepPolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("KeepPolicy"));
  137.     m_keepCookies = keepPolicyEnum.keyToValue(value) == -1 ?
  138.                         KeepUntilExpire :
  139.                         static_cast<KeepPolicy>(keepPolicyEnum.keyToValue(value));
  140.     if (m_keepCookies == KeepUntilExit)
  141.         setAllCookies(QList<QNetworkCookie>());
  142.     m_loaded = true;
  143.     emit cookiesChanged();
  144. }
  145. void CookieJar::save()
  146. {
  147.     if (!m_loaded)
  148.         return;
  149.     purgeOldCookies();
  150.     QString directory = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
  151.     if (directory.isEmpty())
  152.         directory = QDir::homePath() + QLatin1String("/.") + QCoreApplication::applicationName();
  153.     if (!QFile::exists(directory)) {
  154.         QDir dir;
  155.         dir.mkpath(directory);
  156.     }
  157.     QSettings cookieSettings(directory + QLatin1String("/cookies.ini"), QSettings::IniFormat);
  158.     QList<QNetworkCookie> cookies = allCookies();
  159.     for (int i = cookies.count() - 1; i >= 0; --i) {
  160.         if (cookies.at(i).isSessionCookie())
  161.             cookies.removeAt(i);
  162.     }
  163.     cookieSettings.setValue(QLatin1String("cookies"), qVariantFromValue<QList<QNetworkCookie> >(cookies));
  164.     cookieSettings.beginGroup(QLatin1String("Exceptions"));
  165.     cookieSettings.setValue(QLatin1String("block"), m_exceptions_block);
  166.     cookieSettings.setValue(QLatin1String("allow"), m_exceptions_allow);
  167.     cookieSettings.setValue(QLatin1String("allowForSession"), m_exceptions_allowForSession);
  168.     // save cookie settings
  169.     QSettings settings;
  170.     settings.beginGroup(QLatin1String("cookies"));
  171.     QMetaEnum acceptPolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("AcceptPolicy"));
  172.     settings.setValue(QLatin1String("acceptCookies"), QLatin1String(acceptPolicyEnum.valueToKey(m_acceptCookies)));
  173.     QMetaEnum keepPolicyEnum = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("KeepPolicy"));
  174.     settings.setValue(QLatin1String("keepCookiesUntil"), QLatin1String(keepPolicyEnum.valueToKey(m_keepCookies)));
  175. }
  176. void CookieJar::purgeOldCookies()
  177. {
  178.     QList<QNetworkCookie> cookies = allCookies();
  179.     if (cookies.isEmpty())
  180.         return;
  181.     int oldCount = cookies.count();
  182.     QDateTime now = QDateTime::currentDateTime();
  183.     for (int i = cookies.count() - 1; i >= 0; --i) {
  184.         if (!cookies.at(i).isSessionCookie() && cookies.at(i).expirationDate() < now)
  185.             cookies.removeAt(i);
  186.     }
  187.     if (oldCount == cookies.count())
  188.         return;
  189.     setAllCookies(cookies);
  190.     emit cookiesChanged();
  191. }
  192. QList<QNetworkCookie> CookieJar::cookiesForUrl(const QUrl &url) const
  193. {
  194.     CookieJar *that = const_cast<CookieJar*>(this);
  195.     if (!m_loaded)
  196.         that->load();
  197.     QWebSettings *globalSettings = QWebSettings::globalSettings();
  198.     if (globalSettings->testAttribute(QWebSettings::PrivateBrowsingEnabled)) {
  199.         QList<QNetworkCookie> noCookies;
  200.         return noCookies;
  201.     }
  202.     return QNetworkCookieJar::cookiesForUrl(url);
  203. }
  204. bool CookieJar::setCookiesFromUrl(const QList<QNetworkCookie> &cookieList, const QUrl &url)
  205. {
  206.     if (!m_loaded)
  207.         load();
  208.     QWebSettings *globalSettings = QWebSettings::globalSettings();
  209.     if (globalSettings->testAttribute(QWebSettings::PrivateBrowsingEnabled))
  210.         return false;
  211.     QString host = url.host();
  212.     bool eBlock = qBinaryFind(m_exceptions_block.begin(), m_exceptions_block.end(), host) != m_exceptions_block.end();
  213.     bool eAllow = qBinaryFind(m_exceptions_allow.begin(), m_exceptions_allow.end(), host) != m_exceptions_allow.end();
  214.     bool eAllowSession = qBinaryFind(m_exceptions_allowForSession.begin(), m_exceptions_allowForSession.end(), host) != m_exceptions_allowForSession.end();
  215.     bool addedCookies = false;
  216.     // pass exceptions
  217.     bool acceptInitially = (m_acceptCookies != AcceptNever);
  218.     if ((acceptInitially && !eBlock)
  219.         || (!acceptInitially && (eAllow || eAllowSession))) {
  220.         // pass url domain == cookie domain
  221.         QDateTime soon = QDateTime::currentDateTime();
  222.         soon = soon.addDays(90);
  223.         foreach(QNetworkCookie cookie, cookieList) {
  224.             QList<QNetworkCookie> lst;
  225.             if (m_keepCookies == KeepUntilTimeLimit
  226.                 && !cookie.isSessionCookie()
  227.                 && cookie.expirationDate() > soon) {
  228.                     cookie.setExpirationDate(soon);
  229.             }
  230.             lst += cookie;
  231.             if (QNetworkCookieJar::setCookiesFromUrl(lst, url)) {
  232.                 addedCookies = true;
  233.             } else {
  234.                 // finally force it in if wanted
  235.                 if (m_acceptCookies == AcceptAlways) {
  236.                     QList<QNetworkCookie> cookies = allCookies();
  237.                     cookies += cookie;
  238.                     setAllCookies(cookies);
  239.                     addedCookies = true;
  240.                 }
  241. #if 0
  242.                 else
  243.                     qWarning() << "setCookiesFromUrl failed" << url << cookieList.value(0).toRawForm();
  244. #endif
  245.             }
  246.         }
  247.     }
  248.     if (addedCookies) {
  249.         m_saveTimer->changeOccurred();
  250.         emit cookiesChanged();
  251.     }
  252.     return addedCookies;
  253. }
  254. CookieJar::AcceptPolicy CookieJar::acceptPolicy() const
  255. {
  256.     if (!m_loaded)
  257.         (const_cast<CookieJar*>(this))->load();
  258.     return m_acceptCookies;
  259. }
  260. void CookieJar::setAcceptPolicy(AcceptPolicy policy)
  261. {
  262.     if (!m_loaded)
  263.         load();
  264.     if (policy == m_acceptCookies)
  265.         return;
  266.     m_acceptCookies = policy;
  267.     m_saveTimer->changeOccurred();
  268. }
  269. CookieJar::KeepPolicy CookieJar::keepPolicy() const
  270. {
  271.     if (!m_loaded)
  272.         (const_cast<CookieJar*>(this))->load();
  273.     return m_keepCookies;
  274. }
  275. void CookieJar::setKeepPolicy(KeepPolicy policy)
  276. {
  277.     if (!m_loaded)
  278.         load();
  279.     if (policy == m_keepCookies)
  280.         return;
  281.     m_keepCookies = policy;
  282.     m_saveTimer->changeOccurred();
  283. }
  284. QStringList CookieJar::blockedCookies() const
  285. {
  286.     if (!m_loaded)
  287.         (const_cast<CookieJar*>(this))->load();
  288.     return m_exceptions_block;
  289. }
  290. QStringList CookieJar::allowedCookies() const
  291. {
  292.     if (!m_loaded)
  293.         (const_cast<CookieJar*>(this))->load();
  294.     return m_exceptions_allow;
  295. }
  296. QStringList CookieJar::allowForSessionCookies() const
  297. {
  298.     if (!m_loaded)
  299.         (const_cast<CookieJar*>(this))->load();
  300.     return m_exceptions_allowForSession;
  301. }
  302. void CookieJar::setBlockedCookies(const QStringList &list)
  303. {
  304.     if (!m_loaded)
  305.         load();
  306.     m_exceptions_block = list;
  307.     qSort(m_exceptions_block.begin(), m_exceptions_block.end());
  308.     m_saveTimer->changeOccurred();
  309. }
  310. void CookieJar::setAllowedCookies(const QStringList &list)
  311. {
  312.     if (!m_loaded)
  313.         load();
  314.     m_exceptions_allow = list;
  315.     qSort(m_exceptions_allow.begin(), m_exceptions_allow.end());
  316.     m_saveTimer->changeOccurred();
  317. }
  318. void CookieJar::setAllowForSessionCookies(const QStringList &list)
  319. {
  320.     if (!m_loaded)
  321.         load();
  322.     m_exceptions_allowForSession = list;
  323.     qSort(m_exceptions_allowForSession.begin(), m_exceptions_allowForSession.end());
  324.     m_saveTimer->changeOccurred();
  325. }
  326. CookieModel::CookieModel(CookieJar *cookieJar, QObject *parent)
  327.     : QAbstractTableModel(parent)
  328.     , m_cookieJar(cookieJar)
  329. {
  330.     connect(m_cookieJar, SIGNAL(cookiesChanged()), this, SLOT(cookiesChanged()));
  331.     m_cookieJar->load();
  332. }
  333. QVariant CookieModel::headerData(int section, Qt::Orientation orientation, int role) const
  334. {
  335.     if (role == Qt::SizeHintRole) {
  336.         QFont font;
  337.         font.setPointSize(10);
  338.         QFontMetrics fm(font);
  339.         int height = fm.height() + fm.height()/3;
  340.         int width = fm.width(headerData(section, orientation, Qt::DisplayRole).toString());
  341.         return QSize(width, height);
  342.     }
  343.     if (orientation == Qt::Horizontal) {
  344.         if (role != Qt::DisplayRole)
  345.             return QVariant();
  346.         switch (section) {
  347.             case 0:
  348.                 return tr("Website");
  349.             case 1:
  350.                 return tr("Name");
  351.             case 2:
  352.                 return tr("Path");
  353.             case 3:
  354.                 return tr("Secure");
  355.             case 4:
  356.                 return tr("Expires");
  357.             case 5:
  358.                 return tr("Contents");
  359.             default:
  360.                 return QVariant();
  361.         }
  362.     }
  363.     return QAbstractTableModel::headerData(section, orientation, role);
  364. }
  365. QVariant CookieModel::data(const QModelIndex &index, int role) const
  366. {
  367.     QList<QNetworkCookie> lst;
  368.     if (m_cookieJar)
  369.         lst = m_cookieJar->allCookies();
  370.     if (index.row() < 0 || index.row() >= lst.size())
  371.         return QVariant();
  372.     switch (role) {
  373.     case Qt::DisplayRole:
  374.     case Qt::EditRole: {
  375.         QNetworkCookie cookie = lst.at(index.row());
  376.         switch (index.column()) {
  377.             case 0:
  378.                 return cookie.domain();
  379.             case 1:
  380.                 return cookie.name();
  381.             case 2:
  382.                 return cookie.path();
  383.             case 3:
  384.                 return cookie.isSecure();
  385.             case 4:
  386.                 return cookie.expirationDate();
  387.             case 5:
  388.                 return cookie.value();
  389.         }
  390.         }
  391.     case Qt::FontRole:{
  392.         QFont font;
  393.         font.setPointSize(10);
  394.         return font;
  395.         }
  396.     }
  397.     return QVariant();
  398. }
  399. int CookieModel::columnCount(const QModelIndex &parent) const
  400. {
  401.     return (parent.isValid()) ? 0 : 6;
  402. }
  403. int CookieModel::rowCount(const QModelIndex &parent) const
  404. {
  405.     return (parent.isValid() || !m_cookieJar) ? 0 : m_cookieJar->allCookies().count();
  406. }
  407. bool CookieModel::removeRows(int row, int count, const QModelIndex &parent)
  408. {
  409.     if (parent.isValid() || !m_cookieJar)
  410.         return false;
  411.     int lastRow = row + count - 1;
  412.     beginRemoveRows(parent, row, lastRow);
  413.     QList<QNetworkCookie> lst = m_cookieJar->allCookies();
  414.     for (int i = lastRow; i >= row; --i) {
  415.         lst.removeAt(i);
  416.     }
  417.     m_cookieJar->setAllCookies(lst);
  418.     endRemoveRows();
  419.     return true;
  420. }
  421. void CookieModel::cookiesChanged()
  422. {
  423.     reset();
  424. }
  425. CookiesDialog::CookiesDialog(CookieJar *cookieJar, QWidget *parent) : QDialog(parent)
  426. {
  427.     setupUi(this);
  428.     setWindowFlags(Qt::Sheet);
  429.     CookieModel *model = new CookieModel(cookieJar, this);
  430.     m_proxyModel = new QSortFilterProxyModel(this);
  431.     connect(search, SIGNAL(textChanged(QString)),
  432.             m_proxyModel, SLOT(setFilterFixedString(QString)));
  433.     connect(removeButton, SIGNAL(clicked()), cookiesTable, SLOT(removeOne()));
  434.     connect(removeAllButton, SIGNAL(clicked()), cookiesTable, SLOT(removeAll()));
  435.     m_proxyModel->setSourceModel(model);
  436.     cookiesTable->verticalHeader()->hide();
  437.     cookiesTable->setSelectionBehavior(QAbstractItemView::SelectRows);
  438.     cookiesTable->setModel(m_proxyModel);
  439.     cookiesTable->setAlternatingRowColors(true);
  440.     cookiesTable->setTextElideMode(Qt::ElideMiddle);
  441.     cookiesTable->setShowGrid(false);
  442.     cookiesTable->setSortingEnabled(true);
  443.     QFont f = font();
  444.     f.setPointSize(10);
  445.     QFontMetrics fm(f);
  446.     int height = fm.height() + fm.height()/3;
  447.     cookiesTable->verticalHeader()->setDefaultSectionSize(height);
  448.     cookiesTable->verticalHeader()->setMinimumSectionSize(-1);
  449.     for (int i = 0; i < model->columnCount(); ++i){
  450.         int header = cookiesTable->horizontalHeader()->sectionSizeHint(i);
  451.         switch (i) {
  452.         case 0:
  453.             header = fm.width(QLatin1String("averagehost.domain.com"));
  454.             break;
  455.         case 1:
  456.             header = fm.width(QLatin1String("_session_id"));
  457.             break;
  458.         case 4:
  459.             header = fm.width(QDateTime::currentDateTime().toString(Qt::LocalDate));
  460.             break;
  461.         }
  462.         int buffer = fm.width(QLatin1String("xx"));
  463.         header += buffer;
  464.         cookiesTable->horizontalHeader()->resizeSection(i, header);
  465.     }
  466.     cookiesTable->horizontalHeader()->setStretchLastSection(true);
  467. }
  468. CookieExceptionsModel::CookieExceptionsModel(CookieJar *cookiejar, QObject *parent)
  469.     : QAbstractTableModel(parent)
  470.     , m_cookieJar(cookiejar)
  471. {
  472.     m_allowedCookies = m_cookieJar->allowedCookies();
  473.     m_blockedCookies = m_cookieJar->blockedCookies();
  474.     m_sessionCookies = m_cookieJar->allowForSessionCookies();
  475. }
  476. QVariant CookieExceptionsModel::headerData(int section, Qt::Orientation orientation, int role) const
  477. {
  478.     if (role == Qt::SizeHintRole) {
  479.         QFont font;
  480.         font.setPointSize(10);
  481.         QFontMetrics fm(font);
  482.         int height = fm.height() + fm.height()/3;
  483.         int width = fm.width(headerData(section, orientation, Qt::DisplayRole).toString());
  484.         return QSize(width, height);
  485.     }
  486.     if (orientation == Qt::Horizontal
  487.         && role == Qt::DisplayRole) {
  488.         switch (section) {
  489.             case 0:
  490.                 return tr("Website");
  491.             case 1:
  492.                 return tr("Status");
  493.         }
  494.     }
  495.     return QAbstractTableModel::headerData(section, orientation, role);
  496. }
  497. QVariant CookieExceptionsModel::data(const QModelIndex &index, int role) const
  498. {
  499.     if (index.row() < 0 || index.row() >= rowCount())
  500.         return QVariant();
  501.     switch (role) {
  502.     case Qt::DisplayRole:
  503.     case Qt::EditRole: {
  504.         int row = index.row();
  505.         if (row < m_allowedCookies.count()) {
  506.             switch (index.column()) {
  507.                 case 0:
  508.                     return m_allowedCookies.at(row);
  509.                 case 1:
  510.                     return tr("Allow");
  511.             }
  512.         }
  513.         row = row - m_allowedCookies.count();
  514.         if (row < m_blockedCookies.count()) {
  515.             switch (index.column()) {
  516.                 case 0:
  517.                     return m_blockedCookies.at(row);
  518.                 case 1:
  519.                     return tr("Block");
  520.             }
  521.         }
  522.         row = row - m_blockedCookies.count();
  523.         if (row < m_sessionCookies.count()) {
  524.             switch (index.column()) {
  525.                 case 0:
  526.                     return m_sessionCookies.at(row);
  527.                 case 1:
  528.                     return tr("Allow For Session");
  529.             }
  530.         }
  531.         }
  532.     case Qt::FontRole:{
  533.         QFont font;
  534.         font.setPointSize(10);
  535.         return font;
  536.         }
  537.     }
  538.     return QVariant();
  539. }
  540. int CookieExceptionsModel::columnCount(const QModelIndex &parent) const
  541. {
  542.     return (parent.isValid()) ? 0 : 2;
  543. }
  544. int CookieExceptionsModel::rowCount(const QModelIndex &parent) const
  545. {
  546.     return (parent.isValid() || !m_cookieJar) ? 0 : m_allowedCookies.count() + m_blockedCookies.count() + m_sessionCookies.count();
  547. }
  548. bool CookieExceptionsModel::removeRows(int row, int count, const QModelIndex &parent)
  549. {
  550.     if (parent.isValid() || !m_cookieJar)
  551.         return false;
  552.     int lastRow = row + count - 1;
  553.     beginRemoveRows(parent, row, lastRow);
  554.     for (int i = lastRow; i >= row; --i) {
  555.         if (i < m_allowedCookies.count()) {
  556.             m_allowedCookies.removeAt(row);
  557.             continue;
  558.         }
  559.         i = i - m_allowedCookies.count();
  560.         if (i < m_blockedCookies.count()) {
  561.             m_blockedCookies.removeAt(row);
  562.             continue;
  563.         }
  564.         i = i - m_blockedCookies.count();
  565.         if (i < m_sessionCookies.count()) {
  566.             m_sessionCookies.removeAt(row);
  567.             continue;
  568.         }
  569.     }
  570.     m_cookieJar->setAllowedCookies(m_allowedCookies);
  571.     m_cookieJar->setBlockedCookies(m_blockedCookies);
  572.     m_cookieJar->setAllowForSessionCookies(m_sessionCookies);
  573.     endRemoveRows();
  574.     return true;
  575. }
  576. CookiesExceptionsDialog::CookiesExceptionsDialog(CookieJar *cookieJar, QWidget *parent)
  577.     : QDialog(parent)
  578.     , m_cookieJar(cookieJar)
  579. {
  580.     setupUi(this);
  581.     setWindowFlags(Qt::Sheet);
  582.     connect(removeButton, SIGNAL(clicked()), exceptionTable, SLOT(removeOne()));
  583.     connect(removeAllButton, SIGNAL(clicked()), exceptionTable, SLOT(removeAll()));
  584.     exceptionTable->verticalHeader()->hide();
  585.     exceptionTable->setSelectionBehavior(QAbstractItemView::SelectRows);
  586.     exceptionTable->setAlternatingRowColors(true);
  587.     exceptionTable->setTextElideMode(Qt::ElideMiddle);
  588.     exceptionTable->setShowGrid(false);
  589.     exceptionTable->setSortingEnabled(true);
  590.     m_exceptionsModel = new CookieExceptionsModel(cookieJar, this);
  591.     m_proxyModel = new QSortFilterProxyModel(this);
  592.     m_proxyModel->setSourceModel(m_exceptionsModel);
  593.     connect(search, SIGNAL(textChanged(QString)),
  594.             m_proxyModel, SLOT(setFilterFixedString(QString)));
  595.     exceptionTable->setModel(m_proxyModel);
  596.     CookieModel *cookieModel = new CookieModel(cookieJar, this);
  597.     domainLineEdit->setCompleter(new QCompleter(cookieModel, domainLineEdit));
  598.     connect(domainLineEdit, SIGNAL(textChanged(const QString &)),
  599.             this, SLOT(textChanged(const QString &)));
  600.     connect(blockButton, SIGNAL(clicked()), this, SLOT(block()));
  601.     connect(allowButton, SIGNAL(clicked()), this, SLOT(allow()));
  602.     connect(allowForSessionButton, SIGNAL(clicked()), this, SLOT(allowForSession()));
  603.     QFont f = font();
  604.     f.setPointSize(10);
  605.     QFontMetrics fm(f);
  606.     int height = fm.height() + fm.height()/3;
  607.     exceptionTable->verticalHeader()->setDefaultSectionSize(height);
  608.     exceptionTable->verticalHeader()->setMinimumSectionSize(-1);
  609.     for (int i = 0; i < m_exceptionsModel->columnCount(); ++i){
  610.         int header = exceptionTable->horizontalHeader()->sectionSizeHint(i);
  611.         switch (i) {
  612.         case 0:
  613.             header = fm.width(QLatin1String("averagebiglonghost.domain.com"));
  614.             break;
  615.         case 1:
  616.             header = fm.width(QLatin1String("Allow For Session"));
  617.             break;
  618.         }
  619.         int buffer = fm.width(QLatin1String("xx"));
  620.         header += buffer;
  621.         exceptionTable->horizontalHeader()->resizeSection(i, header);
  622.     }
  623. }
  624. void CookiesExceptionsDialog::textChanged(const QString &text)
  625. {
  626.     bool enabled = !text.isEmpty();
  627.     blockButton->setEnabled(enabled);
  628.     allowButton->setEnabled(enabled);
  629.     allowForSessionButton->setEnabled(enabled);
  630. }
  631. void CookiesExceptionsDialog::block()
  632. {
  633.     if (domainLineEdit->text().isEmpty())
  634.         return;
  635.     m_exceptionsModel->m_blockedCookies.append(domainLineEdit->text());
  636.     m_cookieJar->setBlockedCookies(m_exceptionsModel->m_blockedCookies);
  637.     m_exceptionsModel->reset();
  638. }
  639. void CookiesExceptionsDialog::allow()
  640. {
  641.     if (domainLineEdit->text().isEmpty())
  642.         return;
  643.     m_exceptionsModel->m_allowedCookies.append(domainLineEdit->text());
  644.     m_cookieJar->setAllowedCookies(m_exceptionsModel->m_allowedCookies);
  645.     m_exceptionsModel->reset();
  646. }
  647. void CookiesExceptionsDialog::allowForSession()
  648. {
  649.     if (domainLineEdit->text().isEmpty())
  650.         return;
  651.     m_exceptionsModel->m_sessionCookies.append(domainLineEdit->text());
  652.     m_cookieJar->setAllowForSessionCookies(m_exceptionsModel->m_sessionCookies);
  653.     m_exceptionsModel->reset();
  654. }