3 commits - c++/lib c++/tests

Christian Mollekopf mollekopf at kolabsys.com
Wed Feb 22 22:32:27 CET 2012


 c++/lib/kolabcontact.h       |    6 +++++-
 c++/lib/utils.cpp            |   31 ++++++++++++++++++++++++++++++-
 c++/lib/utils.h              |    3 +++
 c++/lib/xcardconversions.h   |   16 ++++++++++------
 c++/tests/bindingstest.cpp   |    5 ++---
 c++/tests/conversiontest.cpp |   12 ++++++++++++
 c++/tests/conversiontest.h   |    2 ++
 7 files changed, 64 insertions(+), 11 deletions(-)

New commits:
commit 7925c6678efaf60b7d3cc1df219c2f98e3f814bd
Merge: 467fda6 f2c239d
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Feb 22 22:32:13 2012 +0100

    Merge branch 'master' of ssh://git.kolabsys.com/git/libkolabxml



commit 467fda64299b2faa32e993360a12d0d981ee34d5
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Feb 22 22:30:11 2012 +0100

    Affiliation logo

diff --git a/c++/lib/kolabcontact.h b/c++/lib/kolabcontact.h
index e0f35ec..f1b2441 100644
--- a/c++/lib/kolabcontact.h
+++ b/c++/lib/kolabcontact.h
@@ -54,6 +54,7 @@ private:
 struct Affiliation {
     bool operator==(const Affiliation &other) const { return mOrg == other.mOrg &&
                                                     mLogo == other.mLogo &&
+                                                    mLogoMimetype == other.mLogoMimetype &&
                                                     mTitles == other.mTitles &&
                                                     mRoles == other.mRoles &&
                                                     mManagers == other.mManagers &&
@@ -63,8 +64,10 @@ struct Affiliation {
     void setOrganisation(const std::string &org) { mOrg = org; };
     std::string organisation() const { return mOrg; };
 //     void setOrganisationalUnits(const std::vector<std::string> &units);
-    void setLogo(const std::string &l) { mLogo = l; };
+    void setLogo(const std::string &l, const std::string mimetype) { mLogo = l; mLogoMimetype = mimetype; };
     std::string logo() const { return mLogo; };
+    std::string logoMimetype() const { return mLogoMimetype; };
+
     void setTitles(const std::vector<std::string> &titles) { mTitles = titles; };
     std::vector<std::string> titles() const { return mTitles; };
     void setRoles(const std::vector<std::string> &roles) { mRoles = roles; };
@@ -79,6 +82,7 @@ private:
     std::string mOrg;
     std::vector<std::string> mOrgUnits;
     std::string mLogo;
+    std::string mLogoMimetype;
     std::vector<std::string> mTitles;
     std::vector<std::string> mRoles;
     std::vector<std::string> mManagers;
diff --git a/c++/lib/xcardconversions.h b/c++/lib/xcardconversions.h
index f8f13a4..3d11bc3 100644
--- a/c++/lib/xcardconversions.h
+++ b/c++/lib/xcardconversions.h
@@ -257,7 +257,10 @@ void writeCard<Kolab::Contact>(vcard_4_0::vcard &vcard, const Kolab::Contact &co
     if (!contact.affiliations().empty()) {
         vcard::group_sequence affiliations;
         BOOST_FOREACH(const Affiliation &a, contact.affiliations()) {
-            std::string encodedLogo = a.logo();//TODO encode logo
+            std::string encodedLogo;
+            if (!a.logo().empty()) {
+                encodedLogo = uriInlineEncoding(a.logo(), a.logoMimetype());
+            }
             affiliationPropType::org_type org;
             org.text().push_back(a.organisation());
             vcard::group_type group(org, affiliationPropType::logo_type(encodedLogo));
@@ -535,7 +538,9 @@ boost::shared_ptr<Kolab::Contact> readCard <Kolab::Contact> (const vcard_4_0::Vc
                 WARNING("No org present");
             }
             aff.setOrganisation(org);
-            aff.setLogo(group.logo().uri());
+            std::string mimetype;
+            const std::string &logo = uriInlineDecoding(group.logo().uri(), mimetype);
+            aff.setLogo(logo, mimetype);
             aff.setTitles(toTextList<vcard::group_type::title_type>(group.title()));
             aff.setRoles(toTextList<vcard::group_type::role_type>(group.role()));
             aff.setManagers(toTextList<vcard::group_type::x_manager_type>(group.x_manager()));
diff --git a/c++/tests/bindingstest.cpp b/c++/tests/bindingstest.cpp
index ebc0130..d1fb65c 100644
--- a/c++/tests/bindingstest.cpp
+++ b/c++/tests/bindingstest.cpp
@@ -259,7 +259,7 @@ void BindingsTest::contactCompletness()
     std::vector<Kolab::Affiliation> list;
     Kolab::Affiliation aff;
     aff.setOrganisation("org");
-    aff.setLogo("logo");
+    aff.setLogo("logo", "mime/miem");
     aff.setTitles(stringlist);
     aff.setRoles(stringlist);
     aff.setManagers(stringlist);


commit bb8080aa66f9ed9a418e14841d17634d9d6e7539
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Feb 22 22:15:21 2012 +0100

    Uri inline encoding + contact photo

diff --git a/c++/lib/utils.cpp b/c++/lib/utils.cpp
index ce578ab..b3862d3 100644
--- a/c++/lib/utils.cpp
+++ b/c++/lib/utils.cpp
@@ -21,6 +21,7 @@
 #include <boost/uuid/uuid_io.hpp>
 #include <boost/lexical_cast.hpp>
 #include <time.h>
+#include "base64.h"
 
 namespace Kolab {
     
@@ -130,6 +131,34 @@ std::string getErrorMessage()
     return global_errorMessage;
 }
 
+
+std::string uriInlineEncoding(const std::string &s, const std::string &mimetype)
+{
+    return std::string("data:")+mimetype+std::string(";base64,")+base64_encode(reinterpret_cast<const unsigned char*>(s.c_str()), s.length());
 }
 
-}
\ No newline at end of file
+std::string uriInlineDecoding(const std::string &s, std::string &mimetype)
+{
+    if (s.substr(0, 5) != std::string("data:")) {
+        ERROR("wrong picture encoding");
+        std::cout << s <<  "      " << s.substr(0, 5) << std::endl;
+        return std::string();
+    }
+    std::size_t pos = s.find(";",5);
+    if (pos == std::string::npos) {
+        ERROR("wrong picture encoding");
+        std::cout << s <<  "      " << s.substr(0, 5) << std::endl;
+        return std::string();
+    }
+    mimetype = s.substr(5, pos-5);
+    if (s.substr(pos+1, 6) != std::string("base64")) {
+        ERROR("wrong picture encoding");
+        std::cout << s <<  "      " << s.substr(pos+1, 6) << std::endl;
+        return std::string();
+    }
+    return base64_decode(s.substr(pos+8, s.size()-(pos+8)));
+}
+
+} //Namespace
+
+} //Namespace
\ No newline at end of file
diff --git a/c++/lib/utils.h b/c++/lib/utils.h
index a0b2283..41f60ce 100644
--- a/c++/lib/utils.h
+++ b/c++/lib/utils.h
@@ -107,6 +107,9 @@ T fromInt(int integer)
     return 0;
 }
 
+std::string uriInlineEncoding(const std::string &, const std::string &mime);
+std::string uriInlineDecoding(const std::string &s, std::string &mimetype);
+
     } //Namespace
 
 } //Namespace
