File indexing completed on 2024-05-05 16:08:26

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"