File indexing completed on 2024-04-28 16:54:24

0001 /*
0002     SPDX-FileCopyrightText: 2004 Esben Mose Hansen <kde@mosehansen.dk>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 #include "historyurlitem.h"
0007 
0008 #include <QCryptographicHash>
0009 #include <QIODevice>
0010 #include <QMimeData>
0011 
0012 namespace
0013 {
0014 QByteArray compute_uuid(const QList<QUrl> &_urls, const KUrlMimeData::MetaDataMap &_metaData, bool _cut)
0015 {
0016     QCryptographicHash hash(QCryptographicHash::Sha1);
0017     foreach (const QUrl &url, _urls) {
0018         hash.addData(url.toEncoded());
0019         hash.addData("\0", 1); // Use binary zero as that is not a valid path character
0020     }
0021     QByteArray buffer;
0022     QDataStream out(&buffer, QIODevice::WriteOnly);
0023     out << _metaData << "\0" << _cut;
0024     hash.addData(buffer);
0025     return hash.result();
0026 }
0027 }
0028 
0029 HistoryURLItem::HistoryURLItem(const QList<QUrl> &_urls, const KUrlMimeData::MetaDataMap &_metaData, bool _cut)
0030     : HistoryItem(compute_uuid(_urls, _metaData, _cut))
0031     , m_urls(_urls)
0032     , m_metaData(_metaData)
0033     , m_cut(_cut)
0034 {
0035 }
0036 
0037 /* virtual */
0038 void HistoryURLItem::write(QDataStream &stream) const
0039 {
0040     stream << QStringLiteral("url") << m_urls << m_metaData << (int)m_cut;
0041 }
0042 
0043 QString HistoryURLItem::text() const
0044 {
0045     QString ret;
0046     bool first = true;
0047     for (const QUrl &url : m_urls) {
0048         if (!first) {
0049             ret.append(QLatin1Char(' '));
0050         }
0051         first = false;
0052         ret.append(url.toString(QUrl::FullyEncoded));
0053     }
0054     return ret;
0055 }
0056 
0057 QMimeData *HistoryURLItem::mimeData() const
0058 {
0059     QMimeData *data = new QMimeData();
0060     data->setUrls(m_urls);
0061     KUrlMimeData::setMetaData(m_metaData, data);
0062     data->setData(QStringLiteral("application/x-kde-cutselection"), QByteArray(m_cut ? "1" : "0"));
0063     return data;
0064 }
0065 
0066 bool HistoryURLItem::operator==(const HistoryItem &rhs) const
0067 {
0068     if (const HistoryURLItem *casted_rhs = dynamic_cast<const HistoryURLItem *>(&rhs)) {
0069         return casted_rhs->m_urls == m_urls && casted_rhs->m_metaData.count() == m_metaData.count()
0070             && std::equal(casted_rhs->m_metaData.begin(), casted_rhs->m_metaData.end(), m_metaData.begin()) && casted_rhs->m_cut == m_cut;
0071     }
0072     return false;
0073 }