23 #include "alarmtext.h"
27 #ifdef KALARMCAL_USE_KRESOURCES
28 #include <kcal/todo.h>
31 #include <klocalizedstring.h>
33 #include <QStringList>
37 const int MAIL_FROM_LINE = 0;
38 const int MAIL_TO_LINE = 1;
39 const int MAIL_CC_LINE = 2;
40 const int MAIL_MIN_LINES = 4;
46 class AlarmText::Private
49 enum Type { None, Email, Script, Todo };
52 static void initialise();
53 static void setUpTranslations();
54 static int emailHeaderCount(
const QStringList&);
55 static QString todoTitle(
const QString& text);
57 static QString mFromPrefix;
58 static QString mToPrefix;
59 static QString mCcPrefix;
60 static QString mDatePrefix;
61 static QString mSubjectPrefix;
62 static QString mTitlePrefix;
63 static QString mLocnPrefix;
64 static QString mDuePrefix;
65 static QString mFromPrefixEn;
66 static QString mToPrefixEn;
67 static QString mCcPrefixEn;
68 static QString mDatePrefixEn;
69 static QString mSubjectPrefixEn;
70 static bool mInitialised;
72 QString mBody, mFrom, mTo, mCc, mTime, mSubject;
73 unsigned long mKMailSerialNum;
78 QString AlarmText::Private::mFromPrefix;
79 QString AlarmText::Private::mToPrefix;
80 QString AlarmText::Private::mCcPrefix;
81 QString AlarmText::Private::mDatePrefix;
82 QString AlarmText::Private::mSubjectPrefix;
83 QString AlarmText::Private::mTitlePrefix;
84 QString AlarmText::Private::mLocnPrefix;
85 QString AlarmText::Private::mDuePrefix;
86 QString AlarmText::Private::mFromPrefixEn;
87 QString AlarmText::Private::mToPrefixEn;
88 QString AlarmText::Private::mCcPrefixEn;
89 QString AlarmText::Private::mDatePrefixEn;
90 QString AlarmText::Private::mSubjectPrefixEn;
91 bool AlarmText::Private::mInitialised =
false;
93 void AlarmText::Private::initialise()
98 mFromPrefixEn = QLatin1String(
"From:");
99 mToPrefixEn = QLatin1String(
"To:");
100 mCcPrefixEn = QLatin1String(
"Cc:");
101 mDatePrefixEn = QLatin1String(
"Date:");
102 mSubjectPrefixEn = QLatin1String(
"Subject:");
109 Private::initialise();
114 : d(new Private(*other.d))
118 AlarmText::~AlarmText()
123 AlarmText& AlarmText::operator=(
const AlarmText& other)
134 if (text.startsWith(QLatin1String(
"#!")))
135 d->mType = Private::Script;
141 d->mType = Private::Script;
145 const QString& subject,
const QString& body,
unsigned long kmailSerialNumber)
148 d->mType = Private::Email;
158 #ifndef KALARMCAL_USE_KRESOURCES
165 d->mType = Private::Todo;
166 d->mSubject = todo->summary();
167 d->mBody = todo->description();
168 d->mTo = todo->location();
169 if (todo->hasDueDate())
171 KDateTime due = todo->dtDue(
false);
172 if (todo->hasStartDate() && todo->dtStart() != due)
174 d->mTime = todo->allDay() ? KGlobal::locale()->formatDate(due.date(), KLocale::ShortDate)
175 : KGlobal::locale()->formatDateTime(due.dateTime());
185 return d->displayText();
188 QString AlarmText::Private::displayText()
const
196 text = mFromPrefix + QLatin1Char(
'\t') + mFrom + QLatin1Char(
'\n');
197 text += mToPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
199 text += mCcPrefix + QLatin1Char(
'\t') + mCc + QLatin1Char(
'\n');
200 if (!mTime.isEmpty())
201 text += mDatePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
202 text += mSubjectPrefix + QLatin1Char(
'\t') + mSubject;
203 if (!mBody.isEmpty())
205 text += QLatin1String(
"\n\n");
212 if (!mSubject.isEmpty())
213 text = mTitlePrefix + QLatin1Char(
'\t') + mSubject + QLatin1Char(
'\n');
215 text += mLocnPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
216 if (!mTime.isEmpty())
217 text += mDuePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
218 if (!mBody.isEmpty())
221 text += QLatin1Char(
'\n');
228 return !text.isEmpty() ? text : mBody;
233 return (d->mType == Private::Email) ? d->mTo : QString();
238 return (d->mType == Private::Email) ? d->mFrom : QString();
243 return (d->mType == Private::Email) ? d->mCc : QString();
248 return (d->mType == Private::Email) ? d->mTime : QString();
253 return (d->mType == Private::Email) ? d->mSubject : QString();
258 return (d->mType == Private::Email) ? d->mBody : QString();
263 return (d->mType == Private::Todo) ? d->mSubject : QString();
268 return (d->mType == Private::Todo) ? d->mTo : QString();
273 return (d->mType == Private::Todo) ? d->mTime : QString();
278 return (d->mType == Private::Todo) ? d->mBody : QString();
286 if (!d->mBody.isEmpty())
288 if (d->mType != Private::Email)
290 return d->mFrom.isEmpty() && d->mTo.isEmpty() && d->mCc.isEmpty() && d->mTime.isEmpty() && d->mSubject.isEmpty();
295 return d->mType == Private::Email;
300 return d->mType == Private::Script;
305 return d->mType == Private::Todo;
310 return d->mKMailSerialNum;
321 static const QRegExp localfile(QLatin1String(
"^file:/+"));
326 text =
event.audioFile();
327 if (localfile.indexIn(text) >= 0)
328 text = text.mid(localfile.matchedLength() - 1);
331 text =
event.emailSubject();
334 text =
event.cleanText();
335 if (localfile.indexIn(text) >= 0)
336 text = text.mid(localfile.matchedLength() - 1);
339 text =
event.cleanText();
343 text =
event.cleanText();
346 if (!subject.isNull())
356 subject = Private::todoTitle(text);
357 if (!subject.isEmpty())
369 if (text.count(QLatin1Char(
'\n')) < maxLines)
372 for (
int i = 0; i < maxLines; ++i)
374 newline = text.indexOf(QLatin1Char(
'\n'), newline + 1);
378 if (newline == static_cast<int>(text.length()) - 1)
379 return text.left(newline);
382 return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QLatin1String(
"...");
390 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
391 return Private::emailHeaderCount(lines);
401 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
402 const int n = Private::emailHeaderCount(lines);
406 return lines[n-1].mid(Private::mSubjectPrefix.length()).trimmed();
407 QString h = lines[0];
408 for (
int i = 1; i < n; ++i)
410 h += QLatin1Char(
'\n');
424 Private::initialise();
425 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
426 const int maxn = lines.count();
427 if (maxn >= MAIL_MIN_LINES
428 && lines[MAIL_FROM_LINE].startsWith(Private::mFromPrefixEn)
429 && lines[MAIL_TO_LINE].startsWith(Private::mToPrefixEn))
431 int n = MAIL_CC_LINE;
432 if (lines[MAIL_CC_LINE].startsWith(Private::mCcPrefixEn))
435 && lines[n].startsWith(Private::mDatePrefixEn)
436 && lines[n+1].startsWith(Private::mSubjectPrefixEn))
438 Private::setUpTranslations();
440 dispText = Private::mFromPrefix + lines[MAIL_FROM_LINE].mid(Private::mFromPrefixEn.length()) + QLatin1Char(
'\n');
441 dispText += Private::mToPrefix + lines[MAIL_TO_LINE].mid(Private::mToPrefixEn.length()) + QLatin1Char(
'\n');
442 if (n > MAIL_CC_LINE)
443 dispText += Private::mCcPrefix + lines[MAIL_CC_LINE].mid(Private::mCcPrefixEn.length()) + QLatin1Char(
'\n');
444 dispText += Private::mDatePrefix + lines[n].mid(Private::mDatePrefixEn.length()) + QLatin1Char(
'\n');
445 dispText += Private::mSubjectPrefix + lines[n+1].mid(Private::mSubjectPrefixEn.length());
446 int i = text.indexOf(Private::mSubjectPrefixEn);
447 i = text.indexOf(QLatin1Char(
'\n'), i);
449 dispText += text.mid(i);
464 Private::setUpTranslations();
465 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
466 const int maxn = lines.count();
467 if (maxn >= MAIL_MIN_LINES
468 && lines[MAIL_FROM_LINE].startsWith(Private::mFromPrefix)
469 && lines[MAIL_TO_LINE].startsWith(Private::mToPrefix))
471 int n = MAIL_CC_LINE;
472 if (lines[MAIL_CC_LINE].startsWith(Private::mCcPrefix))
475 && lines[n].startsWith(Private::mDatePrefix)
476 && lines[n+1].startsWith(Private::mSubjectPrefix))
480 calText = Private::mFromPrefixEn + lines[MAIL_FROM_LINE].mid(Private::mFromPrefix.length()) + QLatin1Char(
'\n');
481 calText += Private::mToPrefixEn + lines[MAIL_TO_LINE].mid(Private::mToPrefix.length()) + QLatin1Char(
'\n');
482 if (n > MAIL_CC_LINE)
483 calText += Private::mCcPrefixEn + lines[MAIL_CC_LINE].mid(Private::mCcPrefix.length()) + QLatin1Char(
'\n');
484 calText += Private::mDatePrefixEn + lines[n].mid(Private::mDatePrefix.length()) + QLatin1Char(
'\n');
485 calText += Private::mSubjectPrefixEn + lines[n+1].mid(Private::mSubjectPrefix.length());
486 int i = text.indexOf(Private::mSubjectPrefix);
487 i = text.indexOf(QLatin1Char(
'\n'), i);
489 calText += text.mid(i);
496 void AlarmText::Private::clear()
511 void AlarmText::Private::setUpTranslations()
514 if (mFromPrefix.isNull())
516 mFromPrefix = i18nc(
"@info/plain 'From' email address",
"From:");
517 mToPrefix = i18nc(
"@info/plain Email addressee",
"To:");
518 mCcPrefix = i18nc(
"@info/plain Copy-to in email headers",
"Cc:");
519 mDatePrefix = i18nc(
"@info/plain",
"Date:");
520 mSubjectPrefix = i18nc(
"@info/plain Email subject",
"Subject:");
522 mTitlePrefix = i18nc(
"@info/plain Todo calendar item's title field",
"To-do:");
523 mLocnPrefix = i18nc(
"@info/plain Todo calendar item's location field",
"Location:");
524 mDuePrefix = i18nc(
"@info/plain Todo calendar item's due date/time",
"Due:");
532 int AlarmText::Private::emailHeaderCount(
const QStringList& lines)
535 const int maxn = lines.count();
536 if (maxn >= MAIL_MIN_LINES
537 && lines[MAIL_FROM_LINE].startsWith(mFromPrefix)
538 && lines[MAIL_TO_LINE].startsWith(mToPrefix))
540 int n = MAIL_CC_LINE;
541 if (lines[MAIL_CC_LINE].startsWith(mCcPrefix))
544 && lines[n].startsWith(mDatePrefix)
545 && lines[n+1].startsWith(mSubjectPrefix))
554 QString AlarmText::Private::todoTitle(
const QString& text)
557 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
559 for (n = 0; n < lines.count() && lines[n].contains(QLatin1Char(
'\t')); ++n) ;
564 if (lines[i].startsWith(mTitlePrefix + QLatin1Char(
'\t')))
566 title = lines[i].mid(mTitlePrefix.length()).trimmed();
569 if (i < n && lines[i].startsWith(mLocnPrefix + QLatin1Char(
'\t')))
571 if (i < n && lines[i].startsWith(mDuePrefix + QLatin1Char(
'\t')))
576 if (!title.isEmpty())
578 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.