kio
metainfojob.cpp
Go to the documentation of this file.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 d->currentItem->current()->setMetaInfo(info);
00150 emit gotMetaInfo(d->currentItem->current());
00151 d->succeeded = true;
00152 }
00153
00154 QStringList MetaInfoJob::availablePlugins()
00155 {
00156 QStringList result;
00157 KTrader::OfferList plugins = KTrader::self()->query("KFilePlugin");
00158 for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
00159 result.append((*it)->desktopEntryName());
00160 return result;
00161 }
00162
00163 QStringList MetaInfoJob::supportedMimeTypes()
00164 {
00165 QStringList result;
00166 KTrader::OfferList plugins = KTrader::self()->query("KFilePlugin");
00167 for (KTrader::OfferList::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
00168 result += (*it)->property("MimeTypes").toStringList();
00169 return result;
00170 }
00171
00172 KIO_EXPORT MetaInfoJob *KIO::fileMetaInfo( const KFileItemList &items)
00173 {
00174 return new MetaInfoJob(items, false);
00175 }
00176
00177 KIO_EXPORT MetaInfoJob *KIO::fileMetaInfo( const KURL::List &items)
00178 {
00179 KFileItemList fileItems;
00180 for (KURL::List::ConstIterator it = items.begin(); it != items.end(); ++it)
00181 fileItems.append(new KFileItem(KFileItem::Unknown, KFileItem::Unknown, *it, true));
00182 return new MetaInfoJob(fileItems, true);
00183 }
00184