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
load();
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"