File indexing completed on 2025-01-19 12:45:17
0001 /***************************************************************************** 0002 * Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> * 0003 * * 0004 * This library is free software; you can redistribute it and/or * 0005 * modify it under the terms of the GNU Library General Public * 0006 * License as published by the Free Software Foundation; either * 0007 * version 2 of the License, or (at your option) any later version. * 0008 * * 0009 * This library is distributed in the hope that it will be useful, * 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 0012 * Library General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU Library General Public License * 0015 * along with this library; see the file COPYING.LIB. If not, write to * 0016 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * 0017 * Boston, MA 02110-1301, USA. * 0018 *****************************************************************************/ 0019 0020 #include "kfilemetadatareader_p.h" 0021 0022 #include <QProcess> 0023 0024 #include <qstandardpaths.h> 0025 0026 class KFileMetaDataReader::Private 0027 { 0028 public: 0029 Private(KFileMetaDataReader *parent); 0030 ~Private(); 0031 0032 void slotLoadingFinished(int exitCode, QProcess::ExitStatus exitStatus); 0033 0034 bool m_readContextData; 0035 QProcess *m_process; 0036 QStringList arguments; 0037 QHash<QUrl, Nepomuk::Variant> m_metaData; 0038 0039 private: 0040 KFileMetaDataReader *const q; 0041 }; 0042 0043 KFileMetaDataReader::Private::Private(KFileMetaDataReader *parent) : 0044 m_readContextData(true), 0045 m_process(new QProcess()), 0046 m_metaData(), 0047 q(parent) 0048 { 0049 } 0050 0051 KFileMetaDataReader::Private::~Private() 0052 { 0053 delete m_process; 0054 } 0055 0056 void KFileMetaDataReader::Private::slotLoadingFinished(int exitCode, QProcess::ExitStatus exitStatus) 0057 { 0058 Q_UNUSED(exitCode); 0059 Q_UNUSED(exitStatus); 0060 0061 QDataStream in(QByteArray::fromBase64(m_process->readLine())); 0062 0063 QUrl key; 0064 Nepomuk::Variant value; 0065 while (!in.atEnd()) { 0066 in >> key; 0067 0068 // Unlike QVariant no streaming operators are implemented for Nepomuk::Variant. 0069 // So it is required to manually decode the variant from the stream. See 0070 // function sendMetaData() in kfilemetadatareaderprocess.cpp for the encoding 0071 // counterpart. 0072 int streamType; 0073 in >> streamType; 0074 0075 switch (streamType) { 0076 case 0: { 0077 QStringList stringList; 0078 in >> stringList; 0079 value = stringList; 0080 break; 0081 } 0082 case 1: { 0083 QString resource; 0084 in >> resource; 0085 value = resource; 0086 break; 0087 } 0088 0089 default: 0090 QVariant variant; 0091 in >> variant; 0092 value = Nepomuk::Variant(variant); 0093 } 0094 0095 m_metaData.insert(key, value); 0096 } 0097 0098 emit q->finished(); 0099 } 0100 0101 KFileMetaDataReader::KFileMetaDataReader(const QList<QUrl> &urls, QObject *parent) : 0102 QObject(parent), 0103 d(new Private(this)) 0104 { 0105 foreach (const QUrl &url, urls) { 0106 d->arguments.append(url.toString()); 0107 } 0108 0109 d->m_process->setReadChannel(QProcess::StandardOutput); 0110 connect(d->m_process, SIGNAL(finished(int,QProcess::ExitStatus)), 0111 this, SLOT(slotLoadingFinished(int,QProcess::ExitStatus))); 0112 } 0113 0114 KFileMetaDataReader::~KFileMetaDataReader() 0115 { 0116 delete d; 0117 } 0118 0119 void KFileMetaDataReader::setReadContextData(bool read) 0120 { 0121 d->m_readContextData = read; 0122 } 0123 0124 bool KFileMetaDataReader::readContextData() const 0125 { 0126 return d->m_readContextData; 0127 } 0128 0129 void KFileMetaDataReader::start() 0130 { 0131 if (d->m_process->state() == QProcess::NotRunning) { 0132 const QString fileMetaDataReaderExe = QStandardPaths::findExecutable(QLatin1String("kfilemetadatareader")); 0133 if (!d->m_readContextData) { 0134 d->arguments.append("--file"); 0135 } 0136 d->m_process->start(fileMetaDataReaderExe, d->arguments, QIODevice::ReadOnly); 0137 } 0138 } 0139 0140 QHash<QUrl, Nepomuk::Variant> KFileMetaDataReader::metaData() const 0141 { 0142 return d->m_metaData; 0143 } 0144 0145 #include "moc_kfilemetadatareader_p.cpp"