diff --git a/c++/lib/xcardconversions.h b/c++/lib/xcardconversions.h
index 2fc1291..f8f13a4 100644
--- a/c++/lib/xcardconversions.h
+++ b/c++/lib/xcardconversions.h
@@ -355,8 +355,7 @@ void writeCard<Kolab::Contact>(vcard_4_0::vcard &vcard, const Kolab::Contact &co
     }
     
     if (!contact.photo().empty()) {
-        vcard::photo_type photo(vcard_4_0::UriPropertyType::uri_type(contact.photo()));
-        //TODO photo inline encoding
+        vcard::photo_type photo(vcard_4_0::UriPropertyType::uri_type(uriInlineEncoding(contact.photo(), contact.photoMimetype())));
         vcard.photo(photo);
     }
     
@@ -604,8 +603,8 @@ boost::shared_ptr<Kolab::Contact> readCard <Kolab::Contact> (const vcard_4_0::Vc
         contact->setAnniversary(toDateTime(*vcard.anniversary()));
     }
     if (vcard.photo()) {
-        const std::string decodedPhoto =  (*vcard.photo()).uri(); //TODO decode photo
-        const std::string mimetype;
+        std::string mimetype;
+        const std::string decodedPhoto =  uriInlineDecoding((*vcard.photo()).uri(), mimetype);
         contact->setPhoto(decodedPhoto, mimetype);
     }
     if (vcard.gender()) {
diff --git a/c++/tests/bindingstest.cpp b/c++/tests/bindingstest.cpp
index 9b2d071..ebc0130 100644
--- a/c++/tests/bindingstest.cpp
+++ b/c++/tests/bindingstest.cpp
@@ -298,7 +298,6 @@ void BindingsTest::contactCompletness()
     telephones.push_back(phone);
     telephones.push_back(phone);
     c.setTelephones(telephones, 1);
-    c.setPhoto("photo", "mimetype");
     
 //     c.setGPSpos(stringlist,1);
     
@@ -322,7 +321,7 @@ void BindingsTest::contactCompletness()
     QCOMPARE(e.bDay(), c.bDay());
     QCOMPARE(e.anniversary(), c.anniversary());
     QCOMPARE(e.photo(), c.photo());
-    //     QCOMPARE(e.photoMimetype(), c.photoMimetype());
+    QCOMPARE(e.photoMimetype(), c.photoMimetype());
     QCOMPARE(e.gender(), c.gender());
     QCOMPARE(e.languages(), c.languages());
     QCOMPARE(e.telephones(), c.telephones());
diff --git a/c++/tests/conversiontest.cpp b/c++/tests/conversiontest.cpp
index ef3998c..369e380 100644
--- a/c++/tests/conversiontest.cpp
+++ b/c++/tests/conversiontest.cpp
@@ -3,6 +3,7 @@
 #include <QtTest/QtTest>
 #include <lib/xcalconversions.h>
 #include <lib/xcardconversions.h>
+#include <lib/utils.h>
 
 #include "serializers.h"
 
@@ -130,6 +131,17 @@ void ConversionTest::xCardSerializerTest()
     QCOMPARE(QString::fromStdString(s), expected);
 }
 
+void ConversionTest::uriInlineEncodingTest()
+{
+    const std::string &s = Kolab::Utils::uriInlineEncoding("data", "mimetype/mime");
+    QCOMPARE(s, std::string("data:mimetype/mime;base64,ZGF0YQ=="));
+    std::string mimetype;
+    const std::string &d = Kolab::Utils::uriInlineDecoding(s, mimetype);
+    QCOMPARE(mimetype, std::string("mimetype/mime"));
+    QCOMPARE(d, std::string("data"));
+}
+
+
 
 QTEST_MAIN( ConversionTest )
 
diff --git a/c++/tests/conversiontest.h b/c++/tests/conversiontest.h
index 91fe618..3b4739e 100644
--- a/c++/tests/conversiontest.h
+++ b/c++/tests/conversiontest.h
@@ -26,6 +26,8 @@ class ConversionTest : public QObject
     
     void xCardSerializerTest_data();
     void xCardSerializerTest();
+    
+    void uriInlineEncodingTest();
 };
 
 #endif // CONVERSIONTEST_H





More information about the commits mailing list