Branch 'encoding' - kolabformat/kolabobject.cpp mime/mimeutils.cpp mime/mimeutils.h

Christian Mollekopf mollekopf at kolabsys.com
Wed Aug 15 14:05:08 CEST 2012


 kolabformat/kolabobject.cpp |   26 ++++++++++++++++++--------
 mime/mimeutils.cpp          |   11 +++++++++++
 mime/mimeutils.h            |    4 +---
 3 files changed, 30 insertions(+), 11 deletions(-)

New commits:
commit b123e0604c7d6f9caab245006cc9f18d34af6210
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Aug 15 14:04:46 2012 +0200

    Autodetect type based on mimetype as fallback for v2 messages lacking the Kolab-Type header.

diff --git a/kolabformat/kolabobject.cpp b/kolabformat/kolabobject.cpp
index fc97715..a8b1404 100644
--- a/kolabformat/kolabobject.cpp
+++ b/kolabformat/kolabobject.cpp
@@ -188,6 +188,17 @@ QByteArray getMimeType(Kolab::ObjectType type)
     return QByteArray();
 }
 
+Kolab::ObjectType detectType(const KMime::Message::Ptr &msg)
+{
+    Q_FOREACH(const QByteArray &type, Mime::getContentMimeTypeList(msg)) {
+        Kolab::ObjectType t = getObjectType(type); //works for v2 types
+        if (t != InvalidObject) {
+            return t;
+        }
+    }
+    return InvalidObject;
+}
+
 void printMessageDebugInfo(const KMime::Message::Ptr &msg)
 {
     //TODO replace by Debug stream for Mimemessage
@@ -342,19 +353,18 @@ ObjectType KolabObjectReader::parseMimeMessage(const KMime::Message::Ptr &msg)
     }
     Kolab::ObjectType objectType = InvalidObject;
     if (d->mOverrideObjectType == InvalidObject) {
-        KMime::Headers::Base *xKolabHeader = msg->getHeaderByType(X_KOLAB_TYPE_HEADER);
-        if (!xKolabHeader) {
-            CRITICAL("could not find the X-Kolab-Type Header");
-            printMessageDebugInfo(msg);
-            return InvalidObject;
+        if (KMime::Headers::Base *xKolabHeader = msg->getHeaderByType(X_KOLAB_TYPE_HEADER)) {
+            objectType = getObjectType(xKolabHeader->asUnicodeString().trimmed());
+        } else {
+            Warning() << "could not find the X-Kolab-Type Header, trying autodetection" ;
+            //This works only for v2 messages atm.
+            objectType = detectType(msg);
         }
-        const QString &kolabType = xKolabHeader->asUnicodeString().trimmed();
-        objectType = getObjectType(kolabType);
     } else {
         objectType = d->mOverrideObjectType;
     }
     if (objectType == InvalidObject) {
-        Warning() << "invalid object type";
+        Critical() << "unable to detect object type";
         printMessageDebugInfo(msg);
         return InvalidObject;
     }
diff --git a/mime/mimeutils.cpp b/mime/mimeutils.cpp
index f51e498..a8259d3 100644
--- a/mime/mimeutils.cpp
+++ b/mime/mimeutils.cpp
@@ -75,6 +75,17 @@ KMime::Content* findContentById(const KMime::Message::Ptr &data, const QByteArra
     return 0;
 }
 
+QList<QByteArray> getContentMimeTypeList(const KMime::Message::Ptr& data)
+{
+    QList<QByteArray> typeList;
+    Q_ASSERT(!data->contents().isEmpty());
+    Q_FOREACH(KMime::Content *c, data->contents()) {
+        typeList.append(c->contentType()->mimeType());
+    }
+    return typeList;
+}
+
+
 
 QByteArray getXmlDocument(const KMime::Message::Ptr &data, const QByteArray &mimetype)
 {
diff --git a/mime/mimeutils.h b/mime/mimeutils.h
index 428cbcf..9d42ac4 100644
--- a/mime/mimeutils.h
+++ b/mime/mimeutils.h
@@ -29,12 +29,10 @@ class QDomDocument;
 namespace Kolab {
     namespace Mime {
 
-//TODO Generic
 KMime::Content* findContentByName(const KMime::Message::Ptr &data, const QString &name, QByteArray &type);
-//TODO Generic
 KMime::Content* findContentByType(const KMime::Message::Ptr &data, const QByteArray &type);
+QList<QByteArray> getContentMimeTypeList(const KMime::Message::Ptr &data);
 
-//TODO Generic
 QByteArray getXmlDocument(const KMime::Message::Ptr &data, const QByteArray &mimetype);
 
 /**





More information about the commits mailing list