[Digikam-devel] extragear/graphics/digikam/utilities/cameragui

Gilles Caulier caulier.gilles at gmail.com
Thu Nov 6 16:03:13 GMT 2008


SVN commit 880838 by cgilles:

with USB Mass Storage Camera, try to get video thumbnail using KDE thumb creator.
Marcel, Andi, this patch work for you? (video thumb is broken under KDE4)
CCMAIL: digikam-devel at kde.org


 M  +75 -0     umscamera.cpp  
 M  +2 -0      umscamera.h  


--- trunk/extragear/graphics/digikam/utilities/cameragui/umscamera.cpp #880837:880838
@@ -44,10 +44,16 @@
 
 // KDE includes.
 
+#include <kdebug.h>
 #include <kcodecs.h>
 #include <kdebug.h>
 #include <klocale.h>
 #include <kfilemetainfo.h>
+#include <ktrader.h>
+#include <klibloader.h>
+#include <kmimetype.h>
+#include <kio/global.h>
+#include <kio/thumbcreator.h>
 #include <solid/device.h>
 #include <solid/storageaccess.h>
 #include <solid/storagedrive.h>
@@ -259,9 +265,78 @@
         return true;
     }
 
+    if (loadKDEThumbCreator(folder, itemName, thumbnail))
+        return true;
+
     return false;
 }
 
+bool UMSCamera::loadKDEThumbCreator(const QString& folder, const QString& itemName, QImage& thumbnail)
+{
+    QString path     = folder + QString("/") + itemName;
+    QString mimeType = KMimeType::findByUrl(path)->name();
+
+    if (mimeType.isEmpty())
+    {
+        kDebug(50003) << "Mimetype not found" << endl;
+        return false;
+    }
+
+    QString mimeTypeAlt = mimeType.replace(QRegExp("/.*"), "/*");
+    QString plugin;
+
+    KService::List plugins = KServiceTypeTrader::self()->query("ThumbCreator");
+    for (KService::List::ConstIterator it = plugins.begin(); it != plugins.end(); ++it)
+    {
+        QStringList mimeTypes = (*it)->property("MimeTypes").toStringList();
+        for (QStringList::ConstIterator mt = mimeTypes.begin(); mt != mimeTypes.end(); ++mt)
+        {
+            if  ((*mt) == mimeType || (*mt) == mimeTypeAlt)
+            {
+                plugin = (*it)->library();
+                break;
+            }
+        }
+
+        if (!plugin.isEmpty())
+            break;
+    }
+
+    if (plugin.isEmpty())
+    {
+        kDebug(50003) << "No relevant plugin found " << endl;
+        return false;
+    }
+
+    KLibrary *library = KLibLoader::self()->library(QFile::encodeName(plugin));
+    if (!library)
+    {
+        kDebug(50003) << "Plugin library not found " << plugin << endl;
+        return false;
+    }
+
+    ThumbCreator *creator = 0;
+    newCreator create     = (newCreator)library->resolveSymbol("new_creator");
+    if (create)
+        creator = create();
+
+    if (!creator)
+    {
+        kDebug(50003) << "Cannot load ThumbCreator " << plugin << endl;
+        return false;
+    }
+
+    if (!creator->create(path, 256, 256, thumbnail))
+    {
+        kDebug(50003) << "Cannot create thumbnail for " << path << endl;
+        delete creator;
+        return false;
+    }
+
+    delete creator;
+    return true;
+}
+
 bool UMSCamera::getExif(const QString&, const QString&, char **, int&)
 {
     // not necessary to implement this. read it directly from the file
--- trunk/extragear/graphics/digikam/utilities/cameragui/umscamera.h #880837:880838
@@ -83,6 +83,8 @@
      */
     void getUUIDFromSolid();
 
+    bool loadKDEThumbCreator(const QString& folder, const QString& itemName, QImage& thumbnail);
+
 private:
 
     bool m_cancel;



More information about the Digikam-devel mailing list