korganizer

koalarmclient.cpp

00001 /*
00002     KOrganizer Alarm Daemon Client.
00003 
00004     This file is part of KOrganizer.
00005 
00006     Copyright (c) 2002,2003 Cornelius Schumacher
00007 
00008     This program is free software; you can redistribute it and/or modify
00009     it under the terms of the GNU General Public License as published by
00010     the Free Software Foundation; either version 2 of the License, or
00011     (at your option) any later version.
00012 
00013     This program is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00016     GNU General Public License for more details.
00017 
00018     You should have received a copy of the GNU General Public License
00019     along with this program; if not, write to the Free Software
00020     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00021 
00022     As a special exception, permission is given to link this program
00023     with any edition of Qt, and distribute the resulting executable,
00024     without including the source code for Qt in the source distribution.
00025 */
00026 
00027 #include "koalarmclient.h"
00028 
00029 #include "alarmdockwindow.h"
00030 #include "alarmdialog.h"
00031 
00032 #include <libkcal/calendarresources.h>
00033 
00034 #include <kstandarddirs.h>
00035 #include <kdebug.h>
00036 #include <klocale.h>
00037 #include <kapplication.h>
00038 #include <kwin.h>
00039 
00040 #include <qpushbutton.h>
00041 
00042 KOAlarmClient::KOAlarmClient( QObject *parent, const char *name )
00043   : DCOPObject( "ac" ), QObject( parent, name ), mDialog( 0 )
00044 {
00045   kdDebug(5890) << "KOAlarmClient::KOAlarmClient()" << endl;
00046 
00047   mDocker = new AlarmDockWindow;
00048   mDocker->show();
00049   connect( this, SIGNAL(reminderCount(int)), mDocker, SLOT(slotUpdate(int)) );
00050   connect( mDocker, SIGNAL(quitSignal()), SLOT(slotQuit()) );
00051 
00052   KConfig c( locate( "config", "korganizerrc" ) );
00053   c.setGroup( "Time & Date" );
00054   const QString tz = c.readEntry( "TimeZoneId" );
00055   kdDebug(5890) << "TimeZone: " << tz << endl;
00056 
00057   mCalendar = new CalendarResources( tz );
00058   mCalendar->readConfig();
00059   mCalendar->load();
00060 
00061   connect( &mCheckTimer, SIGNAL(timeout()), SLOT(checkAlarms()) );
00062 
00063   KConfig *config = kapp->config();
00064   config->setGroup( "Alarms" );
00065   const int interval = config->readNumEntry( "Interval", 60 );
00066   kdDebug(5890) << "KOAlarmClient check interval: " << interval << " seconds."
00067                 << endl;
00068   mLastChecked = config->readDateTimeEntry( "CalendarsLastChecked" );
00069 
00070   // load reminders that were active when quitting
00071   config->setGroup( "General" );
00072   const int numReminders = config->readNumEntry( "Reminders", 0 );
00073   for ( int i = 1; i <= numReminders; ++i ) {
00074     const QString group( QString( "Incidence-%1" ).arg( i ) );
00075     config->setGroup( group );
00076     const QString uid = config->readEntry( "UID" );
00077     const QDateTime remindAtDate = config->readDateTimeEntry( "RemindAt" );
00078     if ( !uid.isEmpty() ) {
00079       Incidence *i = mCalendar->incidence( uid );
00080       if ( i && !i->alarms().isEmpty() ) {
00081         createReminder( mCalendar, i, remindAtDate, QString() );
00082       }
00083     }
00084     config->deleteGroup( group );
00085   }
00086   config->setGroup( "General" );
00087   if ( numReminders ) {
00088    config->writeEntry( "Reminders", 0 );
00089    config->sync();
00090   }
00091 
00092   checkAlarms();
00093   mCheckTimer.start( 1000 * interval );  // interval in seconds
00094 }
00095 
00096 KOAlarmClient::~KOAlarmClient()
00097 {
00098   emit saveAllSignal();
00099   saveLastCheckTime();
00100   delete mCalendar;
00101   delete mDocker;
00102   delete mDialog;
00103 }
00104 
00105 void KOAlarmClient::checkAlarms()
00106 {
00107   KConfig *cfg = kapp->config();
00108 
00109   cfg->setGroup( "General" );
00110   if ( !cfg->readBoolEntry( "Enabled", true ) ) return;
00111 
00112   QDateTime from = mLastChecked.addSecs( 1 );
00113   mLastChecked = QDateTime::currentDateTime();
00114 
00115   kdDebug(5891) << "Check: " << from.toString() << " - " << mLastChecked.toString() << endl;
00116 
00117   QValueList<Alarm *> alarms = mCalendar->alarms( from, mLastChecked );
00118 
00119   QValueList<Alarm *>::ConstIterator it;
00120   for( it = alarms.begin(); it != alarms.end(); ++it ) {
00121     kdDebug(5891) << "REMINDER: " << (*it)->parent()->summary() << endl;
00122     Incidence *incidence = mCalendar->incidence( (*it)->parent()->uid() );
00123     createReminder( mCalendar, incidence, from, (*it)->text() );
00124   }
00125   saveLastCheckTime();
00126 }
00127 
00128 void KOAlarmClient::createReminder( KCal::CalendarResources *calendar,
00129                                     KCal::Incidence *incidence,
00130                                     const QDateTime &remindAtDate,
00131                                     const QString &displayText )
00132 {
00133   if ( !incidence )
00134     return;
00135 
00136   if ( !mDialog ) {
00137     mDialog = new AlarmDialog( calendar );
00138     connect( mDialog, SIGNAL(reminderCount(int)), mDocker, SLOT(slotUpdate(int)) );
00139     connect( mDocker, SIGNAL(suspendAllSignal()), mDialog, SLOT(suspendAll()) );
00140     connect( mDocker, SIGNAL(dismissAllSignal()), mDialog, SLOT(dismissAll()) );
00141     connect( this, SIGNAL(saveAllSignal()), mDialog, SLOT(slotSave()) );
00142   }
00143 
00144   mDialog->addIncidence( incidence, remindAtDate, displayText );
00145   mDialog->wakeUp();
00146   saveLastCheckTime();
00147 }
00148 
00149 void KOAlarmClient::slotQuit()
00150 {
00151   emit saveAllSignal();
00152   saveLastCheckTime();
00153   quit();
00154 }
00155 
00156 void KOAlarmClient::saveLastCheckTime()
00157 {
00158   KConfigGroup cg( KGlobal::config(), "Alarms");
00159   cg.writeEntry( "CalendarsLastChecked", mLastChecked );
00160   KGlobal::config()->sync();
00161 }
00162 
00163 void KOAlarmClient::quit()
00164 {
00165   kdDebug(5890) << "KOAlarmClient::quit()" << endl;
00166   kapp->quit();
00167 }
00168 
00169 bool KOAlarmClient::commitData( QSessionManager& )
00170 {
00171   emit saveAllSignal();
00172   saveLastCheckTime();
00173   return true;
00174 }
00175 
00176 void KOAlarmClient::forceAlarmCheck()
00177 {
00178   checkAlarms();
00179   saveLastCheckTime();
00180 }
00181 
00182 void KOAlarmClient::dumpDebug()
00183 {
00184   KConfig *cfg = kapp->config();
00185 
00186   cfg->setGroup( "Alarms" );
00187   const QDateTime lastChecked = cfg->readDateTimeEntry( "CalendarsLastChecked" );
00188 
00189   kdDebug(5890) << "Last Check: " << lastChecked << endl;
00190 }
00191 
00192 QStringList KOAlarmClient::dumpAlarms()
00193 {
00194   const QDateTime start = QDateTime( QDateTime::currentDateTime().date(),
00195                                QTime( 0, 0 ) );
00196   const QDateTime end = start.addDays( 1 ).addSecs( -1 );
00197 
00198   QStringList lst;
00199   // Don't translate, this is for debugging purposes.
00200   lst << QString("AlarmDeamon::dumpAlarms() from ") + start.toString()+ " to " +
00201          end.toString();
00202 
00203   QValueList<Alarm*> alarms = mCalendar->alarms( start, end );
00204   QValueList<Alarm*>::ConstIterator it;
00205   for( it = alarms.begin(); it != alarms.end(); ++it ) {
00206     Alarm *a = *it;
00207     lst << QString("  ") + a->parent()->summary() + " ("
00208               + a->time().toString() + ")";
00209   }
00210 
00211   return lst;
00212 }
00213 
00214 void KOAlarmClient::debugShowDialog()
00215 {
00216 //   showAlarmDialog();
00217 }
00218 
00219 #include "koalarmclient.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys