23 #include "alarmtext.h"
27 #ifdef KALARMCAL_USE_KRESOURCES
28 #include <kcal/todo.h>
31 #include <klocalizedstring.h>
33 #include <QStringList>
38 class AlarmText::Private
41 enum Type { None, Email, Script, Todo };
44 static void initialise();
45 static void setUpTranslations();
46 static int emailHeaderCount(
const QStringList&);
47 static QString todoTitle(
const QString& text);
49 static QString mFromPrefix;
50 static QString mToPrefix;
51 static QString mCcPrefix;
52 static QString mDatePrefix;
53 static QString mSubjectPrefix;
54 static QString mTitlePrefix;
55 static QString mLocnPrefix;
56 static QString mDuePrefix;
57 static QString mFromPrefixEn;
58 static QString mToPrefixEn;
59 static QString mCcPrefixEn;
60 static QString mDatePrefixEn;
61 static QString mSubjectPrefixEn;
62 static bool mInitialised;
64 QString mBody, mFrom, mTo, mCc, mTime, mSubject;
65 unsigned long mKMailSerialNum;
70 QString AlarmText::Private::mFromPrefix;
71 QString AlarmText::Private::mToPrefix;
72 QString AlarmText::Private::mCcPrefix;
73 QString AlarmText::Private::mDatePrefix;
74 QString AlarmText::Private::mSubjectPrefix;
75 QString AlarmText::Private::mTitlePrefix;
76 QString AlarmText::Private::mLocnPrefix;
77 QString AlarmText::Private::mDuePrefix;
78 QString AlarmText::Private::mFromPrefixEn;
79 QString AlarmText::Private::mToPrefixEn;
80 QString AlarmText::Private::mCcPrefixEn;
81 QString AlarmText::Private::mDatePrefixEn;
82 QString AlarmText::Private::mSubjectPrefixEn;
83 bool AlarmText::Private::mInitialised =
false;
85 void AlarmText::Private::initialise()
90 mFromPrefixEn = QLatin1String(
"From:");
91 mToPrefixEn = QLatin1String(
"To:");
92 mCcPrefixEn = QLatin1String(
"Cc:");
93 mDatePrefixEn = QLatin1String(
"Date:");
94 mSubjectPrefixEn = QLatin1String(
"Subject:");
101 Private::initialise();
106 : d(new Private(*other.d))
110 AlarmText::~AlarmText()
115 AlarmText& AlarmText::operator=(
const AlarmText& other)
126 if (text.startsWith(QLatin1String(
"#!")))
127 d->mType = Private::Script;
133 d->mType = Private::Script;
137 const QString& subject,
const QString& body,
unsigned long kmailSerialNumber)
140 d->mType = Private::Email;
150 #ifndef KALARMCAL_USE_KRESOURCES
157 d->mType = Private::Todo;
158 d->mSubject = todo->summary();
159 d->mBody = todo->description();
160 d->mTo = todo->location();
161 if (todo->hasDueDate())
163 KDateTime due = todo->dtDue(
false);
164 if (todo->hasStartDate() && todo->dtStart() != due)
166 d->mTime = todo->allDay() ? KGlobal::locale()->formatDate(due.date(), KLocale::ShortDate)
167 : KGlobal::locale()->formatDateTime(due.dateTime());
177 return d->displayText();
180 QString AlarmText::Private::displayText()
const
188 text = mFromPrefix + QLatin1Char(
'\t') + mFrom + QLatin1Char(
'\n');
189 text += mToPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
191 text += mCcPrefix + QLatin1Char(
'\t') + mCc + QLatin1Char(
'\n');
192 if (!mTime.isEmpty())
193 text += mDatePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
194 text += mSubjectPrefix + QLatin1Char(
'\t') + mSubject;
195 if (!mBody.isEmpty())
197 text += QLatin1String(
"\n\n");
204 if (!mSubject.isEmpty())
205 text = mTitlePrefix + QLatin1Char(
'\t') + mSubject + QLatin1Char(
'\n');
207 text += mLocnPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
208 if (!mTime.isEmpty())
209 text += mDuePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
210 if (!mBody.isEmpty())
213 text += QLatin1Char(
'\n');
220 return !text.isEmpty() ? text : mBody;
225 return (d->mType == Private::Email) ? d->mTo : QString();
230 return (d->mType == Private::Email) ? d->mFrom : QString();
235 return (d->mType == Private::Email) ? d->mCc : QString();
240 return (d->mType == Private::Email) ? d->mTime : QString();
245 return (d->mType == Private::Email) ? d->mSubject : QString();
250 return (d->mType == Private::Email) ? d->mBody : QString();
255 return (d->mType == Private::Todo) ? d->mSubject : QString();
260 return (d->mType == Private::Todo) ? d->mTo : QString();
265 return (d->mType == Private::Todo) ? d->mTime : QString();
270 return (d->mType == Private::Todo) ? d->mBody : QString();
278 if (!d->mBody.isEmpty())
280 if (d->mType != Private::Email)
282 return d->mFrom.isEmpty() && d->mTo.isEmpty() && d->mCc.isEmpty() && d->mTime.isEmpty() && d->mSubject.isEmpty();
287 return d->mType == Private::Email;
292 return d->mType == Private::Script;
297 return d->mType == Private::Todo;
302 return d->mKMailSerialNum;
313 static const QRegExp localfile(QLatin1String(
"^file:/+"));
318 text =
event.audioFile();
319 if (localfile.indexIn(text) >= 0)
320 text = text.mid(localfile.matchedLength() - 1);
323 text =
event.emailSubject();
326 text =
event.cleanText();
327 if (localfile.indexIn(text) >= 0)
328 text = text.mid(localfile.matchedLength() - 1);
331 text =
event.cleanText();
335 text =
event.cleanText();
338 if (!subject.isNull())
348 subject = Private::todoTitle(text);
349 if (!subject.isEmpty())
361 if (text.count(QLatin1Char(
'\n')) < maxLines)
364 for (
int i = 0; i < maxLines; ++i)
366 newline = text.indexOf(QLatin1Char(
'\n'), newline + 1);
370 if (newline == static_cast<int>(text.length()) - 1)
371 return text.left(newline);
374 return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QLatin1String(
"...");
382 QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
383 return Private::emailHeaderCount(lines);
393 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
394 int n = Private::emailHeaderCount(lines);
398 return lines[n-1].mid(Private::mSubjectPrefix.length()).trimmed();
399 QString h = lines[0];
400 for (
int i = 1; i < n; ++i)
402 h += QLatin1Char(
'\n');
416 Private::initialise();
417 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
418 int maxn = lines.count();
420 && lines[0].startsWith(Private::mFromPrefixEn)
421 && lines[1].startsWith(Private::mToPrefixEn))
424 if (lines[2].startsWith(Private::mCcPrefixEn))
427 && lines[n].startsWith(Private::mDatePrefixEn)
428 && lines[n+1].startsWith(Private::mSubjectPrefixEn))
430 Private::setUpTranslations();
432 dispText = Private::mFromPrefix + lines[0].mid(Private::mFromPrefixEn.length()) + QLatin1Char(
'\n');
433 dispText += Private::mToPrefix + lines[1].mid(Private::mToPrefixEn.length()) + QLatin1Char(
'\n');
435 dispText += Private::mCcPrefix + lines[2].mid(Private::mCcPrefixEn.length()) + QLatin1Char(
'\n');
436 dispText += Private::mDatePrefix + lines[n].mid(Private::mDatePrefixEn.length()) + QLatin1Char(
'\n');
437 dispText += Private::mSubjectPrefix + lines[n+1].mid(Private::mSubjectPrefixEn.length());
438 int i = text.indexOf(Private::mSubjectPrefixEn);
439 i = text.indexOf(QLatin1Char(
'\n'), i);
441 dispText += text.mid(i);
456 Private::setUpTranslations();
457 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
458 int maxn = lines.count();
460 && lines[0].startsWith(Private::mFromPrefix)
461 && lines[1].startsWith(Private::mToPrefix))
464 if (lines[2].startsWith(Private::mCcPrefix))
467 && lines[n].startsWith(Private::mDatePrefix)
468 && lines[n+1].startsWith(Private::mSubjectPrefix))
472 calText = Private::mFromPrefixEn + lines[0].mid(Private::mFromPrefix.length()) + QLatin1Char(
'\n');
473 calText += Private::mToPrefixEn + lines[1].mid(Private::mToPrefix.length()) + QLatin1Char(
'\n');
475 calText += Private::mCcPrefixEn + lines[2].mid(Private::mCcPrefix.length()) + QLatin1Char(
'\n');
476 calText += Private::mDatePrefixEn + lines[n].mid(Private::mDatePrefix.length()) + QLatin1Char(
'\n');
477 calText += Private::mSubjectPrefixEn + lines[n+1].mid(Private::mSubjectPrefix.length());
478 int i = text.indexOf(Private::mSubjectPrefix);
479 i = text.indexOf(QLatin1Char(
'\n'), i);
481 calText += text.mid(i);
488 void AlarmText::Private::clear()
503 void AlarmText::Private::setUpTranslations()
506 if (mFromPrefix.isNull())
508 mFromPrefix = i18nc(
"@info/plain 'From' email address",
"From:");
509 mToPrefix = i18nc(
"@info/plain Email addressee",
"To:");
510 mCcPrefix = i18nc(
"@info/plain Copy-to in email headers",
"Cc:");
511 mDatePrefix = i18nc(
"@info/plain",
"Date:");
512 mSubjectPrefix = i18nc(
"@info/plain Email subject",
"Subject:");
514 mTitlePrefix = i18nc(
"@info/plain Todo calendar item's title field",
"To-do:");
515 mLocnPrefix = i18nc(
"@info/plain Todo calendar item's location field",
"Location:");
516 mDuePrefix = i18nc(
"@info/plain Todo calendar item's due date/time",
"Due:");
524 int AlarmText::Private::emailHeaderCount(
const QStringList& lines)
527 int maxn = lines.count();
529 && lines[0].startsWith(mFromPrefix)
530 && lines[1].startsWith(mToPrefix))
533 if (lines[2].startsWith(mCcPrefix))
536 && lines[n].startsWith(mDatePrefix)
537 && lines[n+1].startsWith(mSubjectPrefix))
546 QString AlarmText::Private::todoTitle(
const QString& text)
549 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
551 for (n = 0; n < lines.count() && lines[n].contains(QLatin1Char(
'\t')); ++n) ;
556 if (lines[i].startsWith(mTitlePrefix + QLatin1Char(
'\t')))
558 title = lines[i].mid(mTitlePrefix.length()).trimmed();
561 if (i < n && lines[i].startsWith(mLocnPrefix + QLatin1Char(
'\t')))
563 if (i < n && lines[i].startsWith(mDuePrefix + QLatin1Char(
'\t')))
568 if (!title.isEmpty())
570 if (n < lines.count())
QString summary() const
Return the summary text for a todo.
QString cc() const
Return the 'Cc' header parameter for an email alarm.
QString displayText() const
Return the text for a text message alarm, in display format.
static QString fromCalendarText(const QString &text, bool &email)
Translate an alarm calendar text to a display text.
bool isEmpty() const
Return whether there is any text.
QString subject() const
Return the 'Subject' header parameter for an email alarm.
QString location() const
Return the location text for a todo.
QString time() const
Return the 'Date' header parameter for an email alarm.
QString description() const
Return the description text for a todo.
Type
The category of an event, indicated by the middle part of its UID.
static QString emailHeaders(const QString &text, bool subjectOnly)
Check whether a text is an email (with at least To and From headers), and if so return its headers or...
bool isTodo() const
Return whether the instance contains the text of a todo.
static QString toCalendarText(const QString &text)
Return the text for an alarm message text, in alarm calendar format.
unsigned long kmailSerialNumber() const
Return the kmail serial number of an email.
bool isScript() const
Return whether the instance contains the text of a script.
QString due() const
Return the due date text for a todo.
void setEmail(const QString &to, const QString &from, const QString &cc, const QString &time, const QString &subject, const QString &body, unsigned long kmailSerialNumber=0)
Set the instance contents to be an email.
QString from() const
Return the 'From' header parameter for an email alarm.
Parses email, todo and script alarm texts.
display the contents of a file
void setScript(const QString &text)
Set the instance contents to be a script.
KAEvent represents a KAlarm event.
void setTodo(const KCalCore::Todo::Ptr &todo)
Set the instance contents to be a todo.
SubAction actionSubType() const
Return the action sub-type of the event's main alarm.
static bool checkIfEmail(const QString &text)
Return whether a text is an email, with at least To and From headers.
bool isEmail() const
Return whether the instance contains the text of an email.
void setText(const QString &text)
Set the alarm text.
AlarmText(const QString &text=QString())
Constructor which sets the alarm text.
QString body() const
Return the email message body.
QSharedPointer< Todo > Ptr
QString to() const
Return the 'To' header parameter for an email alarm.