summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/metainfojob.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/metainfojob.cpp')
-rw-r--r--tdeio/tdeio/metainfojob.cpp184
1 files changed, 184 insertions, 0 deletions
diff --git a/tdeio/tdeio/metainfojob.cpp b/tdeio/tdeio/metainfojob.cpp
new file mode 100644
index 000000000..d9a31ab0e
--- /dev/null
+++ b/tdeio/tdeio/metainfojob.cpp
@@ -0,0 +1,184 @@
+// -*- c++ -*-
+// vim: ts=4 sw=4 et
+/* This file is part of the KDE libraries
+ Copyright (C) 2002 Rolf Magnus <ramagnus@kde.org>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation version 2.0.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+
+ $Id$
+*/
+
+#include <kdatastream.h> // Do not remove, needed for correct bool serialization
+#include <tdefileitem.h>
+#include <kdebug.h>
+#include <tdefilemetainfo.h>
+#include <tdeio/kservice.h>
+#include <tdeparts/componentfactory.h>
+
+#include <tqtimer.h>
+
+#include "metainfojob.moc"
+
+using namespace TDEIO;
+
+struct TDEIO::MetaInfoJobPrivate
+{
+ KFileItemList items; // all the items we got
+ KFileItemListIterator* currentItem; // argh! No default constructor
+ bool deleteItems; // Delete the KFileItems when done?
+ bool succeeded; // if the current item is ok
+};
+
+MetaInfoJob::MetaInfoJob(const KFileItemList &items, bool deleteItems)
+ : TDEIO::Job(false /* no GUI */)
+{
+ d = new MetaInfoJobPrivate;
+ d->deleteItems = deleteItems;
+ d->succeeded = false;
+ d->items = items;
+ d->currentItem = new KFileItemListIterator(d->items);
+
+ d->items.setAutoDelete(deleteItems);
+
+ if (d->currentItem->isEmpty())
+ {
+ kdDebug(7007) << "nothing to do for the MetaInfoJob\n";
+ emitResult();
+ return;
+ }
+
+ kdDebug(7007) << "starting MetaInfoJob\n";
+
+ // Return to event loop first, determineNextFile() might delete this;
+ // (no idea what that means, it comes from previewjob)
+ TQTimer::singleShot(0, this, TQT_SLOT(start()));
+}
+
+MetaInfoJob::~MetaInfoJob()
+{
+ delete d->currentItem;
+ delete d;
+}
+
+void MetaInfoJob::start()
+{
+ getMetaInfo();
+}
+
+void MetaInfoJob::removeItem(const KFileItem* item)
+{
+ if (d->currentItem->current() == item)
+ {
+ subjobs.first()->kill();
+ subjobs.removeFirst();
+ determineNextFile();
+ }
+
+ d->items.remove(d->items.find(item));
+}
+
+void MetaInfoJob::determineNextFile()
+{
+ if (d->currentItem->atLast())
+ {
+ kdDebug(7007) << "finished MetaInfoJob\n";
+ emitResult();
+ return;
+ }
+
+ ++(*d->currentItem);
+ d->succeeded = false;
+
+ // does the file item already have the needed info? Then shortcut
+ if (d->currentItem->current()->metaInfo(false).isValid())
+ {
+// kdDebug(7007) << "Is already valid *************************\n";
+ emit gotMetaInfo(d->currentItem->current());
+ determineNextFile();
+ return;
+ }
+
+ getMetaInfo();
+}
+
+void MetaInfoJob::slotResult( TDEIO::Job *job )
+{
+ subjobs.remove(job);
+ Q_ASSERT(subjobs.isEmpty()); // We should have only one job at a time ...
+
+ determineNextFile();
+}
+
+void MetaInfoJob::getMetaInfo()
+{
+ Q_ASSERT(!d->currentItem->isEmpty());
+
+ KURL URL;
+ URL.setProtocol("metainfo");
+ URL.setPath(d->currentItem->current()->url().path());
+
+ TDEIO::TransferJob* job = TDEIO::get(URL, false, false);
+ addSubjob(job);
+
+ connect(job, TQT_SIGNAL(data(TDEIO::Job *, const TQByteArray &)),
+ this, TQT_SLOT(slotMetaInfo(TDEIO::Job *, const TQByteArray &)));
+
+ job->addMetaData("mimeType", d->currentItem->current()->mimetype());
+}
+
+
+void MetaInfoJob::slotMetaInfo(TDEIO::Job*, const TQByteArray &data)
+{
+ KFileMetaInfo info;
+ TQDataStream s(data, IO_ReadOnly);
+
+ s >> info;
+
+ d->currentItem->current()->setMetaInfo(info);
+ emit gotMetaInfo(d->currentItem->current());
+ d->succeeded = true;
+}
+
+TQStringList MetaInfoJob::availablePlugins()
+{
+ TQStringList result;
+ KTrader::OfferList plugins = KTrader::self()->query("KFilePlugin");
+ for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
+ result.append((*it)->desktopEntryName());
+ return result;
+}
+
+TQStringList MetaInfoJob::supportedMimeTypes()
+{
+ TQStringList result;
+ KTrader::OfferList plugins = KTrader::self()->query("KFilePlugin");
+ for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
+ result += (*it)->property("MimeTypes").toStringList();
+ return result;
+}
+
+TDEIO_EXPORT MetaInfoJob *TDEIO::fileMetaInfo( const KFileItemList &items)
+{
+ return new MetaInfoJob(items, false);
+}
+
+TDEIO_EXPORT MetaInfoJob *TDEIO::fileMetaInfo( const KURL::List &items)
+{
+ KFileItemList fileItems;
+ for (KURL::List::ConstIterator it = items.begin(); it != items.end(); ++it)
+ fileItems.append(new KFileItem(KFileItem::Unknown, KFileItem::Unknown, *it, true));
+ return new MetaInfoJob(fileItems, true);
+}
+