Branch 'libkolabxml-1.0' - 4 commits - src/containers src/kolabformat.cpp src/utils.cpp src/utils.h src/xcalconversions.h

Christian Mollekopf mollekopf at kolabsys.com
Tue Mar 25 10:56:46 CET 2014


 src/containers/kolabcontainers.cpp |    6 ++-
 src/kolabformat.cpp                |   73 +++++++++++++++++++++++++++++++------
 src/utils.cpp                      |   11 +++++
 src/utils.h                        |   14 +++++--
 src/xcalconversions.h              |    9 +---
 5 files changed, 91 insertions(+), 22 deletions(-)

New commits:
commit 133e34a0481293d64a9899e107acbdc9ba817ec5
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Mar 21 17:30:45 2014 +0100

    Made attachment mimetype optional.

diff --git a/src/containers/kolabcontainers.cpp b/src/containers/kolabcontainers.cpp
index 47c76e3..fc241a1 100644
--- a/src/containers/kolabcontainers.cpp
+++ b/src/containers/kolabcontainers.cpp
@@ -536,11 +536,13 @@ struct Attachment::Private
     std::string data;
     std::string mimetype;
     std::string label;
+    bool isValid;
 };
 
 Attachment::Attachment()
 :   d(new Attachment::Private)
 {
+    d->isValid = false;
 }
 
 Attachment::Attachment(const Kolab::Attachment &other)
@@ -568,6 +570,7 @@ bool Attachment::operator==(const Kolab::Attachment &other) const
 
 void Attachment::setUri(const std::string &uri, const std::string& mimetype)
 {
+    d->isValid = true;
     d->uri = uri;
     d->mimetype = mimetype;
 }
@@ -594,6 +597,7 @@ std::string Attachment::label() const
 
 void Attachment::setData(const std::string &data, const std::string& mimetype)
 {
+    d->isValid = true;
     d->data = data;
     d->mimetype = mimetype;
 }
@@ -605,7 +609,7 @@ std::string Attachment::data() const
 
 bool Attachment::isValid() const
 {
-    return !d->mimetype.empty(); //TODO use isValid variable
+    return d->isValid;
 }
 
 
diff --git a/src/xcalconversions.h b/src/xcalconversions.h
index 9326548..923646b 100644
--- a/src/xcalconversions.h
+++ b/src/xcalconversions.h
@@ -417,16 +417,13 @@ Kolab::Attachment toAttachment(T aProp)
             }
         }
     }
-    if (mimetype.empty()) {
-        ERROR("no mimetype");
-    }
 
     if (aProp.uri()) {
         a.setUri(*aProp.uri(), mimetype);
     } else if (aProp.binary()) {
         a.setData(base64_decode(*aProp.binary()), mimetype);
     } else {
-        ERROR("not uri and no data available");
+        ERROR("no uri and no data available");
     }
     return a;
 }


commit 236784324a6430370ad353d1be27190c5d518953
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Mar 21 17:25:11 2014 +0100

    Follow up the parsing error message with message that it occurred during writing.

