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