summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2004-08-07 17:37:12 (UTC)
committer zautrix <zautrix>2004-08-07 17:37:12 (UTC)
commit2219ddf2cb8022a24101e45ca439e65e95743388 (patch) (unidiff)
tree3e15d6b069a82901a5e032f641889b1870fc6ede
parent88b0d33b8b0b1f6ae320cfc863ca6a47fa8fec22 (diff)
downloadkdepimpi-2219ddf2cb8022a24101e45ca439e65e95743388.zip
kdepimpi-2219ddf2cb8022a24101e45ca439e65e95743388.tar.gz
kdepimpi-2219ddf2cb8022a24101e45ca439e65e95743388.tar.bz2
added gammu
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/calendarview.cpp42
-rw-r--r--korganizer/calendarview.h1
-rw-r--r--korganizer/mainwindow.cpp8
-rw-r--r--libkcal/libkcalE.pro2
-rw-r--r--libkcal/phoneformat.cpp1359
-rw-r--r--libkcal/phoneformat.h65
6 files changed, 1467 insertions, 10 deletions
diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp
index 689618d..a7f7010 100644
--- a/korganizer/calendarview.cpp
+++ b/korganizer/calendarview.cpp
@@ -78,16 +78,17 @@
78#include <libkcal/filestorage.h> 78#include <libkcal/filestorage.h>
79#include <libkcal/calendarresources.h> 79#include <libkcal/calendarresources.h>
80#include <libkcal/qtopiaformat.h> 80#include <libkcal/qtopiaformat.h>
81#include "../kalarmd/alarmdialog.h" 81#include "../kalarmd/alarmdialog.h"
82 82
83#ifndef DESKTOP_VERSION 83#ifndef DESKTOP_VERSION
84#include <libkcal/sharpformat.h> 84#include <libkcal/sharpformat.h>
85#endif 85#endif
86#include <libkcal/phoneformat.h>
86#ifndef KORG_NOMAIL 87#ifndef KORG_NOMAIL
87#include "komailclient.h" 88#include "komailclient.h"
88#endif 89#endif
89#ifndef KORG_NOPRINTER 90#ifndef KORG_NOPRINTER
90#include "calprinter.h" 91#include "calprinter.h"
91#endif 92#endif
92#ifndef KORG_NOPLUGINS 93#ifndef KORG_NOPLUGINS
93#include "kocore.h" 94#include "kocore.h"
@@ -1170,48 +1171,66 @@ bool CalendarView::syncCalendar(QString filename, int mode)
1170 delete storage; 1171 delete storage;
1171 delete calendar; 1172 delete calendar;
1172 if ( syncOK ) 1173 if ( syncOK )
1173 updateView(); 1174 updateView();
1174 return syncOK; 1175 return syncOK;
1175} 1176}
1176void CalendarView::syncPhone() 1177void CalendarView::syncPhone()
1177{ 1178{
1178 qDebug("CalendarView::syncPhone() "); 1179 syncExternal( 1 );
1179} 1180}
1180void CalendarView::syncSharp() 1181void CalendarView::syncExternal( int mode )
1181{ 1182{
1182#ifndef DESKTOP_VERSION 1183 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
1183 mGlobalSyncMode = SYNC_MODE_EXTERNAL;
1184 //mCurrentSyncDevice = "sharp-DTM"; 1184 //mCurrentSyncDevice = "sharp-DTM";
1185 if ( KOPrefs::instance()->mAskForPreferences ) 1185 if ( KOPrefs::instance()->mAskForPreferences )
1186 edit_sync_options(); 1186 edit_sync_options();
1187 qApp->processEvents(); 1187 qApp->processEvents();
1188 CalendarLocal* calendar = new CalendarLocal(); 1188 CalendarLocal* calendar = new CalendarLocal();
1189 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId); 1189 calendar->setTimeZoneId(KOPrefs::instance()->mTimeZoneId);
1190 bool syncOK = false; 1190 bool syncOK = false;
1191 SharpFormat sharpFormat; 1191 boo loadSuccess = false;
1192 if ( sharpFormat.load( calendar, mCalendar ) ) { 1192 PhoneFormat* phoneFormat = 0;
1193#ifndef DESKTOP_VERSION
1194 SharpFormat* sharpFormat = 0;
1195 if ( mode == 0 ) { // sharp
1196 sharpFormat = new SharpFormat () ;
1197 loadSuccess = sharpFormat->load( calendar, mCalendar );
1198
1199 } else
1200#endif
1201 if ( mode == 1 ) { // phone
1202 phoneFormat = new PhoneFormat ();
1203 loadSuccess = phoneFormat->load( calendar, mCalendar );
1204
1205 } else
1206 return;
1207 if ( loadSuccess ) {
1193 getEventViewerDialog()->setSyncMode( true ); 1208 getEventViewerDialog()->setSyncMode( true );
1194 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs ); 1209 syncOK = synchronizeCalendar( mCalendar, calendar, KOPrefs::instance()->mSyncAlgoPrefs );
1195 getEventViewerDialog()->setSyncMode( false ); 1210 getEventViewerDialog()->setSyncMode( false );
1196 qApp->processEvents(); 1211 qApp->processEvents();
1197 if ( syncOK ) { 1212 if ( syncOK ) {
1198 if ( KOPrefs::instance()->mWriteBackFile ) 1213 if ( KOPrefs::instance()->mWriteBackFile )
1199 { 1214 {
1200 QPtrList<Incidence> iL = mCalendar->rawIncidences(); 1215 QPtrList<Incidence> iL = mCalendar->rawIncidences();
1201 Incidence* inc = iL.first(); 1216 Incidence* inc = iL.first();
1202 /* obsolete 1217 /* obsolete
1203 while ( inc ) { 1218 while ( inc ) {
1204 inc->setZaurusStat( inc->revision () ); 1219 inc->setZaurusStat( inc->revision () );
1205 inc = iL.next(); 1220 inc = iL.next();
1206 } 1221 }
1207 */ 1222 */
1208 // pending: clean last sync event description 1223#ifndef DESKTOP_VERSION
1209 sharpFormat.save(calendar); 1224 if ( sharpFormat )
1225 sharpFormat->save(calendar);
1226#endif
1227 if ( phoneFormat )
1228 phoneFormat->save(calendar);
1210 iL = calendar->rawIncidences(); 1229 iL = calendar->rawIncidences();
1211 inc = iL.first(); 1230 inc = iL.first();
1212 Incidence* loc; 1231 Incidence* loc;
1213 while ( inc ) { 1232 while ( inc ) {
1214 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) { 1233 if ( inc->tempSyncStat() == SYNC_TEMPSTATE_NEW_ID ) {
1215 loc = mCalendar->incidence(inc->uid() ); 1234 loc = mCalendar->incidence(inc->uid() );
1216 if ( loc ) { 1235 if ( loc ) {
1217 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) ); 1236 loc->setID(mCurrentSyncDevice, inc->getID(mCurrentSyncDevice) );
@@ -1233,17 +1252,22 @@ void CalendarView::syncSharp()
1233 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ; 1252 QString question = i18n("Sorry, the database access\ncommand failed!\n\nNothing synced!\n") ;
1234 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"), 1253 QMessageBox::information( 0, i18n("KO/Pi Import - ERROR"),
1235 question, i18n("Ok")) ; 1254 question, i18n("Ok")) ;
1236 1255
1237 } 1256 }
1238 delete calendar; 1257 delete calendar;
1239 updateView(); 1258 updateView();
1240 return ;//syncOK; 1259 return ;//syncOK;
1241#endif 1260
1261}
1262void CalendarView::syncSharp()
1263{
1264 syncExternal( 0 );
1265
1242} 1266}
1243 1267
1244 1268
1245#include <kabc/stdaddressbook.h> 1269#include <kabc/stdaddressbook.h>
1246bool CalendarView::importBday() 1270bool CalendarView::importBday()
1247{ 1271{
1248 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true ); 1272 KABC::StdAddressBook* AddressBook = KABC::StdAddressBook::self( true );
1249 KABC::AddressBook::Iterator it; 1273 KABC::AddressBook::Iterator it;
diff --git a/korganizer/calendarview.h b/korganizer/calendarview.h
index b2838db..a3315ad 100644
--- a/korganizer/calendarview.h
+++ b/korganizer/calendarview.h
@@ -421,16 +421,17 @@ class CalendarView : public KOrg::CalendarViewBase, public KCal::Calendar::Obser
421 void slotCalendarChanged(); 421 void slotCalendarChanged();
422 bool importBday(); 422 bool importBday();
423 bool addAnniversary( QDate data, QString name, KCal::Attendee* a , bool birthday ); 423 bool addAnniversary( QDate data, QString name, KCal::Attendee* a , bool birthday );
424 bool importQtopia( const QString &categoriesFile, 424 bool importQtopia( const QString &categoriesFile,
425 const QString &datebookFile, 425 const QString &datebookFile,
426 const QString &tasklistFile ); 426 const QString &tasklistFile );
427 void syncSharp( ); 427 void syncSharp( );
428 void syncPhone( ); 428 void syncPhone( );
429 void syncExternal( int mode );
429 void slotSelectPickerDate( QDate ) ; 430 void slotSelectPickerDate( QDate ) ;
430 void showDatePicker( ) ; 431 void showDatePicker( ) ;
431 void moveIncidence(Incidence *) ; 432 void moveIncidence(Incidence *) ;
432 void beamIncidence(Incidence *) ; 433 void beamIncidence(Incidence *) ;
433 void beamCalendar() ; 434 void beamCalendar() ;
434 void beamFilteredCalendar() ; 435 void beamFilteredCalendar() ;
435 void beamIncidenceList(QPtrList<Incidence>) ; 436 void beamIncidenceList(QPtrList<Incidence>) ;
436 void manageCategories(); 437 void manageCategories();
diff --git a/korganizer/mainwindow.cpp b/korganizer/mainwindow.cpp
index 062c95f..cce182a 100644
--- a/korganizer/mainwindow.cpp
+++ b/korganizer/mainwindow.cpp
@@ -995,17 +995,23 @@ void MainWindow::slotSyncMenu( int action )
995 } else if ( action == 1002 ) { 995 } else if ( action == 1002 ) {
996 quickSyncLocalFile(); 996 quickSyncLocalFile();
997 997
998 } else if ( action >= 1003 ) { 998 } else if ( action >= 1003 ) {
999 if ( temp->getIsLocalFileSync() ) { 999 if ( temp->getIsLocalFileSync() ) {
1000 if ( syncWithFile( temp->getRemoteFileName( ), false ) ) 1000 if ( syncWithFile( temp->getRemoteFileName( ), false ) )
1001 KOPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileName(); 1001 KOPrefs::instance()->mLastSyncedLocalFile = temp->getRemoteFileName();
1002 } else { 1002 } else {
1003 syncRemote( temp ); 1003 if ( temp->getIsPhoneSync() ) {
1004 KOPrefs::instance()->mPhoneDevice = temp->getPhoneDevice( ) ;
1005 KOPrefs::instance()->mPhoneConnection = temp->getPhoneConnection( );
1006 KOPrefs::instance()->mPhoneModel = temp->getPhoneModel( );
1007 syncPhone();
1008 } else
1009 syncRemote( temp );
1004 1010
1005 } 1011 }
1006 } 1012 }
1007 delete temp; 1013 delete temp;
1008 mBlockSaveFlag = false; 1014 mBlockSaveFlag = false;
1009} 1015}
1010void MainWindow::setDefaultPreferences() 1016void MainWindow::setDefaultPreferences()
1011{ 1017{
diff --git a/libkcal/libkcalE.pro b/libkcal/libkcalE.pro
index 283a22d..f5be980 100644
--- a/libkcal/libkcalE.pro
+++ b/libkcal/libkcalE.pro
@@ -36,16 +36,17 @@ HEADERS = \
36 imipscheduler.h \ 36 imipscheduler.h \
37 incidence.h \ 37 incidence.h \
38 incidencebase.h \ 38 incidencebase.h \
39 journal.h \ 39 journal.h \
40 period.h \ 40 period.h \
41 person.h \ 41 person.h \
42 qtopiaformat.h \ 42 qtopiaformat.h \
43 sharpformat.h \ 43 sharpformat.h \
44 phoneformat.h \
44 recurrence.h \ 45 recurrence.h \
45 scheduler.h \ 46 scheduler.h \
46 todo.h \ 47 todo.h \
47 vcaldrag.h \ 48 vcaldrag.h \
48 vcalformat.h \ 49 vcalformat.h \
49 versit/port.h \ 50 versit/port.h \
50 versit/vcc.h \ 51 versit/vcc.h \
51 versit/vobject.h \ 52 versit/vobject.h \
@@ -72,16 +73,17 @@ SOURCES = \
72 imipscheduler.cpp \ 73 imipscheduler.cpp \
73 incidence.cpp \ 74 incidence.cpp \
74 incidencebase.cpp \ 75 incidencebase.cpp \
75 journal.cpp \ 76 journal.cpp \
76 period.cpp \ 77 period.cpp \
77 person.cpp \ 78 person.cpp \
78 qtopiaformat.cpp \ 79 qtopiaformat.cpp \
79 sharpformat.cpp \ 80 sharpformat.cpp \
81 phoneformat.cpp \
80 recurrence.cpp \ 82 recurrence.cpp \
81 scheduler.cpp \ 83 scheduler.cpp \
82 todo.cpp \ 84 todo.cpp \
83 vcaldrag.cpp \ 85 vcaldrag.cpp \
84 vcalformat.cpp \ 86 vcalformat.cpp \
85 versit/vcc.c \ 87 versit/vcc.c \
86 versit/vobject.c \ 88 versit/vobject.c \
87 89
diff --git a/libkcal/phoneformat.cpp b/libkcal/phoneformat.cpp
new file mode 100644
index 0000000..f78730d
--- a/dev/null
+++ b/libkcal/phoneformat.cpp
@@ -0,0 +1,1359 @@
1/*
2 This file is part of libkcal.
3
4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
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
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20*/
21
22#include <qdatetime.h>
23#include <qstring.h>
24#include <qapplication.h>
25#include <qptrlist.h>
26#include <qregexp.h>
27#include <qmessagebox.h>
28#include <qclipboard.h>
29#include <qfile.h>
30#include <qtextstream.h>
31#include <qtextcodec.h>
32#include <qxml.h>
33#include <qlabel.h>
34
35#include <kdebug.h>
36#include <klocale.h>
37#include <kglobal.h>
38
39#include "calendar.h"
40#include "alarm.h"
41#include "recurrence.h"
42#include "calendarlocal.h"
43
44#include "phoneformat.h"
45
46using namespace KCal;
47
48//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
49// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
50
51//ARSD silentalarm = 0
52// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly
53// 12 RFRQ
54// 13 RPOS pos = 4. monday in month
55// 14 RDYS days: 1 mon/ 2 tue .. 64 sun
56// 15 REND 0 = no end/ 1 = end
57// 16 REDT rec end dt
58//ALSD
59//ALED
60//MDAY
61
62class SharpParser : public QObject
63{
64 public:
65 SharpParser( Calendar *calendar ) : mCalendar( calendar ) {
66 oldCategories = 0;
67 }
68
69 bool startElement( Calendar *existingCalendar, const QStringList & attList, QString qName )
70 {
71 int i = 1;
72 bool skip = true;
73 int max = attList.count() -2;
74 while ( i < max ) {
75 if ( !attList[i].isEmpty() ) {
76 skip = false;
77 break;
78 }
79 ++i ;
80 }
81 if ( skip )
82 return false;
83 ulong cSum = SharpFormat::getCsum(attList );
84
85 if ( qName == "Event" ) {
86 Event *event;
87 event = existingCalendar->event( attList[0].toInt() );
88 if ( event )
89 event = (Event*)event->clone();
90 else
91 event = new Event;
92 event->setZaurusId( attList[0].toInt() );
93 event->setZaurusUid( cSum );
94 event->setZaurusStat( -2 );
95
96 event->setSummary( attList[2] );
97 event->setLocation( attList[3] );
98 event->setDescription( attList[4] );
99 if ( attList[7] == "1" ) {
100 event->setDtStart( QDateTime(fromString( attList[17]+"T000000", false ).date(),QTime(0,0,0 ) ));
101 event->setDtEnd( QDateTime(fromString( attList[18]+"T000000", false ).date(),QTime(0,0,0 )));
102 event->setFloats( true );
103 } else {
104 event->setFloats( false );
105 event->setDtStart( fromString( attList[5] ) );
106 event->setDtEnd( fromString( attList[6] ));
107 }
108
109 QString rtype = attList[11];
110 if ( rtype != "255" ) {
111 // qDebug("recurs ");
112 QDate startDate = event->dtStart().date();
113
114 QString freqStr = attList[12];
115 int freq = freqStr.toInt();
116
117 QString hasEndDateStr = attList[15] ;
118 bool hasEndDate = hasEndDateStr == "1";
119
120 QString endDateStr = attList[16];
121 QDate endDate = fromString( endDateStr ).date();
122
123 QString weekDaysStr = attList[14];
124 uint weekDaysNum = weekDaysStr.toInt();
125
126 QBitArray weekDays( 7 );
127 int i;
128 int bb = 1;
129 for( i = 1; i <= 7; ++i ) {
130 weekDays.setBit( i - 1, ( bb & weekDaysNum ));
131 bb = 2 << (i-1);
132 //qDebug(" %d bit %d ",i-1,weekDays.at(i-1) );
133 }
134 // qDebug("next ");
135 QString posStr = attList[13];
136 int pos = posStr.toInt();
137 Recurrence *r = event->recurrence();
138
139 if ( rtype == "0" ) {
140 if ( hasEndDate ) r->setDaily( freq, endDate );
141 else r->setDaily( freq, -1 );
142 } else if ( rtype == "1" ) {
143 if ( hasEndDate ) r->setWeekly( freq, weekDays, endDate );
144 else r->setWeekly( freq, weekDays, -1 );
145 } else if ( rtype == "3" ) {
146 if ( hasEndDate )
147 r->setMonthly( Recurrence::rMonthlyDay, freq, endDate );
148 else
149 r->setMonthly( Recurrence::rMonthlyDay, freq, -1 );
150 r->addMonthlyDay( startDate.day() );
151 } else if ( rtype == "2" ) {
152 if ( hasEndDate )
153 r->setMonthly( Recurrence::rMonthlyPos, freq, endDate );
154 else
155 r->setMonthly( Recurrence::rMonthlyPos, freq, -1 );
156 QBitArray days( 7 );
157 days.fill( false );
158 days.setBit( startDate.dayOfWeek() - 1 );
159 r->addMonthlyPos( pos, days );
160 } else if ( rtype == "4" ) {
161 if ( hasEndDate )
162 r->setYearly( Recurrence::rYearlyMonth, freq, endDate );
163 else
164 r->setYearly( Recurrence::rYearlyMonth, freq, -1 );
165 r->addYearlyNum( startDate.month() );
166 }
167 }
168
169 QString categoryList = attList[1] ;
170 event->setCategories( lookupCategories( categoryList ) );
171
172 // strange 0 semms to mean: alarm enabled
173 if ( attList[8] == "0" ) {
174 Alarm *alarm;
175 if ( event->alarms().count() > 0 )
176 alarm = event->alarms().first();
177 else {
178 alarm = new Alarm( event );
179 event->addAlarm( alarm );
180 }
181 alarm->setType( Alarm::Audio );
182 alarm->setEnabled( true );
183 int alarmOffset = attList[9].toInt();
184 alarm->setStartOffset( alarmOffset * -60 );
185 }
186
187 mCalendar->addEvent( event);
188 } else if ( qName == "Todo" ) {
189 Todo *todo;
190
191 todo = existingCalendar->todo( attList[0].toInt() );
192 if (todo )
193 todo = (Todo*)todo->clone();
194 else
195 todo = new Todo;
196
197//CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1
198// 0 1 2 3 4 5 6 7 8
199//1,,,,,1,4,Loch zumachen,""
200//3,Privat,20040317T000000,20040318T000000,20040319T000000,0,5,Call bbb,"notes123 bbb gggg ""bb "" "
201//2,"Familie,Freunde,Holiday",20040318T000000,20040324T000000,20040317T000000,1,2,tod2,notes
202
203 todo->setZaurusId( attList[0].toInt() );
204 todo->setZaurusUid( cSum );
205 todo->setZaurusStat( -2 );
206
207 todo->setSummary( attList[7] );
208 todo->setDescription( attList[8]);
209
210 int priority = attList[6].toInt();
211 if ( priority == 0 ) priority = 3;
212 todo->setPriority( priority );
213
214 QString categoryList = attList[1];
215 todo->setCategories( lookupCategories( categoryList ) );
216
217
218
219 QString hasDateStr = attList[3]; // due
220 if ( !hasDateStr.isEmpty() ) {
221 if ( hasDateStr.right(6) == "000000" ) {
222 todo->setDtDue( QDateTime(fromString( hasDateStr, false ).date(), QTime(0,0,0 )) );
223 todo->setFloats( true );
224 }
225 else {
226 todo->setDtDue( fromString( hasDateStr ) );
227 todo->setFloats( false );
228 }
229
230 todo->setHasDueDate( true );
231 }
232 hasDateStr = attList[2];//start
233 if ( !hasDateStr.isEmpty() ) {
234
235 todo->setDtStart( fromString( hasDateStr ) );
236 todo->setHasStartDate( true);
237 } else
238 todo->setHasStartDate( false );
239 hasDateStr = attList[4];//completed
240 if ( !hasDateStr.isEmpty() ) {
241 todo->setCompleted(fromString( hasDateStr ) );
242 }
243 QString completedStr = attList[5];
244 if ( completedStr == "0" )
245 todo->setCompleted( true );
246 else
247 todo->setCompleted( false );
248 mCalendar->addTodo( todo );
249
250 } else if ( qName == "Category" ) {
251 /*
252 QString id = attributes.value( "id" );
253 QString name = attributes.value( "name" );
254 setCategory( id, name );
255 */
256 }
257 //qDebug("end ");
258 return true;
259 }
260
261
262 void setCategoriesList ( QStringList * c )
263 {
264 oldCategories = c;
265 }
266
267 QDateTime fromString ( QString s, bool useTz = true ) {
268 QDateTime dt;
269 int y,m,t,h,min,sec;
270 y = s.mid(0,4).toInt();
271 m = s.mid(4,2).toInt();
272 t = s.mid(6,2).toInt();
273 h = s.mid(9,2).toInt();
274 min = s.mid(11,2).toInt();
275 sec = s.mid(13,2).toInt();
276 dt = QDateTime(QDate(y,m,t), QTime(h,min,sec));
277 int offset = KGlobal::locale()->localTimeOffset( dt );
278 if ( useTz )
279 dt = dt.addSecs ( offset*60);
280 return dt;
281
282 }
283 protected:
284 QDateTime toDateTime( const QString &value )
285 {
286 QDateTime dt;
287 dt.setTime_t( value.toUInt() );
288
289 return dt;
290 }
291
292 QStringList lookupCategories( const QString &categoryList )
293 {
294 QStringList categoryIds = QStringList::split( ";", categoryList );
295 QStringList categories;
296 QStringList::ConstIterator it;
297 for( it = categoryIds.begin(); it != categoryIds.end(); ++it ) {
298 QString cate = category( *it );
299 if ( oldCategories ) {
300 if ( ! oldCategories->contains( cate ) )
301 oldCategories->append( cate );
302 }
303 categories.append(cate );
304 }
305 return categories;
306 }
307
308 private:
309 Calendar *mCalendar;
310 QStringList * oldCategories;
311 static QString category( const QString &id )
312 {
313 QMap<QString,QString>::ConstIterator it = mCategoriesMap.find( id );
314 if ( it == mCategoriesMap.end() ) return id;
315 else return *it;
316 }
317
318 static void setCategory( const QString &id, const QString &name )
319 {
320 mCategoriesMap.insert( id, name );
321 }
322
323 static QMap<QString,QString> mCategoriesMap;
324};
325
326QMap<QString,QString> SharpParser::mCategoriesMap;
327
328SharpFormat::SharpFormat()
329{
330 mCategories = 0;
331}
332
333SharpFormat::~SharpFormat()
334{
335}
336ulong SharpFormat::getCsum( const QStringList & attList)
337{
338 int max = attList.count() -1;
339 ulong cSum = 0;
340 int j,k,i;
341 int add;
342 for ( i = 1; i < max ; ++i ) {
343 QString s = attList[i];
344 if ( ! s.isEmpty() ){
345 j = s.length();
346 for ( k = 0; k < j; ++k ) {
347 int mul = k +1;
348 add = s[k].unicode ();
349 if ( k < 16 )
350 mul = mul * mul;
351 add = add * mul *i*i*i;
352 cSum += add;
353 }
354 }
355 }
356 return cSum;
357
358}
359//extern "C" GSM_Error GSM_InitConnection(GSM_StateMachine *s, int ReplyNum);
360#include <stdlib.h>
361#define DEBUGMODE false
362bool SharpFormat::load( Calendar *calendar, Calendar *existngCal )
363{
364
365 GSM_StateMachines;
366 qDebug(" load ");
367 s.opened = false;
368 s.msg = NULL;
369 s.ConfigNum = 0;
370 static char*cp;
371 static INI_Section *cfg = NULL;
372 cfg=GSM_FindGammuRC();
373 int i;
374 for (i = 0; i <= MAX_CONFIG_NUM; i++) {
375 if (cfg!=NULL) {
376 cp = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*)"gammucoding", false);
377 if (cp) di.coding = cp;
378
379 s.Config[i].Localize = (char *)INI_GetValue(cfg, (unsigned char*) "gammu", (unsigned char*) "gammuloc", false);
380 if (s.Config[i].Localize) {
381 s.msg=INI_ReadFile(s.Config[i].Localize, true);
382 } else {
383#if !defined(WIN32) && defined(LOCALE_PATH)
384 locale = setlocale(LC_MESSAGES, NULL);
385 if (locale != NULL) {
386 snprintf(locale_file, 200, "%s/gammu_%c%c.txt",
387 LOCALE_PATH,
388 tolower(locale[0]),
389 tolower(locale[1]));
390 s.msg = INI_ReadFile(locale_file, true);
391 }
392#endif
393 }
394 }
395
396 /* Wanted user specific configuration? */
397
398 if (!GSM_ReadConfig(cfg, &s.Config[i], i) && i != 0) break;
399
400 s.ConfigNum++;
401
402 /* We want to use only one file descriptor for global and state machine debug output */
403 s.Config[i].UseGlobalDebugFile = true;
404
405
406
407 /* We wanted to read just user specified configuration. */
408 {break;}
409 }
410
411
412
413
414 int error=GSM_InitConnection(&s,3);
415
416
417 qDebug(" init %d %d", error, ERR_NONE);
418 if ( error != ERR_NONE )
419 return false;
420 fromString2Cal( calendar, existngCal, &s, "Event" );
421
422
423 error=GSM_TerminateConnection(&s);
424
425
426#if 0
427
428 bool debug = DEBUGMODE;
429 //debug = true;
430 QString text;
431 QString codec = "utf8";
432 QLabel status ( i18n("Reading events ..."), 0 );
433
434 int w = status.sizeHint().width()+20 ;
435 if ( w < 200 ) w = 200;
436 int h = status.sizeHint().height()+20 ;
437 int dw = QApplication::desktop()->width();
438 int dh = QApplication::desktop()->height();
439 status.setCaption(i18n("Reading DTM Data") );
440 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
441 status.show();
442 status.raise();
443 qApp->processEvents();
444 QString fileName;
445 if ( ! debug ) {
446 fileName = "/tmp/kopitempout";
447 QString command ="db2file datebook -r -c "+ codec + " > " + fileName;
448 system ( command.latin1() );
449 } else {
450 fileName = "/tmp/events.txt";
451
452 }
453 QFile file( fileName );
454 if (!file.open( IO_ReadOnly ) ) {
455 return false;
456
457 }
458 QTextStream ts( &file );
459 ts.setCodec( QTextCodec::codecForName("utf8") );
460 text = ts.read();
461 file.close();
462 status.setText( i18n("Processing events ...") );
463 status.raise();
464 qApp->processEvents();
465 fromString2Cal( calendar, existngCal, text, "Event" );
466 status.setText( i18n("Reading todos ...") );
467 qApp->processEvents();
468 if ( ! debug ) {
469 fileName = "/tmp/kopitempout";
470 QString command = "db2file todo -r -c " + codec+ " > " + fileName;
471 system ( command.latin1() );
472 } else {
473 fileName = "/tmp/todo.txt";
474 }
475 file.setName( fileName );
476 if (!file.open( IO_ReadOnly ) ) {
477 return false;
478
479 }
480 ts.setDevice( &file );
481 text = ts.read();
482 file.close();
483
484 status.setText( i18n("Processing todos ...") );
485 status.raise();
486 qApp->processEvents();
487 fromString2Cal( calendar, existngCal, text, "Todo" );
488#endif
489 return true;
490}
491int SharpFormat::getNumFromRecord( QString answer, Incidence* inc )
492{
493 int retval = -1;
494 QStringList templist;
495 QString tempString;
496 int start = 0;
497 int len = answer.length();
498 int end = answer.find ("\n",start)+1;
499 bool ok = true;
500 start = end;
501 int ccc = 0;
502 while ( start > 0 ) {
503 templist.clear();
504 ok = true;
505 int loopCount = 0;
506 while ( ok ) {
507 ++loopCount;
508 if ( loopCount > 25 ) {
509 qDebug("KO: Error in while loop");
510 ok = false;
511 start = 0;
512 break;
513 }
514 if ( ok )
515 tempString = getPart( answer, ok, start );
516 if ( start >= len || start == 0 ) {
517 start = 0;
518 ok = false;
519 }
520 if ( tempString.right(1) =="\n" )
521 tempString = tempString.left( tempString.length()-1);
522
523 templist.append( tempString );
524 }
525 ++ccc;
526 if ( ccc == 2 && loopCount < 25 ) {
527 start = 0;
528 bool ok;
529 int newnum = templist[0].toInt( &ok );
530 if ( ok && newnum > 0) {
531 retval = newnum;
532 inc->setZaurusId( newnum );
533 inc->setZaurusUid( getCsum( templist ) );
534 inc->setZaurusStat( -4 );
535 }
536 }
537 }
538 //qDebug("getNumFromRecord returning : %d ", retval);
539 return retval;
540}
541bool SharpFormat::save( Calendar *calendar)
542{
543
544 QLabel status ( i18n("Processing/adding events ..."), 0 );
545 int w = status.sizeHint().width()+20 ;
546 if ( w < 200 ) w = 200;
547 int h = status.sizeHint().height()+20 ;
548 int dw = QApplication::desktop()->width();
549 int dh = QApplication::desktop()->height();
550 status.setCaption(i18n("Writing DTM Data") );
551 status.setGeometry( (dw-w)/2, (dh - h )/2 ,w,h );
552 status.show();
553 status.raise();
554 qApp->processEvents();
555 bool debug = DEBUGMODE;
556 QString codec = "utf8";
557 QString answer;
558 QString ePrefix = "CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY\n";
559 QString tPrefix = "CARDID,CATEGORY,ETDY,LTDY,FNDY,MARK,PRTY,TITL,MEM1\n";
560 QString command;
561 QPtrList<Event> er = calendar->rawEvents();
562 Event* ev = er.first();
563 QString fileName = "/tmp/kopitempout";
564 int i = 0;
565 QString changeString = ePrefix;
566 QString deleteString = ePrefix;
567 bool deleteEnt = false;
568 bool changeEnt = false;
569 QString message = i18n("Processing event # ");
570 int procCount = 0;
571 while ( ev ) {
572 //qDebug("i %d ", ++i);
573 if ( ev->zaurusStat() != -2 ) {
574 status.setText ( message + QString::number ( ++procCount ) );
575 qApp->processEvents();
576 QString eString = getEventString( ev );
577 if ( ev->zaurusStat() == -3 ) { // delete
578 // deleting empty strings does not work.
579 // we write first and x and then delete the record with the x
580 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
581 changeString += eString + "\n";
582 deleteString += eString + "\n";
583 deleteEnt = true;
584 changeEnt = true;
585 }
586 else if ( ev->zaurusId() == -1 ) { // add new
587 command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
588 system ( command.utf8() );
589 QFile file( fileName );
590 if (!file.open( IO_ReadOnly ) ) {
591 return false;
592
593 }
594 QTextStream ts( &file );
595 ts.setCodec( QTextCodec::codecForName("utf8") );
596 answer = ts.read();
597 file.close();
598 //qDebug("answer \n%s ", answer.latin1());
599 getNumFromRecord( answer, ev ) ;
600
601 }
602 else { // change existing
603 //qDebug("canging %d %d",ev->zaurusStat() ,ev->zaurusId() );
604 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
605 changeString += eString + "\n";
606 changeEnt = true;
607
608 }
609 }
610 ev = er.next();
611 }
612 status.setText ( i18n("Changing events ...") );
613 qApp->processEvents();
614 //qDebug("changing... ");
615 if ( changeEnt ) {
616 QFile file( fileName );
617 if (!file.open( IO_WriteOnly ) ) {
618 return false;
619
620 }
621 QTextStream ts( &file );
622 ts.setCodec( QTextCodec::codecForName("utf8") );
623 ts << changeString ;
624 file.close();
625 command = "db2file datebook -w -g -c " + codec+ " < "+ fileName;
626 system ( command.latin1() );
627 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
628
629 }
630 status.setText ( i18n("Deleting events ...") );
631 qApp->processEvents();
632 //qDebug("deleting... ");
633 if ( deleteEnt ) {
634 QFile file( fileName );
635 if (!file.open( IO_WriteOnly ) ) {
636 return false;
637
638 }
639 QTextStream ts( &file );
640 ts.setCodec( QTextCodec::codecForName("utf8") );
641 ts << deleteString;
642 file.close();
643 command = "db2file datebook -d -c " + codec+ " < "+ fileName;
644 system ( command.latin1() );
645 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
646 }
647
648
649 changeString = tPrefix;
650 deleteString = tPrefix;
651 status.setText ( i18n("Processing todos ...") );
652 qApp->processEvents();
653 QPtrList<Todo> tl = calendar->rawTodos();
654 Todo* to = tl.first();
655 i = 0;
656 message = i18n("Processing todo # ");
657 procCount = 0;
658 while ( to ) {
659 if ( to->zaurusStat() != -2 ) {
660 status.setText ( message + QString::number ( ++procCount ) );
661 qApp->processEvents();
662 QString eString = getTodoString( to );
663 if ( to->zaurusStat() == -3 ) { // delete
664 // deleting empty strings does not work.
665 // we write first and x and then delete the record with the x
666 eString = eString.replace( QRegExp(",\"\""),",\"x\"" );
667 changeString += eString + "\n";
668 deleteString += eString + "\n";
669 deleteEnt = true;
670 changeEnt = true;
671 }
672 else if ( to->zaurusId() == -1 ) { // add new
673 command = "(echo \"" + tPrefix + eString + "\" ) | db2file todo -w -g -c " + codec+ " > "+ fileName;
674 system ( command.utf8() );
675 QFile file( fileName );
676 if (!file.open( IO_ReadOnly ) ) {
677 return false;
678
679 }
680 QTextStream ts( &file );
681 ts.setCodec( QTextCodec::codecForName("utf8") );
682 answer = ts.read();
683 file.close();
684 //qDebug("answer \n%s ", answer.latin1());
685 getNumFromRecord( answer, to ) ;
686
687 }
688 else { // change existing
689 //qDebug("canging %d %d",to->zaurusStat() ,to->zaurusId() );
690 //command = "(echo \"" + ePrefix + eString + "\" ) | db2file datebook -w -g -c " + codec+ " > "+ fileName;
691 changeString += eString + "\n";
692 changeEnt = true;
693
694 }
695 }
696
697 to = tl.next();
698 }
699 status.setText ( i18n("Changing todos ...") );
700 qApp->processEvents();
701 //qDebug("changing... ");
702 if ( changeEnt ) {
703 QFile file( fileName );
704 if (!file.open( IO_WriteOnly ) ) {
705 return false;
706
707 }
708 QTextStream ts( &file );
709 ts.setCodec( QTextCodec::codecForName("utf8") );
710 ts << changeString ;
711 file.close();
712 command = "db2file todo -w -g -c " + codec+ " < "+ fileName;
713 system ( command.latin1() );
714 //qDebug("command %s file :\n%s ", command.latin1(), changeString.latin1());
715
716 }
717 status.setText ( i18n("Deleting todos ...") );
718 qApp->processEvents();
719 //qDebug("deleting... ");
720 if ( deleteEnt ) {
721 QFile file( fileName );
722 if (!file.open( IO_WriteOnly ) ) {
723 return false;
724
725 }
726 QTextStream ts( &file );
727 ts.setCodec( QTextCodec::codecForName("utf8") );
728 ts << deleteString;
729 file.close();
730 command = "db2file todo -d -c " + codec+ " < "+ fileName;
731 system ( command.latin1() );
732 // qDebug("command %s file :\n%s ", command.latin1(), deleteString.latin1());
733 }
734
735 return true;
736}
737QString SharpFormat::dtToString( const QDateTime& dti, bool useTZ )
738{
739 QString datestr;
740 QString timestr;
741 int offset = KGlobal::locale()->localTimeOffset( dti );
742 QDateTime dt;
743 if (useTZ)
744 dt = dti.addSecs ( -(offset*60));
745 else
746 dt = dti;
747 if(dt.date().isValid()){
748 const QDate& date = dt.date();
749 datestr.sprintf("%04d%02d%02d",
750 date.year(), date.month(), date.day());
751 }
752 if(dt.time().isValid()){
753 const QTime& time = dt.time();
754 timestr.sprintf("T%02d%02d%02d",
755 time.hour(), time.minute(), time.second());
756 }
757 return datestr + timestr;
758}
759QString SharpFormat::getEventString( Event* event )
760{
761 QStringList list;
762 list.append( QString::number(event->zaurusId() ) );
763 list.append( event->categories().join(",") );
764 if ( !event->summary().isEmpty() )
765 list.append( event->summary() );
766 else
767 list.append("" );
768 if ( !event->location().isEmpty() )
769 list.append( event->location() );
770 else
771 list.append("" );
772 if ( !event->description().isEmpty() )
773 list.append( event->description() );
774 else
775 list.append( "" );
776 if ( event->doesFloat () ) {
777 list.append( dtToString( QDateTime(event->dtStart().date(), QTime(0,0,0)), false ));
778 list.append( dtToString( QDateTime(event->dtEnd().date(),QTime(23,59,59)), false )); //6
779 list.append( "1" );
780
781 }
782 else {
783 list.append( dtToString( event->dtStart()) );
784 list.append( dtToString( event->dtEnd()) ); //6
785 list.append( "0" );
786 }
787 bool noAlarm = true;
788 if ( event->alarms().count() > 0 ) {
789 Alarm * al = event->alarms().first();
790 if ( al->enabled() ) {
791 noAlarm = false;
792 list.append( "0" ); // yes, 0 == alarm
793 list.append( QString::number( al->startOffset().asSeconds()/(-60) ) );
794 if ( al->type() == Alarm::Audio )
795 list.append( "1" ); // type audio
796 else
797 list.append( "0" ); // type silent
798 }
799 }
800 if ( noAlarm ) {
801 list.append( "1" ); // yes, 1 == no alarm
802 list.append( "0" ); // no alarm offset
803 list.append( "1" ); // type
804 }
805 // next is: 11
806 // next is: 11-16 are recurrence
807 Recurrence* rec = event->recurrence();
808
809 bool writeEndDate = false;
810 switch ( rec->doesRecur() )
811 {
812 case Recurrence::rDaily: // 0
813 list.append( "0" );
814 list.append( QString::number( rec->frequency() ));//12
815 list.append( "0" );
816 list.append( "0" );
817 writeEndDate = true;
818 break;
819 case Recurrence::rWeekly:// 1
820 list.append( "1" );
821 list.append( QString::number( rec->frequency()) );//12
822 list.append( "0" );
823 {
824 int days = 0;
825 QBitArray weekDays = rec->days();
826 int i;
827 for( i = 1; i <= 7; ++i ) {
828 if ( weekDays[i-1] ) {
829 days += 1 << (i-1);
830 }
831 }
832 list.append( QString::number( days ) );
833 }
834 //pending weekdays
835 writeEndDate = true;
836
837 break;
838 case Recurrence::rMonthlyPos:// 2
839 list.append( "2" );
840 list.append( QString::number( rec->frequency()) );//12
841
842 writeEndDate = true;
843 {
844 int count = 1;
845 QPtrList<Recurrence::rMonthPos> rmp;
846 rmp = rec->monthPositions();
847 if ( rmp.first()->negative )
848 count = 5 - rmp.first()->rPos - 1;
849 else
850 count = rmp.first()->rPos - 1;
851 list.append( QString::number( count ) );
852
853 }
854
855 list.append( "0" );
856 break;
857 case Recurrence::rMonthlyDay:// 3
858 list.append( "3" );
859 list.append( QString::number( rec->frequency()) );//12
860 list.append( "0" );
861 list.append( "0" );
862 writeEndDate = true;
863 break;
864 case Recurrence::rYearlyMonth://4
865 list.append( "4" );
866 list.append( QString::number( rec->frequency()) );//12
867 list.append( "0" );
868 list.append( "0" );
869 writeEndDate = true;
870 break;
871
872 default:
873 list.append( "255" );
874 list.append( QString() );
875 list.append( "0" );
876 list.append( QString() );
877 list.append( "0" );
878 list.append( "20991231T000000" );
879 break;
880 }
881 if ( writeEndDate ) {
882
883 if ( rec->endDate().isValid() ) { // 15 + 16
884 list.append( "1" );
885 list.append( dtToString( rec->endDate()) );
886 } else {
887 list.append( "0" );
888 list.append( "20991231T000000" );
889 }
890
891 }
892 if ( event->doesFloat () ) {
893 list.append( dtToString( event->dtStart(), false ).left( 8 ));
894 list.append( dtToString( event->dtEnd(), false ).left( 8 )); //6
895
896 }
897 else {
898 list.append( QString() );
899 list.append( QString() );
900
901 }
902 if (event->dtStart().date() == event->dtEnd().date() )
903 list.append( "0" );
904 else
905 list.append( "1" );
906
907
908 for(QStringList::Iterator it=list.begin();
909 it!=list.end(); ++it){
910 QString& s = (*it);
911 s.replace(QRegExp("\""), "\"\"");
912 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
913 s.prepend('\"');
914 s.append('\"');
915 } else if(s.isEmpty() && !s.isNull()){
916 s = "\"\"";
917 }
918 }
919 return list.join(",");
920
921
922}
923QString SharpFormat::getTodoString( Todo* todo )
924{
925 QStringList list;
926 list.append( QString::number( todo->zaurusId() ) );
927 list.append( todo->categories().join(",") );
928
929 if ( todo->hasStartDate() ) {
930 list.append( dtToString( todo->dtStart()) );
931 } else
932 list.append( QString() );
933
934 if ( todo->hasDueDate() ) {
935 QTime tim;
936 if ( todo->doesFloat()) {
937 list.append( dtToString( QDateTime(todo->dtDue().date(),QTime( 0,0,0 )), false)) ;
938 } else {
939 list.append( dtToString(todo->dtDue() ) );
940 }
941 } else
942 list.append( QString() );
943
944 if ( todo->isCompleted() ) {
945 list.append( dtToString( todo->completed()) );
946 list.append( "0" ); // yes 0 == completed
947 } else {
948 list.append( dtToString( todo->completed()) );
949 list.append( "1" );
950 }
951 list.append( QString::number( todo->priority() ));
952 if( ! todo->summary().isEmpty() )
953 list.append( todo->summary() );
954 else
955 list.append( "" );
956 if (! todo->description().isEmpty() )
957 list.append( todo->description() );
958 else
959 list.append( "" );
960 for(QStringList::Iterator it=list.begin();
961 it!=list.end(); ++it){
962 QString& s = (*it);
963 s.replace(QRegExp("\""), "\"\"");
964 if(s.contains(QRegExp("[,\"\r\n]")) || s.stripWhiteSpace() != s){
965 s.prepend('\"');
966 s.append('\"');
967 } else if(s.isEmpty() && !s.isNull()){
968 s = "\"\"";
969 }
970 }
971 return list.join(",");
972}
973QString SharpFormat::getPart( const QString & text, bool &ok, int &start )
974{
975 //qDebug("start %d ", start);
976
977 QString retval ="";
978 if ( text.at(start) == '"' ) {
979 if ( text.mid( start,2) == "\"\"" && !( text.mid( start+2,1) == "\"")) {
980 start = start +2;
981 if ( text.mid( start,1) == "," ) {
982 start += 1;
983 }
984 retval = "";
985 if ( text.mid( start,1) == "\n" ) {
986 start += 1;
987 ok = false;
988 }
989 return retval;
990 }
991 int hk = start+1;
992 hk = text.find ('"',hk);
993 while ( text.at(hk+1) == '"' )
994 hk = text.find ('"',hk+2);
995 retval = text.mid( start+1, hk-start-1);
996 start = hk+1;
997 retval.replace( QRegExp("\"\""), "\"");
998 if ( text.mid( start,1) == "," ) {
999 start += 1;
1000 }
1001 if ( text.mid( start,1) == "\n" ) {
1002 start += 1;
1003 ok = false;
1004 }
1005 //qDebug("retval***%s*** ",retval.latin1() );
1006 return retval;
1007
1008 } else {
1009 int nl = text.find ("\n",start);
1010 int kom = text.find (',',start);
1011 if ( kom < nl ) {
1012 // qDebug("kom < nl %d ", kom);
1013 retval = text.mid(start, kom-start);
1014 start = kom+1;
1015 return retval;
1016 } else {
1017 if ( nl == kom ) {
1018 // qDebug(" nl == kom ");
1019 start = 0;
1020 ok = false;
1021 return "0";
1022 }
1023 // qDebug(" nl < kom ", nl);
1024 retval = text.mid( start, nl-start);
1025 ok = false;
1026 start = nl+1;
1027 return retval;
1028 }
1029 }
1030}
1031bool SharpFormat::fromString( Calendar *calendar, const QString & text)
1032{
1033 return false;
1034}
1035 bool SharpFormat::fromString2Cal( Calendar *calendar,Calendar *existingCalendar, GSM_StateMachine*s, const QString & type)
1036{
1037 GSM_Phone_Functions*Phone;
1038
1039 GSM_CalendarEntrynote;
1040 GSM_CalendarEntry*Note;
1041 bool refresh= true;
1042
1043 Phone=s->Phone.Functions;
1044 bool gshutdown = false;
1045 SharpParser handler( calendar );
1046 //handler.setCategoriesList( mCategories );
1047 QStringList templist;
1048 QString tempString;
1049 int start = 0;
1050 int error;
1051 int ccc = 0;
1052 while (!gshutdown && ccc++ < 10 ) {
1053 QString CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY;
1054 templist.clear();
1055 qDebug("count %d ", ccc);
1056 error=Phone->GetNextCalendar(s,&note,refresh);
1057 if (error == ERR_EMPTY) break;
1058
1059 Note = &note;
1060//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
1061// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1062
1063//ARSD silentalarm = 0
1064// 11 RTYP 225 no /0 dialy/ 1 weekly/ 3 month by date/ 2 month by day(pos)/ yearly
1065// 12 RFRQ
1066// 13 RPOS pos = 4. monday in month
1067// 14 RDYS days: 1 mon/ 2 tue .. 64 sun
1068// 15 REND 0 = no end/ 1 = end
1069// 16 REDT rec end dt
1070//ALSD
1071//ALED
1072//MDAY
1073
1074 CARDID = QString::number( Note->Location ); // 0
1075
1076
1077 int i_age = 0,i;
1078 GSM_DateTime Alarm,DateTime;
1079 GSM_DateTime* dtp;
1080 GSM_MemoryEntry entry;
1081 unsigned char *name;
1082
1083 bool repeating = false;
1084 int repeat_dayofweek = -1;
1085 int repeat_day = -1;
1086 int repeat_weekofmonth = -1;
1087 int repeat_month = -1;
1088 int repeat_frequency = -1;
1089 GSM_DateTime repeat_startdate = {0,0,0,0,0,0,0};
1090 GSM_DateTime repeat_stopdate = {0,0,0,0,0,0,0};
1091
1092 Alarm.Year = 0;
1093
1094 repeating = false;
1095 repeat_dayofweek = -1;
1096 repeat_day = -1;
1097 repeat_weekofmonth = -1;
1098 repeat_month = -1;
1099 repeat_frequency = -1;
1100 repeat_startdate.Day= 0;
1101 repeat_stopdate.Day = 0;
1102
1103
1104 switch (Note->Type) {
1105 case GSM_CAL_REMINDER : CATEGORY = QString("Reminder"); break;
1106 case GSM_CAL_CALL : CATEGORY = QString("Call"); break;
1107 case GSM_CAL_MEETING : CATEGORY = QString("Meeting"); break;
1108 case GSM_CAL_BIRTHDAY : CATEGORY = QString("Birthday"); break;
1109 case GSM_CAL_MEMO : CATEGORY = QString("Memo"); break;
1110 case GSM_CAL_TRAVEL : CATEGORY = QString("Travel"); break;
1111 case GSM_CAL_VACATION : CATEGORY = QString("Vacation"); break;
1112 case GSM_CAL_ALARM : CATEGORY = QString("Alarm"); break;
1113 case GSM_CAL_DAILY_ALARM : CATEGORY = QString("Daily alarm"); break;
1114 case GSM_CAL_T_ATHL : CATEGORY = QString("Training/Athletism"); break;
1115 case GSM_CAL_T_BALL : CATEGORY = QString("Training/Ball Games"); break;
1116 case GSM_CAL_T_CYCL : CATEGORY = QString("Training/Cycling"); break;
1117 case GSM_CAL_T_BUDO : CATEGORY = QString("Training/Budo"); break;
1118 case GSM_CAL_T_DANC : CATEGORY = QString("Training/Dance"); break;
1119 case GSM_CAL_T_EXTR : CATEGORY = QString("Training/Extreme Sports"); break;
1120 case GSM_CAL_T_FOOT : CATEGORY = QString("Training/Football"); break;
1121 case GSM_CAL_T_GOLF : CATEGORY = QString("Training/Golf"); break;
1122 case GSM_CAL_T_GYM : CATEGORY = QString("Training/Gym"); break;
1123 case GSM_CAL_T_HORS : CATEGORY = QString("Training/Horse Races"); break;
1124 case GSM_CAL_T_HOCK : CATEGORY = QString("Training/Hockey"); break;
1125 case GSM_CAL_T_RACE : CATEGORY = QString("Training/Races"); break;
1126 case GSM_CAL_T_RUGB : CATEGORY = QString("Training/Rugby"); break;
1127 case GSM_CAL_T_SAIL : CATEGORY = QString("Training/Sailing"); break;
1128 case GSM_CAL_T_STRE : CATEGORY = QString("Training/Street Games"); break;
1129 case GSM_CAL_T_SWIM : CATEGORY = QString("Training/Swimming"); break;
1130 case GSM_CAL_T_TENN : CATEGORY = QString("Training/Tennis"); break;
1131 case GSM_CAL_T_TRAV : CATEGORY = QString("Training/Travels"); break;
1132 case GSM_CAL_T_WINT : CATEGORY = QString("Training/Winter Games"); break;
1133 default : CATEGORY = QString("");
1134 }
1135//CARDID,CATEGORY,DSRP,PLCE,MEM1,TIM1,TIM2,ADAY,ARON,ARMN,ARSD,RTYP,RFRQ,RPOS,RDYS,REND,REDT,ALSD,ALED,MDAY
1136// 0x 1x 2x 3x 4x 5x 6x 7x 8x 9x 10? 11 12 13 14 15 16 17x 18x 19?
1137
1138 MEM1 = "";
1139
1140#if 0
1141
1142 if ( attList[7] == "1" ) {
1143 event->setDtStart( QDateTime(fromString( attList[17]+"000000", false ).date(),QTime(0,0,0 ) ));
1144 event->setDtEnd( QDateTime(fromString( attList[18]+"000000", false ).date(),QTime(0,0,0 )));
1145 event->setFloats( true );
1146 } else {
1147 event->setFloats( false );
1148 event->setDtStart( fromString( attList[5] ) );
1149 event->setDtEnd( fromString( attList[6] ));
1150 }
1151
1152
1153
1154typedef struct {
1155 /**
1156 * The difference between local time and GMT in hours
1157 */
1158 int Timezone;
1159
1160 unsigned int Second;
1161 unsigned int Minute;
1162 unsigned int Hour;
1163
1164 unsigned int Day;
1165 /**
1166 * January = 1, February = 2, etc.
1167 */
1168 unsigned int Month;
1169 /**
1170 * Complete year number. Not 03, but 2003
1171 */
1172 unsigned int Year;
1173} GSM_DateTime;
1174
1175 if(dt.date().isValid()){
1176 const QDate& date = dt.date();
1177 datestr.sprintf("%04d%02d%02d",
1178 date.year(), date.month(), date.day());
1179 }
1180 if(dt.time().isValid()){
1181 const QTime& time = dt.time();
1182 timestr.sprintf("T%02d%02d%02d",
1183 time.hour(), time.minute(), time.second());
1184 }
1185 return datestr + timestr;
1186
1187
1188
1189
1190#endif
1191
1192
1193 ADAY = "0";
1194 ARON = "1"; // 1 == disabled
1195 ARMN = "0"; //alarm offset in minutes
1196
1197 for (i=0;i<Note->EntriesNum;i++) {
1198
1199 qDebug(" for ");
1200 switch (Note->Entries[i].EntryType) {
1201 case CAL_START_DATETIME:
1202 dtp = &Note->Entries[i].Date ;
1203
1204 qDebug("hour: %d ", dtp->Hour);
1205 if ( dtp->Hour == -1 ) {
1206 ADAY = "1";
1207 ALSD.sprintf("%04d%02d%02d",dtp->Year, dtp->Month, dtp->Day );
1208 TIM1.sprintf("%04d%02d%02dT000000",dtp->Year, dtp->Month, dtp->Day );
1209 } else {
1210 TIM1.sprintf("%04d%02d%02dT%02d%02d%02d",dtp->Year, dtp->Month, dtp->Day, dtp->Hour - dtp->Timezone, dtp->Minute, dtp->Second );
1211
1212 }
1213 ////printmsg("Start : %s\n",OSDateTime(Note->Entries[i].Date,false));
1214 //memcpy(&DateTime,&Note->Entries[i].Date,sizeof(GSM_DateTime));
1215 break;
1216 case CAL_END_DATETIME:
1217 dtp = &Note->Entries[i].Date ;
1218 qDebug("hour2: %d ", dtp->Hour);
1219 if ( dtp->Hour == -1 ) {
1220 ADAY = "1";
1221 ALED.sprintf("%04d%02d%02d",dtp->Year, dtp->Month, dtp->Day );
1222 TIM2.sprintf("%04d%02d%02dT000000",dtp->Year, dtp->Month, dtp->Day );
1223 } else {
1224 TIM2.sprintf("%04d%02d%02dT%02d%02d%02d",dtp->Year, dtp->Month, dtp->Day, dtp->Hour - dtp->Timezone, dtp->Minute, dtp->Second );
1225
1226 }
1227 //printmsg("Stop : %s\n",OSDateTime(Note->Entries[i].Date,false));
1228 //memcpy(&DateTime,&Note->Entries[i].Date,sizeof(GSM_DateTime));
1229 break;
1230 case CAL_ALARM_DATETIME:
1231 ARON = "0";
1232 dtp = &Note->Entries[i].Date ;
1233 ARMN.sprintf("%04d%02d%02dT%02d%02d%02d",dtp->Year, dtp->Month, dtp->Day, dtp->Hour - dtp->Timezone, dtp->Minute, dtp->Second );
1234 //printmsg("Tone alarm : %s\n",OSDateTime(Note->Entries[i].Date,false));
1235 memcpy(&Alarm,&Note->Entries[i].Date,sizeof(GSM_DateTime));
1236 break;
1237 case CAL_SILENT_ALARM_DATETIME:
1238 ARON = "0";
1239 dtp = &Note->Entries[i].Date ;
1240 ARMN.sprintf("%04d%02d%02dT%02d%02d%02d",dtp->Year, dtp->Month, dtp->Day, dtp->Hour - dtp->Timezone, dtp->Minute, dtp->Second );
1241 //printmsg("Silent alarm : %s\n",OSDateTime(Note->Entries[i].Date,false));
1242 //memcpy(&Alarm,&Note->Entries[i].Date,sizeof(GSM_DateTime));
1243 break;
1244 case CAL_RECURRANCE:
1245 //printmsg("Repeat : %d day%s\n",Note->Entries[i].Number/24,((Note->Entries[i].Number/24)>1) ? "s":"" );
1246 break;
1247 case CAL_TEXT:
1248 DSRP = QString ( (const char*) Note->Entries[i].Text );
1249 break;
1250 case CAL_LOCATION:
1251 PLCE = QString ((const char*) Note->Entries[i].Text );
1252 break;
1253 case CAL_PHONE:
1254 //printmsg("Phone : \"%s\"\n",DecodeUnicodeConsole(Note->Entries[i].Text));
1255 break;
1256 case CAL_PRIVATE:
1257 //printmsg("Private : %s\n",Note->Entries[i].Number == 1 ? "Yes" : "No");
1258 break;
1259 case CAL_CONTACTID:
1260#if 0
1261 entry.Location = Note->Entries[i].Number;
1262 entry.MemoryType = MEM_ME;
1263 error=Phone->GetMemory(&s, &entry);
1264 if (error == ERR_NONE) {
1265 name = GSM_PhonebookGetEntryName(&entry);
1266 if (name != NULL) {
1267 //printmsg("Contact ID : \"%s\" (%d)\n", DecodeUnicodeConsole(name), Note->Entries[i].Number);
1268 } else {
1269 //printmsg("Contact ID : %d\n",Note->Entries[i].Number);
1270 }
1271 } else {
1272 //printmsg("Contact ID : %d\n",Note->Entries[i].Number);
1273 }
1274#endif
1275 break;
1276 case CAL_REPEAT_DAYOFWEEK:
1277 repeat_dayofweek = Note->Entries[i].Number;
1278 repeating = true;
1279 break;
1280 case CAL_REPEAT_DAY:
1281 repeat_day = Note->Entries[i].Number;
1282 repeating = true;
1283 break;
1284 case CAL_REPEAT_WEEKOFMONTH:
1285 repeat_weekofmonth = Note->Entries[i].Number;
1286 repeating = true;
1287 break;
1288 case CAL_REPEAT_MONTH:
1289 repeat_month = Note->Entries[i].Number;
1290 repeating = true;
1291 break;
1292 case CAL_REPEAT_FREQUENCY:
1293 repeat_frequency = Note->Entries[i].Number;
1294 repeating = true;
1295 break;
1296 case CAL_REPEAT_STARTDATE:
1297 repeat_startdate = Note->Entries[i].Date;
1298 repeating = true;
1299 break;
1300 case CAL_REPEAT_STOPDATE:
1301 repeat_stopdate = Note->Entries[i].Date;
1302 repeating = true;
1303 break;
1304 }
1305 }
1306
1307
1308
1309 if ( ARON == "0" ) {
1310 QDateTime start,alarm;
1311 start = handler.fromString( TIM1 );
1312 alarm = handler.fromString( ARMN );
1313 int min = alarm.secsTo ( start )/60;
1314 ARMN = QString::number ( min );
1315 }
1316
1317 templist.clear();
1318 templist << CARDID << CATEGORY << DSRP << PLCE << MEM1 << TIM1 << TIM2 << ADAY << ARON << ARMN << ARSD << RTYP << RFRQ << RPOS << RDYS << REND << REDT << ALSD << ALED << MDAY;
1319 handler.startElement( existingCalendar, templist, type );
1320 }
1321
1322
1323
1324#if 0
1325 // qDebug("test %s ", text.latin1());
1326 QStringList templist;
1327 QString tempString;
1328 int start = 0;
1329 int len = text.length();
1330 int end = text.find ("\n",start)+1;
1331 bool ok = true;
1332 start = end;
1333 SharpParser handler( calendar );
1334 handler.setCategoriesList( mCategories );
1335 while ( start > 0 ) {
1336 templist.clear();
1337 ok = true;
1338 while ( ok ) {
1339 tempString = getPart( text, ok, start );
1340 if ( start >= len || start == 0 ) {
1341 start = 0;
1342 ok = false;
1343 }
1344 if ( tempString.right(1) =="\n" )
1345 tempString = tempString.left( tempString.length()-1);
1346 //if ( ok )
1347 templist.append( tempString );
1348 //qDebug("%d ---%s---", templist.count(),tempString.latin1() );
1349 }
1350 handler.startElement( existingCalendar, templist, type );
1351 }
1352#endif
1353 return false;
1354}
1355
1356QString SharpFormat::toString( Calendar * )
1357{
1358 return QString::null;
1359}
diff --git a/libkcal/phoneformat.h b/libkcal/phoneformat.h
new file mode 100644
index 0000000..f4cb52c
--- a/dev/null
+++ b/libkcal/phoneformat.h
@@ -0,0 +1,65 @@
1/*
2 This file is part of libkcal.
3
4 Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
5
6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version.
10
11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details.
15
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
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20*/
21#ifndef SHARPFORMAT_H
22#define SHARPAFORMAT_H
23
24#include <qstring.h>
25
26#include "scheduler.h"
27
28#include "calformat.h"
29extern "C" {
30#include "gammu.h"
31}
32
33namespace KCal {
34
35/**
36 This class implements the calendar format used by Sharp.
37*/
38
39class SharpFormat : public QObject {
40 public:
41 /** Create new iCalendar format. */
42 SharpFormat();
43 virtual ~SharpFormat();
44
45 bool load( Calendar * ,Calendar *);
46 bool save( Calendar * );
47 void setCategoriesList ( QStringList * cat ){ mCategories = cat; }
48 bool fromString2Cal( Calendar *, Calendar *, GSM_StateMachine*s , const QString & );
49 bool fromString( Calendar *, const QString & );
50 QString toString( Calendar * );
51 static ulong getCsum( const QStringList & );
52
53 private:
54 QString getEventString( Event* );
55 QString getTodoString( Todo* );
56 QString dtToString( const QDateTime& dt, bool useTZ = true );
57
58 QStringList *mCategories;
59 int getNumFromRecord( QString answer,Incidence* inc ) ;
60 QString getPart( const QString & text, bool &ok, int &start );
61};
62
63}
64
65#endif