summaryrefslogtreecommitdiff
path: root/library/backend
Unidiff
Diffstat (limited to 'library/backend') (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/event.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/library/backend/event.cpp b/library/backend/event.cpp
index 7cac314..7ccf16b 100644
--- a/library/backend/event.cpp
+++ b/library/backend/event.cpp
@@ -902,384 +902,418 @@ const Event &EffectiveEvent::event() const
902 902
903/*! 903/*!
904 \internal 904 \internal
905*/ 905*/
906const QTime &EffectiveEvent::end() const 906const QTime &EffectiveEvent::end() const
907{ 907{
908 return mEnd; 908 return mEnd;
909} 909}
910 910
911/*! 911/*!
912 \internal 912 \internal
913*/ 913*/
914const QTime &EffectiveEvent::start() const 914const QTime &EffectiveEvent::start() const
915{ 915{
916 return mStart; 916 return mStart;
917} 917}
918 918
919/*! 919/*!
920 Returns the date the effective event occurs on. 920 Returns the date the effective event occurs on.
921*/ 921*/
922const QDate &EffectiveEvent::date() const 922const QDate &EffectiveEvent::date() const
923{ 923{
924 return mDate; 924 return mDate;
925} 925}
926 926
927/*! 927/*!
928 \internal 928 \internal
929*/ 929*/
930int EffectiveEvent::length() const 930int EffectiveEvent::length() const
931{ 931{
932 return (mEnd.hour() * 60 - mStart.hour() * 60) 932 return (mEnd.hour() * 60 - mStart.hour() * 60)
933 + QABS(mStart.minute() - mEnd.minute() ); 933 + QABS(mStart.minute() - mEnd.minute() );
934} 934}
935 935
936/*! 936/*!
937 \internal 937 \internal
938*/ 938*/
939void EffectiveEvent::setDate( const QDate &dt ) 939void EffectiveEvent::setDate( const QDate &dt )
940{ 940{
941 mDate = dt; 941 mDate = dt;
942} 942}
943 943
944/*! 944/*!
945 \internal 945 \internal
946*/ 946*/
947void EffectiveEvent::setStart( const QTime &start ) 947void EffectiveEvent::setStart( const QTime &start )
948{ 948{
949 mStart = start; 949 mStart = start;
950} 950}
951 951
952/*! 952/*!
953 \internal 953 \internal
954*/ 954*/
955void EffectiveEvent::setEnd( const QTime &end ) 955void EffectiveEvent::setEnd( const QTime &end )
956{ 956{
957 mEnd = end; 957 mEnd = end;
958} 958}
959 959
960/*! 960/*!
961 \internal 961 \internal
962*/ 962*/
963void EffectiveEvent::setEvent( Event e ) 963void EffectiveEvent::setEvent( Event e )
964{ 964{
965 mEvent = e; 965 mEvent = e;
966} 966}
967 967
968/*! 968/*!
969 \internal 969 \internal
970*/ 970*/
971bool EffectiveEvent::operator<( const EffectiveEvent &e ) const 971bool EffectiveEvent::operator<( const EffectiveEvent &e ) const
972{ 972{
973 if ( mDate < e.date() ) 973 if ( mDate < e.date() )
974 return TRUE; 974 return TRUE;
975 if ( mDate == e.date() ) 975 if ( mDate == e.date() )
976 return ( mStart < e.start() ); 976 return ( mStart < e.start() );
977 else 977 else
978 return FALSE; 978 return FALSE;
979} 979}
980 980
981/*! 981/*!
982 \internal 982 \internal
983*/ 983*/
984bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const 984bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const
985{ 985{
986 return (mDate <= e.date() ); 986 return (mDate <= e.date() );
987} 987}
988 988
989/*! 989/*!
990 \internal 990 \internal
991*/ 991*/
992bool EffectiveEvent::operator==( const EffectiveEvent &e ) const 992bool EffectiveEvent::operator==( const EffectiveEvent &e ) const
993{ 993{
994 return ( mDate == e.date() 994 return ( mDate == e.date()
995 && mStart == e.start() 995 && mStart == e.start()
996 && mEnd == e.end() 996 && mEnd == e.end()
997 && mEvent == e.event() ); 997 && mEvent == e.event() );
998} 998}
999 999
1000/*! 1000/*!
1001 \internal 1001 \internal
1002*/ 1002*/
1003bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const 1003bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const
1004{ 1004{
1005 return !(*this == e); 1005 return !(*this == e);
1006} 1006}
1007 1007
1008/*! 1008/*!
1009 \internal 1009 \internal
1010*/ 1010*/
1011bool EffectiveEvent::operator>( const EffectiveEvent &e ) const 1011bool EffectiveEvent::operator>( const EffectiveEvent &e ) const
1012{ 1012{
1013 return !(*this <= e ); 1013 return !(*this <= e );
1014} 1014}
1015 1015
1016/*! 1016/*!
1017 \internal 1017 \internal
1018*/ 1018*/
1019bool EffectiveEvent::operator>=(const EffectiveEvent &e) const 1019bool EffectiveEvent::operator>=(const EffectiveEvent &e) const
1020{ 1020{
1021 return !(*this < e); 1021 return !(*this < e);
1022} 1022}
1023 1023
1024/*! 1024/*!
1025 \internal 1025 \internal
1026*/ 1026*/
1027void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to ) 1027void EffectiveEvent::setEffectiveDates( const QDate &from, const QDate &to )
1028{ 1028{
1029 if ( !from.isValid() ) { 1029 if ( !from.isValid() ) {
1030 delete d; 1030 delete d;
1031 d = 0; 1031 d = 0;
1032 return; 1032 return;
1033 } 1033 }
1034 if ( !d ) 1034 if ( !d )
1035 d = new EffectiveEventPrivate; 1035 d = new EffectiveEventPrivate;
1036 d->startDate = from; 1036 d->startDate = from;
1037 d->endDate = to; 1037 d->endDate = to;
1038} 1038}
1039 1039
1040/*! 1040/*!
1041 \internal 1041 \internal
1042*/ 1042*/
1043QDate EffectiveEvent::startDate() const 1043QDate EffectiveEvent::startDate() const
1044{ 1044{
1045 if ( d ) 1045 if ( d )
1046 return d->startDate; 1046 return d->startDate;
1047 else if ( mEvent.hasRepeat() ) 1047 else if ( mEvent.hasRepeat() )
1048 return mDate; // single day, since multi-day should have a d pointer 1048 return mDate; // single day, since multi-day should have a d pointer
1049 else 1049 else
1050 return mEvent.start().date(); 1050 return mEvent.start().date();
1051} 1051}
1052 1052
1053/*! 1053/*!
1054 \internal 1054 \internal
1055*/ 1055*/
1056QDate EffectiveEvent::endDate() const 1056QDate EffectiveEvent::endDate() const
1057{ 1057{
1058 if ( d ) 1058 if ( d )
1059 return d->endDate; 1059 return d->endDate;
1060 else if ( mEvent.hasRepeat() ) 1060 else if ( mEvent.hasRepeat() )
1061 return mDate; // single day, since multi-day should have a d pointer 1061 return mDate; // single day, since multi-day should have a d pointer
1062 else 1062 else
1063 return mEvent.end().date(); 1063 return mEvent.end().date();
1064} 1064}
1065 1065
1066/*! 1066/*!
1067 \internal 1067 \internal
1068*/ 1068*/
1069int EffectiveEvent::size() const 1069int EffectiveEvent::size() const
1070{ 1070{
1071 return ( mEnd.hour() - mStart.hour() ) * 3600 1071 return ( mEnd.hour() - mStart.hour() ) * 3600
1072 + (mEnd.minute() - mStart.minute() * 60 1072 + (mEnd.minute() - mStart.minute() * 60
1073 + mEnd.second() - mStart.second() ); 1073 + mEnd.second() - mStart.second() );
1074} 1074}
1075 1075
1076 1076
1077// vcal conversion code 1077// vcal conversion code
1078static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value ) 1078static inline VObject *safeAddPropValue( VObject *o, const char *prop, const QString &value )
1079{ 1079{
1080 VObject *ret = 0; 1080 VObject *ret = 0;
1081 if ( o && !value.isEmpty() ) 1081 if ( o && !value.isEmpty() )
1082 ret = addPropValue( o, prop, value.latin1() ); 1082 ret = addPropValue( o, prop, value.latin1() );
1083 return ret; 1083 return ret;
1084} 1084}
1085 1085
1086static inline VObject *safeAddProp( VObject *o, const char *prop) 1086static inline VObject *safeAddProp( VObject *o, const char *prop)
1087{ 1087{
1088 VObject *ret = 0; 1088 VObject *ret = 0;
1089 if ( o ) 1089 if ( o )
1090 ret = addProp( o, prop ); 1090 ret = addProp( o, prop );
1091 return ret; 1091 return ret;
1092} 1092}
1093 1093
1094/*
1095 * Until we support vCal/iCal right
1096 * we will make DTSTART and other things
1097 * be floating in the sense of
1098 * RFC 2445
1099 */
1100namespace {
1101/*
1102 * Convert QDateTime to iso8601 but take
1103 * local time and do not use the Z at the end
1104 *
1105 */
1106 QCString toISOLocal( const QDateTime& dt ) {
1107 QCString str;
1108 /*
1109 * year month day T Hour Minute Second
1110 * 4 2 2 2 2 2 digits
1111 */
1112 str.sprintf("%04d%02d%02dT%02d%02d%02d",
1113 dt.date().year(),
1114 dt.date().month(),
1115 dt.date().year(),
1116 dt.time().hour(),
1117 dt.time().minute(),
1118 dt.time().second() );
1119
1120
1121
1122 return str;
1123 }
1124
1125
1126};
1127
1094static VObject *createVObject( const Event &e ) 1128static VObject *createVObject( const Event &e )
1095{ 1129{
1096 VObject *vcal = newVObject( VCCalProp ); 1130 VObject *vcal = newVObject( VCCalProp );
1097 safeAddPropValue( vcal, VCVersionProp, "1.0" ); 1131 safeAddPropValue( vcal, VCVersionProp, "1.0" );
1098 VObject *event = safeAddProp( vcal, VCEventProp ); 1132 VObject *event = safeAddProp( vcal, VCEventProp );
1099 1133
1100 safeAddPropValue( event, VCDTstartProp, TimeConversion::toISO8601( e.start() ) ); 1134 safeAddPropValue( event, VCDTstartProp, TimeConversion::toISO8601( e.start() ) );
1101 safeAddPropValue( event, VCDTendProp, TimeConversion::toISO8601( e.end() ) ); 1135 safeAddPropValue( event, VCDTendProp, TimeConversion::toISO8601( e.end() ) );
1102 safeAddPropValue( event, "X-Qtopia-NOTES", e.description() ); 1136 safeAddPropValue( event, "X-Qtopia-NOTES", e.description() );
1103 safeAddPropValue( event, VCDescriptionProp, e.description() ); 1137 safeAddPropValue( event, VCDescriptionProp, e.description() );
1104 safeAddPropValue( event, VCLocationProp, e.location() ); 1138 safeAddPropValue( event, VCLocationProp, e.location() );
1105 1139
1106 if ( e.hasAlarm() ) { 1140 if ( e.hasAlarm() ) {
1107 VObject *alarm = safeAddProp( event, VCAAlarmProp ); 1141 VObject *alarm = safeAddProp( event, VCAAlarmProp );
1108 QDateTime dt = e.start(); 1142 QDateTime dt = e.start();
1109 dt = dt.addSecs( -e.alarmTime()*60 ); 1143 dt = dt.addSecs( -e.alarmTime()*60 );
1110 safeAddPropValue( alarm, VCRunTimeProp, TimeConversion::toISO8601( dt ) ); 1144 safeAddPropValue( alarm, VCRunTimeProp, TimeConversion::toISO8601( dt ) );
1111 safeAddPropValue( alarm, VCAudioContentProp, 1145 safeAddPropValue( alarm, VCAudioContentProp,
1112 (e.alarmSound() == Event::Silent ? "silent" : "alarm" ) ); 1146 (e.alarmSound() == Event::Silent ? "silent" : "alarm" ) );
1113 } 1147 }
1114 1148
1115 safeAddPropValue( event, "X-Qtopia-TIMEZONE", e.timeZone() ); 1149 safeAddPropValue( event, "X-Qtopia-TIMEZONE", e.timeZone() );
1116 1150
1117 if ( e.type() == Event::AllDay ) 1151 if ( e.type() == Event::AllDay )
1118 safeAddPropValue( event, "X-Qtopia-AllDay", e.timeZone() ); 1152 safeAddPropValue( event, "X-Qtopia-AllDay", e.timeZone() );
1119 1153
1120 // ### repeat missing 1154 // ### repeat missing
1121 1155
1122 // ### categories missing 1156 // ### categories missing
1123 1157
1124 return vcal; 1158 return vcal;
1125} 1159}
1126 1160
1127 1161
1128static Event parseVObject( VObject *obj ) 1162static Event parseVObject( VObject *obj )
1129{ 1163{
1130 Event e; 1164 Event e;
1131 1165
1132 bool haveAlarm = FALSE; 1166 bool haveAlarm = FALSE;
1133 bool haveStart = FALSE; 1167 bool haveStart = FALSE;
1134 bool haveEnd = FALSE; 1168 bool haveEnd = FALSE;
1135 QDateTime alarmTime; 1169 QDateTime alarmTime;
1136 Event::SoundTypeChoice soundType = Event::Silent; 1170 Event::SoundTypeChoice soundType = Event::Silent;
1137 1171
1138 VObjectIterator it; 1172 VObjectIterator it;
1139 initPropIterator( &it, obj ); 1173 initPropIterator( &it, obj );
1140 while( moreIteration( &it ) ) { 1174 while( moreIteration( &it ) ) {
1141 VObject *o = nextVObject( &it ); 1175 VObject *o = nextVObject( &it );
1142 QCString name = vObjectName( o ); 1176 QCString name = vObjectName( o );
1143 QCString value = vObjectStringZValue( o ); 1177 QCString value = vObjectStringZValue( o );
1144 if ( name == VCDTstartProp ) { 1178 if ( name == VCDTstartProp ) {
1145 e.setStart( TimeConversion::fromISO8601( value ) ); 1179 e.setStart( TimeConversion::fromISO8601( value ) );
1146 haveStart = TRUE; 1180 haveStart = TRUE;
1147 } 1181 }
1148 else if ( name == VCDTendProp ) { 1182 else if ( name == VCDTendProp ) {
1149 e.setEnd( TimeConversion::fromISO8601( value ) ); 1183 e.setEnd( TimeConversion::fromISO8601( value ) );
1150 haveEnd = TRUE; 1184 haveEnd = TRUE;
1151 } 1185 }
1152 else if ( name == "X-Qtopia-NOTES" ) { 1186 else if ( name == "X-Qtopia-NOTES" ) {
1153 e.setNotes( value ); 1187 e.setNotes( value );
1154 } 1188 }
1155 else if ( name == VCDescriptionProp ) { 1189 else if ( name == VCDescriptionProp ) {
1156 e.setDescription( value ); 1190 e.setDescription( value );
1157 } 1191 }
1158 else if ( name == VCLocationProp ) { 1192 else if ( name == VCLocationProp ) {
1159 e.setLocation( value ); 1193 e.setLocation( value );
1160 } 1194 }
1161 else if ( name == VCAudioContentProp ) { 1195 else if ( name == VCAudioContentProp ) {
1162 haveAlarm = TRUE; 1196 haveAlarm = TRUE;
1163 VObjectIterator nit; 1197 VObjectIterator nit;
1164 initPropIterator( &nit, o ); 1198 initPropIterator( &nit, o );
1165 while( moreIteration( &nit ) ) { 1199 while( moreIteration( &nit ) ) {
1166 VObject *o = nextVObject( &nit ); 1200 VObject *o = nextVObject( &nit );
1167 QCString name = vObjectName( o ); 1201 QCString name = vObjectName( o );
1168 QCString value = vObjectStringZValue( o ); 1202 QCString value = vObjectStringZValue( o );
1169 if ( name == VCRunTimeProp ) 1203 if ( name == VCRunTimeProp )
1170 alarmTime = TimeConversion::fromISO8601( value ); 1204 alarmTime = TimeConversion::fromISO8601( value );
1171 else if ( name == VCAudioContentProp ) { 1205 else if ( name == VCAudioContentProp ) {
1172 if ( value == "silent" ) 1206 if ( value == "silent" )
1173 soundType = Event::Silent; 1207 soundType = Event::Silent;
1174 else 1208 else
1175 soundType = Event::Loud; 1209 soundType = Event::Loud;
1176 } 1210 }
1177 } 1211 }
1178 } 1212 }
1179 else if ( name == "X-Qtopia-TIMEZONE") { 1213 else if ( name == "X-Qtopia-TIMEZONE") {
1180 e.setTimeZone( value ); 1214 e.setTimeZone( value );
1181 } 1215 }
1182 else if ( name == "X-Qtopia-AllDay" ) { 1216 else if ( name == "X-Qtopia-AllDay" ) {
1183 e.setType( Event::AllDay ); 1217 e.setType( Event::AllDay );
1184 } 1218 }
1185#if 0 1219#if 0
1186 else { 1220 else {
1187 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) ); 1221 printf("Name: %s, value=%s\n", name.data(), vObjectStringZValue( o ) );
1188 VObjectIterator nit; 1222 VObjectIterator nit;
1189 initPropIterator( &nit, o ); 1223 initPropIterator( &nit, o );
1190 while( moreIteration( &nit ) ) { 1224 while( moreIteration( &nit ) ) {
1191 VObject *o = nextVObject( &nit ); 1225 VObject *o = nextVObject( &nit );
1192 QCString name = vObjectName( o ); 1226 QCString name = vObjectName( o );
1193 QString value = vObjectStringZValue( o ); 1227 QString value = vObjectStringZValue( o );
1194 printf(" subprop: %s = %s\n", name.data(), value.latin1() ); 1228 printf(" subprop: %s = %s\n", name.data(), value.latin1() );
1195 } 1229 }
1196 } 1230 }
1197#endif 1231#endif
1198 } 1232 }
1199 1233
1200 if ( !haveStart && !haveEnd ) 1234 if ( !haveStart && !haveEnd )
1201 e.setStart( QDateTime::currentDateTime() ); 1235 e.setStart( QDateTime::currentDateTime() );
1202 1236
1203 if ( !haveEnd ) { 1237 if ( !haveEnd ) {
1204 e.setType( Event::AllDay ); 1238 e.setType( Event::AllDay );
1205 e.setEnd( e.start() ); 1239 e.setEnd( e.start() );
1206 } 1240 }
1207 1241
1208 if ( haveAlarm ) { 1242 if ( haveAlarm ) {
1209 int minutes = alarmTime.secsTo( e.start() ) / 60; 1243 int minutes = alarmTime.secsTo( e.start() ) / 60;
1210 e.setAlarm( TRUE, minutes, soundType ); 1244 e.setAlarm( TRUE, minutes, soundType );
1211 } 1245 }
1212 return e; 1246 return e;
1213} 1247}
1214 1248
1215 1249
1216/*! 1250/*!
1217 Writes the list of \a events as a set of VCards to the file \a filename. 1251 Writes the list of \a events as a set of VCards to the file \a filename.
1218*/ 1252*/
1219void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events) 1253void Event::writeVCalendar( const QString &filename, const QValueList<Event> &events)
1220{ 1254{
1221 1255
1222 QFileDirect f( filename.utf8().data() ); 1256 QFileDirect f( filename.utf8().data() );
1223 1257
1224 if ( !f.open( IO_WriteOnly ) ) { 1258 if ( !f.open( IO_WriteOnly ) ) {
1225 1259
1226 qWarning("Unable to open vcard write"); 1260 qWarning("Unable to open vcard write");
1227 1261
1228 return; 1262 return;
1229 1263
1230 } 1264 }
1231 1265
1232 1266
1233 QValueList<Event>::ConstIterator it; 1267 QValueList<Event>::ConstIterator it;
1234 for( it = events.begin(); it != events.end(); ++it ) { 1268 for( it = events.begin(); it != events.end(); ++it ) {
1235 VObject *obj = createVObject( *it ); 1269 VObject *obj = createVObject( *it );
1236 writeVObject( f.directHandle() , obj ); 1270 writeVObject( f.directHandle() , obj );
1237 cleanVObject( obj ); 1271 cleanVObject( obj );
1238 } 1272 }
1239 1273
1240 1274
1241 cleanStrTbl(); 1275 cleanStrTbl();
1242} 1276}
1243 1277
1244/*! 1278/*!
1245 Writes \a event as a VCard to the file \a filename. 1279 Writes \a event as a VCard to the file \a filename.
1246*/ 1280*/
1247void Event::writeVCalendar( const QString &filename, const Event &event) 1281void Event::writeVCalendar( const QString &filename, const Event &event)
1248{ 1282{
1249 1283
1250 QFileDirect f( filename.utf8().data() ); 1284 QFileDirect f( filename.utf8().data() );
1251 1285
1252 if ( !f.open( IO_WriteOnly ) ) { 1286 if ( !f.open( IO_WriteOnly ) ) {
1253 1287
1254 qWarning("Unable to open vcard write"); 1288 qWarning("Unable to open vcard write");
1255 1289
1256 return; 1290 return;
1257 1291
1258 } 1292 }
1259 1293
1260 1294
1261 VObject *obj = createVObject( event ); 1295 VObject *obj = createVObject( event );
1262 writeVObject( f.directHandle() , obj ); 1296 writeVObject( f.directHandle() , obj );
1263 cleanVObject( obj ); 1297 cleanVObject( obj );
1264 1298
1265 cleanStrTbl(); 1299 cleanStrTbl();
1266} 1300}
1267 1301
1268/*! 1302/*!
1269 Returns the set of events read as VCards from the file \a filename. 1303 Returns the set of events read as VCards from the file \a filename.
1270*/ 1304*/
1271QValueList<Event> Event::readVCalendar( const QString &filename ) 1305QValueList<Event> Event::readVCalendar( const QString &filename )
1272{ 1306{
1273 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() ); 1307 VObject *obj = Parse_MIME_FromFileName( (char *)filename.utf8().data() );
1274 1308
1275 QValueList<Event> events; 1309 QValueList<Event> events;
1276 1310
1277 while ( obj ) { 1311 while ( obj ) {
1278 QCString name = vObjectName( obj ); 1312 QCString name = vObjectName( obj );
1279 if ( name == VCCalProp ) { 1313 if ( name == VCCalProp ) {
1280 VObjectIterator nit; 1314 VObjectIterator nit;
1281 initPropIterator( &nit, obj ); 1315 initPropIterator( &nit, obj );
1282 while( moreIteration( &nit ) ) { 1316 while( moreIteration( &nit ) ) {
1283 VObject *o = nextVObject( &nit ); 1317 VObject *o = nextVObject( &nit );
1284 QCString name = vObjectName( o ); 1318 QCString name = vObjectName( o );
1285 if ( name == VCEventProp ) 1319 if ( name == VCEventProp )