diff options
Diffstat (limited to 'tderesources/birthdays/resourcetdeabc.cpp')
-rw-r--r-- | tderesources/birthdays/resourcetdeabc.cpp | 528 |
1 files changed, 528 insertions, 0 deletions
diff --git a/tderesources/birthdays/resourcetdeabc.cpp b/tderesources/birthdays/resourcetdeabc.cpp new file mode 100644 index 000000000..d36ebdddb --- /dev/null +++ b/tderesources/birthdays/resourcetdeabc.cpp @@ -0,0 +1,528 @@ +/* + This file is part of libkcal. + + Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include <typeinfo> +#include <stdlib.h> + +#include <tqdatetime.h> +#include <tqstring.h> +#include <tqptrlist.h> + +#include <tdelocale.h> +#include <kdebug.h> +#include <kurl.h> +#include <tdeio/job.h> +#include <kstandarddirs.h> + +#include <tdeabc/stdaddressbook.h> +#include <tdeabc/locknull.h> + +#include "libkcal/vcaldrag.h" +#include "libkcal/vcalformat.h" +#include "libkcal/icalformat.h" +#include "libkcal/exceptions.h" +#include "libkcal/incidence.h" +#include "libkcal/event.h" +#include "libkcal/todo.h" +#include "libkcal/journal.h" +#include "libkcal/filestorage.h" +#include "libkcal/alarm.h" + +#include <libemailfunctions/email.h> + +#include <tderesources/configwidget.h> + +#include "resourcetdeabcconfig.h" + +#include "resourcetdeabc.h" + +using namespace KCal; + +extern "C" +{ + void *init_kcal_tdeabc() + { + TDEGlobal::locale()->insertCatalogue( "kres_birthday" ); + TDEGlobal::locale()->insertCatalogue( "libkcal" ); + return new KRES::PluginFactory<ResourceTDEABC,ResourceTDEABCConfig>(); + } +} + +ResourceTDEABC::ResourceTDEABC( const TDEConfig* config ) + : ResourceCalendar( config ), mCalendar( TQString::fromLatin1( "UTC" ) ), + mAlarmDays( 0 ), mAlarm( true ), mUseCategories( false ) +{ + if ( config ) { + readConfig( config ); + } else { + setResourceName( i18n( "Birthdays" ) ); + } + + init(); +} + +ResourceTDEABC::ResourceTDEABC() + : ResourceCalendar( 0 ), mCalendar( TQString::fromLatin1( "UTC" ) ), + mAlarmDays( 0 ), mAlarm( true ), mUseCategories( false ) +{ + init(); +} + +ResourceTDEABC::~ResourceTDEABC() +{ + delete mLock; +} + +void ResourceTDEABC::init() +{ + setType( "birthdays" ); + + setReadOnly( true ); + + mLock = new TDEABC::LockNull( false ); + + mAddressbook = 0; +} + +void ResourceTDEABC::readConfig( const TDEConfig *config ) +{ + mAlarmDays = config->readNumEntry( "AlarmDays", 0 ); + mAlarm = config->readBoolEntry( "Alarm", true ); + mCategories = config->readListEntry( "Categories" ); + mUseCategories = config->readBoolEntry( "UseCategories", false ); +} + +void ResourceTDEABC::writeConfig( TDEConfig *config ) +{ + ResourceCalendar::writeConfig( config ); + config->writeEntry( "AlarmDays", mAlarmDays ); + config->writeEntry( "Alarm", mAlarm ); + config->writeEntry( "Categories", mCategories ); + config->writeEntry( "UseCategories", mUseCategories ); +} + + +bool ResourceTDEABC::doOpen() +{ + kdDebug(5800) << "ResourceTDEABC::doOpen()" << endl; + + mAddressbook = TDEABC::StdAddressBook::self( true ); + connect( mAddressbook, TQT_SIGNAL(addressBookChanged(AddressBook*)), TQT_SLOT( reload() ) ); + + return true; +} + +bool ResourceTDEABC::doLoad() +{ + kdDebug(5800) << "ResourceTDEABC::load()" << endl; + + mCalendar.close(); + + // import from tdeabc + TQString summary; + TQStringList::ConstIterator strIt; + const TQStringList::ConstIterator endStrIt = mCategories.end(); + TDEABC::Addressee::List anniversaries; + TDEABC::Addressee::List::Iterator addrIt; + + TDEABC::AddressBook::Iterator it; + const TDEABC::AddressBook::Iterator endIt = mAddressbook->end(); + for ( it = mAddressbook->begin(); it != endIt; ++it ) { + + if ( mUseCategories ) { + bool hasCategory = false; + TQStringList categories = (*it).categories(); + for ( strIt = mCategories.begin(); strIt != endStrIt; ++strIt ) + if ( categories.contains( *strIt ) ) { + hasCategory = true; + break; + } + + if ( !hasCategory ) + continue; + } + + TQDate birthdate = (*it).birthday().date(); + TQString name_1, email_1, uid_1; + if ( birthdate.isValid() ) { + kdDebug(5800) << "found a birthday " << TQString(birthdate.toString()) << endl; + + name_1 = (*it).nickName(); + email_1 = (*it).fullEmail(); + uid_1 = (*it).uid(); + if (name_1.isEmpty()) name_1 = (*it).realName(); + summary = i18n("%1's birthday").arg( name_1 ); + + + Event *ev = new Event(); + ev->setUid( uid_1+"_KABC_Birthday"); + + ev->setDtStart(birthdate); + ev->setDtEnd(birthdate); + ev->setHasEndDate(true); + ev->setFloats(true); + ev->setTransparency( Event::Transparent ); + + ev->setCustomProperty("KABC", "BIRTHDAY", "YES"); + ev->setCustomProperty("KABC", "UID-1", uid_1 ); + ev->setCustomProperty("KABC", "NAME-1", name_1 ); + ev->setCustomProperty("KABC", "EMAIL-1", email_1 ); + kdDebug(5800) << "ResourceTDEABC::doLoad: uid:" << uid_1 << " name: " << name_1 + << " email: " << email_1 << endl; + ev->setSummary(summary); + + // Set the recurrence + Recurrence *vRecurrence = ev->recurrence(); + vRecurrence->setStartDate( birthdate ); + vRecurrence->setYearly( 1 ); + if ( birthdate.month()==2 && birthdate.day()==29 ) { + vRecurrence->addYearlyDay( 60 ); + } + + ev->clearAlarms(); + + if ( mAlarm ) { + // Set the alarm + Alarm* vAlarm = ev->newAlarm(); + vAlarm->setText(summary); + vAlarm->setTime(birthdate); + // 24 hours before. duration is in seconds. + vAlarm->setStartOffset( -86400 * mAlarmDays ); + vAlarm->setEnabled(true); + } + + // insert category + ev->setCategories(i18n("Birthday")); + + ev->setReadOnly( true ); + mCalendar.addEvent(ev); + kdDebug(5800) << "imported " << TQString(birthdate.toString()) << endl; + } + + TQString anniversary_string = (*it).custom( "KADDRESSBOOK", "X-Anniversary" ); + if (anniversary_string.isEmpty() ) + continue; + TQDateTime anniversary = TQDate::fromString( anniversary_string, Qt::ISODate ); + if ( !anniversary.isValid() ) + continue; + + TQString name = (*it).custom( "KADDRESSBOOK", "X-SpousesName" ); + if ( name.isEmpty() ) + anniversaries.append( *it ); + else { + bool found = false; + for ( addrIt = anniversaries.begin(); addrIt != anniversaries.end(); ++addrIt ) { + if ( name == (*addrIt).realName() ) { + TQDate spouseAnniversary = + TQDate::fromString( (*addrIt).custom( "KADDRESSBOOK", "X-Anniversary" ), Qt::ISODate ); + if ( anniversary == TQDateTime(spouseAnniversary) ) { + found = true; + break; + + } + } + } + + if ( !found ) + anniversaries.append( *it ); + } + } + + for ( addrIt = anniversaries.begin(); addrIt != anniversaries.end(); ++addrIt ) { + TQDate anniversary = TQDate::fromString( (*addrIt).custom( "KADDRESSBOOK", "X-Anniversary" ), Qt::ISODate ); + kdDebug(5800) << "found a anniversary " << TQString(anniversary.toString()) << endl; + TQString name; + TQString name_1 = (*addrIt).nickName(); + TQString uid_1 = (*addrIt).uid(); + TQString email_1 = (*addrIt).fullEmail(); + if ( name_1.isEmpty() ) + name_1 = (*addrIt).realName(); + + + TQString spouseName = (*addrIt).custom( "KADDRESSBOOK", "X-SpousesName" ); + TQString name_2,email_2,uid_2; + if ( !spouseName.isEmpty() ) { + TQString tname, temail; + KPIM::getNameAndMail( spouseName, tname, temail ); + tname = KPIM::quoteNameIfNecessary( tname ); + if ( ( tname[0] == '"' ) && ( tname[tname.length() - 1] == '"' ) ) { + tname.remove( 0, 1 ); + tname.truncate( tname.length() - 1 ); + } + TDEABC::Addressee spouse; + spouse.setNameFromString( tname ); + name_2 = spouse.nickName(); + uid_2 = spouse.uid(); + email_2 = spouse.fullEmail(); + if ( name_2.isEmpty() ) { + name_2 = spouse.realName(); + } + summary = i18n("insert names of both spouses", + "%1's & %2's anniversary").arg( name_1 ).arg( name_2 ); + } else { + summary = i18n("only one spouse in addressbook, insert the name", + "%1's anniversary").arg( name_1 ); + } + + Event *ev = new Event(); + ev->setUid( uid_1+"_KABC_Anniversary" ); + + ev->setDtStart(anniversary); + ev->setDtEnd(anniversary); + ev->setHasEndDate(true); + ev->setFloats(true); + + ev->setSummary(summary); + + ev->setCustomProperty( "KABC", "BIRTHDAY", "YES" ); + + ev->setCustomProperty( "KABC", "UID-1", uid_1 ); + ev->setCustomProperty( "KABC", "NAME-1", name_1 ); + ev->setCustomProperty( "KABC", "EMAIL-1", email_1 ); + ev->setCustomProperty( "KABC", "ANNIVERSARY", "YES" ); + if ( !spouseName.isEmpty() ) { + ev->setCustomProperty("KABC", "UID-2", uid_2 ); + ev->setCustomProperty("KABC", "NAME-2", spouseName ); + ev->setCustomProperty("KABC", "EMAIL-2", email_2 ); + } + // Set the recurrence + Recurrence *vRecurrence = ev->recurrence(); + vRecurrence->setStartDate( anniversary ); + vRecurrence->setYearly( 1 ); + if ( anniversary.month()==2 && anniversary.day()==29 ) { + vRecurrence->addYearlyDay( 60 ); + } + + ev->clearAlarms(); + + if ( mAlarm ) { + // Set the alarm + Alarm* vAlarm = ev->newAlarm(); + vAlarm->setText(summary); + vAlarm->setTime(anniversary); + // 24 hours before. duration is in seconds. + vAlarm->setStartOffset( -86400 * mAlarmDays ); + vAlarm->setEnabled(true); + } + + // insert category + ev->setCategories(i18n("Anniversary")); + + ev->setReadOnly( true ); + mCalendar.addEvent(ev); + kdDebug(5800) << "imported " << TQString(anniversary.toString()) << endl; + } + + return true; +} + +void ResourceTDEABC::setAlarm( bool a ) +{ + mAlarm = a; +} + +bool ResourceTDEABC::alarm() +{ + return mAlarm; +} + +void ResourceTDEABC::setAlarmDays( int ad ) +{ + mAlarmDays = ad; +} + +int ResourceTDEABC::alarmDays() +{ + return mAlarmDays; +} + +void ResourceTDEABC::setCategories( const TQStringList &categories ) +{ + mCategories = categories; +} + +TQStringList ResourceTDEABC::categories() const +{ + return mCategories; +} + +void ResourceTDEABC::setUseCategories( bool useCategories ) +{ + mUseCategories = useCategories; +} + +bool ResourceTDEABC::useCategories() const +{ + return mUseCategories; +} + +bool ResourceTDEABC::doSave() +{ + // is always read only! + return true; +} + +bool ResourceTDEABC::isSaving() +{ + return false; +} + +TDEABC::Lock *ResourceTDEABC::lock() +{ + return mLock; +} + + +bool ResourceTDEABC::addEvent( Event * ) +{ + return false; +} + +bool ResourceTDEABC::addEvent( Event *, const TQString & ) +{ + return false; +} + +bool ResourceTDEABC::deleteEvent( Event * ) +{ + return false; +} + + +Event *ResourceTDEABC::event( const TQString &uid ) +{ + return mCalendar.event( uid ); +} + +Event::List ResourceTDEABC::rawEventsForDate( const TQDate &date, + EventSortField sortField, + SortDirection sortDirection ) +{ + return mCalendar.rawEventsForDate( date, sortField, sortDirection ); +} + +Event::List ResourceTDEABC::rawEvents( const TQDate &start, const TQDate &end, + bool inclusive ) +{ + return mCalendar.rawEvents( start, end, inclusive ); +} + +Event::List ResourceTDEABC::rawEventsForDate(const TQDateTime &qdt) +{ + return mCalendar.rawEventsForDate( qdt.date() ); +} + +Event::List ResourceTDEABC::rawEvents( EventSortField sortField, SortDirection sortDirection ) +{ + return mCalendar.rawEvents( sortField, sortDirection ); +} + +bool ResourceTDEABC::addTodo( Todo * ) +{ + return false; +} + +bool ResourceTDEABC::addTodo( Todo *, const TQString & ) +{ + return false; +} + +bool ResourceTDEABC::deleteTodo( Todo * ) +{ + return false; +} + + +Todo::List ResourceTDEABC::rawTodos( TodoSortField sortField, SortDirection sortDirection ) +{ + return mCalendar.rawTodos( sortField, sortDirection ); +} + +Todo *ResourceTDEABC::todo( const TQString &uid ) +{ + return mCalendar.todo( uid ); +} + +Todo::List ResourceTDEABC::rawTodosForDate( const TQDate &date ) +{ + return mCalendar.rawTodosForDate( date ); +} + + +bool ResourceTDEABC::addJournal( Journal * ) +{ + return false; +} + +bool ResourceTDEABC::addJournal( Journal *, const TQString & ) +{ + return false; +} + +bool ResourceTDEABC::deleteJournal( Journal * ) +{ + return false; +} + +Journal *ResourceTDEABC::journal(const TQString &uid) +{ + return mCalendar.journal( uid ); +} + +Journal::List ResourceTDEABC::rawJournals( JournalSortField sortField, SortDirection sortDirection ) +{ + return mCalendar.rawJournals( sortField, sortDirection ); +} + +Journal::List ResourceTDEABC::rawJournalsForDate( const TQDate &date ) +{ + return mCalendar.rawJournalsForDate( date ); +} + +Alarm::List ResourceTDEABC::alarmsTo( const TQDateTime &to ) +{ + return mCalendar.alarmsTo( to ); +} + +Alarm::List ResourceTDEABC::alarms( const TQDateTime &from, const TQDateTime &to ) +{ +// kdDebug(5800) << "ResourceTDEABC::alarms(" << from.toString() << " - " << to.toString() << ")\n"; + + return mCalendar.alarms( from, to ); +} + +void ResourceTDEABC::dump() const +{ + ResourceCalendar::dump(); +} + +void ResourceTDEABC::reload() +{ + load(); + emit resourceChanged( this ); +} + +void ResourceTDEABC::setTimeZoneId( const TQString& tzid ) +{ + mCalendar.setTimeZoneId( tzid ); +} + +#include "resourcetdeabc.moc" |