39 #include <QtCore/QRegExp>
40 #include <QtCore/QString>
42 using namespace KCalCore;
48 int korg = productId.indexOf(
"KOrganizer" );
49 int outl9 = productId.indexOf(
"Outlook 9.0" );
52 int versionStart = productId.indexOf(
" ", korg );
53 if ( versionStart >= 0 ) {
54 int versionStop = productId.indexOf( QRegExp(
"[ /]" ), versionStart + 1 );
55 if ( versionStop >= 0 ) {
56 QString version = productId.mid( versionStart + 1,
57 versionStop - versionStart - 1 );
59 int versionNum = version.section(
'.', 0, 0 ).toInt() * 10000 +
60 version.section(
'.', 1, 1 ).toInt() * 100 +
61 version.section(
'.', 2, 2 ).toInt();
62 int releaseStop = productId.indexOf(
"/", versionStop );
64 if ( releaseStop > versionStop ) {
65 release = productId.mid( versionStop+1, releaseStop-versionStop-1 );
67 if ( versionNum < 30100 ) {
69 }
else if ( versionNum < 30200 ) {
71 }
else if ( versionNum == 30200 && release ==
"pre" ) {
72 kDebug() <<
"Generating compat for KOrganizer 3.2 pre";
74 }
else if ( versionNum < 30400 ) {
76 }
else if ( versionNum < 30500 ) {
81 }
else if ( outl9 >= 0 ) {
82 kDebug() <<
"Generating compat for Outlook < 2000 (Outlook 9.0)";
89 if ( implementationVersion.isEmpty() && ( productId.contains(
"libkcal") || productId.contains(
"KOrganizer") || productId.contains(
"KAlarm") ) ) {
111 if ( incidence->summary().isEmpty() && !( incidence->description().isEmpty() ) ) {
112 QString oldDescription = incidence->description().trimmed();
113 QString newSummary( oldDescription );
114 newSummary.remove( QRegExp(
"\n.*" ) );
115 incidence->setSummary( newSummary );
116 if ( oldDescription == newSummary ) {
117 incidence->setDescription(
"" );
124 Q_UNUSED( incidence );
134 Q_UNUSED( incidence );
151 Q_UNUSED( incidence );
156 struct CompatDecorator::Private {
160 CompatDecorator::CompatDecorator(
Compat *compat)
166 CompatDecorator::~CompatDecorator()
174 d->compat->fixEmptySummary( incidence );
179 d->compat->fixAlarms( incidence );
184 d->compat->fixFloatingEnd( date );
189 d->compat->fixRecurrence( incidence );
194 return d->compat->fixPriority( priority );
199 return d->compat->useTimeZoneShift();
204 d->compat->setCreatedToDtStamp( incidence, dtstamp );
209 Recurrence *recurrence = incidence->recurrence();
211 KDateTime start( incidence->dtStart() );
214 if ( r && !r->dateMatchesRules( start ) ) {
215 recurrence->addExDateTime( start );
225 if ( 0 < priority && priority < 6 ) {
227 return 2 * priority - 1;
235 Recurrence *recurrence = incidence->recurrence();
237 recurrence->
setDuration( recurrence->
duration() + incidence->recurrence()->exDates().count() );
245 endDate = endDate.addDays( 1 );
255 r = recur->defaultRRule();
259 if ( duration > 0 ) {
265 QDate end( r->
startDt().date() );
266 bool doNothing =
false;
268 int tmp = ( duration - 1 ) * r->
frequency();
269 switch ( r->recurrenceType() ) {
270 case RecurrenceRule::rWeekly:
272 end = end.addDays( tmp * 7 + 7 - end.dayOfWeek() );
275 case RecurrenceRule::rMonthly:
277 int month = end.month() - 1 + tmp;
278 end.setYMD( end.year() + month / 12, month % 12 + 1, 31 );
281 case RecurrenceRule::rYearly:
283 end.setYMD( end.year() + tmp, 12, 31 );
292 KDateTime( end, QTime( 0, 0, 0 ), incidence->dtStart().timeSpec() ) );
300 QList<int> days = r->byYearDays();
301 if ( !days.isEmpty() ) {
302 QList<int> months = r->byMonths();
303 for (
int i = 0; i < months.size(); ++i ) {
305 QDate( r->
startDt().date().year(), 1, 1 ).addDays( months.at( i ) - 1 ).month();
306 if ( !months.contains( newmonth ) ) {
307 months.append( newmonth );
311 r->setByMonths( months );
313 r->setByYearDays( days );
324 Alarm::List::Iterator it;
325 for ( it = alarms.begin(); it != alarms.end(); ++it ) {
327 if ( al && al->hasStartOffset() ) {
328 Duration offsetDuration = al->startOffset();
333 al->setStartOffset( offsetDuration );
343 CompatPre410::CompatPre410(
Compat* decoratedCompat )
351 if ( dtstamp.isValid() ) {
352 incidence->setCreated( dtstamp );