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     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 MetaInfoJob *KIO::fileMetaInfo( const KFileItemList &items)
00173 {
00174     return new MetaInfoJob(items, false);
00175 }
00176 
00177 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 
 
This file is part of the documentation for kio Library Version 3.2.0.