1 /*
2     SPDX-FileCopyrightText: 2004 Esben Mose Hansen <kde@mosehansen.dk>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 #include "historyurlitem.h"
7 
8 #include <QCryptographicHash>
9 #include <QMimeData>
10 
11 namespace
12 {
compute_uuid(const QList<QUrl> & _urls,const KUrlMimeData::MetaDataMap & _metaData,bool _cut)13 QByteArray compute_uuid(const QList<QUrl> &_urls, const KUrlMimeData::MetaDataMap &_metaData, bool _cut)
14 {
15     QCryptographicHash hash(QCryptographicHash::Sha1);
16     foreach (const QUrl &url, _urls) {
17         hash.addData(url.toEncoded());
18         hash.addData("\0", 1); // Use binary zero as that is not a valid path character
19     }
20     QByteArray buffer;
21     QDataStream out(&buffer, QIODevice::WriteOnly);
22     out << _metaData << "\0" << _cut;
23     hash.addData(buffer);
24     return hash.result();
25 }
26 }
27 
HistoryURLItem(const QList<QUrl> & _urls,const KUrlMimeData::MetaDataMap & _metaData,bool _cut)28 HistoryURLItem::HistoryURLItem(const QList<QUrl> &_urls, const KUrlMimeData::MetaDataMap &_metaData, bool _cut)
29     : HistoryItem(compute_uuid(_urls, _metaData, _cut))
30     , m_urls(_urls)
31     , m_metaData(_metaData)
32     , m_cut(_cut)
33 {
34 }
35 
36 /* virtual */
write(QDataStream & stream) const37 void HistoryURLItem::write(QDataStream &stream) const
38 {
39     stream << QStringLiteral("url") << m_urls << m_metaData << (int)m_cut;
40 }
41 
text() const42 QString HistoryURLItem::text() const
43 {
44     QString ret;
45     bool first = true;
46     for (const QUrl &url : m_urls) {
47         if (!first) {
48             ret.append(QLatin1Char(' '));
49         }
50         first = false;
51         ret.append(url.toString(QUrl::FullyEncoded));
52     }
53     return ret;
54 }
55 
mimeData() const56 QMimeData *HistoryURLItem::mimeData() const
57 {
58     QMimeData *data = new QMimeData();
59     data->setUrls(m_urls);
60     KUrlMimeData::setMetaData(m_metaData, data);
61     data->setData(QStringLiteral("application/x-kde-cutselection"), QByteArray(m_cut ? "1" : "0"));
62     return data;
63 }
64 
operator ==(const HistoryItem & rhs) const65 bool HistoryURLItem::operator==(const HistoryItem &rhs) const
66 {
67     if (const HistoryURLItem *casted_rhs = dynamic_cast<const HistoryURLItem *>(&rhs)) {
68         return casted_rhs->m_urls == m_urls && casted_rhs->m_metaData.count() == m_metaData.count()
69             && std::equal(casted_rhs->m_metaData.begin(), casted_rhs->m_metaData.end(), m_metaData.begin()) && casted_rhs->m_cut == m_cut;
70     }
71     return false;
72 }
73