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