diff --git a/src/kolabformat.cpp b/src/kolabformat.cpp
index abd8f54..4ab8ed1 100644
--- a/src/kolabformat.cpp
+++ b/src/kolabformat.cpp
@@ -89,6 +89,9 @@ std::string writeEvent(const Kolab::Event &event, const std::string& productId)
     const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(event, productId);
     //Validate
     XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -109,6 +112,9 @@ std::string writeTodo(const Kolab::Todo &event, const std::string& productId)
     const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(event, productId);
     //Validate
     XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -129,6 +135,9 @@ std::string writeJournal(const Kolab::Journal &j, const std::string& productId)
     const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Journal> >(j, productId);
     //Validate
     XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Journal> >(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -148,6 +157,9 @@ std::string writeFreebusy(const Freebusy &f, const std::string& productId)
     validate(f);
     const std::string result = XCAL::serializeFreebusy<XCAL::IncidenceTrait<Kolab::Freebusy> >(f, productId);
     XCAL::deserializeIncidence<XCAL::IncidenceTrait<Kolab::Freebusy> >(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -168,6 +180,9 @@ std::string writeContact(const Contact &contact, const std::string& productId)
     const std::string result = XCARD::serializeCard(contact, productId);
     //Validate
     XCARD::deserializeCard<Kolab::Contact>(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -188,6 +203,9 @@ std::string writeDistlist(const DistList &list, const std::string& productId)
     const std::string result = XCARD::serializeCard(list, productId);
     //Validate
     XCARD::deserializeCard<Kolab::DistList>(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -208,6 +226,9 @@ std::string writeNote(const Note &note, const std::string& productId)
     const std::string result = Kolab::KolabObjects::serializeObject<Kolab::Note>(note, productId);
     //Validate
     Kolab::KolabObjects::deserializeObject<Kolab::Note>(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -228,6 +249,9 @@ std::string writeFile(const File &file, const std::string& productId)
     const std::string result = Kolab::KolabObjects::serializeObject<Kolab::File>(file, productId);
     //Validate
     Kolab::KolabObjects::deserializeObject<Kolab::File>(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
@@ -248,6 +272,9 @@ std::string writeConfiguration(const Configuration &config, const std::string& p
     const std::string result = Kolab::KolabObjects::serializeObject<Kolab::Configuration>(config, productId);
     //Validate
     Kolab::KolabObjects::deserializeObject<Kolab::Configuration>(result, false);
+    if (errorOccurred()) {
+        LOG("Error occurred while writing.")
+    }
     return result;
 }
 
diff --git a/src/utils.h b/src/utils.h
index 2c7e579..2688af4 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -33,10 +33,10 @@ std::string getUID(const std::string & = std::string());
 
 void logMessage(const std::string &,const std::string &, int, ErrorSeverity s);
      
-#define LOG(message) logMessage(message,__FILE__, __LINE__, NoError);
-#define WARNING(message) logMessage(message,__FILE__, __LINE__, Warning);
-#define ERROR(message) logMessage(message,__FILE__, __LINE__, Error);
-#define CRITICAL(message) logMessage(message,__FILE__, __LINE__, Critical);
+#define LOG(message) Utils::logMessage(message,__FILE__, __LINE__, NoError);
+#define WARNING(message) Utils::logMessage(message,__FILE__, __LINE__, Warning);
+#define ERROR(message) Utils::logMessage(message,__FILE__, __LINE__, Error);
+#define CRITICAL(message) Utils::logMessage(message,__FILE__, __LINE__, Critical);
 
 void logMessage(const std::string &, ErrorSeverity s = Warning);
 


commit f882aee4905863b1d242ee0303ed0213d9eae4b0
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Mar 21 17:07:32 2014 +0100

    Validate serialized objects again.
    
    We ensure that we can parse everything we serialize by parsing it again.
    This implies an overhead, but since reads are probably far more frequent than
    write and its generally anyways fast, I assume this is ok.
    
    The error reporting is as usual through Kolab::error().

diff --git a/src/kolabformat.cpp b/src/kolabformat.cpp
index 10f5591..abd8f54 100644
--- a/src/kolabformat.cpp
+++ b/src/kolabformat.cpp
@@ -86,7 +86,10 @@ std::string writeEvent(const Kolab::Event &event, const std::string& productId)
 {
     Utils::clearErrors();
     validate(event);
-    return XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(event, productId);
+    const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(event, productId);
+    //Validate
+    XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Event> >(result, false);
+    return result;
 }
 
 Kolab::Todo readTodo(const std::string& s, bool isUrl)
@@ -103,7 +106,10 @@ std::string writeTodo(const Kolab::Todo &event, const std::string& productId)
 {
     Utils::clearErrors();
     validate(event);
-    return XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(event, productId);
+    const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(event, productId);
+    //Validate
+    XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Todo> >(result, false);
+    return result;
 }
 
 Journal readJournal(const std::string& s, bool isUrl)
@@ -120,7 +126,10 @@ std::string writeJournal(const Kolab::Journal &j, const std::string& productId)
 {
     Utils::clearErrors();
     validate(j);
-    return XCAL::serializeIncidence<XCAL::IncidenceTrait<Kolab::Journal> >(j, productId);
+    const std::string result = XCAL::serializeIncidence< XCAL::IncidenceTrait<Kolab::Journal> >(j, productId);
+    //Validate
+    XCAL::deserializeIncidence< XCAL::IncidenceTrait<Kolab::Journal> >(result, false);
+    return result;
 }
 
 Kolab::Freebusy readFreebusy(const std::string& s, bool isUrl)
@@ -137,7 +146,9 @@ std::string writeFreebusy(const Freebusy &f, const std::string& productId)
 {
     Utils::clearErrors();
     validate(f);
-    return XCAL::serializeFreebusy<XCAL::IncidenceTrait<Kolab::Freebusy> >(f, productId);
+    const std::string result = XCAL::serializeFreebusy<XCAL::IncidenceTrait<Kolab::Freebusy> >(f, productId);
+    XCAL::deserializeIncidence<XCAL::IncidenceTrait<Kolab::Freebusy> >(result, false);
+    return result;
 }
 
 Kolab::Contact readContact(const std::string& s, bool isUrl)
@@ -154,7 +165,10 @@ std::string writeContact(const Contact &contact, const std::string& productId)
 {
     Utils::clearErrors();
     validate(contact);
-    return XCARD::serializeCard(contact, productId);
+    const std::string result = XCARD::serializeCard(contact, productId);
+    //Validate
+    XCARD::deserializeCard<Kolab::Contact>(result, false);
+    return result;
 }
 
 DistList readDistlist(const std::string& s, bool isUrl)
@@ -171,7 +185,10 @@ std::string writeDistlist(const DistList &list, const std::string& productId)
 {
     Utils::clearErrors();
     validate(list);
-    return XCARD::serializeCard(list, productId);
+    const std::string result = XCARD::serializeCard(list, productId);
+    //Validate
+    XCARD::deserializeCard<Kolab::DistList>(result, false);
+    return result;
 }
 
 Note readNote(const std::string& s, bool isUrl)
@@ -188,7 +205,10 @@ std::string writeNote(const Note &note, const std::string& productId)
 {
     Utils::clearErrors();
     validate(note);
-    return Kolab::KolabObjects::serializeObject<Kolab::Note>(note, productId);
+    const std::string result = Kolab::KolabObjects::serializeObject<Kolab::Note>(note, productId);
+    //Validate
+    Kolab::KolabObjects::deserializeObject<Kolab::Note>(result, false);
+    return result;
 }
 
 File readFile(const std::string& s, bool isUrl)
@@ -205,7 +225,10 @@ std::string writeFile(const File &file, const std::string& productId)
 {
     Utils::clearErrors();
     validate(file);
-    return Kolab::KolabObjects::serializeObject<Kolab::File>(file, productId);
+    const std::string result = Kolab::KolabObjects::serializeObject<Kolab::File>(file, productId);
+    //Validate
+    Kolab::KolabObjects::deserializeObject<Kolab::File>(result, false);
+    return result;
 }
 
 Configuration readConfiguration(const std::string& s, bool isUrl)
@@ -222,7 +245,10 @@ std::string writeConfiguration(const Configuration &config, const std::string& p
 {
     Utils::clearErrors();
     validate(config);
-    return Kolab::KolabObjects::serializeObject< Kolab::Configuration >(config, productId);
+    const std::string result = Kolab::KolabObjects::serializeObject<Kolab::Configuration>(config, productId);
+    //Validate
+    Kolab::KolabObjects::deserializeObject<Kolab::Configuration>(result, false);
+    return result;
 }
 
 


commit defffa8e9497161a49dcf8a48606d509bf7ca97d
Author: Christian Mollekopf <chrigi_1 at fastmail.fm>
Date:   Fri Mar 21 17:05:04 2014 +0100

    Move xCalVersion to thread local storage.
    
    This started to crash due to a double free while trying to add validation by
    parsing the serialized result again. I assume the global variable took a reference
    to a temporary string or alike which got then free'd again, but I'm not sure.
    
    However, this should be in thread-local storage anyways and that fixes the problem.

diff --git a/src/kolabformat.cpp b/src/kolabformat.cpp
index bb0a418..10f5591 100644
--- a/src/kolabformat.cpp
+++ b/src/kolabformat.cpp
@@ -49,7 +49,7 @@ std::string productId()
 
 std::string xCalVersion()
 {
-    return XCAL::global_xCalVersion;
+    return Utils::xCalVersion();
 }
 
 std::string xKolabVersion()
diff --git a/src/utils.cpp b/src/utils.cpp
index 170f6b1..5ece8cb 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -47,6 +47,7 @@ struct Global {
     std::string createdUID;
     std::string productId;
     std::string xKolabVersion;
+    std::string xCalVersion;
     
     ErrorSeverity errorBit;
     std::string errorMessage;
@@ -80,6 +81,16 @@ std::string kolabVersion()
     return ThreadLocal::inst().xKolabVersion;
 }
 
+void setXCalVersion(const std::string &s)
+{
+    ThreadLocal::inst().xCalVersion = s;
+}
+
+std::string xCalVersion()
+{
+    return ThreadLocal::inst().xCalVersion;
+}
+
 void setProductId(const std::string &s)
 {
     ThreadLocal::inst().productId = s;
diff --git a/src/utils.h b/src/utils.h
index 7ed26b9..2c7e579 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -72,6 +72,12 @@ void setKolabVersion(const std::string &);
 std::string kolabVersion();
 
 /**
+ * The xCal Version of the last deserialized object
+ */
+void setXCalVersion(const std::string &);
+std::string xCalVersion();
+
+/**
  * A timestamp which overrides the one normally used.
  */
 void setOverrideTimestamp(const cDateTime &);
diff --git a/src/xcalconversions.h b/src/xcalconversions.h
index a0489a8..9326548 100644
--- a/src/xcalconversions.h
+++ b/src/xcalconversions.h
@@ -47,8 +47,6 @@
 namespace Kolab {
     namespace XCAL {
         
-std::string global_xCalVersion;
-
 const char* const XCAL_VERSION = "2.0";
 const char* const XCAL_NAMESPACE = "urn:ietf:params:xml:ns:icalendar-2.0";
 
@@ -1948,7 +1946,7 @@ typename T::IncidencePtr deserializeIncidence(const std::string& s, bool isUrl)
         }
         
         setProductId( vcalendar.properties().prodid().text() );
-        global_xCalVersion = vcalendar.properties().version().text();
+        setXCalVersion(vcalendar.properties().version().text());
         setKolabVersion( vcalendar.properties().x_kolab_version().text() );
 
         if (incidences.empty()) {




More information about the commits mailing list