summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/calendarview.cpp20
-rw-r--r--libkcal/incidencebase.cpp96
-rw-r--r--libkcal/incidencebase.h13
-rw-r--r--libkcal/sharpformat.cpp20
4 files changed, 45 insertions, 104 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index fab4540..5150455 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -718,25 +718,25 @@ int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , b
718 // int zaurusId() const; 718 // int zaurusId() const;
719 // void setZaurusUid(int id); 719 // void setZaurusUid(int id);
720 // int zaurusUid() const; 720 // int zaurusUid() const;
721 // void setZaurusStat(int id); 721 // void setZaurusStat(int id);
722 // int zaurusStat() const; 722 // int zaurusStat() const;
723 // 0 equal 723 // 0 equal
724 // 1 take local 724 // 1 take local
725 // 2 take remote 725 // 2 take remote
726 // 3 cancel 726 // 3 cancel
727 QDateTime lastSync = mLastCalendarSync; 727 QDateTime lastSync = mLastCalendarSync;
728 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 728 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
729 bool remCh, locCh; 729 bool remCh, locCh;
730 remCh = ( remote->zaurusUid() != local->zaurusUid() ); 730 remCh = ( remote->getCsum(mCurrentSyncDevice) != local->getCsum(mCurrentSyncDevice) );
731 locCh = ( local->lastModified() > mLastCalendarSync ); 731 locCh = ( local->lastModified() > mLastCalendarSync );
732 //qDebug("locCh %d remCh %d locuid %d remuid %d", locCh, remCh,local->zaurusUid(), remote->zaurusUid() ); 732 //qDebug("locCh %d remCh %d locuid %d remuid %d", locCh, remCh,local->zaurusUid(), remote->zaurusUid() );
733 if ( !remCh && ! locCh ) { 733 if ( !remCh && ! locCh ) {
734 //qDebug("both not changed "); 734 //qDebug("both not changed ");
735 lastSync = local->lastModified().addDays(1); 735 lastSync = local->lastModified().addDays(1);
736 } else { 736 } else {
737 if ( locCh ) { 737 if ( locCh ) {
738 //qDebug("loc changed %d %d", local->zaurusStat(), local->revision() ); 738 //qDebug("loc changed %d %d", local->zaurusStat(), local->revision() );
739 lastSync = local->lastModified().addDays( -1 ); 739 lastSync = local->lastModified().addDays( -1 );
740 if ( !remCh ) 740 if ( !remCh )
741 remote->setLastModified( lastSync.addDays( -1 ) ); 741 remote->setLastModified( lastSync.addDays( -1 ) );
742 } else { 742 } else {
@@ -764,25 +764,25 @@ int CalendarView::takeEvent( Incidence* local, Incidence* remote, int mode , b
764 if ( full ) { 764 if ( full ) {
765 bool equ = false; 765 bool equ = false;
766 if ( local->type() == "Event" ) { 766 if ( local->type() == "Event" ) {
767 equ = (*((Event*) local) == *((Event*) remote)); 767 equ = (*((Event*) local) == *((Event*) remote));
768 } 768 }
769 else if ( local->type() =="Todo" ) 769 else if ( local->type() =="Todo" )
770 equ = (*((Todo*) local) == (*(Todo*) remote)); 770 equ = (*((Todo*) local) == (*(Todo*) remote));
771 else if ( local->type() =="Journal" ) 771 else if ( local->type() =="Journal" )
772 equ = (*((Journal*) local) == *((Journal*) remote)); 772 equ = (*((Journal*) local) == *((Journal*) remote));
773 if ( equ ) { 773 if ( equ ) {
774 //qDebug("equal "); 774 //qDebug("equal ");
775 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 775 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
776 local->setZaurusUid( remote->zaurusUid() ); 776 local->setCsum( mCurrentSyncDevice, remote->getCsum(mCurrentSyncDevice) );
777 } 777 }
778 if ( mode < SYNC_PREF_FORCE_LOCAL ) 778 if ( mode < SYNC_PREF_FORCE_LOCAL )
779 return 0; 779 return 0;
780 780
781 }//else //debug only 781 }//else //debug only
782 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1()); 782 //qDebug("not equal %s %s ", local->summary().latin1(), remote->summary().latin1());
783 } 783 }
784 int result; 784 int result;
785 bool localIsNew; 785 bool localIsNew;
786 if ( full && mode < SYNC_PREF_NEWEST ) 786 if ( full && mode < SYNC_PREF_NEWEST )
787 mode = SYNC_PREF_ASK; 787 mode = SYNC_PREF_ASK;
788 788
@@ -886,31 +886,31 @@ void CalendarView::setupExternSyncProfiles()
886// we check, if the to delete event has a id for a profile 886// we check, if the to delete event has a id for a profile
887// if yes, we set this id in the profile to delete 887// if yes, we set this id in the profile to delete
888void CalendarView::checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete ) 888void CalendarView::checkExternSyncEvent( QPtrList<Event> lastSync , Incidence* toDelete )
889{ 889{
890 if ( ! lastSync.count() == 0 ) 890 if ( ! lastSync.count() == 0 )
891 return; 891 return;
892 if ( toDelete->type() == "Journal" ) 892 if ( toDelete->type() == "Journal" )
893 return; 893 return;
894 894
895 Event* eve = lastSync.first(); 895 Event* eve = lastSync.first();
896 896
897 while ( eve ) { 897 while ( eve ) {
898 int id = toDelete->getID( eve->uid().mid( 15 ) ); // this is the sync profile name 898 QString id = toDelete->getID( eve->uid().mid( 15 ) ); // this is the sync profile name
899 if ( id >= 0 ) { 899 if ( !id.isEmpty() ) {
900 QString des = eve->description(); 900 QString des = eve->description();
901 QString pref = "e"; 901 QString pref = "e";
902 if ( toDelete->type() == "Todo" ) 902 if ( toDelete->type() == "Todo" )
903 pref = "t"; 903 pref = "t";
904 des += pref+ QString::number ( id ) + ","; 904 des += pref+ id + ",";
905 eve->setReadOnly( false ); 905 eve->setReadOnly( false );
906 eve->setDescription( des ); 906 eve->setDescription( des );
907 eve->setReadOnly( true ); 907 eve->setReadOnly( true );
908 } 908 }
909 eve = lastSync.next(); 909 eve = lastSync.next();
910 } 910 }
911 911
912} 912}
913void CalendarView::checkExternalId( Incidence * inc ) 913void CalendarView::checkExternalId( Incidence * inc )
914{ 914{
915 QPtrList<Event> lastSync = mCalendar->getExternLastSyncEvents() ; 915 QPtrList<Event> lastSync = mCalendar->getExternLastSyncEvents() ;
916 checkExternSyncEvent( lastSync, inc ); 916 checkExternSyncEvent( lastSync, inc );
@@ -1004,45 +1004,45 @@ bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int
1004 qApp->processEvents(); 1004 qApp->processEvents();
1005 if ( !skipIncidence ) { 1005 if ( !skipIncidence ) {
1006 inL = local->incidence( uid ); 1006 inL = local->incidence( uid );
1007 if ( inL ) { // maybe conflict - same uid in both calendars 1007 if ( inL ) { // maybe conflict - same uid in both calendars
1008 int maxrev = inL->revision(); 1008 int maxrev = inL->revision();
1009 if ( maxrev < inR->revision() ) 1009 if ( maxrev < inR->revision() )
1010 maxrev = inR->revision(); 1010 maxrev = inR->revision();
1011 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) { 1011 if ( (take = takeEvent( inL, inR, mode, fullDateRange )) > 0 ) {
1012 //qDebug("take %d %s ", take, inL->summary().latin1()); 1012 //qDebug("take %d %s ", take, inL->summary().latin1());
1013 if ( take == 3 ) 1013 if ( take == 3 )
1014 return false; 1014 return false;
1015 if ( take == 1 ) {// take local 1015 if ( take == 1 ) {// take local
1016 inL->setZaurusUid( inR->zaurusUid() ); 1016 inL->setCsum( mCurrentSyncDevice, inR->getCsum(mCurrentSyncDevice) );
1017 remote->deleteIncidence( inR ); 1017 remote->deleteIncidence( inR );
1018 if ( inL->revision() < maxrev ) 1018 if ( inL->revision() < maxrev )
1019 inL->setRevision( maxrev ); 1019 inL->setRevision( maxrev );
1020 remote->addIncidence( inL->clone() ); 1020 remote->addIncidence( inL->clone() );
1021 ++changedRemote; 1021 ++changedRemote;
1022 } else { 1022 } else {
1023 if ( inR->revision() < maxrev ) 1023 if ( inR->revision() < maxrev )
1024 inR->setRevision( maxrev ); 1024 inR->setRevision( maxrev );
1025 local->deleteIncidence( inL ); 1025 local->deleteIncidence( inL );
1026 local->addIncidence( inR->clone() ); 1026 local->addIncidence( inR->clone() );
1027 ++changedLocal; 1027 ++changedLocal;
1028 } 1028 }
1029 } 1029 }
1030 } else { // no conflict 1030 } else { // no conflict
1031 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1031 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1032 QString des = eventLSync->description(); 1032 QString des = eventLSync->description();
1033 QString pref = "e"; 1033 QString pref = "e";
1034 if ( inR->type() == "Todo" ) 1034 if ( inR->type() == "Todo" )
1035 pref = "t"; 1035 pref = "t";
1036 if ( des.find(pref+QString::number( inR->getID(mCurrentSyncDevice) ) +"," ) >= 0 && mode != 5) { // delete it 1036 if ( des.find(pref+ inR->getID(mCurrentSyncDevice) +"," ) >= 0 && mode != 5) { // delete it
1037 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE ); 1037 inR->setTempSyncStat( SYNC_TEMPSTATE_DELETE );
1038 //remote->deleteIncidence( inR ); 1038 //remote->deleteIncidence( inR );
1039 ++deletedEventR; 1039 ++deletedEventR;
1040 } else { 1040 } else {
1041 inR->setLastModified( modifiedCalendar ); 1041 inR->setLastModified( modifiedCalendar );
1042 local->addIncidence( inR->clone() ); 1042 local->addIncidence( inR->clone() );
1043 ++addedEvent; 1043 ++addedEvent;
1044 } 1044 }
1045 } else { 1045 } else {
1046 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) { 1046 if ( inR->lastModified() > mLastCalendarSync || mode == 5 ) {
1047 inR->setLastModified( modifiedCalendar ); 1047 inR->setLastModified( modifiedCalendar );
1048 local->addIncidence( inR->clone() ); 1048 local->addIncidence( inR->clone() );
@@ -1074,30 +1074,30 @@ bool CalendarView::synchronizeCalendar( Calendar* local, Calendar* remote, int
1074 bar.setProgress( incCounter ); 1074 bar.setProgress( incCounter );
1075 ++incCounter; 1075 ++incCounter;
1076 uid = inL->uid(); 1076 uid = inL->uid();
1077 bool skipIncidence = false; 1077 bool skipIncidence = false;
1078 if ( uid.left(15) == QString("last-syncEvent-") ) 1078 if ( uid.left(15) == QString("last-syncEvent-") )
1079 skipIncidence = true; 1079 skipIncidence = true;
1080 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" ) 1080 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL && inL->type() == "Journal" )
1081 skipIncidence = true; 1081 skipIncidence = true;
1082 if ( !skipIncidence ) { 1082 if ( !skipIncidence ) {
1083 inR = remote->incidence( uid ); 1083 inR = remote->incidence( uid );
1084 if ( ! inR ) { 1084 if ( ! inR ) {
1085 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) { 1085 if ( mGlobalSyncMode == SYNC_MODE_EXTERNAL ) {
1086 if ( inL->getID(mCurrentSyncDevice) >= 0 && mode != 4 ) { 1086 if ( !inL->getID(mCurrentSyncDevice).isEmpty() && mode != 4 ) {
1087 local->deleteIncidence( inL ); 1087 local->deleteIncidence( inL );
1088 ++deletedEventL; 1088 ++deletedEventL;
1089 } else { 1089 } else {
1090 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) { 1090 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
1091 inL->setID(mCurrentSyncDevice, -1 ); 1091 inL->removeID(mCurrentSyncDevice );
1092 ++addedEventR; 1092 ++addedEventR;
1093 inL->setLastModified( modifiedCalendar ); 1093 inL->setLastModified( modifiedCalendar );
1094 remote->addIncidence( inL->clone() ); 1094 remote->addIncidence( inL->clone() );
1095 } 1095 }
1096 } 1096 }
1097 } else { 1097 } else {
1098 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) { 1098 if ( inL->lastModified() < mLastCalendarSync && mode != 4 ) {
1099 checkExternSyncEvent(eventLSyncSharp, inL); 1099 checkExternSyncEvent(eventLSyncSharp, inL);
1100 local->deleteIncidence( inL ); 1100 local->deleteIncidence( inL );
1101 ++deletedEventL; 1101 ++deletedEventL;
1102 } else { 1102 } else {
1103 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) { 1103 if ( ! KOPrefs::instance()->mWriteBackExistingOnly ) {
@@ -1199,25 +1199,25 @@ void CalendarView::syncSharp()
1199 } 1199 }
1200 */ 1200 */
1201 // pending: clean last sync event description 1201 // pending: clean last sync event description
1202 sharpFormat.save(calendar); 1202 sharpFormat.save(calendar);
1203 iL = calendar->rawIncidences(); 1203 iL = calendar->rawIncidences();
1204 inc = iL.first(); 1204 inc = iL.first();
1205 Incidence* loc; 1205 Incidence* loc;
1206 while ( inc ) { 1206 while ( inc ) {
1207 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) { 1207 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) {
1208 loc = mCalendar->incidence(inc->uid() ); 1208 loc = mCalendar->incidence(inc->uid() );
1209 if ( loc ) { 1209 if ( loc ) {
1210 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) ); 1210 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) );
1211 loc->setZaurusUid( inc->zaurusUid() ); 1211 loc->setCsum( mCurrentSyncDevice, inc->getCsum(mCurrentSyncDevice) );
1212 } 1212 }
1213 } 1213 }
1214 inc = iL.next(); 1214 inc = iL.next();
1215 } 1215 }
1216 Incidence* lse = getLastSyncEvent(); 1216 Incidence* lse = getLastSyncEvent();
1217 if ( lse ) { 1217 if ( lse ) {
1218 lse->setReadOnly( false ); 1218 lse->setReadOnly( false );
1219 lse->setDescription( "" ); 1219 lse->setDescription( "" );
1220 lse->setReadOnly( true ); 1220 lse->setReadOnly( true );
1221 } 1221 }
1222 } 1222 }
1223 } 1223 }
diff --git a/libkcal/incidencebase.cpp b/libkcal/incidencebase.cpp
index 5d8785b..15c4fa8 100644
--- a/libkcal/incidencebase.cpp
+++ b/libkcal/incidencebase.cpp
@@ -12,65 +12,64 @@
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21#include <kglobal.h> 21#include <kglobal.h>
22#include <klocale.h> 22#include <klocale.h>
23#include <kdebug.h> 23#include <kdebug.h>
24#include <kidmanager.h>
24 25
25#include "calformat.h" 26#include "calformat.h"
26 27
27#include "incidencebase.h" 28#include "incidencebase.h"
28 29
29using namespace KCal; 30using namespace KCal;
30 31
31IncidenceBase::IncidenceBase() : 32IncidenceBase::IncidenceBase() :
32 mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false), 33 mReadOnly(false), mFloats(true), mDuration(0), mHasDuration(false),
33 mPilotId(0), mSyncStatus(SYNCMOD) 34 mPilotId(0), mSyncStatus(SYNCMOD)
34{ 35{
35 setUid(CalFormat::createUniqueId()); 36 setUid(CalFormat::createUniqueId());
36 mOrganizer = ""; 37 mOrganizer = "";
37 mFloats = false; 38 mFloats = false;
38 mDuration = 0; 39 mDuration = 0;
39 mHasDuration = false; 40 mHasDuration = false;
40 mPilotId = 0; 41 mPilotId = 0;
41 mZaurusUid = 0;
42 mExternalId = ":"; 42 mExternalId = ":";
43 mTempSyncStat = 0; 43 mTempSyncStat = 0;
44 mSyncStatus = 0; 44 mSyncStatus = 0;
45 mAttendees.setAutoDelete( true ); 45 mAttendees.setAutoDelete( true );
46} 46}
47 47
48IncidenceBase::IncidenceBase(const IncidenceBase &i) : 48IncidenceBase::IncidenceBase(const IncidenceBase &i) :
49 CustomProperties( i ) 49 CustomProperties( i )
50{ 50{
51 mReadOnly = i.mReadOnly; 51 mReadOnly = i.mReadOnly;
52 mDtStart = i.mDtStart; 52 mDtStart = i.mDtStart;
53 mDuration = i.mDuration; 53 mDuration = i.mDuration;
54 mHasDuration = i.mHasDuration; 54 mHasDuration = i.mHasDuration;
55 mOrganizer = i.mOrganizer; 55 mOrganizer = i.mOrganizer;
56 mUid = i.mUid; 56 mUid = i.mUid;
57 QPtrList<Attendee> attendees = i.attendees(); 57 QPtrList<Attendee> attendees = i.attendees();
58 for( Attendee *a = attendees.first(); a; a = attendees.next() ) { 58 for( Attendee *a = attendees.first(); a; a = attendees.next() ) {
59 mAttendees.append( new Attendee( *a ) ); 59 mAttendees.append( new Attendee( *a ) );
60 } 60 }
61 mFloats = i.mFloats; 61 mFloats = i.mFloats;
62 mLastModified = i.mLastModified; 62 mLastModified = i.mLastModified;
63 mPilotId = i.mPilotId; 63 mPilotId = i.mPilotId;
64 mZaurusUid = i.mZaurusUid;
65 mTempSyncStat = i.mTempSyncStat; 64 mTempSyncStat = i.mTempSyncStat;
66 mSyncStatus = i.mSyncStatus; 65 mSyncStatus = i.mSyncStatus;
67 mExternalId = i.mExternalId; 66 mExternalId = i.mExternalId;
68 // The copied object is a new one, so it isn't observed by the observer 67 // The copied object is a new one, so it isn't observed by the observer
69 // of the original object. 68 // of the original object.
70 mObservers.clear(); 69 mObservers.clear();
71 70
72 mAttendees.setAutoDelete( true ); 71 mAttendees.setAutoDelete( true );
73} 72}
74 73
75IncidenceBase::~IncidenceBase() 74IncidenceBase::~IncidenceBase()
76{ 75{
@@ -332,112 +331,57 @@ int IncidenceBase::syncStatus() const
332 331
333void IncidenceBase::setPilotId( int id ) 332void IncidenceBase::setPilotId( int id )
334{ 333{
335 if (mReadOnly) return; 334 if (mReadOnly) return;
336 mPilotId = id; 335 mPilotId = id;
337} 336}
338 337
339int IncidenceBase::pilotId() const 338int IncidenceBase::pilotId() const
340{ 339{
341 return mPilotId; 340 return mPilotId;
342} 341}
343 342
344int IncidenceBase::zaurusUid() const
345{
346 return mZaurusUid;
347}
348void IncidenceBase::setZaurusUid( int id )
349{
350 if (mReadOnly) return;
351 mZaurusUid = id;
352}
353
354int IncidenceBase::tempSyncStat() const 343int IncidenceBase::tempSyncStat() const
355{ 344{
356 return mTempSyncStat; 345 return mTempSyncStat;
357} 346}
358void IncidenceBase::setTempSyncStat( int id ) 347void IncidenceBase::setTempSyncStat( int id )
359{ 348{
360 if (mReadOnly) return; 349 if (mReadOnly) return;
361 mTempSyncStat = id; 350 mTempSyncStat = id;
362} 351}
363 352
364void IncidenceBase::setID( const QString & prof , int id ) 353void IncidenceBase::removeID(const QString &prof)
365{ 354{
366 int num = mExternalId.find( ":"+prof+";" ); 355 mExternalId = KIdManager::removeId ( mExternalId, prof);
367 if ( num >= 0 ) { 356
368 int len = prof.length()+2; 357}
369 int end = mExternalId.find( ";", num+len ); 358void IncidenceBase::setID( const QString & prof , const QString & id )
370 if ( end > 0 ) { 359{
371 mExternalId = mExternalId.left( num+len ) +QString::number( id)+mExternalId.mid( end ); 360 mExternalId = KIdManager::setId ( mExternalId, prof, id );
372 } else 361}
373 qDebug("Error in IncidenceBase::setID "); 362QString IncidenceBase::getID( const QString & prof)
374 } else { 363{
375 mExternalId += prof+";"+QString::number( id) +";0:"; 364 return KIdManager::getId ( mExternalId, prof );
376 }
377 qDebug("setID*%s*%d*%s* ", prof.latin1(), id,mExternalId.latin1() );
378}
379int IncidenceBase::getID( const QString & prof)
380{
381 int ret = -1;
382 int num = mExternalId.find(":"+ prof+";" );
383 if ( num >= 0 ) {
384 int len = prof.length()+2;
385 int end = mExternalId.find( ";", num+len );
386 if ( end > 0 ) {
387 bool ok;
388 ret = mExternalId.mid ( num + len,end-len-num).toInt( &ok );
389 if (!ok)
390 ret = -1;
391 }
392 }
393 qDebug("getID*%s*%d*%s* ", prof.latin1(), ret,mExternalId.latin1() );
394 return ret;
395} 365}
396 366
397// example :Sharp_DTM;22;23566:TP;-1;8654:TPP;18;0: 367// example :Sharp_DTM;22;23566:TP;-1;8654:TPP;18;0:
398// format name;III;JJJ: III >= 0, may be -1. JJJ always >= 0 368// format name;III;JJJ: III >= 0, may be -1. JJJ always >= 0
399void IncidenceBase::setCsum( const QString & prof , int id ) 369void IncidenceBase::setCsum( const QString & prof , const QString & id )
400{ 370{
401 int num = mExternalId.find( ":"+prof+";"); 371 mExternalId = KIdManager::setCsum ( mExternalId, prof, id );
402 if ( num >= 0 ) { 372}
403 int len = prof.length()+2; 373QString IncidenceBase::getCsum( const QString & prof)
404 num = mExternalId.find( ";", num+len ); 374{
405 int end = mExternalId.find( ":", num+1 ); 375 return KIdManager::getCsum ( mExternalId, prof );
406 if ( end > 0 ) {
407 mExternalId = mExternalId.left( num ) +QString::number(id)+mExternalId.mid( end );
408 } else
409 qDebug("Error in IncidenceBase::setCsum ");
410 } else {
411 mExternalId += prof+";-1;"+QString::number( id) +":";
412 }
413 qDebug("setCsum*%s*%d*%s* ", prof.latin1(), id,mExternalId.latin1() );
414}
415int IncidenceBase::getCsum( const QString & prof)
416{
417 int ret = -1;
418 int num = mExternalId.find( ":"+prof+";" );
419 if ( num >= 0 ) {
420 int len = prof.length()+2;
421 num = mExternalId.find( ";", num+len );
422 int end = mExternalId.find( ":", num+1 );
423 if ( end > 0 ) {
424 bool ok;
425 ret = mExternalId.mid ( num ,end-num).toInt( &ok );
426 if (!ok)
427 ret = -1;
428 }
429 }
430 qDebug("getCsum*%s*%d*%s* ", prof.latin1(), ret,mExternalId.latin1() );
431 return ret;
432} 376}
433 377
434void IncidenceBase::setIDStr( const QString & s ) 378void IncidenceBase::setIDStr( const QString & s )
435{ 379{
436 if (mReadOnly) return; 380 if (mReadOnly) return;
437 mExternalId = s; 381 mExternalId = s;
438} 382}
439 383
440QString IncidenceBase::IDStr() const 384QString IncidenceBase::IDStr() const
441{ 385{
442 return mExternalId ; 386 return mExternalId ;
443} 387}
diff --git a/libkcal/incidencebase.h b/libkcal/incidencebase.h
index e2950d3..e02d03a 100644
--- a/libkcal/incidencebase.h
+++ b/libkcal/incidencebase.h
@@ -117,58 +117,55 @@ class IncidenceBase : public CustomProperties
117 /** pilot syncronization states */ 117 /** pilot syncronization states */
118 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 }; 118 enum { SYNCNONE = 0, SYNCMOD = 1, SYNCDEL = 3 };
119 /** Set synchronisation satus. */ 119 /** Set synchronisation satus. */
120 void setSyncStatus(int stat); 120 void setSyncStatus(int stat);
121 /** Return synchronisation status. */ 121 /** Return synchronisation status. */
122 int syncStatus() const; 122 int syncStatus() const;
123 123
124 /** Set Pilot Id. */ 124 /** Set Pilot Id. */
125 void setPilotId(int id); 125 void setPilotId(int id);
126 /** Return Pilot Id. */ 126 /** Return Pilot Id. */
127 int pilotId() const; 127 int pilotId() const;
128 128
129 void setZaurusUid(int id);
130 int zaurusUid() const;
131 void setTempSyncStat(int id); 129 void setTempSyncStat(int id);
132 int tempSyncStat() const; 130 int tempSyncStat() const;
133 void setIDStr( const QString & ); 131 void setIDStr( const QString & );
134 QString IDStr() const; 132 QString IDStr() const;
135 void setID( const QString &, int ); 133 void setID( const QString &, const QString & );
136 int getID( const QString & ); 134 QString getID( const QString & );
137 void setCsum( const QString &, int ); 135 void setCsum( const QString &, const QString & );
138 int getCsum( const QString & ); 136 QString getCsum( const QString & );
139 137 void removeID(const QString &);
140 138
141 void registerObserver( Observer * ); 139 void registerObserver( Observer * );
142 void unRegisterObserver( Observer * ); 140 void unRegisterObserver( Observer * );
143 void updated(); 141 void updated();
144 142
145 protected: 143 protected:
146 bool mReadOnly; 144 bool mReadOnly;
147 QDateTime getEvenTime( QDateTime ); 145 QDateTime getEvenTime( QDateTime );
148 146
149 private: 147 private:
150 // base components 148 // base components
151 QDateTime mDtStart; 149 QDateTime mDtStart;
152 QString mOrganizer; 150 QString mOrganizer;
153 QString mUid; 151 QString mUid;
154 QDateTime mLastModified; 152 QDateTime mLastModified;
155 QPtrList<Attendee> mAttendees; 153 QPtrList<Attendee> mAttendees;
156 154
157 bool mFloats; 155 bool mFloats;
158 156
159 int mDuration; 157 int mDuration;
160 bool mHasDuration; 158 bool mHasDuration;
161 QString mExternalId; 159 QString mExternalId;
162 int mZaurusUid;
163 int mTempSyncStat; 160 int mTempSyncStat;
164 161
165 // PILOT SYNCHRONIZATION STUFF 162 // PILOT SYNCHRONIZATION STUFF
166 int mPilotId; // unique id for pilot sync 163 int mPilotId; // unique id for pilot sync
167 int mSyncStatus; // status (for sync) 164 int mSyncStatus; // status (for sync)
168 165
169 QPtrList<Observer> mObservers; 166 QPtrList<Observer> mObservers;
170}; 167};
171 168
172bool operator==( const IncidenceBase&, const IncidenceBase& ); 169bool operator==( const IncidenceBase&, const IncidenceBase& );
173} 170}
174 171
diff --git a/libkcal/sharpformat.cpp b/libkcal/sharpformat.cpp
index 605a54d..e8934bf 100644
--- a/libkcal/sharpformat.cpp
+++ b/libkcal/sharpformat.cpp
@@ -81,26 +81,26 @@ class SharpParser : public QObject
81 } 81 }
82 if ( skip ) 82 if ( skip )
83 return false; 83 return false;
84 ulong cSum = SharpFormat::getCsum(attList ); 84 ulong cSum = SharpFormat::getCsum(attList );
85 85
86 if ( qName == "Event" ) { 86 if ( qName == "Event" ) {
87 Event *event; 87 Event *event;
88 event = existingCalendar->event( "Sharp_DTM",attList[0].toInt() ); 88 event = existingCalendar->event( "Sharp_DTM",attList[0].toInt() );
89 if ( event ) 89 if ( event )
90 event = (Event*)event->clone(); 90 event = (Event*)event->clone();
91 else 91 else
92 event = new Event; 92 event = new Event;
93 event->setID("Sharp_DTM", attList[0].toInt() ); 93 event->setID("Sharp_DTM", attList[0] );
94 event->setZaurusUid( cSum ); 94 event->setCsum( "Sharp_DTM", QString::number( cSum ));
95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL ); 95 event->setTempSyncStat(SYNC_TEMPSTATE_NEW_EXTERNAL );
96 96
97 event->setSummary( attList[2] ); 97 event->setSummary( attList[2] );
98 event->setLocation( attList[3] ); 98 event->setLocation( attList[3] );
99 event->setDescription( attList[4] ); 99 event->setDescription( attList[4] );
100 if ( attList[7] == "1" ) { 100 if ( attList[7] == "1" ) {
101 event->setDtStart( QDateTime(fromString( attList[17]+"000000", false ).date(),QTime(0,0,0 ) )); 101 event->setDtStart( QDateTime(fromString( attList[17]+"000000", false ).date(),QTime(0,0,0 ) ));
102 event->setDtEnd( QDateTime(fromString( attList[18]+"000000", false ).date(),QTime(0,0,0 ))); 102 event->setDtEnd( QDateTime(fromString( attList[18]+"000000", false ).date(),QTime(0,0,0 )));
103 event->setFloats( true ); 103 event->setFloats( true );
104 } else { 104 } else {
105 event->setFloats( false ); 105 event->setFloats( false );
106 event->setDtStart( fromString( attList[5] ) ); 106 event->setDtStart( fromString( attList[5] ) );
@@ -192,26 +192,26 @@ class SharpParser : public QObject
192 todo = existingCalendar->todo( "Sharp_DTM", attList[0].toInt() ); 192 todo = existingCalendar->todo( "Sharp_DTM", attList[0].toInt() );
193 if (todo ) 193 if (todo )
194 todo = (Todo*)todo->clone(); 194 todo = (Todo*)todo->clone();
195 else 195 else
196 todo = new Todo; 196 todo = new Todo;
197 197
198//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1 198//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
199// 0 1 2 3 4 5 6 7 8 199// 0 1 2 3 4 5 6 7 8
200//1,,,,,1,4,Loch zumachen,"" 200//1,,,,,1,4,Loch zumachen,""
201//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" " 201//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
202//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes 202//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
203 203
204 todo->setID( "Sharp_DTM", attList[0].toInt() ); 204 todo->setID( "Sharp_DTM", attList[0]);
205 todo->setZaurusUid( cSum ); 205 todo->setCsum( "Sharp_DTM", QString::number( cSum ));
206 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 206 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
207 207
208 todo->setSummary( attList[7] ); 208 todo->setSummary( attList[7] );
209 todo->setDescription( attList[8]); 209 todo->setDescription( attList[8]);
210 210
211 int priority = attList[6].toInt(); 211 int priority = attList[6].toInt();
212 if ( priority == 0 ) priority = 3; 212 if ( priority == 0 ) priority = 3;
213 todo->setPriority( priority ); 213 todo->setPriority( priority );
214 214
215 QString categoryList = attList[1]; 215 QString categoryList = attList[1];
216 todo->setCategories( lookupCategories( categoryList ) ); 216 todo->setCategories( lookupCategories( categoryList ) );
217 217
@@ -457,26 +457,26 @@ int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
457 if ( tempString.right(1) =="\n" ) 457 if ( tempString.right(1) =="\n" )
458 tempString = tempString.left( tempString.length()-1); 458 tempString = tempString.left( tempString.length()-1);
459 459
460 templist.append( tempString ); 460 templist.append( tempString );
461 } 461 }
462 ++ccc; 462 ++ccc;
463 if ( ccc == 2 && loopCount < 25 ) { 463 if ( ccc == 2 && loopCount < 25 ) {
464 start = 0; 464 start = 0;
465 bool ok; 465 bool ok;
466 int newnum = templist[0].toInt( &ok ); 466 int newnum = templist[0].toInt( &ok );
467 if ( ok && newnum > 0) { 467 if ( ok && newnum > 0) {
468 retval = newnum; 468 retval = newnum;
469 inc->setID( "Sharp_DTM",newnum ); 469 inc->setID( "Sharp_DTM",templist[0] );
470 inc->setZaurusUid( getCsum( templist ) ); 470 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) ));
471 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 471 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
472 } 472 }
473 } 473 }
474 } 474 }
475 //qDebug("getNumFromRecord returning : %d ", retval); 475 //qDebug("getNumFromRecord returning : %d ", retval);
476 return retval; 476 return retval;
477} 477}
478bool SharpFormat::save( Calendar *calendar) 478bool SharpFormat::save( Calendar *calendar)
479{ 479{
480 480
481 QLabel status ( i18n("Processing/adding events ..."), 0 ); 481 QLabel status ( i18n("Processing/adding events ..."), 0 );
482 int w = status.sizeHint().width()+20 ; 482 int w = status.sizeHint().width()+20 ;
@@ -511,25 +511,25 @@ bool SharpFormat::save( Calendar *calendar)
511 status.setText ( message + QString::number ( ++procCount ) ); 511 status.setText ( message + QString::number ( ++procCount ) );
512 qApp->processEvents(); 512 qApp->processEvents();
513 QString eString = getEventString( ev ); 513 QString eString = getEventString( ev );
514 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 514 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
515 // deleting empty strings does not work. 515 // deleting empty strings does not work.
516 // we write first and x and then delete the record with the x 516 // we write first and x and then delete the record with the x
517 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 517 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
518 changeString += eString + "\n"; 518 changeString += eString + "\n";
519 deleteString += eString + "\n"; 519 deleteString += eString + "\n";
520 deleteEnt = true; 520 deleteEnt = true;
521 changeEnt = true; 521 changeEnt = true;
522 } 522 }
523 else if ( ev->getID("Sharp_DTM") == -1 ) { // add new 523 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new
524 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 524 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
525 system ( command.utf8() ); 525 system ( command.utf8() );
526 QFile file( fileName ); 526 QFile file( fileName );
527 if (!file.open( IO_ReadOnly ) ) { 527 if (!file.open( IO_ReadOnly ) ) {
528 return false; 528 return false;
529 529
530 } 530 }
531 QTextStream ts( &file ); 531 QTextStream ts( &file );
532 ts.setCodec( QTextCodec::codecForName("utf8") ); 532 ts.setCodec( QTextCodec::codecForName("utf8") );
533 answer = ts.read(); 533 answer = ts.read();
534 file.close(); 534 file.close();
535 //qDebug("answer \n%s ", answer.latin1()); 535 //qDebug("answer \n%s ", answer.latin1());
@@ -597,25 +597,25 @@ bool SharpFormat::save( Calendar *calendar)
597 status.setText ( message + QString::number ( ++procCount ) ); 597 status.setText ( message + QString::number ( ++procCount ) );
598 qApp->processEvents(); 598 qApp->processEvents();
599 QString eString = getTodoString( to ); 599 QString eString = getTodoString( to );
600 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 600 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
601 // deleting empty strings does not work. 601 // deleting empty strings does not work.
602 // we write first and x and then delete the record with the x 602 // we write first and x and then delete the record with the x
603 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 603 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
604 changeString += eString + "\n"; 604 changeString += eString + "\n";
605 deleteString += eString + "\n"; 605 deleteString += eString + "\n";
606 deleteEnt = true; 606 deleteEnt = true;
607 changeEnt = true; 607 changeEnt = true;
608 } 608 }
609 else if ( to->getID("Sharp_DTM") == -1 ) { // add new 609 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
610 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 610 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
611 system ( command.utf8() ); 611 system ( command.utf8() );
612 QFile file( fileName ); 612 QFile file( fileName );
613 if (!file.open( IO_ReadOnly ) ) { 613 if (!file.open( IO_ReadOnly ) ) {
614 return false; 614 return false;
615 615
616 } 616 }
617 QTextStream ts( &file ); 617 QTextStream ts( &file );
618 ts.setCodec( QTextCodec::codecForName("utf8") ); 618 ts.setCodec( QTextCodec::codecForName("utf8") );
619 answer = ts.read(); 619 answer = ts.read();
620 file.close(); 620 file.close();
621 //qDebug("answer \n%s ", answer.latin1()); 621 //qDebug("answer \n%s ", answer.latin1());
@@ -687,25 +687,25 @@ QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
687 date.year(), date.month(), date.day()); 687 date.year(), date.month(), date.day());
688 } 688 }
689 if(dt.time().isValid()){ 689 if(dt.time().isValid()){
690 const QTime& time = dt.time(); 690 const QTime& time = dt.time();
691 timestr.sprintf("T%02d%02d%02d", 691 timestr.sprintf("T%02d%02d%02d",
692 time.hour(), time.minute(), time.second()); 692 time.hour(), time.minute(), time.second());
693 } 693 }
694 return datestr + timestr; 694 return datestr + timestr;
695} 695}
696QString SharpFormat::getEventString( Event* event ) 696QString SharpFormat::getEventString( Event* event )
697{ 697{
698 QStringList list; 698 QStringList list;
699 list.append( QString::number(event->getID("Sharp_DTM") ) ); 699 list.append( event->getID("Sharp_DTM") );
700 list.append( event->categories().join(",") ); 700 list.append( event->categories().join(",") );
701 if ( !event->summary().isEmpty() ) 701 if ( !event->summary().isEmpty() )
702 list.append( event->summary() ); 702 list.append( event->summary() );
703 else 703 else
704 list.append("" ); 704 list.append("" );
705 if ( !event->location().isEmpty() ) 705 if ( !event->location().isEmpty() )
706 list.append( event->location() ); 706 list.append( event->location() );
707 else 707 else
708 list.append("" ); 708 list.append("" );
709 if ( !event->description().isEmpty() ) 709 if ( !event->description().isEmpty() )
710 list.append( event->description() ); 710 list.append( event->description() );
711 else 711 else
@@ -851,25 +851,25 @@ QString SharpFormat::getEventString( Event* event )
851 s.append('\"'); 851 s.append('\"');
852 } else if(s.isEmpty() && !s.isNull()){ 852 } else if(s.isEmpty() && !s.isNull()){
853 s = "\"\""; 853 s = "\"\"";
854 } 854 }
855 } 855 }
856 return list.join(","); 856 return list.join(",");
857 857
858 858
859} 859}
860QString SharpFormat::getTodoString( Todo* todo ) 860QString SharpFormat::getTodoString( Todo* todo )
861{ 861{
862 QStringList list; 862 QStringList list;
863 list.append( QString::number( todo->getID("Sharp_DTM") ) ); 863 list.append( todo->getID("Sharp_DTM") );
864 list.append( todo->categories().join(",") ); 864 list.append( todo->categories().join(",") );
865 865
866 if ( todo->hasStartDate() ) { 866 if ( todo->hasStartDate() ) {
867 list.append( dtToString( todo->dtStart()) ); 867 list.append( dtToString( todo->dtStart()) );
868 } else 868 } else
869 list.append( QString() ); 869 list.append( QString() );
870 870
871 if ( todo->hasDueDate() ) { 871 if ( todo->hasDueDate() ) {
872 QTime tim; 872 QTime tim;
873 if ( todo->doesFloat()) { 873 if ( todo->doesFloat()) {
874 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 874 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
875 } else { 875 } else {