summaryrefslogtreecommitdiffabout
path: root/libkcal
Unidiff
Diffstat (limited to 'libkcal') (more/less context) (ignore whitespace changes)
-rw-r--r--libkcal/sharpformat.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/libkcal/sharpformat.cpp b/libkcal/sharpformat.cpp
index a53b3f8..e7fc670 100644
--- a/libkcal/sharpformat.cpp
+++ b/libkcal/sharpformat.cpp
@@ -1,1019 +1,1035 @@
1/* 1/*
2 This file is part of libkcal. 2 This file is part of libkcal.
3 3
4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22#include <qdatetime.h> 22#include <qdatetime.h>
23#include <qstring.h> 23#include <qstring.h>
24#include <qapplication.h> 24#include <qapplication.h>
25#include <qptrlist.h> 25#include <qptrlist.h>
26#include <qregexp.h> 26#include <qregexp.h>
27#include <qmessagebox.h> 27#include <qmessagebox.h>
28#include <qclipboard.h> 28#include <qclipboard.h>
29#include <qfile.h> 29#include <qfile.h>
30#include <qtextstream.h> 30#include <qtextstream.h>
31#include <qtextcodec.h> 31#include <qtextcodec.h>
32#include <qxml.h> 32#include <qxml.h>
33#include <qlabel.h> 33#include <qlabel.h>
34 34
35#include <kdebug.h> 35#include <kdebug.h>
36#include <klocale.h> 36#include <klocale.h>
37#include <kglobal.h> 37#include <kglobal.h>
38 38
39#include "calendar.h" 39#include "calendar.h"
40#include "alarm.h" 40#include "alarm.h"
41#include "recurrence.h" 41#include "recurrence.h"
42#include "calendarlocal.h" 42#include "calendarlocal.h"
43 43
44#include "sharpformat.h" 44#include "sharpformat.h"
45#include "syncdefines.h" 45#include "syncdefines.h"
46 46
47using namespace KCal; 47using namespace KCal;
48 48
49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY 49//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 50// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
51 51
52//ARSD silentalarm = 0 52//ARSD silentalarm = 0
53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly 53// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly
54// 12 RFRQ 54// 12 RFRQ
55// 13 RPOS pos = 4. monday in month 55// 13 RPOS pos = 4. monday in month
56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun 56// 14 RDYS days: 1 mon/ 2 tue .. 64 sun
57// 15 REND 0 = no end/ 1 = end 57// 15 REND 0 = no end/ 1 = end
58// 16 REDT rec end dt 58// 16 REDT rec end dt
59//ALSD 59//ALSD
60//ALED 60//ALED
61//MDAY 61//MDAY
62 62
63class SharpParser : public QObject 63class SharpParser : public QObject
64{ 64{
65 public: 65 public:
66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) { 66 SharpParser( Calendar *calendar ) : mCalendar( calendar ) {
67 oldCategories = 0; 67 oldCategories = 0;
68 } 68 }
69 69
70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName ) 70 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName )
71 { 71 {
72 int i = 1; 72 int i = 1;
73 bool skip = true; 73 bool skip = true;
74 int max = attList.count() -2; 74 int max = attList.count() -2;
75 while ( i < max ) { 75 while ( i < max ) {
76 if ( !attList[i].isEmpty() ) { 76 if ( !attList[i].isEmpty() ) {
77 skip = false; 77 skip = false;
78 break; 78 break;
79 } 79 }
80 ++i ; 80 ++i ;
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] ); 88 event = existingCalendar->event( "Sharp_DTM",attList[0] );
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] ); 93 event->setID("Sharp_DTM", attList[0] );
94 event->setCsum( "Sharp_DTM", QString::number( 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]+"T000000", false ).date(),QTime(0,0,0 ) )); 101 event->setDtStart( QDateTime(fromString( attList[17]+"T000000", false ).date(),QTime(0,0,0 ) ));
102 event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", false ).date(),QTime(0,0,0 ))); 102 event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", 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] ) );
107 event->setDtEnd( fromString( attList[6] )); 107 event->setDtEnd( fromString( attList[6] ));
108 } 108 }
109 109
110 QString rtype = attList[11]; 110 QString rtype = attList[11];
111 if ( rtype != "255" ) { 111 if ( rtype != "255" ) {
112 // qDebug("recurs "); 112 // qDebug("recurs ");
113 QDate startDate = event->dtStart().date(); 113 QDate startDate = event->dtStart().date();
114 114
115 QString freqStr = attList[12]; 115 QString freqStr = attList[12];
116 int freq = freqStr.toInt(); 116 int freq = freqStr.toInt();
117 117
118 QString hasEndDateStr = attList[15] ; 118 QString hasEndDateStr = attList[15] ;
119 bool hasEndDate = hasEndDateStr == "1"; 119 bool hasEndDate = hasEndDateStr == "1";
120 120
121 QString endDateStr = attList[16]; 121 QString endDateStr = attList[16];
122 QDate endDate = fromString( endDateStr ).date(); 122 QDate endDate = fromString( endDateStr ).date();
123 123
124 QString weekDaysStr = attList[14]; 124 QString weekDaysStr = attList[14];
125 uint weekDaysNum = weekDaysStr.toInt(); 125 uint weekDaysNum = weekDaysStr.toInt();
126 126
127 QBitArray weekDays( 7 ); 127 QBitArray weekDays( 7 );
128 int i; 128 int i;
129 int bb = 1; 129 int bb = 1;
130 for( i = 1; i <= 7; ++i ) { 130 for( i = 1; i <= 7; ++i ) {
131 weekDays.setBit( i - 1, ( bb & weekDaysNum )); 131 weekDays.setBit( i - 1, ( bb & weekDaysNum ));
132 bb = 2 << (i-1); 132 bb = 2 << (i-1);
133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) ); 133 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) );
134 } 134 }
135 // qDebug("next "); 135 // qDebug("next ");
136 QString posStr = attList[13]; 136 QString posStr = attList[13];
137 int pos = posStr.toInt(); 137 int pos = posStr.toInt();
138 Recurrence *r = event->recurrence(); 138 Recurrence *r = event->recurrence();
139 139
140 if ( rtype == "0" ) { 140 if ( rtype == "0" ) {
141 if ( hasEndDate ) r->setDaily( freq, endDate ); 141 if ( hasEndDate ) r->setDaily( freq, endDate );
142 else r->setDaily( freq, -1 ); 142 else r->setDaily( freq, -1 );
143 } else if ( rtype == "1" ) { 143 } else if ( rtype == "1" ) {
144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate ); 144 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate );
145 else r->setWeekly( freq, weekDays, -1 ); 145 else r->setWeekly( freq, weekDays, -1 );
146 } else if ( rtype == "3" ) { 146 } else if ( rtype == "3" ) {
147 if ( hasEndDate ) 147 if ( hasEndDate )
148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate ); 148 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
149 else 149 else
150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 ); 150 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 );
151 r->addMonthlyDay( startDate.day() ); 151 r->addMonthlyDay( startDate.day() );
152 } else if ( rtype == "2" ) { 152 } else if ( rtype == "2" ) {
153 if ( hasEndDate ) 153 if ( hasEndDate )
154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate ); 154 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
155 else 155 else
156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 ); 156 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 );
157 QBitArray days( 7 ); 157 QBitArray days( 7 );
158 days.fill( false ); 158 days.fill( false );
159 days.setBit( startDate.dayOfWeek() - 1 ); 159 days.setBit( startDate.dayOfWeek() - 1 );
160 r->addMonthlyPos( pos, days ); 160 r->addMonthlyPos( pos, days );
161 } else if ( rtype == "4" ) { 161 } else if ( rtype == "4" ) {
162 if ( hasEndDate ) 162 if ( hasEndDate )
163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate ); 163 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
164 else 164 else
165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 ); 165 r->setYearly( Recurrence::rYearlyMonth, freq, -1 );
166 r->addYearlyNum( startDate.month() ); 166 r->addYearlyNum( startDate.month() );
167 } 167 }
168 } else { 168 } else {
169 event->recurrence()->unsetRecurs(); 169 event->recurrence()->unsetRecurs();
170 } 170 }
171 171
172 QString categoryList = attList[1] ; 172 QString categoryList = attList[1] ;
173 event->setCategories( lookupCategories( categoryList ) ); 173 event->setCategories( lookupCategories( categoryList ) );
174 174
175 // strange 0 semms to mean: alarm enabled 175 // strange 0 semms to mean: alarm enabled
176 if ( attList[8] == "0" ) { 176 if ( attList[8] == "0" ) {
177 Alarm *alarm; 177 Alarm *alarm;
178 if ( event->alarms().count() > 0 ) 178 if ( event->alarms().count() > 0 )
179 alarm = event->alarms().first(); 179 alarm = event->alarms().first();
180 else { 180 else {
181 alarm = new Alarm( event ); 181 alarm = new Alarm( event );
182 event->addAlarm( alarm ); 182 event->addAlarm( alarm );
183 alarm->setType( Alarm::Audio ); 183 alarm->setType( Alarm::Audio );
184 } 184 }
185 //alarm->setType( Alarm::Audio ); 185 //alarm->setType( Alarm::Audio );
186 alarm->setEnabled( true ); 186 alarm->setEnabled( true );
187 int alarmOffset = attList[9].toInt(); 187 int alarmOffset = attList[9].toInt();
188 alarm->setStartOffset( alarmOffset * -60 ); 188 alarm->setStartOffset( alarmOffset * -60 );
189 } else { 189 } else {
190 Alarm *alarm; 190 Alarm *alarm;
191 if ( event->alarms().count() > 0 ) { 191 if ( event->alarms().count() > 0 ) {
192 alarm = event->alarms().first(); 192 alarm = event->alarms().first();
193 alarm->setType( Alarm::Audio ); 193 alarm->setType( Alarm::Audio );
194 alarm->setStartOffset( -60*15 ); 194 alarm->setStartOffset( -60*15 );
195 alarm->setEnabled( false ); 195 alarm->setEnabled( false );
196 } 196 }
197 } 197 }
198 198
199 mCalendar->addEvent( event); 199 mCalendar->addEvent( event);
200 } else if ( qName == "Todo" ) { 200 } else if ( qName == "Todo" ) {
201 Todo *todo; 201 Todo *todo;
202 202
203 todo = existingCalendar->todo( "Sharp_DTM", attList[0] ); 203 todo = existingCalendar->todo( "Sharp_DTM", attList[0] );
204 if (todo ) 204 if (todo )
205 todo = (Todo*)todo->clone(); 205 todo = (Todo*)todo->clone();
206 else 206 else
207 todo = new Todo; 207 todo = new Todo;
208 208
209//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1 209//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
210// 0 1 2 3 4 5 6 7 8 210// 0 1 2 3 4 5 6 7 8
211//1,,,,,1,4,Loch zumachen,"" 211//1,,,,,1,4,Loch zumachen,""
212//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" " 212//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
213//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes 213//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
214 214
215 todo->setID( "Sharp_DTM", attList[0]); 215 todo->setID( "Sharp_DTM", attList[0]);
216 todo->setCsum( "Sharp_DTM", QString::number( cSum )); 216 todo->setCsum( "Sharp_DTM", QString::number( cSum ));
217 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL ); 217 todo->setTempSyncStat( SYNC_TEMPSTATE_NEW_EXTERNAL );
218 218
219 todo->setSummary( attList[7] ); 219 todo->setSummary( attList[7] );
220 todo->setDescription( attList[8]); 220 todo->setDescription( attList[8]);
221 221
222 int priority = attList[6].toInt(); 222 int priority = attList[6].toInt();
223 if ( priority == 0 ) priority = 3; 223 if ( priority == 0 ) priority = 3;
224 todo->setPriority( priority ); 224 todo->setPriority( priority );
225 225
226 QString categoryList = attList[1]; 226 QString categoryList = attList[1];
227 todo->setCategories( lookupCategories( categoryList ) ); 227 todo->setCategories( lookupCategories( categoryList ) );
228 228
229 229
230 230
231 QString hasDateStr = attList[3]; // due 231 QString hasDateStr = attList[3]; // due
232 if ( !hasDateStr.isEmpty() ) { 232 if ( !hasDateStr.isEmpty() ) {
233 if ( hasDateStr.right(6) == "000000" ) { 233 if ( hasDateStr.right(6) == "000000" ) {
234 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) ); 234 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) );
235 todo->setFloats( true ); 235 todo->setFloats( true );
236 } 236 }
237 else { 237 else {
238 todo->setDtDue( fromString( hasDateStr ) ); 238 todo->setDtDue( fromString( hasDateStr ) );
239 todo->setFloats( false ); 239 todo->setFloats( false );
240 } 240 }
241 241
242 todo->setHasDueDate( true ); 242 todo->setHasDueDate( true );
243 } 243 }
244 hasDateStr = attList[2];//start 244 hasDateStr = attList[2];//start
245 if ( !hasDateStr.isEmpty() ) { 245 if ( !hasDateStr.isEmpty() ) {
246 246
247 todo->setDtStart( fromString( hasDateStr ) ); 247 todo->setDtStart( fromString( hasDateStr ) );
248 todo->setHasStartDate( true); 248 todo->setHasStartDate( true);
249 } else 249 } else
250 todo->setHasStartDate( false ); 250 todo->setHasStartDate( false );
251 hasDateStr = attList[4];//completed 251 hasDateStr = attList[4];//completed
252 if ( !hasDateStr.isEmpty() ) { 252 if ( !hasDateStr.isEmpty() ) {
253 todo->setCompleted(fromString( hasDateStr ) ); 253 todo->setCompleted(fromString( hasDateStr ) );
254 } 254 }
255 QString completedStr = attList[5]; 255 QString completedStr = attList[5];
256 if ( completedStr == "0" ) 256 if ( completedStr == "0" )
257 todo->setCompleted( true ); 257 todo->setCompleted( true );
258 else 258 else
259 todo->setCompleted( false ); 259 todo->setCompleted( false );
260 mCalendar->addTodo( todo ); 260 mCalendar->addTodo( todo );
261 261
262 } else if ( qName == "Category" ) { 262 } else if ( qName == "Category" ) {
263 /* 263 /*
264 QString id = attributes.value( "id" ); 264 QString id = attributes.value( "id" );
265 QString name = attributes.value( "name" ); 265 QString name = attributes.value( "name" );
266 setCategory( id, name ); 266 setCategory( id, name );
267 */ 267 */
268 } 268 }
269 //qDebug("end "); 269 //qDebug("end ");
270 return true; 270 return true;
271 } 271 }
272 272
273 273
274 void setCategoriesList ( QStringList * c ) 274 void setCategoriesList ( QStringList * c )
275 { 275 {
276 oldCategories = c; 276 oldCategories = c;
277 } 277 }
278 278
279 QDateTime fromString ( QString s, bool useTz = true ) { 279 QDateTime fromString ( QString s, bool useTz = true ) {
280 QDateTime dt; 280 QDateTime dt;
281 int y,m,t,h,min,sec; 281 int y,m,t,h,min,sec;
282 y = s.mid(0,4).toInt(); 282 y = s.mid(0,4).toInt();
283 m = s.mid(4,2).toInt(); 283 m = s.mid(4,2).toInt();
284 t = s.mid(6,2).toInt(); 284 t = s.mid(6,2).toInt();
285 h = s.mid(9,2).toInt(); 285 h = s.mid(9,2).toInt();
286 min = s.mid(11,2).toInt(); 286 min = s.mid(11,2).toInt();
287 sec = s.mid(13,2).toInt(); 287 sec = s.mid(13,2).toInt();
288 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec)); 288 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
289 int offset = KGlobal::locale()->localTimeOffset( dt ); 289 int offset = KGlobal::locale()->localTimeOffset( dt );
290 if ( useTz ) 290 if ( useTz )
291 dt = dt.addSecs ( offset*60); 291 dt = dt.addSecs ( offset*60);
292 return dt; 292 return dt;
293 293
294 } 294 }
295 protected: 295 protected:
296 QDateTime toDateTime( const QString &value ) 296 QDateTime toDateTime( const QString &value )
297 { 297 {
298 QDateTime dt; 298 QDateTime dt;
299 dt.setTime_t( value.toUInt() ); 299 dt.setTime_t( value.toUInt() );
300 300
301 return dt; 301 return dt;
302 } 302 }
303 303
304 QStringList lookupCategories( const QString &categoryList ) 304 QStringList lookupCategories( const QString &categoryList )
305 { 305 {
306 QStringList categoryIds = QStringList::split( ";", categoryList ); 306 QStringList categoryIds = QStringList::split( ";", categoryList );
307 QStringList categories; 307 QStringList categories;
308 QStringList::ConstIterator it; 308 QStringList::ConstIterator it;
309 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) { 309 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
310 QString cate = category( *it ); 310 QString cate = category( *it );
311 if ( oldCategories ) { 311 if ( oldCategories ) {
312 if ( ! oldCategories->contains( cate ) ) 312 if ( ! oldCategories->contains( cate ) )
313 oldCategories->append( cate ); 313 oldCategories->append( cate );
314 } 314 }
315 categories.append(cate ); 315 categories.append(cate );
316 } 316 }
317 return categories; 317 return categories;
318 } 318 }
319 319
320 private: 320 private:
321 Calendar *mCalendar; 321 Calendar *mCalendar;
322 QStringList * oldCategories; 322 QStringList * oldCategories;
323 static QString category( const QString &id ) 323 static QString category( const QString &id )
324 { 324 {
325 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id ); 325 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
326 if ( it == mCategoriesMap.end() ) return id; 326 if ( it == mCategoriesMap.end() ) return id;
327 else return *it; 327 else return *it;
328 } 328 }
329 329
330 static void setCategory( const QString &id, const QString &name ) 330 static void setCategory( const QString &id, const QString &name )
331 { 331 {
332 mCategoriesMap.insert( id, name ); 332 mCategoriesMap.insert( id, name );
333 } 333 }
334 334
335 static QMap<QString,QString> mCategoriesMap; 335 static QMap<QString,QString> mCategoriesMap;
336}; 336};
337 337
338QMap<QString,QString> SharpParser::mCategoriesMap; 338QMap<QString,QString> SharpParser::mCategoriesMap;
339 339
340SharpFormat::SharpFormat() 340SharpFormat::SharpFormat()
341{ 341{
342 mCategories = 0; 342 mCategories = 0;
343} 343}
344 344
345SharpFormat::~SharpFormat() 345SharpFormat::~SharpFormat()
346{ 346{
347} 347}
348ulong SharpFormat::getCsum( const QStringList & attList) 348ulong SharpFormat::getCsum( const QStringList & attList)
349{ 349{
350 int max = attList.count() -1; 350 int max = attList.count() -1;
351 ulong cSum = 0; 351 ulong cSum = 0;
352 int j,k,i; 352 int j,k,i;
353 int add; 353 int add;
354 for ( i = 1; i < max ; ++i ) { 354 for ( i = 1; i < max ; ++i ) {
355 QString s = attList[i]; 355 QString s = attList[i];
356 if ( ! s.isEmpty() ){ 356 if ( ! s.isEmpty() ){
357 j = s.length(); 357 j = s.length();
358 for ( k = 0; k < j; ++k ) { 358 for ( k = 0; k < j; ++k ) {
359 int mul = k +1; 359 int mul = k +1;
360 add = s[k].unicode (); 360 add = s[k].unicode ();
361 if ( k < 16 ) 361 if ( k < 16 )
362 mul = mul * mul; 362 mul = mul * mul;
363 add = add * mul *i*i*i; 363 add = add * mul *i*i*i;
364 cSum += add; 364 cSum += add;
365 } 365 }
366 } 366 }
367 } 367 }
368 return cSum; 368 return cSum;
369 369
370} 370}
371#include <stdlib.h> 371#include <stdlib.h>
372#define DEBUGMODE false 372#define DEBUGMODE false
373//#define DEBUGMODE true 373//#define DEBUGMODE true
374bool SharpFormat::load( Calendar *calendar, Calendar *existngCal ) 374bool SharpFormat::load( Calendar *calendar, Calendar *existngCal )
375{ 375{
376 376
377 377
378 bool debug = DEBUGMODE; 378 bool debug = DEBUGMODE;
379 QString text; 379 QString text;
380 QString codec = "utf8"; 380 QString codec = "utf8";
381 QLabel status ( i18n("Reading events ..."), 0 ); 381 QLabel status ( i18n("Reading events ..."), 0 );
382 382
383 int w = status.sizeHint().width()+20 ; 383 int w = status.sizeHint().width()+20 ;
384 if ( w < 200 ) w = 200; 384 if ( w < 200 ) w = 200;
385 int h = status.sizeHint().height()+20 ; 385 int h = status.sizeHint().height()+20 ;
386 int dw = QApplication::desktop()->width(); 386 int dw = QApplication::desktop()->width();
387 int dh = QApplication::desktop()->height(); 387 int dh = QApplication::desktop()->height();
388 status.setCaption(i18n("Reading DTM Data") ); 388 status.setCaption(i18n("Reading DTM Data") );
389 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 389 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
390 status.show(); 390 status.show();
391 status.raise(); 391 status.raise();
392 qApp->processEvents(); 392 qApp->processEvents();
393 QString fileName; 393 QString fileName;
394 if ( ! debug ) { 394 if ( ! debug ) {
395 fileName = "/tmp/kopitempout"; 395 fileName = "/tmp/kopitempout";
396 QString command ="db2file datebook -r -c "+ codec + " > " + fileName; 396 QString command ="db2file datebook -r -c "+ codec + " > " + fileName;
397 system ( command.latin1() ); 397 system ( command.latin1() );
398 } else { 398 } else {
399 fileName = "/tmp/events.txt"; 399 fileName = "/tmp/events.txt";
400 400
401 } 401 }
402 QFile file( fileName ); 402 QFile file( fileName );
403 if (!file.open( IO_ReadOnly ) ) { 403 if (!file.open( IO_ReadOnly ) ) {
404 return false; 404 return false;
405 405
406 } 406 }
407 QTextStream ts( &file ); 407 QTextStream ts( &file );
408 ts.setCodec( QTextCodec::codecForName("utf8") ); 408 ts.setCodec( QTextCodec::codecForName("utf8") );
409 text = ts.read(); 409 text = ts.read();
410 file.close(); 410 file.close();
411 status.setText( i18n("Processing events ...") ); 411 status.setText( i18n("Processing events ...") );
412 status.raise(); 412 status.raise();
413 qApp->processEvents(); 413 qApp->processEvents();
414 fromString2Cal( calendar, existngCal, text, "Event" ); 414 fromString2Cal( calendar, existngCal, text, "Event" );
415 status.setText( i18n("Reading todos ...") ); 415 status.setText( i18n("Reading todos ...") );
416 qApp->processEvents(); 416 qApp->processEvents();
417 if ( ! debug ) { 417 if ( ! debug ) {
418 fileName = "/tmp/kopitempout"; 418 fileName = "/tmp/kopitempout";
419 QString command = "db2file todo -r -c " + codec+ " > " + fileName; 419 QString command = "db2file todo -r -c " + codec+ " > " + fileName;
420 system ( command.latin1() ); 420 system ( command.latin1() );
421 } else { 421 } else {
422 fileName = "/tmp/todo.txt"; 422 fileName = "/tmp/todo.txt";
423 } 423 }
424 file.setName( fileName ); 424 file.setName( fileName );
425 if (!file.open( IO_ReadOnly ) ) { 425 if (!file.open( IO_ReadOnly ) ) {
426 return false; 426 return false;
427 427
428 } 428 }
429 ts.setDevice( &file ); 429 ts.setDevice( &file );
430 text = ts.read(); 430 text = ts.read();
431 file.close(); 431 file.close();
432 432
433 status.setText( i18n("Processing todos ...") ); 433 status.setText( i18n("Processing todos ...") );
434 status.raise(); 434 status.raise();
435 qApp->processEvents(); 435 qApp->processEvents();
436 fromString2Cal( calendar, existngCal, text, "Todo" ); 436 fromString2Cal( calendar, existngCal, text, "Todo" );
437 return true; 437 return true;
438} 438}
439int SharpFormat::getNumFromRecord( QString answer, Incidence* inc ) 439int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
440{ 440{
441 int retval = -1; 441 int retval = -1;
442 QStringList templist; 442 QStringList templist;
443 QString tempString; 443 QString tempString;
444 int start = 0; 444 int start = 0;
445 int len = answer.length(); 445 int len = answer.length();
446 int end = answer.find ("\n",start)+1; 446 int end = answer.find ("\n",start)+1;
447 bool ok = true; 447 bool ok = true;
448 start = end; 448 start = end;
449 int ccc = 0; 449 int ccc = 0;
450 while ( start > 0 ) { 450 while ( start > 0 ) {
451 templist.clear(); 451 templist.clear();
452 ok = true; 452 ok = true;
453 int loopCount = 0; 453 int loopCount = 0;
454 while ( ok ) { 454 while ( ok ) {
455 ++loopCount; 455 ++loopCount;
456 if ( loopCount > 25 ) { 456 if ( loopCount > 25 ) {
457 qDebug("KO: Error in while loop"); 457 qDebug("KO: Error in while loop");
458 ok = false; 458 ok = false;
459 start = 0; 459 start = 0;
460 break; 460 break;
461 } 461 }
462 if ( ok ) 462 if ( ok )
463 tempString = getPart( answer, ok, start ); 463 tempString = getPart( answer, ok, start );
464 if ( start >= len || start == 0 ) { 464 if ( start >= len || start == 0 ) {
465 start = 0; 465 start = 0;
466 ok = false; 466 ok = false;
467 } 467 }
468 if ( tempString.right(1) =="\n" ) 468 if ( tempString.right(1) =="\n" )
469 tempString = tempString.left( tempString.length()-1); 469 tempString = tempString.left( tempString.length()-1);
470 470
471 templist.append( tempString ); 471 templist.append( tempString );
472 } 472 }
473 ++ccc; 473 ++ccc;
474 if ( ccc == 2 && loopCount < 25 ) { 474 if ( ccc == 2 && loopCount < 25 ) {
475 start = 0; 475 start = 0;
476 bool ok; 476 bool ok;
477 int newnum = templist[0].toInt( &ok ); 477 int newnum = templist[0].toInt( &ok );
478 if ( ok && newnum > 0) { 478 if ( ok && newnum > 0) {
479 retval = newnum; 479 retval = newnum;
480 inc->setID( "Sharp_DTM",templist[0] ); 480 inc->setID( "Sharp_DTM",templist[0] );
481 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) )); 481 inc->setCsum( "Sharp_DTM", QString::number( getCsum( templist ) ));
482 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID ); 482 inc->setTempSyncStat( SYNC_TEMPSTATE_NEW_ID );
483 } 483 }
484 if ( ok && newnum == -1 ) {
485 qDebug("Error writing back %s ", inc->summary().latin1());
486 }
484 } 487 }
485 } 488 }
486 //qDebug("getNumFromRecord returning : %d ", retval); 489 //qDebug("getNumFromRecord returning : %d ", retval);
487 return retval; 490 return retval;
488} 491}
489bool SharpFormat::save( Calendar *calendar) 492bool SharpFormat::save( Calendar *calendar)
490{ 493{
491 494
492 QLabel status ( i18n("Processing/adding events ..."), 0 ); 495 QLabel status ( i18n("Processing/adding events ..."), 0 );
493 int w = status.sizeHint().width()+20 ; 496 int w = status.sizeHint().width()+20 ;
494 if ( w < 200 ) w = 200; 497 if ( w < 200 ) w = 200;
495 int h = status.sizeHint().height()+20 ; 498 int h = status.sizeHint().height()+20 ;
496 int dw = QApplication::desktop()->width(); 499 int dw = QApplication::desktop()->width();
497 int dh = QApplication::desktop()->height(); 500 int dh = QApplication::desktop()->height();
498 status.setCaption(i18n("Writing DTM Data") ); 501 status.setCaption(i18n("Writing DTM Data") );
499 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h ); 502 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
500 status.show(); 503 status.show();
501 status.raise(); 504 status.raise();
502 qApp->processEvents(); 505 qApp->processEvents();
503 bool debug = DEBUGMODE; 506 bool debug = DEBUGMODE;
504 QString codec = "utf8"; 507 QString codec = "utf8";
505 QString answer; 508 QString answer;
506 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n"; 509 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n";
507 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n"; 510 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n";
508 QString command; 511 QString command;
509 QPtrList<Event> er = calendar->rawEvents(); 512 QPtrList<Event> er = calendar->rawEvents();
510 Event* ev = er.first(); 513 Event* ev = er.first();
511 QString fileName = "/tmp/kopitempout"; 514 QString fileName = "/tmp/kopitempout";
512 int i = 0; 515 int i = 0;
513 QString changeString = ePrefix; 516 QString changeString = ePrefix;
514 QString deleteString = ePrefix; 517 QString deleteString = ePrefix;
515 bool deleteEnt = false; 518 bool deleteEnt = false;
516 bool changeEnt = false; 519 bool changeEnt = false;
517 QString message = i18n("Processing event # "); 520 QString message = i18n("Processing event # ");
518 int procCount = 0; 521 int procCount = 0;
519 while ( ev ) { 522 while ( ev ) {
520 //qDebug("i %d ", ++i); 523 //qDebug("i %d ", ++i);
521 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 524 if ( ev->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
522 status.setText ( message + QString::number ( ++procCount ) ); 525 status.setText ( message + QString::number ( ++procCount ) );
523 qApp->processEvents(); 526 qApp->processEvents();
524 QString eString = getEventString( ev ); 527 QString eString = getEventString( ev );
525 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 528 if ( ev->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
526 // deleting empty strings does not work. 529 // deleting empty strings does not work.
527 // we write first and x and then delete the record with the x 530 // we write first and x and then delete the record with the x
528 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 531 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
529 changeString += eString + "\n"; 532 changeString += eString + "\n";
530 deleteString += eString + "\n"; 533 deleteString += eString + "\n";
531 deleteEnt = true; 534 deleteEnt = true;
532 changeEnt = true; 535 changeEnt = true;
533 } 536 }
534 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new 537 else if ( ev->getID("Sharp_DTM").isEmpty() ) { // add new
535 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 538 QString fileNameIn = "/tmp/kopitempin";
539 QFile fileIn( fileNameIn );
540 if (!fileIn.open( IO_WriteOnly ) ) {
541 return false;
542 }
543 QTextStream tsIn( &fileIn );
544 tsIn.setCodec( QTextCodec::codecForName("utf8") );
545 tsIn << ePrefix << eString ;
546 fileIn.close();
547 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
548 command = "(cat /tmp/kopitempin | db2file datebook -w -g -c " + codec+ ") > "+ fileName;
549 qDebug("command ++++++++ ");
550 qDebug("%s ",command.latin1());
551 qDebug("command -------- ");
536 system ( command.utf8() ); 552 system ( command.utf8() );
537 QFile file( fileName ); 553 QFile file( fileName );
538 if (!file.open( IO_ReadOnly ) ) { 554 if (!file.open( IO_ReadOnly ) ) {
539 return false; 555 return false;
540 556
541 } 557 }
542 QTextStream ts( &file ); 558 QTextStream ts( &file );
543 ts.setCodec( QTextCodec::codecForName("utf8") ); 559 ts.setCodec( QTextCodec::codecForName("utf8") );
544 answer = ts.read(); 560 answer = ts.read();
545 file.close(); 561 file.close();
546 //qDebug("answer \n%s ", answer.latin1()); 562 //qDebug("answer \n%s ", answer.latin1());
547 getNumFromRecord( answer, ev ) ; 563 getNumFromRecord( answer, ev ) ;
548 564
549 } 565 }
550 else { // change existing 566 else { // change existing
551 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() ); 567 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() );
552 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 568 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
553 changeString += eString + "\n"; 569 changeString += eString + "\n";
554 changeEnt = true; 570 changeEnt = true;
555 571
556 } 572 }
557 } 573 }
558 ev = er.next(); 574 ev = er.next();
559 } 575 }
560 status.setText ( i18n("Changing events ...") ); 576 status.setText ( i18n("Changing events ...") );
561 qApp->processEvents(); 577 qApp->processEvents();
562 //qDebug("changing... "); 578 //qDebug("changing... ");
563 if ( changeEnt ) { 579 if ( changeEnt ) {
564 QFile file( fileName ); 580 QFile file( fileName );
565 if (!file.open( IO_WriteOnly ) ) { 581 if (!file.open( IO_WriteOnly ) ) {
566 return false; 582 return false;
567 583
568 } 584 }
569 QTextStream ts( &file ); 585 QTextStream ts( &file );
570 ts.setCodec( QTextCodec::codecForName("utf8") ); 586 ts.setCodec( QTextCodec::codecForName("utf8") );
571 ts << changeString ; 587 ts << changeString ;
572 file.close(); 588 file.close();
573 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName; 589 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName;
574 system ( command.latin1() ); 590 system ( command.latin1() );
575 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 591 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
576 592
577 } 593 }
578 status.setText ( i18n("Deleting events ...") ); 594 status.setText ( i18n("Deleting events ...") );
579 qApp->processEvents(); 595 qApp->processEvents();
580 //qDebug("deleting... "); 596 //qDebug("deleting... ");
581 if ( deleteEnt ) { 597 if ( deleteEnt ) {
582 QFile file( fileName ); 598 QFile file( fileName );
583 if (!file.open( IO_WriteOnly ) ) { 599 if (!file.open( IO_WriteOnly ) ) {
584 return false; 600 return false;
585 601
586 } 602 }
587 QTextStream ts( &file ); 603 QTextStream ts( &file );
588 ts.setCodec( QTextCodec::codecForName("utf8") ); 604 ts.setCodec( QTextCodec::codecForName("utf8") );
589 ts << deleteString; 605 ts << deleteString;
590 file.close(); 606 file.close();
591 command = "db2file datebook -d -c " + codec+ " < "+ fileName; 607 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
592 system ( command.latin1() ); 608 system ( command.latin1() );
593 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 609 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
594 } 610 }
595 611
596 612
597 changeString = tPrefix; 613 changeString = tPrefix;
598 deleteString = tPrefix; 614 deleteString = tPrefix;
599 status.setText ( i18n("Processing todos ...") ); 615 status.setText ( i18n("Processing todos ...") );
600 qApp->processEvents(); 616 qApp->processEvents();
601 QPtrList<Todo> tl = calendar->rawTodos(); 617 QPtrList<Todo> tl = calendar->rawTodos();
602 Todo* to = tl.first(); 618 Todo* to = tl.first();
603 i = 0; 619 i = 0;
604 message = i18n("Processing todo # "); 620 message = i18n("Processing todo # ");
605 procCount = 0; 621 procCount = 0;
606 while ( to ) { 622 while ( to ) {
607 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) { 623 if ( to->tempSyncStat() != SYNC_TEMPSTATE_NEW_EXTERNAL ) {
608 status.setText ( message + QString::number ( ++procCount ) ); 624 status.setText ( message + QString::number ( ++procCount ) );
609 qApp->processEvents(); 625 qApp->processEvents();
610 QString eString = getTodoString( to ); 626 QString eString = getTodoString( to );
611 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete 627 if ( to->tempSyncStat() == SYNC_TEMPSTATE_DELETE ) { // delete
612 // deleting empty strings does not work. 628 // deleting empty strings does not work.
613 // we write first and x and then delete the record with the x 629 // we write first and x and then delete the record with the x
614 eString = eString.replace( QRegExp(",\"\""),",\"x\"" ); 630 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
615 changeString += eString + "\n"; 631 changeString += eString + "\n";
616 deleteString += eString + "\n"; 632 deleteString += eString + "\n";
617 deleteEnt = true; 633 deleteEnt = true;
618 changeEnt = true; 634 changeEnt = true;
619 } 635 }
620 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new 636 else if ( to->getID("Sharp_DTM").isEmpty() ) { // add new
621 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName; 637 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
622 system ( command.utf8() ); 638 system ( command.utf8() );
623 QFile file( fileName ); 639 QFile file( fileName );
624 if (!file.open( IO_ReadOnly ) ) { 640 if (!file.open( IO_ReadOnly ) ) {
625 return false; 641 return false;
626 642
627 } 643 }
628 QTextStream ts( &file ); 644 QTextStream ts( &file );
629 ts.setCodec( QTextCodec::codecForName("utf8") ); 645 ts.setCodec( QTextCodec::codecForName("utf8") );
630 answer = ts.read(); 646 answer = ts.read();
631 file.close(); 647 file.close();
632 //qDebug("answer \n%s ", answer.latin1()); 648 //qDebug("answer \n%s ", answer.latin1());
633 getNumFromRecord( answer, to ) ; 649 getNumFromRecord( answer, to ) ;
634 650
635 } 651 }
636 else { // change existing 652 else { // change existing
637 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() ); 653 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() );
638 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName; 654 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
639 changeString += eString + "\n"; 655 changeString += eString + "\n";
640 changeEnt = true; 656 changeEnt = true;
641 657
642 } 658 }
643 } 659 }
644 660
645 to = tl.next(); 661 to = tl.next();
646 } 662 }
647 status.setText ( i18n("Changing todos ...") ); 663 status.setText ( i18n("Changing todos ...") );
648 qApp->processEvents(); 664 qApp->processEvents();
649 //qDebug("changing... "); 665 //qDebug("changing... ");
650 if ( changeEnt ) { 666 if ( changeEnt ) {
651 QFile file( fileName ); 667 QFile file( fileName );
652 if (!file.open( IO_WriteOnly ) ) { 668 if (!file.open( IO_WriteOnly ) ) {
653 return false; 669 return false;
654 670
655 } 671 }
656 QTextStream ts( &file ); 672 QTextStream ts( &file );
657 ts.setCodec( QTextCodec::codecForName("utf8") ); 673 ts.setCodec( QTextCodec::codecForName("utf8") );
658 ts << changeString ; 674 ts << changeString ;
659 file.close(); 675 file.close();
660 command = "db2file todo -w -g -c " + codec+ " < "+ fileName; 676 command = "db2file todo -w -g -c " + codec+ " < "+ fileName;
661 system ( command.latin1() ); 677 system ( command.latin1() );
662 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1()); 678 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
663 679
664 } 680 }
665 status.setText ( i18n("Deleting todos ...") ); 681 status.setText ( i18n("Deleting todos ...") );
666 qApp->processEvents(); 682 qApp->processEvents();
667 //qDebug("deleting... "); 683 //qDebug("deleting... ");
668 if ( deleteEnt ) { 684 if ( deleteEnt ) {
669 QFile file( fileName ); 685 QFile file( fileName );
670 if (!file.open( IO_WriteOnly ) ) { 686 if (!file.open( IO_WriteOnly ) ) {
671 return false; 687 return false;
672 688
673 } 689 }
674 QTextStream ts( &file ); 690 QTextStream ts( &file );
675 ts.setCodec( QTextCodec::codecForName("utf8") ); 691 ts.setCodec( QTextCodec::codecForName("utf8") );
676 ts << deleteString; 692 ts << deleteString;
677 file.close(); 693 file.close();
678 command = "db2file todo -d -c " + codec+ " < "+ fileName; 694 command = "db2file todo -d -c " + codec+ " < "+ fileName;
679 system ( command.latin1() ); 695 system ( command.latin1() );
680 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1()); 696 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
681 } 697 }
682 698
683 return true; 699 return true;
684} 700}
685QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ ) 701QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
686{ 702{
687 QString datestr; 703 QString datestr;
688 QString timestr; 704 QString timestr;
689 int offset = KGlobal::locale()->localTimeOffset( dti ); 705 int offset = KGlobal::locale()->localTimeOffset( dti );
690 QDateTime dt; 706 QDateTime dt;
691 if (useTZ) 707 if (useTZ)
692 dt = dti.addSecs ( -(offset*60)); 708 dt = dti.addSecs ( -(offset*60));
693 else 709 else
694 dt = dti; 710 dt = dti;
695 if(dt.date().isValid()){ 711 if(dt.date().isValid()){
696 const QDate& date = dt.date(); 712 const QDate& date = dt.date();
697 datestr.sprintf("%04d%02d%02d", 713 datestr.sprintf("%04d%02d%02d",
698 date.year(), date.month(), date.day()); 714 date.year(), date.month(), date.day());
699 } 715 }
700 if(dt.time().isValid()){ 716 if(dt.time().isValid()){
701 const QTime& time = dt.time(); 717 const QTime& time = dt.time();
702 timestr.sprintf("T%02d%02d%02d", 718 timestr.sprintf("T%02d%02d%02d",
703 time.hour(), time.minute(), time.second()); 719 time.hour(), time.minute(), time.second());
704 } 720 }
705 return datestr + timestr; 721 return datestr + timestr;
706} 722}
707QString SharpFormat::getEventString( Event* event ) 723QString SharpFormat::getEventString( Event* event )
708{ 724{
709 QStringList list; 725 QStringList list;
710 list.append( event->getID("Sharp_DTM") ); 726 list.append( event->getID("Sharp_DTM") );
711 list.append( event->categories().join(",") ); 727 list.append( event->categories().join(",") );
712 if ( !event->summary().isEmpty() ) 728 if ( !event->summary().isEmpty() )
713 list.append( event->summary() ); 729 list.append( event->summary() );
714 else 730 else
715 list.append("" ); 731 list.append("" );
716 if ( !event->location().isEmpty() ) 732 if ( !event->location().isEmpty() )
717 list.append( event->location() ); 733 list.append( event->location() );
718 else 734 else
719 list.append("" ); 735 list.append("" );
720 if ( !event->description().isEmpty() ) 736 if ( !event->description().isEmpty() )
721 list.append( event->description() ); 737 list.append( event->description() );
722 else 738 else
723 list.append( "" ); 739 list.append( "" );
724 if ( event->doesFloat () ) { 740 if ( event->doesFloat () ) {
725 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false )); 741 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
726 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6 742 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
727 list.append( "1" ); 743 list.append( "1" );
728 744
729 } 745 }
730 else { 746 else {
731 list.append( dtToString( event->dtStart()) ); 747 list.append( dtToString( event->dtStart()) );
732 list.append( dtToString( event->dtEnd()) ); //6 748 list.append( dtToString( event->dtEnd()) ); //6
733 list.append( "0" ); 749 list.append( "0" );
734 } 750 }
735 bool noAlarm = true; 751 bool noAlarm = true;
736 if ( event->alarms().count() > 0 ) { 752 if ( event->alarms().count() > 0 ) {
737 Alarm * al = event->alarms().first(); 753 Alarm * al = event->alarms().first();
738 if ( al->enabled() ) { 754 if ( al->enabled() ) {
739 noAlarm = false; 755 noAlarm = false;
740 list.append( "0" ); // yes, 0 == alarm 756 list.append( "0" ); // yes, 0 == alarm
741 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) ); 757 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
742 if ( al->type() == Alarm::Audio ) 758 if ( al->type() == Alarm::Audio )
743 list.append( "1" ); // type audio 759 list.append( "1" ); // type audio
744 else 760 else
745 list.append( "0" ); // type silent 761 list.append( "0" ); // type silent
746 } 762 }
747 } 763 }
748 if ( noAlarm ) { 764 if ( noAlarm ) {
749 list.append( "1" ); // yes, 1 == no alarm 765 list.append( "1" ); // yes, 1 == no alarm
750 list.append( "0" ); // no alarm offset 766 list.append( "0" ); // no alarm offset
751 list.append( "1" ); // type 767 list.append( "1" ); // type
752 } 768 }
753 // next is: 11 769 // next is: 11
754 // next is: 11-16 are recurrence 770 // next is: 11-16 are recurrence
755 Recurrence* rec = event->recurrence(); 771 Recurrence* rec = event->recurrence();
756 772
757 bool writeEndDate = false; 773 bool writeEndDate = false;
758 switch ( rec->doesRecur() ) 774 switch ( rec->doesRecur() )
759 { 775 {
760 case Recurrence::rDaily: // 0 776 case Recurrence::rDaily: // 0
761 list.append( "0" ); 777 list.append( "0" );
762 list.append( QString::number( rec->frequency() ));//12 778 list.append( QString::number( rec->frequency() ));//12
763 list.append( "0" ); 779 list.append( "0" );
764 list.append( "0" ); 780 list.append( "0" );
765 writeEndDate = true; 781 writeEndDate = true;
766 break; 782 break;
767 case Recurrence::rWeekly:// 1 783 case Recurrence::rWeekly:// 1
768 list.append( "1" ); 784 list.append( "1" );
769 list.append( QString::number( rec->frequency()) );//12 785 list.append( QString::number( rec->frequency()) );//12
770 list.append( "0" ); 786 list.append( "0" );
771 { 787 {
772 int days = 0; 788 int days = 0;
773 QBitArray weekDays = rec->days(); 789 QBitArray weekDays = rec->days();
774 int i; 790 int i;
775 for( i = 1; i <= 7; ++i ) { 791 for( i = 1; i <= 7; ++i ) {
776 if ( weekDays[i-1] ) { 792 if ( weekDays[i-1] ) {
777 days += 1 << (i-1); 793 days += 1 << (i-1);
778 } 794 }
779 } 795 }
780 list.append( QString::number( days ) ); 796 list.append( QString::number( days ) );
781 } 797 }
782 //pending weekdays 798 //pending weekdays
783 writeEndDate = true; 799 writeEndDate = true;
784 800
785 break; 801 break;
786 case Recurrence::rMonthlyPos:// 2 802 case Recurrence::rMonthlyPos:// 2
787 list.append( "2" ); 803 list.append( "2" );
788 list.append( QString::number( rec->frequency()) );//12 804 list.append( QString::number( rec->frequency()) );//12
789 805
790 writeEndDate = true; 806 writeEndDate = true;
791 { 807 {
792 int count = 1; 808 int count = 1;
793 QPtrList<Recurrence::rMonthPos> rmp; 809 QPtrList<Recurrence::rMonthPos> rmp;
794 rmp = rec->monthPositions(); 810 rmp = rec->monthPositions();
795 if ( rmp.first()->negative ) 811 if ( rmp.first()->negative )
796 count = 5 - rmp.first()->rPos - 1; 812 count = 5 - rmp.first()->rPos - 1;
797 else 813 else
798 count = rmp.first()->rPos - 1; 814 count = rmp.first()->rPos - 1;
799 list.append( QString::number( count ) ); 815 list.append( QString::number( count ) );
800 816
801 } 817 }
802 818
803 list.append( "0" ); 819 list.append( "0" );
804 break; 820 break;
805 case Recurrence::rMonthlyDay:// 3 821 case Recurrence::rMonthlyDay:// 3
806 list.append( "3" ); 822 list.append( "3" );
807 list.append( QString::number( rec->frequency()) );//12 823 list.append( QString::number( rec->frequency()) );//12
808 list.append( "0" ); 824 list.append( "0" );
809 list.append( "0" ); 825 list.append( "0" );
810 writeEndDate = true; 826 writeEndDate = true;
811 break; 827 break;
812 case Recurrence::rYearlyMonth://4 828 case Recurrence::rYearlyMonth://4
813 list.append( "4" ); 829 list.append( "4" );
814 list.append( QString::number( rec->frequency()) );//12 830 list.append( QString::number( rec->frequency()) );//12
815 list.append( "0" ); 831 list.append( "0" );
816 list.append( "0" ); 832 list.append( "0" );
817 writeEndDate = true; 833 writeEndDate = true;
818 break; 834 break;
819 835
820 default: 836 default:
821 list.append( "255" ); 837 list.append( "255" );
822 list.append( QString() ); 838 list.append( QString() );
823 list.append( "0" ); 839 list.append( "0" );
824 list.append( QString() ); 840 list.append( QString() );
825 list.append( "0" ); 841 list.append( "0" );
826 list.append( "20991231T000000" ); 842 list.append( "20991231T000000" );
827 break; 843 break;
828 } 844 }
829 if ( writeEndDate ) { 845 if ( writeEndDate ) {
830 846
831 if ( rec->endDate().isValid() ) { // 15 + 16 847 if ( rec->endDate().isValid() ) { // 15 + 16
832 list.append( "1" ); 848 list.append( "1" );
833 list.append( dtToString( rec->endDate()) ); 849 list.append( dtToString( rec->endDate()) );
834 } else { 850 } else {
835 list.append( "0" ); 851 list.append( "0" );
836 list.append( "20991231T000000" ); 852 list.append( "20991231T000000" );
837 } 853 }
838 854
839 } 855 }
840 if ( event->doesFloat () ) { 856 if ( event->doesFloat () ) {
841 list.append( dtToString( event->dtStart(), false ).left( 8 )); 857 list.append( dtToString( event->dtStart(), false ).left( 8 ));
842 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6 858 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
843 859
844 } 860 }
845 else { 861 else {
846 list.append( QString() ); 862 list.append( QString() );
847 list.append( QString() ); 863 list.append( QString() );
848 864
849 } 865 }
850 if (event->dtStart().date() == event->dtEnd().date() ) 866 if (event->dtStart().date() == event->dtEnd().date() )
851 list.append( "0" ); 867 list.append( "0" );
852 else 868 else
853 list.append( "1" ); 869 list.append( "1" );
854 870
855 871
856 for(QStringList::Iterator it=list.begin(); 872 for(QStringList::Iterator it=list.begin();
857 it!=list.end(); ++it){ 873 it!=list.end(); ++it){
858 QString& s = (*it); 874 QString& s = (*it);
859 s.replace(QRegExp("\""), "\"\""); 875 s.replace(QRegExp("\""), "\"\"");
860 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 876 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
861 s.prepend('\"'); 877 s.prepend('\"');
862 s.append('\"'); 878 s.append('\"');
863 } else if(s.isEmpty() && !s.isNull()){ 879 } else if(s.isEmpty() && !s.isNull()){
864 s = "\"\""; 880 s = "\"\"";
865 } 881 }
866 } 882 }
867 return list.join(","); 883 return list.join(",");
868 884
869 885
870} 886}
871QString SharpFormat::getTodoString( Todo* todo ) 887QString SharpFormat::getTodoString( Todo* todo )
872{ 888{
873 QStringList list; 889 QStringList list;
874 list.append( todo->getID("Sharp_DTM") ); 890 list.append( todo->getID("Sharp_DTM") );
875 list.append( todo->categories().join(",") ); 891 list.append( todo->categories().join(",") );
876 892
877 if ( todo->hasStartDate() ) { 893 if ( todo->hasStartDate() ) {
878 list.append( dtToString( todo->dtStart()) ); 894 list.append( dtToString( todo->dtStart()) );
879 } else 895 } else
880 list.append( QString() ); 896 list.append( QString() );
881 897
882 if ( todo->hasDueDate() ) { 898 if ( todo->hasDueDate() ) {
883 QTime tim; 899 QTime tim;
884 if ( todo->doesFloat()) { 900 if ( todo->doesFloat()) {
885 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ; 901 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
886 } else { 902 } else {
887 list.append( dtToString(todo->dtDue() ) ); 903 list.append( dtToString(todo->dtDue() ) );
888 } 904 }
889 } else 905 } else
890 list.append( QString() ); 906 list.append( QString() );
891 907
892 if ( todo->isCompleted() ) { 908 if ( todo->isCompleted() ) {
893 list.append( dtToString( todo->completed()) ); 909 list.append( dtToString( todo->completed()) );
894 list.append( "0" ); // yes 0 == completed 910 list.append( "0" ); // yes 0 == completed
895 } else { 911 } else {
896 list.append( dtToString( todo->completed()) ); 912 list.append( dtToString( todo->completed()) );
897 list.append( "1" ); 913 list.append( "1" );
898 } 914 }
899 list.append( QString::number( todo->priority() )); 915 list.append( QString::number( todo->priority() ));
900 if( ! todo->summary().isEmpty() ) 916 if( ! todo->summary().isEmpty() )
901 list.append( todo->summary() ); 917 list.append( todo->summary() );
902 else 918 else
903 list.append( "" ); 919 list.append( "" );
904 if (! todo->description().isEmpty() ) 920 if (! todo->description().isEmpty() )
905 list.append( todo->description() ); 921 list.append( todo->description() );
906 else 922 else
907 list.append( "" ); 923 list.append( "" );
908 for(QStringList::Iterator it=list.begin(); 924 for(QStringList::Iterator it=list.begin();
909 it!=list.end(); ++it){ 925 it!=list.end(); ++it){
910 QString& s = (*it); 926 QString& s = (*it);
911 s.replace(QRegExp("\""), "\"\""); 927 s.replace(QRegExp("\""), "\"\"");
912 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){ 928 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
913 s.prepend('\"'); 929 s.prepend('\"');
914 s.append('\"'); 930 s.append('\"');
915 } else if(s.isEmpty() && !s.isNull()){ 931 } else if(s.isEmpty() && !s.isNull()){
916 s = "\"\""; 932 s = "\"\"";
917 } 933 }
918 } 934 }
919 return list.join(","); 935 return list.join(",");
920} 936}
921QString SharpFormat::getPart( const QString & text, bool &ok, int &start ) 937QString SharpFormat::getPart( const QString & text, bool &ok, int &start )
922{ 938{
923 //qDebug("start %d ", start); 939 //qDebug("start %d ", start);
924 940
925 QString retval =""; 941 QString retval ="";
926 if ( text.at(start) == '"' ) { 942 if ( text.at(start) == '"' ) {
927 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) { 943 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) {
928 start = start +2; 944 start = start +2;
929 if ( text.mid( start,1) == "," ) { 945 if ( text.mid( start,1) == "," ) {
930 start += 1; 946 start += 1;
931 } 947 }
932 retval = ""; 948 retval = "";
933 if ( text.mid( start,1) == "\n" ) { 949 if ( text.mid( start,1) == "\n" ) {
934 start += 1; 950 start += 1;
935 ok = false; 951 ok = false;
936 } 952 }
937 return retval; 953 return retval;
938 } 954 }
939 int hk = start+1; 955 int hk = start+1;
940 hk = text.find ('"',hk); 956 hk = text.find ('"',hk);
941 while ( text.at(hk+1) == '"' ) 957 while ( text.at(hk+1) == '"' )
942 hk = text.find ('"',hk+2); 958 hk = text.find ('"',hk+2);
943 retval = text.mid( start+1, hk-start-1); 959 retval = text.mid( start+1, hk-start-1);
944 start = hk+1; 960 start = hk+1;
945 retval.replace( QRegExp("\"\""), "\""); 961 retval.replace( QRegExp("\"\""), "\"");
946 if ( text.mid( start,1) == "," ) { 962 if ( text.mid( start,1) == "," ) {
947 start += 1; 963 start += 1;
948 } 964 }
949 if ( text.mid( start,1) == "\n" ) { 965 if ( text.mid( start,1) == "\n" ) {
950 start += 1; 966 start += 1;
951 ok = false; 967 ok = false;
952 } 968 }
953 //qDebug("retval***%s*** ",retval.latin1() ); 969 //qDebug("retval***%s*** ",retval.latin1() );
954 return retval; 970 return retval;
955 971
956 } else { 972 } else {
957 int nl = text.find ("\n",start); 973 int nl = text.find ("\n",start);
958 int kom = text.find (',',start); 974 int kom = text.find (',',start);
959 if ( kom < nl ) { 975 if ( kom < nl ) {
960 // qDebug("kom < nl %d ", kom); 976 // qDebug("kom < nl %d ", kom);
961 retval = text.mid(start, kom-start); 977 retval = text.mid(start, kom-start);
962 start = kom+1; 978 start = kom+1;
963 return retval; 979 return retval;
964 } else { 980 } else {
965 if ( nl == kom ) { 981 if ( nl == kom ) {
966 // qDebug(" nl == kom "); 982 // qDebug(" nl == kom ");
967 start = 0; 983 start = 0;
968 ok = false; 984 ok = false;
969 return "0"; 985 return "0";
970 } 986 }
971 // qDebug(" nl < kom ", nl); 987 // qDebug(" nl < kom ", nl);
972 retval = text.mid( start, nl-start); 988 retval = text.mid( start, nl-start);
973 ok = false; 989 ok = false;
974 start = nl+1; 990 start = nl+1;
975 return retval; 991 return retval;
976 } 992 }
977 } 993 }
978} 994}
979bool SharpFormat::fromString( Calendar *calendar, const QString & text) 995bool SharpFormat::fromString( Calendar *calendar, const QString & text)
980{ 996{
981 return false; 997 return false;
982} 998}
983bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, const QString & text, const QString & type) 999bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, const QString & text, const QString & type)
984{ 1000{
985 // qDebug("test %s ", text.latin1()); 1001 // qDebug("test %s ", text.latin1());
986 QStringList templist; 1002 QStringList templist;
987 QString tempString; 1003 QString tempString;
988 int start = 0; 1004 int start = 0;
989 int len = text.length(); 1005 int len = text.length();
990 int end = text.find ("\n",start)+1; 1006 int end = text.find ("\n",start)+1;
991 bool ok = true; 1007 bool ok = true;
992 start = end; 1008 start = end;
993 SharpParser handler( calendar ); 1009 SharpParser handler( calendar );
994 handler.setCategoriesList( mCategories ); 1010 handler.setCategoriesList( mCategories );
995 while ( start > 0 ) { 1011 while ( start > 0 ) {
996 templist.clear(); 1012 templist.clear();
997 ok = true; 1013 ok = true;
998 while ( ok ) { 1014 while ( ok ) {
999 tempString = getPart( text, ok, start ); 1015 tempString = getPart( text, ok, start );
1000 if ( start >= len || start == 0 ) { 1016 if ( start >= len || start == 0 ) {
1001 start = 0; 1017 start = 0;
1002 ok = false; 1018 ok = false;
1003 } 1019 }
1004 if ( tempString.right(1) =="\n" ) 1020 if ( tempString.right(1) =="\n" )
1005 tempString = tempString.left( tempString.length()-1); 1021 tempString = tempString.left( tempString.length()-1);
1006 //if ( ok ) 1022 //if ( ok )
1007 templist.append( tempString ); 1023 templist.append( tempString );
1008 //qDebug("%d ---%s---", templist.count(),tempString.latin1() ); 1024 //qDebug("%d ---%s---", templist.count(),tempString.latin1() );
1009 } 1025 }
1010 handler.startElement( existingCalendar, templist, type ); 1026 handler.startElement( existingCalendar, templist, type );
1011 } 1027 }
1012 1028
1013 return false; 1029 return false;
1014} 1030}
1015 1031
1016QString SharpFormat::toString( Calendar * ) 1032QString SharpFormat::toString( Calendar * )
1017{ 1033{
1018 return QString::null; 1034 return QString::null;
1019} 1035}