summaryrefslogtreecommitdiffstats
path: root/kalarm/dcophandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kalarm/dcophandler.cpp')
-rw-r--r--kalarm/dcophandler.cpp768
1 files changed, 768 insertions, 0 deletions
diff --git a/kalarm/dcophandler.cpp b/kalarm/dcophandler.cpp
new file mode 100644
index 00000000..ab4105fe
--- /dev/null
+++ b/kalarm/dcophandler.cpp
@@ -0,0 +1,768 @@
+/*
+ * dcophandler.cpp - handler for DCOP calls by other applications
+ * Program: kalarm
+ * Copyright © 2002-2006,2008 by David Jarvie <djarvie@kde.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "kalarm.h"
+
+#include <stdlib.h>
+
+#include <kdebug.h>
+
+#include "alarmcalendar.h"
+#include "daemon.h"
+#include "functions.h"
+#include "kalarmapp.h"
+#include "kamail.h"
+#include "karecurrence.h"
+#include "mainwindow.h"
+#include "preferences.h"
+#include "dcophandler.moc"
+
+static const char* DCOP_OBJECT_NAME = "request"; // DCOP name of KAlarm's request interface
+#ifdef OLD_DCOP
+static const char* DCOP_OLD_OBJECT_NAME = "display";
+#endif
+
+
+/*=============================================================================
+= DcopHandler
+= This class's function is to handle DCOP requests by other applications.
+=============================================================================*/
+DcopHandler::DcopHandler()
+ : DCOPObject(DCOP_OBJECT_NAME),
+ QWidget()
+{
+ kdDebug(5950) << "DcopHandler::DcopHandler()\n";
+}
+
+
+bool DcopHandler::cancelEvent(const QString& url,const QString& eventId)
+{
+ return theApp()->deleteEvent(url, eventId);
+}
+
+bool DcopHandler::triggerEvent(const QString& url,const QString& eventId)
+{
+ return theApp()->triggerEvent(url, eventId);
+}
+
+bool DcopHandler::scheduleMessage(const QString& message, const QString& startDateTime, int lateCancel, unsigned flags,
+ const QString& bgColor, const QString& fgColor, const QString& font,
+ const KURL& audioFile, int reminderMins, const QString& recurrence,
+ int subRepeatInterval, int subRepeatCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurrence, subRepeatInterval))
+ return false;
+ return scheduleMessage(message, start, lateCancel, flags, bgColor, fgColor, font, audioFile, reminderMins, recur, subRepeatInterval, subRepeatCount);
+}
+
+bool DcopHandler::scheduleMessage(const QString& message, const QString& startDateTime, int lateCancel, unsigned flags,
+ const QString& bgColor, const QString& fgColor, const QString& font,
+ const KURL& audioFile, int reminderMins,
+ int recurType, int recurInterval, int recurCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, recurCount))
+ return false;
+ return scheduleMessage(message, start, lateCancel, flags, bgColor, fgColor, font, audioFile, reminderMins, recur);
+}
+
+bool DcopHandler::scheduleMessage(const QString& message, const QString& startDateTime, int lateCancel, unsigned flags,
+ const QString& bgColor, const QString& fgColor, const QString& font,
+ const KURL& audioFile, int reminderMins,
+ int recurType, int recurInterval, const QString& endDateTime)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, endDateTime))
+ return false;
+ return scheduleMessage(message, start, lateCancel, flags, bgColor, fgColor, font, audioFile, reminderMins, recur);
+}
+
+bool DcopHandler::scheduleFile(const KURL& file, const QString& startDateTime, int lateCancel, unsigned flags, const QString& bgColor,
+ const KURL& audioFile, int reminderMins, const QString& recurrence,
+ int subRepeatInterval, int subRepeatCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurrence, subRepeatInterval))
+ return false;
+ return scheduleFile(file, start, lateCancel, flags, bgColor, audioFile, reminderMins, recur, subRepeatInterval, subRepeatCount);
+}
+
+bool DcopHandler::scheduleFile(const KURL& file, const QString& startDateTime, int lateCancel, unsigned flags, const QString& bgColor,
+ const KURL& audioFile, int reminderMins, int recurType, int recurInterval, int recurCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, recurCount))
+ return false;
+ return scheduleFile(file, start, lateCancel, flags, bgColor, audioFile, reminderMins, recur);
+}
+
+bool DcopHandler::scheduleFile(const KURL& file, const QString& startDateTime, int lateCancel, unsigned flags, const QString& bgColor,
+ const KURL& audioFile, int reminderMins, int recurType, int recurInterval, const QString& endDateTime)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, endDateTime))
+ return false;
+ return scheduleFile(file, start, lateCancel, flags, bgColor, audioFile, reminderMins, recur);
+}
+
+bool DcopHandler::scheduleCommand(const QString& commandLine, const QString& startDateTime, int lateCancel, unsigned flags,
+ const QString& recurrence, int subRepeatInterval, int subRepeatCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurrence, subRepeatInterval))
+ return false;
+ return scheduleCommand(commandLine, start, lateCancel, flags, recur, subRepeatInterval, subRepeatCount);
+}
+
+bool DcopHandler::scheduleCommand(const QString& commandLine, const QString& startDateTime, int lateCancel, unsigned flags,
+ int recurType, int recurInterval, int recurCount)
+{
+ DateTime start = convertStartDateTime(startDateTime);
+ if (!start.isValid())
+ return false;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, recurCount))
+ return false;
+ return scheduleCommand(commandLine, start, lateCancel, flags, recur);
+}
+
+bool DcopHandler::scheduleCommand(const QString& commandLine, const QString& startDateTime, int lateCancel, unsigned flags,
+ int recurType, int recurInterval, const QString& endDateTime)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, endDateTime))
+ return false;
+ return scheduleCommand(commandLine, start, lateCancel, flags, recur);
+}
+
+bool DcopHandler::scheduleEmail(const QString& fromID, const QString& addresses, const QString& subject, const QString& message,
+ const QString& attachments, const QString& startDateTime, int lateCancel, unsigned flags,
+ const QString& recurrence, int subRepeatInterval, int subRepeatCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurrence, subRepeatInterval))
+ return false;
+ return scheduleEmail(fromID, addresses, subject, message, attachments, start, lateCancel, flags, recur, subRepeatInterval, subRepeatCount);
+}
+
+bool DcopHandler::scheduleEmail(const QString& fromID, const QString& addresses, const QString& subject, const QString& message,
+ const QString& attachments, const QString& startDateTime, int lateCancel, unsigned flags,
+ int recurType, int recurInterval, int recurCount)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, recurCount))
+ return false;
+ return scheduleEmail(fromID, addresses, subject, message, attachments, start, lateCancel, flags, recur);
+}
+
+bool DcopHandler::scheduleEmail(const QString& fromID, const QString& addresses, const QString& subject, const QString& message,
+ const QString& attachments, const QString& startDateTime, int lateCancel, unsigned flags,
+ int recurType, int recurInterval, const QString& endDateTime)
+{
+ DateTime start;
+ KARecurrence recur;
+ if (!convertRecurrence(start, recur, startDateTime, recurType, recurInterval, endDateTime))
+ return false;
+ return scheduleEmail(fromID, addresses, subject, message, attachments, start, lateCancel, flags, recur);
+}
+
+bool DcopHandler::edit(const QString& eventID)
+{
+ return KAlarm::edit(eventID);
+}
+
+bool DcopHandler::editNew(const QString& templateName)
+{
+ return KAlarm::editNew(templateName);
+}
+
+
+/******************************************************************************
+* Schedule a message alarm, after converting the parameters from strings.
+*/
+bool DcopHandler::scheduleMessage(const QString& message, const DateTime& start, int lateCancel, unsigned flags,
+ const QString& bgColor, const QString& fgColor, const QString& fontStr,
+ const KURL& audioFile, int reminderMins, const KARecurrence& recurrence,
+ int subRepeatInterval, int subRepeatCount)
+{
+ unsigned kaEventFlags = convertStartFlags(start, flags);
+ QColor bg = convertBgColour(bgColor);
+ if (!bg.isValid())
+ return false;
+ QColor fg;
+ if (fgColor.isEmpty())
+ fg = Preferences::defaultFgColour();
+ else
+ {
+ fg.setNamedColor(fgColor);
+ if (!fg.isValid())
+ {
+ kdError(5950) << "DCOP call: invalid foreground color: " << fgColor << endl;
+ return false;
+ }
+ }
+ QFont font;
+ if (fontStr.isEmpty())
+ kaEventFlags |= KAEvent::DEFAULT_FONT;
+ else
+ {
+ if (!font.fromString(fontStr)) // N.B. this doesn't do good validation
+ {
+ kdError(5950) << "DCOP call: invalid font: " << fontStr << endl;
+ return false;
+ }
+ }
+ return theApp()->scheduleEvent(KAEvent::MESSAGE, message, start.dateTime(), lateCancel, kaEventFlags, bg, fg, font,
+ audioFile.url(), -1, reminderMins, recurrence, subRepeatInterval, subRepeatCount);
+}
+
+/******************************************************************************
+* Schedule a file alarm, after converting the parameters from strings.
+*/
+bool DcopHandler::scheduleFile(const KURL& file,
+ const DateTime& start, int lateCancel, unsigned flags, const QString& bgColor,
+ const KURL& audioFile, int reminderMins, const KARecurrence& recurrence,
+ int subRepeatInterval, int subRepeatCount)
+{
+ unsigned kaEventFlags = convertStartFlags(start, flags);
+ QColor bg = convertBgColour(bgColor);
+ if (!bg.isValid())
+ return false;
+ return theApp()->scheduleEvent(KAEvent::FILE, file.url(), start.dateTime(), lateCancel, kaEventFlags, bg, Qt::black, QFont(),
+ audioFile.url(), -1, reminderMins, recurrence, subRepeatInterval, subRepeatCount);
+}
+
+/******************************************************************************
+* Schedule a command alarm, after converting the parameters from strings.
+*/
+bool DcopHandler::scheduleCommand(const QString& commandLine,
+ const DateTime& start, int lateCancel, unsigned flags,
+ const KARecurrence& recurrence, int subRepeatInterval, int subRepeatCount)
+{
+ unsigned kaEventFlags = convertStartFlags(start, flags);
+ return theApp()->scheduleEvent(KAEvent::COMMAND, commandLine, start.dateTime(), lateCancel, kaEventFlags, Qt::black, Qt::black, QFont(),
+ QString::null, -1, 0, recurrence, subRepeatInterval, subRepeatCount);
+}
+
+/******************************************************************************
+* Schedule an email alarm, after validating the addresses and attachments.
+*/
+bool DcopHandler::scheduleEmail(const QString& fromID, const QString& addresses, const QString& subject,
+ const QString& message, const QString& attachments,
+ const DateTime& start, int lateCancel, unsigned flags,
+ const KARecurrence& recurrence, int subRepeatInterval, int subRepeatCount)
+{
+ unsigned kaEventFlags = convertStartFlags(start, flags);
+ uint senderId = 0;
+ if (!fromID.isEmpty())
+ {
+ senderId = KAMail::identityUoid(fromID);
+ if (!senderId)
+ {
+ kdError(5950) << "DCOP call scheduleEmail(): unknown sender ID: " << fromID << endl;
+ return false;
+ }
+ }
+ EmailAddressList addrs;
+ QString bad = KAMail::convertAddresses(addresses, addrs);
+ if (!bad.isEmpty())
+ {
+ kdError(5950) << "DCOP call scheduleEmail(): invalid email addresses: " << bad << endl;
+ return false;
+ }
+ if (addrs.isEmpty())
+ {
+ kdError(5950) << "DCOP call scheduleEmail(): no email address\n";
+ return false;
+ }
+ QStringList atts;
+ bad = KAMail::convertAttachments(attachments, atts);
+ if (!bad.isEmpty())
+ {
+ kdError(5950) << "DCOP call scheduleEmail(): invalid email attachment: " << bad << endl;
+ return false;
+ }
+ return theApp()->scheduleEvent(KAEvent::EMAIL, message, start.dateTime(), lateCancel, kaEventFlags, Qt::black, Qt::black, QFont(),
+ QString::null, -1, 0, recurrence, subRepeatInterval, subRepeatCount, senderId, addrs, subject, atts);
+}
+
+
+/******************************************************************************
+* Convert the start date/time string to a DateTime. The date/time string is in
+* the format YYYY-MM-DD[THH:MM[:SS]] or [T]HH:MM[:SS]
+*/
+DateTime DcopHandler::convertStartDateTime(const QString& startDateTime)
+{
+ DateTime start;
+ if (startDateTime.length() > 10)
+ {
+ // Both a date and a time are specified
+ start = QDateTime::fromString(startDateTime, Qt::ISODate);
+ }
+ else
+ {
+ // Check whether a time is specified
+ QString t;
+ if (startDateTime[0] == 'T')
+ t = startDateTime.mid(1); // it's a time: remove the leading 'T'
+ else if (!startDateTime[2].isDigit())
+ t = startDateTime; // it's a time with no leading 'T'
+
+ if (t.isEmpty())
+ {
+ // It's a date
+ start = QDate::fromString(startDateTime, Qt::ISODate);
+ }
+ else
+ {
+ // It's a time, so use today as the date
+ start.set(QDate::currentDate(), QTime::fromString(t, Qt::ISODate));
+ }
+ }
+ if (!start.isValid())
+ kdError(5950) << "DCOP call: invalid start date/time: " << startDateTime << endl;
+ return start;
+}
+
+/******************************************************************************
+* Convert the flag bits to KAEvent flag bits.
+*/
+unsigned DcopHandler::convertStartFlags(const DateTime& start, unsigned flags)
+{
+ unsigned kaEventFlags = 0;
+ if (flags & REPEAT_AT_LOGIN) kaEventFlags |= KAEvent::REPEAT_AT_LOGIN;
+ if (flags & BEEP) kaEventFlags |= KAEvent::BEEP;
+ if (flags & SPEAK) kaEventFlags |= KAEvent::SPEAK;
+ if (flags & CONFIRM_ACK) kaEventFlags |= KAEvent::CONFIRM_ACK;
+ if (flags & REPEAT_SOUND) kaEventFlags |= KAEvent::REPEAT_SOUND;
+ if (flags & AUTO_CLOSE) kaEventFlags |= KAEvent::AUTO_CLOSE;
+ if (flags & EMAIL_BCC) kaEventFlags |= KAEvent::EMAIL_BCC;
+ if (flags & SCRIPT) kaEventFlags |= KAEvent::SCRIPT;
+ if (flags & EXEC_IN_XTERM) kaEventFlags |= KAEvent::EXEC_IN_XTERM;
+ if (flags & SHOW_IN_KORG) kaEventFlags |= KAEvent::COPY_KORGANIZER;
+ if (flags & DISABLED) kaEventFlags |= KAEvent::DISABLED;
+ if (start.isDateOnly()) kaEventFlags |= KAEvent::ANY_TIME;
+ return kaEventFlags;
+}
+
+/******************************************************************************
+* Convert the background colour string to a QColor.
+*/
+QColor DcopHandler::convertBgColour(const QString& bgColor)
+{
+ if (bgColor.isEmpty())
+ return Preferences::defaultBgColour();
+ QColor bg(bgColor);
+ if (!bg.isValid())
+ kdError(5950) << "DCOP call: invalid background color: " << bgColor << endl;
+ return bg;
+}
+
+bool DcopHandler::convertRecurrence(DateTime& start, KARecurrence& recurrence,
+ const QString& startDateTime, const QString& icalRecurrence,
+ int& subRepeatInterval)
+{
+ start = convertStartDateTime(startDateTime);
+ if (!start.isValid())
+ return false;
+ if (!recurrence.set(icalRecurrence))
+ return false;
+ if (subRepeatInterval && recurrence.type() == KARecurrence::NO_RECUR)
+ {
+ subRepeatInterval = 0;
+ kdWarning(5950) << "DCOP call: no recurrence specified, so sub-repetition ignored" << endl;
+ }
+ return true;
+}
+
+bool DcopHandler::convertRecurrence(DateTime& start, KARecurrence& recurrence, const QString& startDateTime,
+ int recurType, int recurInterval, int recurCount)
+{
+ start = convertStartDateTime(startDateTime);
+ if (!start.isValid())
+ return false;
+ return convertRecurrence(recurrence, start, recurType, recurInterval, recurCount, QDateTime());
+}
+
+bool DcopHandler::convertRecurrence(DateTime& start, KARecurrence& recurrence, const QString& startDateTime,
+ int recurType, int recurInterval, const QString& endDateTime)
+{
+ start = convertStartDateTime(startDateTime);
+ if (!start.isValid())
+ return false;
+ QDateTime end;
+ if (endDateTime.find('T') < 0)
+ {
+ if (!start.isDateOnly())
+ {
+ kdError(5950) << "DCOP call: alarm is date-only, but recurrence end is date/time" << endl;
+ return false;
+ }
+ end.setDate(QDate::fromString(endDateTime, Qt::ISODate));
+ }
+ else
+ {
+ if (start.isDateOnly())
+ {
+ kdError(5950) << "DCOP call: alarm is timed, but recurrence end is date-only" << endl;
+ return false;
+ }
+ end = QDateTime::fromString(endDateTime, Qt::ISODate);
+ }
+ if (!end.isValid())
+ {
+ kdError(5950) << "DCOP call: invalid recurrence end date/time: " << endDateTime << endl;
+ return false;
+ }
+ return convertRecurrence(recurrence, start, recurType, recurInterval, 0, end);
+}
+
+bool DcopHandler::convertRecurrence(KARecurrence& recurrence, const DateTime& start, int recurType,
+ int recurInterval, int recurCount, const QDateTime& end)
+{
+ KARecurrence::Type type;
+ switch (recurType)
+ {
+ case MINUTELY: type = KARecurrence::MINUTELY; break;
+ case DAILY: type = KARecurrence::DAILY; break;
+ case WEEKLY: type = KARecurrence::WEEKLY; break;
+ case MONTHLY: type = KARecurrence::MONTHLY_DAY; break;
+ case YEARLY: type = KARecurrence::ANNUAL_DATE; break;
+ break;
+ default:
+ kdError(5950) << "DCOP call: invalid recurrence type: " << recurType << endl;
+ return false;
+ }
+ recurrence.set(type, recurInterval, recurCount, start, end);
+ return true;
+}
+
+
+#ifdef OLD_DCOP
+/*=============================================================================
+= DcopHandlerOld
+= This class's function is simply to act as a receiver for DCOP requests.
+=============================================================================*/
+DcopHandlerOld::DcopHandlerOld()
+ : QWidget(),
+ DCOPObject(DCOP_OLD_OBJECT_NAME)
+{
+ kdDebug(5950) << "DcopHandlerOld::DcopHandlerOld()\n";
+}
+
+/******************************************************************************
+* Process a DCOP request.
+*/
+bool DcopHandlerOld::process(const QCString& func, const QByteArray& data, QCString& replyType, QByteArray&)
+{
+ kdDebug(5950) << "DcopHandlerOld::process(): " << func << endl;
+ enum
+ {
+ OPERATION = 0x0007, // mask for main operation
+ HANDLE = 0x0001,
+ CANCEL = 0x0002,
+ TRIGGER = 0x0003,
+ SCHEDULE = 0x0004,
+ ALARM_TYPE = 0x00F0, // mask for SCHEDULE alarm type
+ MESSAGE = 0x0010,
+ FILE = 0x0020,
+ COMMAND = 0x0030,
+ EMAIL = 0x0040,
+ SCH_FLAGS = 0x0F00, // mask for SCHEDULE flags
+ REP_COUNT = 0x0100,
+ REP_END = 0x0200,
+ FONT = 0x0400,
+ PRE_096 = 0x1000, // old-style pre-0.9.6 deprecated method
+ PRE_091 = 0x2000 | PRE_096 // old-style pre-0.9.1 deprecated method
+ };
+ replyType = "void";
+ int function;
+ if (func == "handleEvent(const QString&,const QString&)"
+ || func == "handleEvent(QString,QString)")
+ function = HANDLE;
+ else if (func == "cancelEvent(const QString&,const QString&)"
+ || func == "cancelEvent(QString,QString)")
+ function = CANCEL;
+ else if (func == "triggerEvent(const QString&,const QString&)"
+ || func == "triggerEvent(QString,QString)")
+ function = TRIGGER;
+
+ // scheduleMessage(message, dateTime, colour, colourfg, flags, audioURL, reminder, recurrence)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,const QColor&,Q_UINT32,const QString&,Q_INT32,const QString&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,QColor,Q_UINT32,QString,Q_UINT32,QString)")
+ function = SCHEDULE | MESSAGE;
+ // scheduleMessage(message, dateTime, colour, colourfg, font, flags, audioURL, reminder, recurrence)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,const QColor&,const QFont&,Q_UINT32,const QString&,Q_INT32,const QString&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,QColor,QFont,Q_UINT32,QString,Q_UINT32,QString)")
+ function = SCHEDULE | MESSAGE | FONT;
+ // scheduleFile(URL, dateTime, colour, flags, audioURL, reminder, recurrence)
+ else if (func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,const QString&)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,QString,Q_UINT32,QString)")
+ function = SCHEDULE | FILE;
+ // scheduleCommand(commandLine, dateTime, flags, recurrence)
+ else if (func == "scheduleCommand(const QString&,const QDateTime&,Q_UINT32,const QString&)"
+ || func == "scheduleCommand(QString,QDateTime,Q_UINT32,QString)")
+ function = SCHEDULE | COMMAND;
+ // scheduleEmail(addresses, subject, message, attachments, dateTime, flags, recurrence)
+ else if (func == "scheduleEmail(const QString&,const QString&,const QString&,const QString&,const QDateTime&,Q_UINT32,const QString&)"
+ || func == "scheduleEmail(QString,QString,QString,QString,QDateTime,Q_UINT32,QString)")
+ function = SCHEDULE | EMAIL;
+
+ // scheduleMessage(message, dateTime, colour, colourfg, flags, audioURL, reminder, recurType, interval, recurCount)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | MESSAGE | REP_COUNT;
+ // scheduleFile(URL, dateTime, colour, flags, audioURL, reminder, recurType, interval, recurCount)
+ else if (func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | FILE | REP_COUNT;
+ // scheduleCommand(commandLine, dateTime, flags, recurType, interval, recurCount)
+ else if (func == "scheduleCommand(const QString&,const QDateTime&,Q_UINT32,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleCommand(QString,QDateTime,Q_UINT32,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | COMMAND | REP_COUNT;
+ // scheduleEmail(addresses, subject, message, attachments, dateTime, flags, recurType, interval, recurCount)
+ else if (func == "scheduleEmail(const QString&,const QString&,const QString&,const QString&,const QDateTime&,Q_UINT32,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleEmail(QString,QString,QString,QString,QDateTime,Q_UINT32,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | EMAIL | REP_COUNT;
+
+ // scheduleMessage(message, dateTime, colour, colourfg, flags, audioURL, reminder, recurType, interval, endTime)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | MESSAGE | REP_END;
+ // scheduleFile(URL, dateTime, colour, flags, audioURL, reminder, recurType, interval, endTime)
+ else if (func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | FILE | REP_END;
+ // scheduleCommand(commandLine, dateTime, flags, recurType, interval, endTime)
+ else if (func == "scheduleCommand(const QString&,const QDateTime&,Q_UINT32,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleCommand(QString,QDateTime,Q_UINT32,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | COMMAND | REP_END;
+ // scheduleEmail(addresses, subject, message, attachments, dateTime, flags, recurType, interval, endTime)
+ else if (func == "scheduleEmail(const QString&,const QString&,const QString&,const QString&,const QDateTime&,Q_UINT32,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleEmail(QString,QString,QString,QString,QDateTime,Q_UINT32,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | EMAIL | REP_END;
+
+ // Deprecated methods: backwards compatibility with KAlarm pre-0.9.6
+ // scheduleMessage(message, dateTime, colour, flags, audioURL, reminder, recurrence)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,const QString&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,QString,Q_UINT32,QString)")
+ function = SCHEDULE | MESSAGE | PRE_096;
+ // scheduleMessage(message, dateTime, colour, font, flags, audioURL, reminder, recurrence)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,const QFont&,Q_UINT32,const QString&,Q_INT32,const QString&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,QFont,Q_UINT32,QString,Q_UINT32,QString)")
+ function = SCHEDULE | MESSAGE | FONT | PRE_096;
+ // scheduleMessage(message, dateTime, colour, flags, audioURL, reminder, recurType, interval, recurCount)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | MESSAGE | REP_COUNT | PRE_096;
+ // scheduleMessage(message, dateTime, colour, flags, audioURL, reminder, recurType, interval, endTime)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | MESSAGE | REP_END | PRE_096;
+
+ // Deprecated methods: backwards compatibility with KAlarm pre-0.9.1
+ // scheduleMessage(message, dateTime, colour, flags, audioURL)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,QString)")
+ function = SCHEDULE | MESSAGE | PRE_091;
+ // scheduleFile(URL, dateTime, colour, flags, audioURL)
+ else if (func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,QString)")
+ function = SCHEDULE | FILE | PRE_091;
+ // scheduleMessage(message, dateTime, colour, flags, audioURL, recurType, interval, recurCount)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | MESSAGE | REP_COUNT | PRE_091;
+ // scheduleFile(URL, dateTime, colour, flags, audioURL, recurType, interval, recurCount)
+ else if (func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,Q_INT32)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,Q_INT32)")
+ function = SCHEDULE | FILE | REP_COUNT | PRE_091;
+ // scheduleMessage(message, dateTime, colour, flags, audioURL, recurType, interval, endTime)
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | MESSAGE | REP_END | PRE_091;
+ // scheduleFile(URL, dateTime, colour, flags, audioURL, recurType, interval, endTime)
+ else if (func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,const QString&,Q_INT32,Q_INT32,const QDateTime&)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,QString,Q_INT32,Q_INT32,QDateTime)")
+ function = SCHEDULE | FILE | REP_END | PRE_091;
+
+ // Obsolete methods: backwards compatibility with KAlarm pre-0.7
+ else if (func == "scheduleMessage(const QString&,const QDateTime&,const QColor&,Q_UINT32,Q_INT32,Q_INT32)"
+ || func == "scheduleMessage(QString,QDateTime,QColor,Q_UINT32,Q_INT32,Q_INT32)"
+ || func == "scheduleFile(const QString&,const QDateTime&,const QColor&,Q_UINT32,Q_INT32,Q_INT32)"
+ || func == "scheduleFile(QString,QDateTime,QColor,Q_UINT32,Q_INT32,Q_INT32)"
+ || func == "scheduleCommand(const QString&,const QDateTime&,Q_UINT32,Q_INT32,Q_INT32)"
+ || func == "scheduleCommand(QString,QDateTime,Q_UINT32,Q_INT32,Q_INT32)"
+ // Obsolete methods: backwards compatibility with KAlarm pre-0.6
+ || func == "cancelMessage(const QString&,const QString&)"
+ || func == "cancelMessage(QString,QString)"
+ || func == "displayMessage(const QString&,const QString&)"
+ || func == "displayMessage(QString,QString)")
+ {
+ kdError(5950) << "DcopHandlerOld::process(): obsolete DCOP function call: '" << func << "'" << endl;
+ return false;
+ }
+ else
+ {
+ kdError(5950) << "DcopHandlerOld::process(): unknown DCOP function" << endl;
+ return false;
+ }
+
+ switch (function & OPERATION)
+ {
+ case HANDLE: // trigger or cancel event with specified ID from calendar file
+ case CANCEL: // cancel event with specified ID from calendar file
+ case TRIGGER: // trigger event with specified ID in calendar file
+ {
+
+ QDataStream arg(data, IO_ReadOnly);
+ QString urlString, vuid;
+ arg >> urlString >> vuid;
+ switch (function)
+ {
+ case HANDLE:
+ return theApp()->handleEvent(urlString, vuid);
+ case CANCEL:
+ return theApp()->deleteEvent(urlString, vuid);
+ case TRIGGER:
+ return theApp()->triggerEvent(urlString, vuid);
+ }
+ break;
+ }
+ case SCHEDULE: // schedule a new event
+ {
+ KAEvent::Action action;
+ switch (function & ALARM_TYPE)
+ {
+ case MESSAGE: action = KAEvent::MESSAGE; break;
+ case FILE: action = KAEvent::FILE; break;
+ case COMMAND: action = KAEvent::COMMAND; break;
+ case EMAIL: action = KAEvent::EMAIL; break;
+ default: return false;
+ }
+ QDataStream arg(data, IO_ReadOnly);
+ QString text, audioFile, mailSubject;
+ float audioVolume = -1;
+ EmailAddressList mailAddresses;
+ QStringList mailAttachments;
+ QDateTime dateTime, endTime;
+ QColor bgColour;
+ QColor fgColour(Qt::black);
+ QFont font;
+ Q_UINT32 flags;
+ int lateCancel = 0;
+ KARecurrence recurrence;
+ Q_INT32 reminderMinutes = 0;
+ if (action == KAEvent::EMAIL)
+ {
+ QString addresses, attachments;
+ arg >> addresses >> mailSubject >> text >> attachments;
+ QString bad = KAMail::convertAddresses(addresses, mailAddresses);
+ if (!bad.isEmpty())
+ {
+ kdError(5950) << "DcopHandlerOld::process(): invalid email addresses: " << bad << endl;
+ return false;
+ }
+ if (mailAddresses.isEmpty())
+ {
+ kdError(5950) << "DcopHandlerOld::process(): no email address\n";
+ return false;
+ }
+ bad = KAMail::convertAttachments(attachments, mailAttachments);
+ if (!bad.isEmpty())
+ {
+ kdError(5950) << "DcopHandlerOld::process(): invalid email attachment: " << bad << endl;
+ return false;
+ }
+ }
+ else
+ arg >> text;
+ arg.readRawBytes((char*)&dateTime, sizeof(dateTime));
+ if (action != KAEvent::COMMAND)
+ arg.readRawBytes((char*)&bgColour, sizeof(bgColour));
+ if (action == KAEvent::MESSAGE && !(function & PRE_096))
+ arg.readRawBytes((char*)&fgColour, sizeof(fgColour));
+ if (function & FONT)
+ {
+ arg.readRawBytes((char*)&font, sizeof(font));
+ arg >> flags;
+ }
+ else
+ {
+ arg >> flags;
+ flags |= KAEvent::DEFAULT_FONT;
+ }
+ if (flags & KAEvent::LATE_CANCEL)
+ lateCancel = 1;
+ if (action == KAEvent::MESSAGE || action == KAEvent::FILE)
+ {
+ arg >> audioFile;
+ if (!(function & PRE_091))
+ arg >> reminderMinutes;
+ }
+ if (function & (REP_COUNT | REP_END))
+ {
+ KARecurrence::Type recurType;
+ Q_INT32 recurCount = 0;
+ Q_INT32 recurInterval;
+ Q_INT32 type;
+ arg >> type >> recurInterval;
+ switch (type)
+ {
+ case 1: recurType = KARecurrence::MINUTELY; break;
+ case 3: recurType = KARecurrence::DAILY; break;
+ case 4: recurType = KARecurrence::WEEKLY; break;
+ case 6: recurType = KARecurrence::MONTHLY_DAY; break;
+ case 7: recurType = KARecurrence::ANNUAL_DATE; break;
+ default:
+ kdError(5950) << "DcopHandlerOld::process(): invalid simple repetition type: " << type << endl;
+ return false;
+ }
+ if (function & REP_COUNT)
+ arg >> recurCount;
+ else
+ arg.readRawBytes((char*)&endTime, sizeof(endTime));
+ recurrence.set(recurType, recurInterval, recurCount,
+ DateTime(dateTime, flags & KAEvent::ANY_TIME), endTime);
+ }
+ else if (!(function & PRE_091))
+ {
+ QString rule;
+ arg >> rule;
+ recurrence.set(rule);
+ }
+ return theApp()->scheduleEvent(action, text, dateTime, lateCancel, flags, bgColour, fgColour, font, audioFile,
+ audioVolume, reminderMinutes, recurrence, 0, 0, 0, mailAddresses, mailSubject, mailAttachments);
+ }
+ }
+ return false;
+}
+#endif // OLD_DCOP