metainfojob.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <kdatastream.h>
00024 #include <kfileitem.h>
00025 #include <kdebug.h>
00026 #include <kfilemetainfo.h>
00027 #include <kio/kservice.h>
00028 #include <kparts/componentfactory.h>
00029
00030 #include <qtimer.h>
00031
00032 #include "metainfojob.moc"
00033
00034 using namespace KIO;
00035
00036 struct KIO::MetaInfoJobPrivate
00037 {
00038 KFileItemList items;
00039 KFileItemListIterator* currentItem;
00040 bool deleteItems;
00041 bool succeeded;
00042 };
00043
00044 MetaInfoJob::MetaInfoJob(const KFileItemList &items, bool deleteItems)
00045 : KIO::Job(false )
00046 {
00047 d = new MetaInfoJobPrivate;
00048 d->deleteItems = deleteItems;
00049 d->succeeded = false;
00050 d->items = items;
00051 d->currentItem = new KFileItemListIterator(d->items);
00052
00053 d->items.setAutoDelete(deleteItems);
00054
00055 if (d->currentItem->isEmpty())
00056 {
00057 kdDebug(7007) << "nothing to do for the MetaInfoJob\n";
00058 emitResult();
00059 return;
00060 }
00061
00062 kdDebug(7007) << "starting MetaInfoJob\n";
00063
00064
00065
00066 QTimer::singleShot(0, this, SLOT(start()));
00067 }
00068
00069 MetaInfoJob::~MetaInfoJob()
00070 {
00071 delete d->currentItem;
00072 delete d;
00073 }
00074
00075 void MetaInfoJob::start()
00076 {
00077 getMetaInfo();
00078 }
00079
00080 void MetaInfoJob::removeItem(const KFileItem* item)
00081 {
00082 if (d->currentItem->current() == item)
00083 {
00084 subjobs.first()->kill();
00085 subjobs.removeFirst();
00086 determineNextFile();
00087 }
00088
00089 d->items.remove(d->items.find(item));
00090 }
00091
00092 void MetaInfoJob::determineNextFile()
00093 {
00094 if (d->currentItem->atLast())
00095 {
00096 kdDebug(7007) << "finished MetaInfoJob\n";
00097 emitResult();
00098 return;
00099 }
00100
00101 ++(*d->currentItem);
00102 d->succeeded = false;
00103
00104
00105 if (d->currentItem->current()->metaInfo(false).isValid())
00106 {
00107
00108 emit gotMetaInfo(d->currentItem->current());
00109 determineNextFile();
00110 return;
00111 }
00112
00113 getMetaInfo();
00114 }
00115
00116 void MetaInfoJob::slotResult( KIO::Job *job )
00117 {
00118 subjobs.remove(job);
00119 Q_ASSERT(subjobs.isEmpty());
00120
00121 determineNextFile();
00122 }
00123
00124 void MetaInfoJob::getMetaInfo()
00125 {
00126 Q_ASSERT(!d->currentItem->isEmpty());
00127
00128 KURL URL;
00129 URL.setProtocol("metainfo");
00130 URL.setPath(d->currentItem->current()->url().path());
00131
00132 KIO::TransferJob* job = KIO::get(URL, false, false);
00133 addSubjob(job);
00134
00135 connect(job, SIGNAL(data(KIO::Job *, const QByteArray &)),
00136 this, SLOT(slotMetaInfo(KIO::Job *, const QByteArray &)));
00137
00138 job->addMetaData("mimeType", d->currentItem->current()->mimetype());
00139 }
00140
00141
00142 void MetaInfoJob::slotMetaInfo(KIO::Job* , const QByteArray &data)
00143 {
00144 KFileMetaInfo info;
00145 QDataStream s(data, IO_ReadOnly);
00146
00147 s >> info;
00148
00149
00150 if (!info.isValid()) kdDebug(7007) << info.path() << " is not valid\n";
00151
00152 d->currentItem->current()->setMetaInfo(info);
00153 emit gotMetaInfo(d->currentItem->current());
00154 d->succeeded = true;
00155 }
00156
00157 QStringList MetaInfoJob::availablePlugins()
00158 {
00159 QStringList result;
00160 KTrader::OfferList plugins = KTrader::self()->query("KFilePlugin");
00161 for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
00162 result.append((*it)->desktopEntryName());
00163 return result;
00164 }
00165
00166 QStringList MetaInfoJob::supportedMimeTypes()
00167 {
00168 QStringList result;
00169 KTrader::OfferList plugins = KTrader::self()->query("KFilePlugin");
00170 for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
00171 result += (*it)->property("MimeTypes").toStringList();
00172 return result;
00173 }
00174
00175 MetaInfoJob *KIO::fileMetaInfo( const KFileItemList &items)
00176 {
00177 return new MetaInfoJob(items, false);
00178 }
00179
00180 MetaInfoJob *KIO::fileMetaInfo( const KURL::List &items)
00181 {
00182 KFileItemList fileItems;
00183 for (KURL::List::ConstIterator it = items.begin(); it != items.end(); ++it)
00184 fileItems.append(new KFileItem(KFileItem::Unknown, KFileItem::Unknown, *it, true));
00185 return new MetaInfoJob(fileItems, true);
00186 }
00187
This file is part of the documentation for kdelibs Version 3.1.4.