Branch 'libkolab-0.4' - 4 commits - CMakeLists.txt conversion/commonconversion.cpp kolabformatV2/incidence.cpp kolabformatV2/incidence.h kolabformatV2/task.cpp kolabformatV2/task.h tests/testfiles

Christian Mollekopf mollekopf at kolabsys.com
Mon Oct 28 11:04:07 CET 2013


 CMakeLists.txt                                 |    2 
 conversion/commonconversion.cpp                |   10 --
 kolabformatV2/incidence.cpp                    |   41 ++++++++-
 kolabformatV2/incidence.h                      |    6 +
 kolabformatV2/task.cpp                         |  110 -------------------------
 kolabformatV2/task.h                           |   16 ---
 tests/testfiles/v2/task/complex.ics.mime       |    3 
 tests/testfiles/v2/task/prioritytest1.ics.mime |    3 
 tests/testfiles/v2/task/prioritytest2.ics.mime |    3 
 tests/testfiles/v2/task/simple.ics.mime        |    3 
 tests/testfiles/v3/event/utf88bit.ics.mime     |   86 +++++++++++++++++++
 11 files changed, 140 insertions(+), 143 deletions(-)

New commits:
commit 40db53509a41c6c6316665269d5620d8094e2399
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Mon Oct 28 10:59:18 2013 +0100

    We effectively require 0.8.5

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9f6eaa4..72d0bf9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -47,7 +47,7 @@ set(CMAKECONFIG_INSTALL_DIR ${LIB_INSTALL_DIR}/cmake/Libkolab )
 include(MacroLogFeature)
 
 # Do the building
-find_package(Libkolabxml 0.8 REQUIRED)
+find_package(Libkolabxml 0.8.5 REQUIRED)
 macro_log_feature(Libkolabxml_FOUND "Libkolabxml" "Kolab XML Format 3 serializing library" "http://git.kolab.org/libkolabxml/" TRUE "0.8.5" "Required for reading/writing Kolab XML Objects")
 
 find_package(Qt4 4.6.0 REQUIRED)


commit bdc5a07f3f1b1f0b78ec3dc7a17ff0c963e348c6
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Wed Oct 9 11:08:56 2013 +0200

    Added missing utf88bit testfile.

diff --git a/tests/testfiles/v3/event/utf88bit.ics.mime b/tests/testfiles/v3/event/utf88bit.ics.mime
new file mode 100644
index 0000000..14ca30e
--- /dev/null
+++ b/tests/testfiles/v3/event/utf88bit.ics.mime
@@ -0,0 +1,86 @@
+Date: Fri, 17 Aug 2012 17:47:13 +0000
+X-Kolab-Type: application/x-vnd.kolab.event
+X-Kolab-Mime-Version: 3.0
+User-Agent: Libkolab-0.3.1
+Content-Type: multipart/mixed; boundary="nextPart1387272.PG4QbOfaIz"
+Subject: KOrganizer-1353608432.168
+MIME-Version: 1.0
+
+
+--nextPart1387272.PG4QbOfaIz
+Content-Type: text/plain; charset="us-ascii"
+Content-Transfer-Encoding: 7Bit
+
+This is a Kolab Groupware object.
+To view this object you will need an email client that can understand the Kolab Groupware format.
+For a list of such email clients please visit
+http://www.kolab.org/get-kolab
+
+--nextPart1387272.PG4QbOfaIz
+Content-Type: application/calendar+xml; charset=UTF-8; name="kolab.xml"
+Content-Transfer-Encoding: 8bit
+Content-Disposition: attachment; filename="kolab.xml"
+
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+
+  <vcalendar>
+    <properties>
+      <prodid>
+        <text>Libkolab-0.3.1 Libkolabxml-0.5</text>
+      </prodid>
+      <version>
+        <text>2.0</text>
+      </version>
+      <x-kolab-version>
+        <text>3.0dev1</text>
+      </x-kolab-version>
+    </properties>
+    <components>
+      <vevent>
+        <properties>
+          <uid>
+            <text>KOrganizer-1353608432.168</text>
+          </uid>
+          <created>
+            <date-time>2009-09-01T11:36:44Z</date-time>
+          </created>
+          <dtstamp>
+            <date-time>2009-09-01T11:36:44Z</date-time>
+          </dtstamp>
+          <sequence>
+            <integer>0</integer>
+          </sequence>
+          <class>
+            <text>PUBLIC</text>
+          </class>
+          <dtstart>
+            <parameters>
+              <tzid>
+                <text>/kolab.org/Europe/Berlin</text>
+              </tzid>
+            </parameters>
+            <date-time>2009-09-02T08:00:00</date-time>
+          </dtstart>
+          <dtend>
+            <parameters>
+              <tzid>
+                <text>/kolab.org/Europe/Berlin</text>
+              </tzid>
+            </parameters>
+            <date-time>2009-09-02T09:00:00</date-time>
+          </dtend>
+          <summary>
+            <text>äöü%@$£é¤¼²°€Š�ـأبـ</text>
+          </summary>
+          <location>
+            <text>äöü%@$£é¤¼²°€Š�ـأبـ</text>
+          </location>
+        </properties>
+      </vevent>
+    </components>
+  </vcalendar>
+
+</icalendar>
+
+--nextPart1387272.PG4QbOfaIz--


