resourcekabc.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <typeinfo>
00023 #include <stdlib.h>
00024
00025 #include <qdatetime.h>
00026 #include <qstring.h>
00027 #include <qptrlist.h>
00028
00029 #include <klocale.h>
00030 #include <kdebug.h>
00031 #include <kurl.h>
00032 #include <kio/job.h>
00033 #include <kstandarddirs.h>
00034
00035 #include <kabc/stdaddressbook.h>
00036 #include <kabc/locknull.h>
00037
00038 #include "vcaldrag.h"
00039 #include "vcalformat.h"
00040 #include "icalformat.h"
00041 #include "exceptions.h"
00042 #include "incidence.h"
00043 #include "event.h"
00044 #include "todo.h"
00045 #include "journal.h"
00046 #include "filestorage.h"
00047 #include "libkcal/alarm.h"
00048
00049 #include <kresources/configwidget.h>
00050
00051 #include "resourcekabcconfig.h"
00052
00053 #include "resourcekabc.h"
00054
00055 using namespace KCal;
00056
00057 extern "C"
00058 {
00059 void *init_kcal_kabc()
00060 {
00061 return new KRES::PluginFactory<ResourceKABC,ResourceKABCConfig>();
00062 }
00063 }
00064
00065
00066 ResourceKABC::ResourceKABC( const KConfig* config )
00067 : ResourceCalendar( config )
00068 {
00069 if ( config ) {
00070 readConfig( config );
00071 }
00072
00073 init();
00074 }
00075
00076 ResourceKABC::ResourceKABC( )
00077 : ResourceCalendar( 0 )
00078 {
00079 mAlarmDays = 1;
00080 mAlarm = false;
00081
00082 init();
00083 }
00084
00085 ResourceKABC::~ResourceKABC()
00086 {
00087 delete mLock;
00088 }
00089
00090 void ResourceKABC::init()
00091 {
00092 setType( "birthdays" );
00093
00094 mOpen = false;
00095 setReadOnly( true );
00096
00097 mLock = new KABC::LockNull( false );
00098
00099 mAddressbook = 0;
00100 }
00101
00102 void ResourceKABC::readConfig( const KConfig *config )
00103 {
00104 mAlarmDays = config->readNumEntry( "AlarmDays", 1 );
00105 mAlarm = config->readBoolEntry( "Alarm", false );
00106 }
00107
00108 void ResourceKABC::writeConfig( KConfig *config )
00109 {
00110 ResourceCalendar::writeConfig( config );
00111 config->writeEntry( "AlarmDays", mAlarmDays );
00112 config->writeEntry( "Alarm", mAlarm );
00113
00114 }
00115
00116
00117 bool ResourceKABC::doOpen()
00118 {
00119 kdDebug(5800) << "ResourceKABC::doOpen()" << endl;
00120
00121 mAddressbook = KABC::StdAddressBook::self();
00122 connect( mAddressbook, SIGNAL(addressBookChanged(AddressBook*)), SLOT( reload() ) );
00123
00124 mOpen = true;
00125
00126 return true;
00127 }
00128
00129 bool ResourceKABC::doLoad()
00130 {
00131 kdDebug(5800) << "ResourceKABC::load()" << endl;
00132
00133 if ( !mOpen ) return true;
00134
00135 mCalendar.close();
00136
00137
00138 QString summary;
00139
00140 KABC::Addressee::List anniversaries;
00141 KABC::Addressee::List::Iterator addrIt;
00142
00143 KABC::AddressBook::Iterator it;
00144 for ( it = mAddressbook->begin(); it != mAddressbook->end(); ++it ) {
00145
00146 QDateTime birthdate = (*it).birthday().date();
00147 if ( birthdate.isValid() ) {
00148 kdDebug(5800) << "found a birthday " << birthdate.toString() << endl;
00149
00150 QString name = (*it).nickName();
00151 if (name.isEmpty()) name = (*it).realName();
00152 summary = i18n("%1's birthday").arg( name );
00153
00154 Event *ev = new Event();
00155
00156 ev->setDtStart(birthdate);
00157 ev->setDtEnd(birthdate);
00158 ev->setHasEndDate(true);
00159 ev->setFloats(true);
00160 ev->setTransparency( Event::Transparent );
00161
00162 ev->setSummary(summary);
00163
00164
00165 Recurrence *vRecurrence = ev->recurrence();
00166 vRecurrence->setRecurStart(birthdate);
00167 vRecurrence->setYearly(Recurrence::rYearlyMonth,1,-1);
00168 vRecurrence->addYearlyNum(birthdate.date().month());
00169
00170 ev->clearAlarms();
00171
00172 if ( mAlarm ) {
00173
00174 Alarm* vAlarm = ev->newAlarm();
00175 vAlarm->setText(summary);
00176 vAlarm->setTime(birthdate);
00177
00178 vAlarm->setStartOffset( -1440 * mAlarmDays );
00179 vAlarm->setEnabled(true);
00180 }
00181
00182
00183 ev->setCategories(i18n("Birthday"));
00184
00185 ev->setReadOnly( true );
00186 mCalendar.addEvent(ev);
00187 kdDebug(5800) << "imported " << birthdate.toString() << endl;
00188 }
00189
00190 QString anniversary_string = (*it).custom( "KADDRESSBOOK", "X-Anniversary" );
00191 if (anniversary_string.isEmpty() )
00192 continue;
00193 QDateTime anniversary = QDate::fromString( anniversary_string, Qt::ISODate );
00194 if ( !anniversary.isValid() )
00195 continue;
00196
00197 QString name = (*it).custom( "KADDRESSBOOK", "X-SpousesName" );
00198 if ( name.isEmpty() )
00199 anniversaries.append( *it );
00200 else {
00201 bool found = false;
00202 for ( addrIt = anniversaries.begin(); addrIt != anniversaries.end(); ++addrIt ) {
00203 if ( name == (*addrIt).realName() ) {
00204 QDateTime spouseAnniversary = QDate::fromString( (*addrIt).custom( "KADDRESSBOOK", "X-Anniversary" ), Qt::ISODate );
00205 if ( anniversary == spouseAnniversary ) {
00206 found = true;
00207 break;
00208
00209 }
00210 }
00211 }
00212
00213 if ( !found )
00214 anniversaries.append( *it );
00215 }
00216 }
00217
00218 for ( addrIt = anniversaries.begin(); addrIt != anniversaries.end(); ++addrIt ) {
00219 QDateTime anniversary = QDate::fromString( (*addrIt).custom( "KADDRESSBOOK", "X-Anniversary" ), Qt::ISODate );
00220 kdDebug(5800) << "found a anniversary " << anniversary.toString() << endl;
00221
00222 QString name = (*addrIt).nickName();
00223 QString spouseName = (*addrIt).custom( "KADDRESSBOOK", "X-SpousesName" );
00224 if ( name.isEmpty() )
00225 name = (*addrIt).givenName();
00226 if ( !spouseName.isEmpty() ) {
00227 KABC::Addressee spouse;
00228 spouse.setNameFromString( spouseName );
00229 name += " & " + spouse.givenName();
00230 }
00231 summary = i18n("%1's anniversary").arg( name );
00232
00233 Event *ev = new Event();
00234
00235 ev->setDtStart(anniversary);
00236 ev->setDtEnd(anniversary);
00237 ev->setHasEndDate(true);
00238 ev->setFloats(true);
00239
00240 ev->setSummary(summary);
00241
00242
00243 Recurrence *vRecurrence = ev->recurrence();
00244 vRecurrence->setRecurStart(anniversary);
00245 vRecurrence->setYearly(Recurrence::rYearlyMonth,1,-1);
00246 vRecurrence->addYearlyNum(anniversary.date().month());
00247
00248 ev->clearAlarms();
00249
00250 if ( mAlarm ) {
00251
00252 Alarm* vAlarm = ev->newAlarm();
00253 vAlarm->setText(summary);
00254 vAlarm->setTime(anniversary);
00255
00256 vAlarm->setStartOffset( -1440 * mAlarmDays );
00257 vAlarm->setEnabled(true);
00258 }
00259
00260
00261 ev->setCategories(i18n("Anniversary"));
00262
00263 ev->setReadOnly( true );
00264 mCalendar.addEvent(ev);
00265 kdDebug(5800) << "imported " << anniversary.toString() << endl;
00266 }
00267
00268 return true;
00269 }
00270
00271 void ResourceKABC::setAlarm( bool a )
00272 {
00273 mAlarm = a;
00274 }
00275
00276 bool ResourceKABC::alarm()
00277 {
00278 return mAlarm;
00279 }
00280
00281 void ResourceKABC::setAlarmDays( int ad )
00282 {
00283 mAlarmDays = ad;
00284 }
00285
00286 int ResourceKABC::alarmDays()
00287 {
00288 return mAlarmDays;
00289 }
00290
00291 bool ResourceKABC::doSave()
00292 {
00293
00294 return true;
00295 }
00296
00297 bool ResourceKABC::isSaving()
00298 {
00299 return false;
00300 }
00301
00302 KABC::Lock *ResourceKABC::lock()
00303 {
00304 return mLock;
00305 }
00306
00307 void ResourceKABC::doClose()
00308 {
00309 if ( !mOpen ) return;
00310
00311 mCalendar.close();
00312 mOpen = false;
00313 }
00314
00315
00316 bool ResourceKABC::addEvent(Event*)
00317 {
00318 return false;
00319 }
00320
00321 void ResourceKABC::deleteEvent(Event*)
00322 {
00323 }
00324
00325
00326 Event *ResourceKABC::event( const QString &uid )
00327 {
00328 return mCalendar.event( uid );
00329 }
00330
00331 Event::List ResourceKABC::rawEventsForDate(const QDate &qd, bool sorted)
00332 {
00333 return mCalendar.rawEventsForDate( qd, sorted );
00334 }
00335
00336
00337 Event::List ResourceKABC::rawEvents( const QDate &start, const QDate &end,
00338 bool inclusive )
00339 {
00340 return mCalendar.rawEvents( start, end, inclusive );
00341 }
00342
00343 Event::List ResourceKABC::rawEventsForDate(const QDateTime &qdt)
00344 {
00345 return mCalendar.rawEventsForDate( qdt.date() );
00346 }
00347
00348 Event::List ResourceKABC::rawEvents()
00349 {
00350 return mCalendar.rawEvents();
00351 }
00352
00353 bool ResourceKABC::addTodo(Todo*)
00354 {
00355 return false;
00356 }
00357
00358 void ResourceKABC::deleteTodo(Todo*)
00359 {
00360 }
00361
00362
00363 Todo::List ResourceKABC::rawTodos()
00364 {
00365 return mCalendar.rawTodos();
00366 }
00367
00368 Todo *ResourceKABC::todo( const QString &uid )
00369 {
00370 return mCalendar.todo( uid );
00371 }
00372
00373 Todo::List ResourceKABC::rawTodosForDate( const QDate &date )
00374 {
00375 return mCalendar.rawTodosForDate( date );
00376 }
00377
00378
00379 bool ResourceKABC::addJournal(Journal*)
00380 {
00381 return false;
00382 }
00383
00384 void ResourceKABC::deleteJournal(Journal*)
00385 {
00386 }
00387
00388 Journal *ResourceKABC::journal(const QDate &date)
00389 {
00390
00391
00392 return mCalendar.journal( date );
00393 }
00394
00395 Journal *ResourceKABC::journal(const QString &uid)
00396 {
00397 return mCalendar.journal( uid );
00398 }
00399
00400 Journal::List ResourceKABC::journals()
00401 {
00402 return mCalendar.journals();
00403 }
00404
00405
00406 Alarm::List ResourceKABC::alarmsTo( const QDateTime &to )
00407 {
00408 return mCalendar.alarmsTo( to );
00409 }
00410
00411 Alarm::List ResourceKABC::alarms( const QDateTime &from, const QDateTime &to )
00412 {
00413
00414
00415 return mCalendar.alarms( from, to );
00416 }
00417
00418 void ResourceKABC::dump() const
00419 {
00420 ResourceCalendar::dump();
00421 }
00422
00423 void ResourceKABC::reload()
00424 {
00425 load();
00426 }
00427
00428 void ResourceKABC::setTimeZoneId( const QString& tzid )
00429 {
00430 mCalendar.setTimeZoneId( tzid );
00431 }
00432
00433 #include "resourcekabc.moc"
This file is part of the documentation for libkcal Library Version 3.3.2.