File indexing completed on 2024-04-28 05:35:28
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 }