[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/3.5/kdepim/libkcal
From:       Jason vanRijn Kasper <vR () movingparts ! net>
Date:       2007-04-13 23:58:45
Message-ID: 1176508725.299198.13763.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 653655 by vanrijn:

- per discussion with reinhold...
- we can't use setNonKDECustomProperty for X-PILOTID and X-PILOTSTAT, since
  setting them trigger updated(), which then result in changing X-PILOTSTAT
  (syncStatus).  instead of doing that, we'll simply handle the property
  reading/writing directly.
- fixed in kdepim-3.5.5+ with r653654
BUG:144166


 M  +40 -16    icalformatimpl.cpp  
 M  +56 -24    tests/testfields.cpp  


--- branches/KDE/3.5/kdepim/libkcal/icalformatimpl.cpp #653654:653655
@@ -298,11 +298,19 @@
   // pilot sync stuff
 // TODO: move this application-specific code to kpilot
   if (incidence->pilotId()) {
-    // this is a fragile thing...  whenever incidence->set* is called, it
-    // triggers an update to syncStatus.  therefore, we have to pull off
-    // the sync status before we do anything else.
-    incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus()));
-    incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId()));
+    // NOTE: we can't do setNonKDECustomProperty here because this changes
+    // data and triggers an updated() event...
+    // incidence->setNonKDECustomProperty("X-PILOTSTAT", QString::number(incidence->syncStatus()));
+    // incidence->setNonKDECustomProperty("X-PILOTID", QString::number(incidence->pilotId()));
+
+    icalproperty *p = 0;
+    p = icalproperty_new_x(QString::number(incidence->syncStatus()).utf8());
+    icalproperty_set_x_name(p,"X-PILOTSTAT");
+    icalcomponent_add_property(parent,p);
+
+    p = icalproperty_new_x(QString::number(incidence->pilotId()).utf8());
+    icalproperty_set_x_name(p,"X-PILOTID");
+    icalcomponent_add_property(parent,p);
   }
 
   if ( incidence->schedulingID() != incidence->uid() )
@@ -1386,17 +1394,6 @@
     incidence->setUid( uid );
   }
 
-  // kpilot stuff
-// TODO: move this application-specific code to kpilot
-  QString kp = incidence->nonKDECustomProperty("X-PILOTID");
-  if (!kp.isNull()) {
-    incidence->setPilotId(kp.toInt());
-  }
-  kp = incidence->nonKDECustomProperty("X-PILOTSTAT");
-  if (!kp.isNull()) {
-    incidence->setSyncStatus(kp.toInt());
-  }
-
   // Now that recurrence and exception stuff is completely set up,
   // do any backwards compatibility adjustments.
   if ( incidence->doesRecur() && mCompat )
@@ -1448,6 +1445,33 @@
     p = icalcomponent_get_next_property(parent,ICAL_ANY_PROPERTY);
   }
 
+  // kpilot stuff
+  // TODO: move this application-specific code to kpilot
+  // need to get X-PILOT* attributes out, set correct properties, and get
+  // rid of them...
+  // Pointer fun, as per libical documentation
+  // (documented in UsingLibical.txt)
+  icalproperty *next =0;
+
+  for ( p = icalcomponent_get_first_property(parent,ICAL_X_PROPERTY);
+       p != 0; 
+       p = next )
+  {
+
+    next = icalcomponent_get_next_property(parent,ICAL_X_PROPERTY);
+
+    QString value = QString::fromUtf8(icalproperty_get_x(p));
+    QString name = icalproperty_get_x_name(p);
+
+    if (name == "X-PILOTID" && !value.isEmpty()) {
+      incidenceBase->setPilotId(value.toInt());
+      icalcomponent_remove_property(parent,p);
+    } else if (name == "X-PILOTSTAT" && !value.isEmpty()) {
+      incidenceBase->setSyncStatus(value.toInt());
+      icalcomponent_remove_property(parent,p);
+    }
+  }
+
   // custom properties
   readCustomProperties(parent, incidenceBase);
 }
--- branches/KDE/3.5/kdepim/libkcal/tests/testfields.cpp #653654:653655
@@ -58,10 +58,14 @@
     return 1;
   }
 