commit 24fa4fd0e4262c9fce781ba9a9348204d2d36543
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Mon Sep 23 16:07:38 2013 +0200

    Implemented KEP:8 in kolabv2 format (priorities).

diff --git a/kolabformatV2/incidence.cpp b/kolabformatV2/incidence.cpp
index f627334..9f0e381 100644
--- a/kolabformatV2/incidence.cpp
+++ b/kolabformatV2/incidence.cpp
@@ -44,9 +44,8 @@
 
 using namespace KolabV2;
 
-
 Incidence::Incidence( const QString& tz, const KCalCore::Incidence::Ptr &incidence )
-  : KolabBase( tz ), mFloatingStatus( Unset ), mHasAlarm( false )
+  : KolabBase( tz ), mFloatingStatus( Unset ), mHasAlarm( false ), mPriority( 0 )
 {
   Q_UNUSED( incidence );
 }
@@ -55,6 +54,16 @@ Incidence::~Incidence()
 {
 }
 
+void Incidence::setPriority( int priority )
+{
+  mPriority = priority;
+}
+
+int Incidence::priority() const
+{
+  return mPriority;
+}
+
 void Incidence::setSummary( const QString& summary )
 {
   mSummary = summary;
@@ -472,7 +481,25 @@ bool Incidence::loadAttribute( QDomElement& element )
 {
   QString tagName = element.tagName();
 
-  if ( tagName == "summary" )
+  if ( tagName == "priority" ) {
+    bool ok;
+    int p = element.text().toInt( &ok );
+    if ( !ok || p < 1 || p > 9 ) {
+      kWarning() << "Invalid \"priority\" value:" << element.text();
+    } else {
+      setPriority( p );
+    }
+  } else if ( tagName == "x-kcal-priority" ) { //for backwards compat
+    bool ok;
+    int p = element.text().toInt( &ok );
+    if ( !ok || p < 0 || p > 9 ) {
+      kWarning() << "Invalid \"x-kcal-priority\" value:" << element.text();
+    } else {
+      if ( priority() == 0 ) {
+        setPriority(p);
+      }
+    }
+  } else if ( tagName == "summary" )
     setSummary( element.text() );
   else if ( tagName == "location" )
     setLocation( element.text() );
@@ -527,6 +554,10 @@ bool Incidence::saveAttributes( QDomElement& element ) const
   // Save the base class elements
   KolabBase::saveAttributes( element );
 
+  if (priority() != 0) {
+    writeString( element, "priority", QString::number( priority() ) );
+  }
+
   if ( mFloatingStatus == HasTime )
     writeString( element, "start-date", dateTimeToString( startDate() ) );
   else
@@ -747,6 +778,7 @@ void Incidence::setFields( const KCalCore::Incidence::Ptr &incidence )
 {
   KolabBase::setFields( incidence );
 
+  setPriority( incidence->priority() );
   if ( incidence->allDay() ) {
     // This is a all-day event. Don't timezone move this one
     mFloatingStatus = AllDay;
@@ -857,6 +889,7 @@ void Incidence::saveTo( const KCalCore::Incidence::Ptr &incidence )
 {
   KolabBase::saveTo( incidence );
 
+  incidence->setPriority( priority() );
   if ( mFloatingStatus == AllDay ) {
     // This is an all-day event. Don't timezone move this one
     incidence->setDtStart( startDate() );
@@ -972,6 +1005,6 @@ QString Incidence::productID() const
 }
 
 // Unhandled KCalCore::Incidence fields:
-// revision, status (unused), priority (done in tasks), attendee.uid,
+// revision, status (unused), attendee.uid,
 // mComments, mReadOnly
 
diff --git a/kolabformatV2/incidence.h b/kolabformatV2/incidence.h
index ad1fa72..b918bd0 100644
--- a/kolabformatV2/incidence.h
+++ b/kolabformatV2/incidence.h
@@ -78,6 +78,9 @@ public:
 
   void saveTo( const KCalCore::Incidence::Ptr &incidence );
 
+  virtual void setPriority( int priority );
+  virtual int priority() const;
+
   virtual void setSummary( const QString& summary );
   virtual QString summary() const;
 
@@ -159,6 +162,9 @@ protected:
   };
   QList<Custom> mCustomList;
 
+  // This is the KCal priority, not the Kolab priority.
+  // See kcalPriorityToKolab() and kolabPrioritytoKCal().
+  int mPriority;
 };
 
 }
diff --git a/kolabformatV2/task.cpp b/kolabformatV2/task.cpp
index fef0d30..0e6772f 100644
--- a/kolabformatV2/task.cpp
+++ b/kolabformatV2/task.cpp
@@ -38,42 +38,6 @@
 
 using namespace KolabV2;
 
-// Kolab Storage Specification:
-//    "The priority can be a number between 1 and 5, with 1 being the highest priority."
-// iCalendar (RFC 2445):
-//    "The priority is specified as an integer in the range
-//     zero to nine. A value of zero specifies an
-//     undefined priority. A value of one is the
-//     highest priority. A value of nine is the lowest
-//     priority."
-
-static int kcalPriorityToKolab( const int kcalPriority )
-{
-  if ( kcalPriority >= 0 && kcalPriority <= 9 ) {
-    // We'll map undefined (0) to 3 (default)
-    //                                   0  1  2  3  4  5  6  7  8  9
-    static const int priorityMap[10] = { 3, 1, 1, 2, 2, 3, 3, 4, 4, 5 };
-    return priorityMap[kcalPriority];
-  }
-  else {
-    kWarning() << "Got invalid priority" << kcalPriority;
-    return 3;
-  }
-}
-
-static int kolabPrioritytoKCal( const int kolabPriority )
-{
-  if ( kolabPriority >= 1 && kolabPriority <= 5 ) {
-    //                                  1  2  3  4  5
-    static const int priorityMap[5] = { 1, 3, 5, 7, 9 };
-    return priorityMap[kolabPriority - 1];
-  }
-  else {
-    kWarning() << "Got invalid priority" << kolabPriority;
-    return 5;
-  }
-}
-
 KCalCore::Todo::Ptr Task::fromXml( const QDomDocument& xmlDoc, const QString& tz )
 {
   Task task( tz );
@@ -91,7 +55,7 @@ QString Task::taskToXML( const KCalCore::Todo::Ptr &todo, const QString& tz )
 
 Task::Task( const QString& tz, const KCalCore::Todo::Ptr &task )
   : Incidence( tz, task ),
-    mPriority( 5 ), mPercentCompleted( 0 ),
+    mPercentCompleted( 0 ),
     mStatus( KCalCore::Incidence::StatusNone ),
     mHasStartDate( false ), mHasDueDate( false ),
     mHasCompletedDate( false )
@@ -105,16 +69,6 @@ Task::~Task()
 {
 }
 
-void Task::setPriority( int priority )
-{
-  mPriority = priority;
-}
-
-int Task::priority() const
-{
-  return mPriority;
-}
-
 void Task::setPercentCompleted( int percent )
 {
   mPercentCompleted = percent;
@@ -209,21 +163,7 @@ bool Task::loadAttribute( QDomElement& element )
 {
   QString tagName = element.tagName();
 
-  if ( tagName == "priority" ) {
-    bool ok;
-    mKolabPriorityFromDom = element.text().toInt( &ok );
-    if ( !ok || mKolabPriorityFromDom < 1 || mKolabPriorityFromDom > 5 ) {
-      kWarning() << "Invalid \"priority\" value:" << element.text();
-      mKolabPriorityFromDom = -1;
-    }
-  } else if ( tagName == "x-kcal-priority" ) {
-    bool ok;
-    mKCalPriorityFromDom = element.text().toInt( &ok );
-    if ( !ok || mKCalPriorityFromDom < 0 || mKCalPriorityFromDom > 9 ) {
-      kWarning() << "Invalid \"x-kcal-priority\" value:" << element.text();
-      mKCalPriorityFromDom = -1;
-    }
-  } else if ( tagName == "completed" ) {
+  if ( tagName == "completed" ) {
     bool ok;
     int percent = element.text().toInt( &ok );
     if ( !ok || percent < 0 || percent > 100 )
@@ -263,11 +203,6 @@ bool Task::saveAttributes( QDomElement& element ) const
   // Save the base class elements
   Incidence::saveAttributes( element );
 
-  // We need to save x-kcal-priority as well, since the Kolab priority can only save values from
-  // 1 to 5, but we have values from 0 to 9, and do not want to loose them
-  writeString( element, "priority", QString::number( kcalPriorityToKolab( priority() ) ) );
-  writeString( element, "x-kcal-priority", QString::number( priority() ) );
-
   writeString( element, "completed", QString::number( percentCompleted() ) );
 
   switch( status() ) {
@@ -318,9 +253,6 @@ bool Task::saveAttributes( QDomElement& element ) const
 
 bool Task::loadXML( const QDomDocument& document )
 {
-  mKolabPriorityFromDom = -1;
-  mKCalPriorityFromDom = -1;
-
   QDomElement top = document.documentElement();
 
   if ( top.tagName() != "task" ) {
@@ -342,7 +274,6 @@ bool Task::loadXML( const QDomDocument& document )
       kDebug() <<"Node is not a comment or an element???";
   }
 
-  decideAndSetPriority();
   return true;
 }
 
@@ -368,7 +299,6 @@ void Task::setFields( const KCalCore::Todo::Ptr &task )
 {
   Incidence::setFields( task );
 
-  setPriority( task->priority() );
   setPercentCompleted( task->percentComplete() );
   setStatus( task->status() );
   setHasStartDate( task->hasStartDate() );
@@ -399,46 +329,10 @@ void Task::setFields( const KCalCore::Todo::Ptr &task )
   }
 }
 
-void Task::decideAndSetPriority()
-{
-  // If we have both Kolab and KCal values in the XML, we prefer the KCal value, but only if the
-  // values are still in sync
-  if  ( mKolabPriorityFromDom != -1 && mKCalPriorityFromDom != -1 ) {
-    const bool inSync = ( kcalPriorityToKolab( mKCalPriorityFromDom ) == mKolabPriorityFromDom );
-    if ( inSync ) {
-      setPriority( mKCalPriorityFromDom );
-    }
-    else {
-      // Out of sync, some other client changed the Kolab priority, so we have to ignore our
-      // KCal priority
-      setPriority( kolabPrioritytoKCal( mKolabPriorityFromDom ) );
-    }
-  }
-
-  // Only KCal priority set, use that.
-  else if ( mKolabPriorityFromDom == -1 && mKCalPriorityFromDom != -1 ) {
-    kWarning() << "No Kolab priority found, only the KCal priority!";
-    setPriority( mKCalPriorityFromDom );
-  }
-
-  // Only Kolab priority set, use that
-  else if ( mKolabPriorityFromDom != -1 && mKCalPriorityFromDom == -1 ) {
-    setPriority( kolabPrioritytoKCal( mKolabPriorityFromDom ) );
-  }
-
-  // No priority set, use the default
-  else {
-    // According the RFC 2445, we should use 0 here, for undefined priority, but AFAIK KOrganizer
-    // doesn't support that, so we'll use 5.
-    setPriority( 5 );
-  }
-}
-
 void Task::saveTo( const KCalCore::Todo::Ptr &task )
 {
   Incidence::saveTo( task );
 
-  task->setPriority( priority() );
   task->setPercentComplete( percentCompleted() );
   task->setStatus( status() );
   task->setHasStartDate( hasStartDate() );
diff --git a/kolabformatV2/task.h b/kolabformatV2/task.h
index 487b98a..da45caf 100644
--- a/kolabformatV2/task.h
+++ b/kolabformatV2/task.h
@@ -71,9 +71,6 @@ public:
 
   void saveTo( const KCalCore::Todo::Ptr &todo );
 
-  virtual void setPriority( int priority );
-  virtual int priority() const;
-
   virtual void setPercentCompleted( int percent );
   virtual int percentCompleted() const;
 
@@ -112,19 +109,6 @@ protected:
   // Read all known fields from this ical todo
   void setFields( const KCalCore::Todo::Ptr & );
 
-  // This sets the priority of this task by looking at mKolabPriorityFromDom and
-  // mKCalPriorityFromDom.
-  void decideAndSetPriority();
-
-  // This is the KCal priority, not the Kolab priority.
-  // See kcalPriorityToKolab() and kolabPrioritytoKCal().
-  int mPriority;
-
-  // Those priority values are the raw values read by loadAttribute().
-  // They will be converted later in decideAndSetPriority().
-  int mKolabPriorityFromDom;
-  int mKCalPriorityFromDom;
-
   int mPercentCompleted;
   KCalCore::Incidence::Status mStatus;
   QString mParent;
diff --git a/tests/testfiles/v2/task/complex.ics.mime b/tests/testfiles/v2/task/complex.ics.mime
index 87c1cd9..5c3dc20 100644
--- a/tests/testfiles/v2/task/complex.ics.mime
+++ b/tests/testfiles/v2/task/complex.ics.mime
@@ -29,6 +29,7 @@ Content-Disposition: attachment; filename="kolab.xml"
  <creation-date>2009-09-01T13:39:15Z</creation-date>
  <last-modification-date>2009-09-01T13:39:15+00:00</last-modification-date>
  <sensitivity>private</sensitivity>
+ <priority>1</priority>
  <start-date>2009-09-01T14:00:00Z</start-date>
  <summary>Complex Task</summary>
  <location>Here</location>
@@ -64,8 +65,6 @@ Content-Disposition: attachment; filename="kolab.xml"
    <end-offset>-15</end-offset>
   </alarm>
  </advanced-alarms>
- <priority>1</priority>
- <x-kcal-priority>1</x-kcal-priority>
  <completed>50</completed>
  <status>not-started</status>
  <due-date>2009-09-08T14:00:00Z</due-date>
diff --git a/tests/testfiles/v2/task/prioritytest1.ics.mime b/tests/testfiles/v2/task/prioritytest1.ics.mime
index 3de9bd2..5a48d7a 100644
--- a/tests/testfiles/v2/task/prioritytest1.ics.mime
+++ b/tests/testfiles/v2/task/prioritytest1.ics.mime
@@ -27,10 +27,9 @@ Content-Disposition: attachment; filename="kolab.xml"
  <creation-date>2009-09-01T13:17:03Z</creation-date>
  <last-modification-date>2009-09-01T13:17:03+00:00</last-modification-date>
  <sensitivity>public</sensitivity>
+ <priority>8</priority>
  <summary>Simple Task</summary>
  <organizer/>
- <priority>4</priority>
- <x-kcal-priority>8</x-kcal-priority>
  <completed>0</completed>
  <status>not-started</status>
 </task>
diff --git a/tests/testfiles/v2/task/prioritytest2.ics.mime b/tests/testfiles/v2/task/prioritytest2.ics.mime
index ad15dbb..ca22058 100644
--- a/tests/testfiles/v2/task/prioritytest2.ics.mime
+++ b/tests/testfiles/v2/task/prioritytest2.ics.mime
@@ -27,10 +27,9 @@ Content-Disposition: attachment; filename="kolab.xml"
  <creation-date>2009-09-01T13:17:03Z</creation-date>
  <last-modification-date>2009-09-01T13:17:03+00:00</last-modification-date>
  <sensitivity>public</sensitivity>
+ <priority>1</priority>
  <summary>Simple Task</summary>
  <organizer/>
- <priority>1</priority>
- <x-kcal-priority>1</x-kcal-priority>
  <completed>0</completed>
  <status>not-started</status>
 </task>
diff --git a/tests/testfiles/v2/task/simple.ics.mime b/tests/testfiles/v2/task/simple.ics.mime
index f1322ef..8855a4b 100644
--- a/tests/testfiles/v2/task/simple.ics.mime
+++ b/tests/testfiles/v2/task/simple.ics.mime
@@ -27,10 +27,9 @@ Content-Disposition: attachment; filename="kolab.xml"
  <creation-date>2009-09-01T13:17:03Z</creation-date>
  <last-modification-date>2009-09-01T13:17:03+00:00</last-modification-date>
  <sensitivity>public</sensitivity>
+ <priority>7</priority>
  <summary>Simple Task</summary>
  <organizer/>
- <priority>4</priority>
- <x-kcal-priority>7</x-kcal-priority>
  <completed>0</completed>
  <status>not-started</status>
 </task>


commit 2e067ddd9dda90fac3849d432608c2ea501fb634
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Mon Oct 28 10:21:59 2013 +0100

    Only issue a warning on unknown timezone, and fallback to floating time.
    
    This way unknown timezones don't completely block the conversion of kolab objects.
    (cherry picked from commit 2bf105d910156d9a742b1946caf9d335367cfe5b)

diff --git a/conversion/commonconversion.cpp b/conversion/commonconversion.cpp
index 87b35c2..3546395 100644
--- a/conversion/commonconversion.cpp
+++ b/conversion/commonconversion.cpp
@@ -39,19 +39,17 @@ KDateTime::Spec getTimeSpec(bool isUtc, const std::string& timezone)
 
     //Convert non-olson timezones if necessary
     const QString normalizedTz = TimezoneConverter::normalizeTimezone(QString::fromStdString(timezone));
-    Debug() << "normalized " << normalizedTz;
     KTimeZone tz = KSystemTimeZones::zone(normalizedTz); //Needs ktimezoned (timezone daemon running) http://api.kde.org/4.x-api/kdelibs-apidocs/kdecore/html/classKSystemTimeZones.html
     if (!tz.isValid()) {
-        Error() << "timezone not found" << QString::fromStdString(timezone);
+        Warning() << "invalid timezone: " << QString::fromStdString(timezone) << ", assuming floating time";
         if (!KSystemTimeZones::isTimeZoneDaemonAvailable()) {
             Error() << "ktimezoned is not available and required for timezone interpretation";
         }
-        tz = KTimeZone::utc(); //Don't crash
+        return  KDateTime::Spec(KDateTime::ClockTime);
     }
     return KDateTime::Spec(tz);
 }
 
-        
 KDateTime toDate(const Kolab::cDateTime &dt)
 {
     KDateTime date;
@@ -97,11 +95,11 @@ cDateTime fromDate(const KDateTime &dt)
             if (!timezone.isEmpty()) {
                 date.setTimezone(toStdString(timezone));
             } else {
-                Error() << "invalid timezone: " << dt.timeZone().name() << " , assuming floating time";
+                Warning() << "invalid timezone: " << dt.timeZone().name() << ", assuming floating time";
                 return date;
             }
         } else if (dt.timeType() != KDateTime::ClockTime) {
-            Error() << "invalid timespec, assuming floating time" << dt.timeType();
+            Error() << "invalid timespec, assuming floating time. Type: " << dt.timeType() << "dt: " << dt.toString();
             return date;
         }
     }




More information about the commits mailing list