-  QString uid = QString::fromLatin1("KOrganizer-1345486115.965");
-  Event *e = cal.event( uid );
+  // 2 tests... first uid should result in a syncStatus of 0.  second uid
+  // should have a new summary and a 1 for syncStatus.
+  QString uid1 = QString::fromLatin1("KOrganizer-1345486115.965");
+  QString uid2 = QString::fromLatin1("KOrganizer-1345486115.967");
+
+  Event *e = cal.event( uid1 );
   if (!e) {
-    kdError() << "No event " << uid << endl;
+    kdError() << "No event " << uid1 << endl;
     return 1;
   }
 
@@ -80,58 +84,86 @@
     return 1;
   }
 
-  QString newSummary = QString::fromLatin1("Mooo summary");
+  kdDebug() << "First test passed.  Able to read fields." << endl;
 
-  e->setSummary(newSummary);
   e->setSyncStatus(KCal::Incidence::SYNCNONE);
 
+  QString newSummary = QString::fromLatin1("Mooo summary");
+
+  Event *f = new Event(*e);
+
+
+  f->setUid(uid2);
+  // add event so we trigger updated()
+  cal.addEvent(f);
+
+  f->setPilotId(34567);
+  f->setSummary(newSummary);
+
+
+
   QString filew = file +".out";
-  if (!cal.save( filew ) ) {
+  // weird, yes, I know, but we have a bug right now with saving the file
+  // twice which is corrupting X-PILOTSTAT
+  if ( !cal.save( filew ) || !cal.save( filew ) ) {
     kdError() << "Can't save " << filew << endl;
     return 1;
   }
 
 
+  // now try to read the file back in and see if our changes made it
   CalendarLocal cal2( QString::fromLatin1("UTC") );
-  // now try to read the file back in and see if our changes made it to
-  // disk
   if (!cal2.load( filew ) ) {
     kdError() << "Can't load " << filew << endl;
     return 1;
   }
 
-  QFile::remove(filew);
+  QFile::remove( filew );
 
-  e = cal2.event( uid );
+  // check for uid1--should have syncStatus of 0
+  e = cal2.event( uid1 );
   if (!e) {
-    kdError() << "No event " << uid << endl;
+    kdError() << "No event for first read test" << uid1 << endl;
     return 1;
   }
 
-  kdDebug() << "Event description " << e->summary() << endl;
+  kdDebug() << "Event 1 description " << e->summary() << endl;
 
-  if (e->hasEndDate()) {
-    QDateTime d = e->dtEnd();
-    kdDebug() << "Event ends " << d << endl;
-  }
-
   if (e->pilotId()) {
-    kdDebug() << "Pilot ID = " << e->pilotId() << endl;
-    kdDebug() << "Pilot Sync Status = " << e->syncStatus() << endl;
+    kdDebug() << "First Pilot ID = " << e->pilotId() << endl;
+    kdDebug() << "First Pilot Sync Status = " << e->syncStatus() << endl;
   } else {
-    kdError() << "No Pilot ID" << endl;
+    kdError() << "No Pilot ID for first test" << endl;
     return 1;
   }
 
-  if (e->summary() != newSummary) {
-    kdError() << "Wrong summary." << endl;
+  if (e->syncStatus() != KCal::Incidence::SYNCNONE) {
+    kdError() << "Wrong Pilot sync status." << endl;
     return 1;
   }
 
-  if (e->syncStatus() != KCal::Incidence::SYNCNONE) {
-    kdError() << "Wrong Pilot sync status." << endl;
+  // now check our second event for correctness
+  f = cal2.event( uid2 );
+
+  kdDebug() << "Event 2 description " << f->summary() << endl;
+
+  if (f->summary() != newSummary) {
+    kdError() << "Wrong summary for second read test." << endl;
     return 1;
   }
 
+  if (f->pilotId()) {
+    kdDebug() << "Second Pilot ID = " << f->pilotId() << endl;
+    kdDebug() << "Second Pilot Sync Status = " << f->syncStatus() << endl;
+  } else {
+    kdError() << "No Pilot ID for second read test" << endl;
+    return 1;
+  }
+
+  if (f->syncStatus() != KCal::Incidence::SYNCMOD) {
+    kdError() << "Wrong Pilot sync status for second read test." << endl;
+    return 1;
+  }
+
   return 0;
 }
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic