<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en_US" xml:lang="en_US"> <head> <title>libkcal: incidenceformatter.cpp Source File (libkcal)</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="pics-label" content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline DE v2.0" l gen true for "http://www.kde.org" r (nz 1 vz 1 lz 1 oz 1 cb 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://www.kde.org" r (n 0 s 0 v 0 l 0))' /> <meta name="trademark" content="KDE e.V." /> <meta name="description" content="K Desktop Environment Homepage, KDE.org" /> <meta name="MSSmartTagsPreventParsing" content="true" /> <meta name="robots" content="all" /> <link rel="shortcut icon" href="../../favicon.ico" /> <link rel="stylesheet" media="screen" type="text/css" title="APIDOX" href="doxygen.css" /> <style type="text/css"> <!-- hr { display: none; } #content h2 { margin-left: 0px; } table.mdTable { background-color: #f8f8f8; border: .2em solid #d7d7d7; } td.mdRow { padding: 8px 20px; } td.md { font-weight: bold; } td.mdname1 { font-weight: bold; color: #602020; } td.mdname { font-weight: bold; color: #602020; } --> </style> </head> <body> <div id="nav_header_top" align="right"> <a href="#content" class="doNotDisplay" accesskey="2">Skip to main content ::</a> <a href="../.."><img id="nav_header_logo" alt="Home" align="left" src="../../kde_gear_64.png" border="0" /></a> <span class="doNotDisplay">::</span> <img id="nav_header_logo_right" alt="" align="right" src="../../pimlogo.png" border="0" /> <div id="nav_header_title" align="left">KDE PIM API Reference</div> </div> <div id="nav_header_bottom" align="right"> <span class="doNotDisplay">:: <a href="#navigation" accesskey="5">Skip to Link Menu</a><br/></span> <div id="nav_header_bottom_left" style="text-align: left;"> / <a href="../../">API Reference</a> / <a href=".">libkcal</a> </div> </div> <table id="main" border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td valign="top" class="menuheader" height="0"></td> <td id="contentcolumn" valign="top" rowspan="2" > <div id="content" style="padding-top: 0px;"><div style="width:100%; margin: 0px; padding: 0px;"> <h2><a name="content"></a>libkcal</h2> <!-- Generated by Doxygen 1.5.5 --> <h1>incidenceformatter.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span> <a name="l00002"></a>00002 <span class="comment"> This file is part of libkcal.</span> <a name="l00003"></a>00003 <span class="comment"></span> <a name="l00004"></a>00004 <span class="comment"> Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org></span> <a name="l00005"></a>00005 <span class="comment"> Copyright (c) 2004 Reinhold Kainhofer <reinhold@kainhofer.com></span> <a name="l00006"></a>00006 <span class="comment"></span> <a name="l00007"></a>00007 <span class="comment"> This library is free software; you can redistribute it and/or</span> <a name="l00008"></a>00008 <span class="comment"> modify it under the terms of the GNU Library General Public</span> <a name="l00009"></a>00009 <span class="comment"> License as published by the Free Software Foundation; either</span> <a name="l00010"></a>00010 <span class="comment"> version 2 of the License, or (at your option) any later version.</span> <a name="l00011"></a>00011 <span class="comment"></span> <a name="l00012"></a>00012 <span class="comment"> This library is distributed in the hope that it will be useful,</span> <a name="l00013"></a>00013 <span class="comment"> but WITHOUT ANY WARRANTY; without even the implied warranty of</span> <a name="l00014"></a>00014 <span class="comment"> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span> <a name="l00015"></a>00015 <span class="comment"> Library General Public License for more details.</span> <a name="l00016"></a>00016 <span class="comment"></span> <a name="l00017"></a>00017 <span class="comment"> You should have received a copy of the GNU Library General Public License</span> <a name="l00018"></a>00018 <span class="comment"> along with this library; see the file COPYING.LIB. If not, write to</span> <a name="l00019"></a>00019 <span class="comment"> the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,</span> <a name="l00020"></a>00020 <span class="comment"> Boston, MA 02110-1301, USA.</span> <a name="l00021"></a>00021 <span class="comment">*/</span> <a name="l00022"></a>00022 <a name="l00023"></a>00023 <span class="preprocessor">#include "incidenceformatter.h"</span> <a name="l00024"></a>00024 <a name="l00025"></a>00025 <span class="preprocessor">#include <libkcal/attachment.h></span> <a name="l00026"></a>00026 <span class="preprocessor">#include <libkcal/event.h></span> <a name="l00027"></a>00027 <span class="preprocessor">#include <libkcal/todo.h></span> <a name="l00028"></a>00028 <span class="preprocessor">#include <libkcal/journal.h></span> <a name="l00029"></a>00029 <span class="preprocessor">#include <<a class="code" href="calendar_8h.html" title="Provides the main &quot;calendar&quot; object class.">libkcal/calendar.h</a>></span> <a name="l00030"></a>00030 <span class="preprocessor">#include <libkcal/calendarlocal.h></span> <a name="l00031"></a>00031 <span class="preprocessor">#include <libkcal/icalformat.h></span> <a name="l00032"></a>00032 <span class="preprocessor">#include <libkcal/freebusy.h></span> <a name="l00033"></a>00033 <span class="preprocessor">#include <<a class="code" href="calendarresources_8h.html" title="Provides a Calendar composed of several Calendar Resources.">libkcal/calendarresources.h</a>></span> <a name="l00034"></a>00034 <a name="l00035"></a>00035 <span class="preprocessor">#include <libemailfunctions/email.h></span> <a name="l00036"></a>00036 <a name="l00037"></a>00037 <span class="preprocessor">#include <ktnef/ktnefparser.h></span> <a name="l00038"></a>00038 <span class="preprocessor">#include <ktnef/ktnefmessage.h></span> <a name="l00039"></a>00039 <span class="preprocessor">#include <ktnef/ktnefdefs.h></span> <a name="l00040"></a>00040 <span class="preprocessor">#include <kabc/phonenumber.h></span> <a name="l00041"></a>00041 <span class="preprocessor">#include <kabc/vcardconverter.h></span> <a name="l00042"></a>00042 <span class="preprocessor">#include <kabc/stdaddressbook.h></span> <a name="l00043"></a>00043 <a name="l00044"></a>00044 <span class="preprocessor">#include <kapplication.h></span> <a name="l00045"></a>00045 <span class="comment">// #include <kdebug.h></span> <a name="l00046"></a>00046 <a name="l00047"></a>00047 <span class="preprocessor">#include <klocale.h></span> <a name="l00048"></a>00048 <span class="preprocessor">#include <kglobal.h></span> <a name="l00049"></a>00049 <span class="preprocessor">#include <kiconloader.h></span> <a name="l00050"></a>00050 <a name="l00051"></a>00051 <span class="preprocessor">#include <qbuffer.h></span> <a name="l00052"></a>00052 <span class="preprocessor">#include <qstylesheet.h></span> <a name="l00053"></a>00053 <span class="preprocessor">#include <qdatetime.h></span> <a name="l00054"></a>00054 <a name="l00055"></a>00055 <span class="preprocessor">#include <time.h></span> <a name="l00056"></a>00056 <a name="l00057"></a>00057 <a name="l00058"></a>00058 <span class="keyword">using namespace </span>KCal; <a name="l00059"></a>00059 <a name="l00060"></a>00060 <a name="l00061"></a>00061 <span class="comment">/*******************************************************************</span> <a name="l00062"></a>00062 <span class="comment"> * Helper functions for the extensive display (event viewer)</span> <a name="l00063"></a>00063 <span class="comment"> *******************************************************************/</span> <a name="l00064"></a>00064 <a name="l00065"></a>00065 <span class="keyword">static</span> QString eventViewerAddLink( <span class="keyword">const</span> QString &ref, <span class="keyword">const</span> QString &text, <a name="l00066"></a>00066 <span class="keywordtype">bool</span> newline = <span class="keyword">true</span> ) <a name="l00067"></a>00067 { <a name="l00068"></a>00068 QString tmpStr( <span class="stringliteral">"<a href=\""</span> + ref + <span class="stringliteral">"\">"</span> + text + <span class="stringliteral">"</a>"</span> ); <a name="l00069"></a>00069 <span class="keywordflow">if</span> ( newline ) tmpStr += <span class="stringliteral">"\n"</span>; <a name="l00070"></a>00070 <span class="keywordflow">return</span> tmpStr; <a name="l00071"></a>00071 } <a name="l00072"></a>00072 <a name="l00073"></a>00073 <span class="keyword">static</span> QString eventViewerAddTag( <span class="keyword">const</span> QString & tag, <span class="keyword">const</span> QString & text ) <a name="l00074"></a>00074 { <a name="l00075"></a>00075 <span class="keywordtype">int</span> numLineBreaks = text.contains( <span class="stringliteral">"\n"</span> ); <a name="l00076"></a>00076 QString str = <span class="stringliteral">"<"</span> + tag + <span class="stringliteral">">"</span>; <a name="l00077"></a>00077 QString tmpText = text; <a name="l00078"></a>00078 QString tmpStr = str; <a name="l00079"></a>00079 <span class="keywordflow">if</span>( numLineBreaks >= 0 ) { <a name="l00080"></a>00080 <span class="keywordflow">if</span> ( numLineBreaks > 0) { <a name="l00081"></a>00081 <span class="keywordtype">int</span> pos = 0; <a name="l00082"></a>00082 QString tmp; <a name="l00083"></a>00083 <span class="keywordflow">for</span>( <span class="keywordtype">int</span> i = 0; i <= numLineBreaks; i++ ) { <a name="l00084"></a>00084 pos = tmpText.find( <span class="stringliteral">"\n"</span> ); <a name="l00085"></a>00085 tmp = tmpText.left( pos ); <a name="l00086"></a>00086 tmpText = tmpText.right( tmpText.length() - pos - 1 ); <a name="l00087"></a>00087 tmpStr += tmp + <span class="stringliteral">"<br>"</span>; <a name="l00088"></a>00088 } <a name="l00089"></a>00089 } <span class="keywordflow">else</span> { <a name="l00090"></a>00090 tmpStr += tmpText; <a name="l00091"></a>00091 } <a name="l00092"></a>00092 } <a name="l00093"></a>00093 tmpStr += <span class="stringliteral">"</"</span> + tag + <span class="stringliteral">">"</span>; <a name="l00094"></a>00094 <span class="keywordflow">return</span> tmpStr; <a name="l00095"></a>00095 } <a name="l00096"></a>00096 <a name="l00097"></a>00097 <span class="keyword">static</span> QString linkPerson( <span class="keyword">const</span> QString& email, QString name, QString uid ) <a name="l00098"></a>00098 { <a name="l00099"></a>00099 <span class="comment">// Make the search, if there is an email address to search on,</span> <a name="l00100"></a>00100 <span class="comment">// and either name or uid is missing</span> <a name="l00101"></a>00101 <span class="keywordflow">if</span> ( !email.isEmpty() && ( name.isEmpty() || uid.isEmpty() ) ) { <a name="l00102"></a>00102 KABC::AddressBook *add_book = KABC::StdAddressBook::self( <span class="keyword">true</span> ); <a name="l00103"></a>00103 KABC::Addressee::List addressList = add_book->findByEmail( email ); <a name="l00104"></a>00104 KABC::Addressee o = addressList.first(); <a name="l00105"></a>00105 <span class="keywordflow">if</span> ( !o.isEmpty() && addressList.size() < 2 ) { <a name="l00106"></a>00106 <span class="keywordflow">if</span> ( name.isEmpty() ) <a name="l00107"></a>00107 <span class="comment">// No name set, so use the one from the addressbook</span> <a name="l00108"></a>00108 name = o.formattedName(); <a name="l00109"></a>00109 uid = o.uid(); <a name="l00110"></a>00110 } <span class="keywordflow">else</span> <a name="l00111"></a>00111 <span class="comment">// Email not found in the addressbook. Don't make a link</span> <a name="l00112"></a>00112 uid = QString::null; <a name="l00113"></a>00113 } <a name="l00114"></a>00114 kdDebug(5850) << <span class="stringliteral">"formatAttendees: uid = "</span> << uid << endl; <a name="l00115"></a>00115 <a name="l00116"></a>00116 <span class="comment">// Show the attendee</span> <a name="l00117"></a>00117 QString tmpString = <span class="stringliteral">"<li>"</span>; <a name="l00118"></a>00118 <span class="keywordflow">if</span> ( !uid.isEmpty() ) { <a name="l00119"></a>00119 <span class="comment">// There is a UID, so make a link to the addressbook</span> <a name="l00120"></a>00120 <span class="keywordflow">if</span> ( name.isEmpty() ) <a name="l00121"></a>00121 <span class="comment">// Use the email address for text</span> <a name="l00122"></a>00122 tmpString += eventViewerAddLink( <span class="stringliteral">"uid:"</span> + uid, email ); <a name="l00123"></a>00123 <span class="keywordflow">else</span> <a name="l00124"></a>00124 tmpString += eventViewerAddLink( <span class="stringliteral">"uid:"</span> + uid, name ); <a name="l00125"></a>00125 } <span class="keywordflow">else</span> { <a name="l00126"></a>00126 <span class="comment">// No UID, just show some text</span> <a name="l00127"></a>00127 tmpString += ( name.isEmpty() ? email : name ); <a name="l00128"></a>00128 } <a name="l00129"></a>00129 tmpString += <span class="charliteral">'\n'</span>; <a name="l00130"></a>00130 <a name="l00131"></a>00131 <span class="comment">// Make the mailto link</span> <a name="l00132"></a>00132 <span class="keywordflow">if</span> ( !email.isEmpty() ) { <a name="l00133"></a>00133 <a class="code" href="classKCal_1_1Person.html" title="This class represents a person.">KCal::Person</a> person( name, email ); <a name="l00134"></a>00134 KURL mailto; <a name="l00135"></a>00135 mailto.setProtocol( <span class="stringliteral">"mailto"</span> ); <a name="l00136"></a>00136 mailto.setPath( person.fullName() ); <a name="l00137"></a>00137 tmpString += eventViewerAddLink( mailto.url(), QString::null ); <a name="l00138"></a>00138 } <a name="l00139"></a>00139 tmpString += <span class="stringliteral">"</li>\n"</span>; <a name="l00140"></a>00140 <a name="l00141"></a>00141 <span class="keywordflow">return</span> tmpString; <a name="l00142"></a>00142 } <a name="l00143"></a>00143 <a name="l00144"></a>00144 <span class="keyword">static</span> QString eventViewerFormatAttendees( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *event ) <a name="l00145"></a>00145 { <a name="l00146"></a>00146 QString tmpStr; <a name="l00147"></a>00147 Attendee::List attendees = <span class="keyword">event</span>->attendees(); <a name="l00148"></a>00148 <span class="keywordflow">if</span> ( attendees.count() ) { <a name="l00149"></a>00149 <a name="l00150"></a>00150 <span class="comment">// Add organizer link</span> <a name="l00151"></a>00151 tmpStr += eventViewerAddTag( <span class="stringliteral">"i"</span>, i18n(<span class="stringliteral">"Organizer"</span>) ); <a name="l00152"></a>00152 tmpStr += <span class="stringliteral">"<ul>"</span>; <a name="l00153"></a>00153 tmpStr += linkPerson( event-><a class="code" href="classKCal_1_1IncidenceBase.html#eb4c2be5ce3f3961dc10204fbc5206a7">organizer</a>().<a class="code" href="classKCal_1_1Person.html#b998a684c9d50625dead81ec3f18698c">email</a>(), <a name="l00154"></a>00154 <span class="keyword">event</span>->organizer().name(), QString::null ); <a name="l00155"></a>00155 tmpStr += <span class="stringliteral">"</ul>"</span>; <a name="l00156"></a>00156 <a name="l00157"></a>00157 <span class="comment">// Add attendees links</span> <a name="l00158"></a>00158 tmpStr += eventViewerAddTag( <span class="stringliteral">"i"</span>, i18n(<span class="stringliteral">"Attendees"</span>) ); <a name="l00159"></a>00159 tmpStr += <span class="stringliteral">"<ul>"</span>; <a name="l00160"></a>00160 Attendee::List::ConstIterator it; <a name="l00161"></a>00161 <span class="keywordflow">for</span>( it = attendees.begin(); it != attendees.end(); ++it ) { <a name="l00162"></a>00162 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a> *a = *it; <a name="l00163"></a>00163 tmpStr += linkPerson( a-><a class="code" href="classKCal_1_1Person.html#b998a684c9d50625dead81ec3f18698c">email</a>(), a-><a class="code" href="classKCal_1_1Person.html#728effd37c750fe1196c063ca7c7e2be">name</a>(), a-><a class="code" href="classKCal_1_1Attendee.html#bb9d8bb1b67207c717c5e872836c7688" title="Return unique id of the attendee.">uid</a>() ); <a name="l00164"></a>00164 <span class="keywordflow">if</span> ( !a-><a class="code" href="classKCal_1_1Attendee.html#6e353bbfe35df6df4c577c480ff639c9" title="Returns the delegator.">delegator</a>().isEmpty() ) { <a name="l00165"></a>00165 tmpStr += i18n(<span class="stringliteral">" (delegated by %1)"</span> ).arg( a-><a class="code" href="classKCal_1_1Attendee.html#6e353bbfe35df6df4c577c480ff639c9" title="Returns the delegator.">delegator</a>() ); <a name="l00166"></a>00166 } <a name="l00167"></a>00167 <span class="keywordflow">if</span> ( !a-><a class="code" href="classKCal_1_1Attendee.html#ef41d5c9a34d29ef7260158a891c5bc1" title="Returns the delegate.">delegate</a>().isEmpty() ) { <a name="l00168"></a>00168 tmpStr += i18n(<span class="stringliteral">" (delegated to %1)"</span> ).arg( a-><a class="code" href="classKCal_1_1Attendee.html#ef41d5c9a34d29ef7260158a891c5bc1" title="Returns the delegate.">delegate</a>() ); <a name="l00169"></a>00169 } <a name="l00170"></a>00170 } <a name="l00171"></a>00171 tmpStr += <span class="stringliteral">"</ul>"</span>; <a name="l00172"></a>00172 } <a name="l00173"></a>00173 <span class="keywordflow">return</span> tmpStr; <a name="l00174"></a>00174 } <a name="l00175"></a>00175 <a name="l00176"></a>00176 <span class="keyword">static</span> QString eventViewerFormatAttachments( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *i ) <a name="l00177"></a>00177 { <a name="l00178"></a>00178 QString tmpStr; <a name="l00179"></a>00179 Attachment::List as = i-><a class="code" href="classKCal_1_1Incidence.html#dfc4bb0127ecf371c0707fed9eb21e3e" title="Return list of all associated attachments.">attachments</a>(); <a name="l00180"></a>00180 <span class="keywordflow">if</span> ( as.count() > 0 ) { <a name="l00181"></a>00181 Attachment::List::ConstIterator it; <a name="l00182"></a>00182 <span class="keywordflow">for</span>( it = as.begin(); it != as.end(); ++it ) { <a name="l00183"></a>00183 <span class="keywordflow">if</span> ( (*it)->isUri() ) { <a name="l00184"></a>00184 QString name; <a name="l00185"></a>00185 <span class="keywordflow">if</span> ( (*it)->uri().startsWith( <span class="stringliteral">"kmail:"</span> ) ) <a name="l00186"></a>00186 name = i18n( <span class="stringliteral">"Show mail"</span> ); <a name="l00187"></a>00187 <span class="keywordflow">else</span> <a name="l00188"></a>00188 name = (*it)->uri(); <a name="l00189"></a>00189 tmpStr += eventViewerAddLink( (*it)->uri(), name ); <a name="l00190"></a>00190 tmpStr += <span class="stringliteral">"<br>"</span>; <a name="l00191"></a>00191 } <a name="l00192"></a>00192 } <a name="l00193"></a>00193 } <a name="l00194"></a>00194 <span class="keywordflow">return</span> tmpStr; <a name="l00195"></a>00195 } <a name="l00196"></a>00196 <a name="l00197"></a>00197 <span class="comment">/*</span> <a name="l00198"></a>00198 <span class="comment"> FIXME:This function depends of kaddressbook. Is necessary a new</span> <a name="l00199"></a>00199 <span class="comment"> type of event?</span> <a name="l00200"></a>00200 <span class="comment">*/</span> <a name="l00201"></a>00201 <span class="keyword">static</span> QString eventViewerFormatBirthday( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l00202"></a>00202 { <a name="l00203"></a>00203 <span class="keywordflow">if</span> ( !event) <span class="keywordflow">return</span> QString::null; <a name="l00204"></a>00204 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1CustomProperties.html#4809ed307d0a7e8bae90485a34e342fb" title="Return the value of a custom calendar property.">customProperty</a>(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"BIRTHDAY"</span>) != <span class="stringliteral">"YES"</span> ) <span class="keywordflow">return</span> QString::null; <a name="l00205"></a>00205 <a name="l00206"></a>00206 QString uid = <span class="keyword">event</span>->customProperty(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"UID-1"</span>); <a name="l00207"></a>00207 QString name = <span class="keyword">event</span>->customProperty(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"NAME-1"</span>); <a name="l00208"></a>00208 QString email= <span class="keyword">event</span>->customProperty(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"EMAIL-1"</span>); <a name="l00209"></a>00209 <a name="l00210"></a>00210 QString tmpString = <span class="stringliteral">"<ul>"</span>; <a name="l00211"></a>00211 tmpString += linkPerson( email, name, uid ); <a name="l00212"></a>00212 <a name="l00213"></a>00213 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1CustomProperties.html#4809ed307d0a7e8bae90485a34e342fb" title="Return the value of a custom calendar property.">customProperty</a>( <span class="stringliteral">"KABC"</span>, <span class="stringliteral">"ANNIVERSARY"</span>) == <span class="stringliteral">"YES"</span> ) { <a name="l00214"></a>00214 uid = <span class="keyword">event</span>->customProperty(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"UID-2"</span>); <a name="l00215"></a>00215 name = <span class="keyword">event</span>->customProperty(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"NAME-2"</span>); <a name="l00216"></a>00216 email= <span class="keyword">event</span>->customProperty(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"EMAIL-2"</span>); <a name="l00217"></a>00217 tmpString += linkPerson( email, name, uid ); <a name="l00218"></a>00218 } <a name="l00219"></a>00219 <a name="l00220"></a>00220 tmpString += <span class="stringliteral">"</ul>"</span>; <a name="l00221"></a>00221 <span class="keywordflow">return</span> tmpString; <a name="l00222"></a>00222 } <a name="l00223"></a>00223 <a name="l00224"></a>00224 <span class="keyword">static</span> QString eventViewerFormatHeader( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *incidence ) <a name="l00225"></a>00225 { <a name="l00226"></a>00226 QString tmpStr = <span class="stringliteral">"<table><tr>"</span>; <a name="l00227"></a>00227 <a name="l00228"></a>00228 <span class="comment">// show icons</span> <a name="l00229"></a>00229 { <a name="l00230"></a>00230 tmpStr += <span class="stringliteral">"<td>"</span>; <a name="l00231"></a>00231 <a name="l00232"></a>00232 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#7981c13389e270b9e3e06a79d8564d5b">type</a>() == <span class="stringliteral">"Event"</span> ) { <a name="l00233"></a>00233 tmpStr += <span class="stringliteral">"<img src=\""</span> + <a name="l00234"></a>00234 KGlobal::iconLoader()->iconPath( <span class="stringliteral">"appointment"</span>, KIcon::Small ) + <a name="l00235"></a>00235 <span class="stringliteral">"\">"</span>; <a name="l00236"></a>00236 } <a name="l00237"></a>00237 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#7981c13389e270b9e3e06a79d8564d5b">type</a>() == <span class="stringliteral">"Todo"</span> ) { <a name="l00238"></a>00238 tmpStr += <span class="stringliteral">"<img src=\""</span> + <a name="l00239"></a>00239 KGlobal::iconLoader()->iconPath( <span class="stringliteral">"todo"</span>, KIcon::Small ) + <a name="l00240"></a>00240 <span class="stringliteral">"\">"</span>; <a name="l00241"></a>00241 } <a name="l00242"></a>00242 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#7981c13389e270b9e3e06a79d8564d5b">type</a>() == <span class="stringliteral">"Journal"</span> ) { <a name="l00243"></a>00243 tmpStr += <span class="stringliteral">"<img src=\""</span> + <a name="l00244"></a>00244 KGlobal::iconLoader()->iconPath( <span class="stringliteral">"journal"</span>, KIcon::Small ) + <a name="l00245"></a>00245 <span class="stringliteral">"\">"</span>; <a name="l00246"></a>00246 } <a name="l00247"></a>00247 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1Incidence.html#74b018256a65d0d87b0dc47083722406" title="Return whether any alarm associated with this incidence is enabled.">isAlarmEnabled</a>() ) { <a name="l00248"></a>00248 tmpStr += <span class="stringliteral">"<img src=\""</span> + <a name="l00249"></a>00249 KGlobal::iconLoader()->iconPath( <span class="stringliteral">"bell"</span>, KIcon::Small ) + <a name="l00250"></a>00250 <span class="stringliteral">"\">"</span>; <a name="l00251"></a>00251 } <a name="l00252"></a>00252 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1Incidence.html#81ad15662138be07f0d55be6b075b043" title="Forward to Recurrence::doesRecur().">doesRecur</a>() ) { <a name="l00253"></a>00253 tmpStr += <span class="stringliteral">"<img src=\""</span> + <a name="l00254"></a>00254 KGlobal::iconLoader()->iconPath( <span class="stringliteral">"recur"</span>, KIcon::Small ) + <a name="l00255"></a>00255 <span class="stringliteral">"\">"</span>; <a name="l00256"></a>00256 } <a name="l00257"></a>00257 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#ed5d0696a6288811b20343d6e467a93a" title="Return if the object is read-only.">isReadOnly</a>() ) { <a name="l00258"></a>00258 tmpStr += <span class="stringliteral">"<img src=\""</span> + <a name="l00259"></a>00259 KGlobal::iconLoader()->iconPath( <span class="stringliteral">"readonlyevent"</span>, KIcon::Small ) + <a name="l00260"></a>00260 <span class="stringliteral">"\">"</span>; <a name="l00261"></a>00261 } <a name="l00262"></a>00262 <a name="l00263"></a>00263 tmpStr += <span class="stringliteral">"</td>"</span>; <a name="l00264"></a>00264 } <a name="l00265"></a>00265 <a name="l00266"></a>00266 tmpStr += <span class="stringliteral">"<td>"</span> <a name="l00267"></a>00267 + eventViewerAddTag( <span class="stringliteral">"u"</span>, <a name="l00268"></a>00268 eventViewerAddTag( <span class="stringliteral">"b"</span>, incidence-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() ) ) <a name="l00269"></a>00269 + <span class="stringliteral">"</td>"</span>; <a name="l00270"></a>00270 tmpStr += <span class="stringliteral">"</tr></table><br>"</span>; <a name="l00271"></a>00271 <a name="l00272"></a>00272 <span class="keywordflow">return</span> tmpStr; <a name="l00273"></a>00273 } <a name="l00274"></a>00274 <a name="l00275"></a>00275 <span class="keyword">static</span> QString eventViewerFormatEvent( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l00276"></a>00276 { <a name="l00277"></a>00277 <span class="keywordflow">if</span> ( !event ) <span class="keywordflow">return</span> QString::null; <a name="l00278"></a>00278 QString tmpStr = eventViewerFormatHeader( event ); <a name="l00279"></a>00279 <a name="l00280"></a>00280 tmpStr += <span class="stringliteral">"<table>"</span>; <a name="l00281"></a>00281 <a name="l00282"></a>00282 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00283"></a>00283 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l00284"></a>00284 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Event.html#579d969ee1963d287f5662554a5aaa4b" title="Return true if the event spans multiple days, otherwise return false.">isMultiDay</a>() ) { <a name="l00285"></a>00285 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Time"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00286"></a>00286 tmpStr += <span class="stringliteral">"<td>"</span> + i18n(<span class="stringliteral">"<beginTime> - <endTime>"</span>,<span class="stringliteral">"%1 - %2"</span>) <a name="l00287"></a>00287 .arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ) <a name="l00288"></a>00288 .arg( event-><a class="code" href="classKCal_1_1Event.html#4138e4c8a9218b9bdf55e0e8f471341d" title="Return end date as string formatted according to the users locale settings.">dtEndDateStr</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00289"></a>00289 } <span class="keywordflow">else</span> { <a name="l00290"></a>00290 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Date"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00291"></a>00291 tmpStr += <span class="stringliteral">"<td>"</span> + i18n(<span class="stringliteral">"date as string"</span>,<span class="stringliteral">"%1"</span>).arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00292"></a>00292 } <a name="l00293"></a>00293 } <span class="keywordflow">else</span> { <a name="l00294"></a>00294 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Event.html#579d969ee1963d287f5662554a5aaa4b" title="Return true if the event spans multiple days, otherwise return false.">isMultiDay</a>() ) { <a name="l00295"></a>00295 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Time"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00296"></a>00296 tmpStr += <span class="stringliteral">"<td>"</span> + i18n(<span class="stringliteral">"<beginTime> - <endTime>"</span>,<span class="stringliteral">"%1 - %2"</span>) <a name="l00297"></a>00297 .arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#94846b495fa6de8138dca8f997e48e57" title="returns an event&#39;s starting date and time as a string formatted according to...">dtStartStr</a>() ) <a name="l00298"></a>00298 .arg( event-><a class="code" href="classKCal_1_1Event.html#22e773f909419de771c0635ba1297e12" title="Return end date and time as string formatted according to the users locale settings...">dtEndStr</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00299"></a>00299 } <span class="keywordflow">else</span> { <a name="l00300"></a>00300 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Time"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00301"></a>00301 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Event.html#2f980150df1a3b3883f9605b25fa769f" title="Return whether the event has an end date/time.">hasEndDate</a>() && <span class="keyword">event</span>->dtStart() != <span class="keyword">event</span>->dtEnd()) { <a name="l00302"></a>00302 tmpStr += <span class="stringliteral">"<td>"</span> + i18n(<span class="stringliteral">"<beginTime> - <endTime>"</span>,<span class="stringliteral">"%1 - %2"</span>) <a name="l00303"></a>00303 .arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#ba22e2b05348fd4f18859b5e434bde3e" title="returns an event&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>() ) <a name="l00304"></a>00304 .arg( event-><a class="code" href="classKCal_1_1Event.html#90ae758766ab822ee69fc0e4524f5359" title="Return end time as string formatted according to the users locale settings.">dtEndTimeStr</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00305"></a>00305 } <span class="keywordflow">else</span> { <a name="l00306"></a>00306 tmpStr += <span class="stringliteral">"<td>"</span> + <span class="keyword">event</span>->dtStartTimeStr() + <span class="stringliteral">"</td>"</span>; <a name="l00307"></a>00307 } <a name="l00308"></a>00308 tmpStr += <span class="stringliteral">"</tr><tr>"</span>; <a name="l00309"></a>00309 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Date"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00310"></a>00310 tmpStr += <span class="stringliteral">"<td>"</span> + i18n(<span class="stringliteral">"date as string"</span>,<span class="stringliteral">"%1"</span>) <a name="l00311"></a>00311 .arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00312"></a>00312 } <a name="l00313"></a>00313 } <a name="l00314"></a>00314 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00315"></a>00315 <a name="l00316"></a>00316 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1CustomProperties.html#4809ed307d0a7e8bae90485a34e342fb" title="Return the value of a custom calendar property.">customProperty</a>(<span class="stringliteral">"KABC"</span>,<span class="stringliteral">"BIRTHDAY"</span>)== <span class="stringliteral">"YES"</span> ) { <a name="l00317"></a>00317 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00318"></a>00318 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Birthday"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00319"></a>00319 tmpStr += <span class="stringliteral">"<td>"</span> + eventViewerFormatBirthday( event ) + <span class="stringliteral">"</td>"</span>; <a name="l00320"></a>00320 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00321"></a>00321 tmpStr += <span class="stringliteral">"</table>"</span>; <a name="l00322"></a>00322 <span class="keywordflow">return</span> tmpStr; <a name="l00323"></a>00323 } <a name="l00324"></a>00324 <a name="l00325"></a>00325 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty() ) { <a name="l00326"></a>00326 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00327"></a>00327 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Description"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00328"></a>00328 tmpStr += <span class="stringliteral">"<td>"</span> + eventViewerAddTag( <span class="stringliteral">"p"</span>, event-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00329"></a>00329 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00330"></a>00330 } <a name="l00331"></a>00331 <a name="l00332"></a>00332 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>().isEmpty() ) { <a name="l00333"></a>00333 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00334"></a>00334 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Location"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00335"></a>00335 tmpStr += <span class="stringliteral">"<td>"</span> + <span class="keyword">event</span>->location() + <span class="stringliteral">"</td>"</span>; <a name="l00336"></a>00336 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00337"></a>00337 } <a name="l00338"></a>00338 <a name="l00339"></a>00339 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Incidence.html#4eae9f79708ab85745dc6fdea51afb76" title="Return categories as a list of strings.">categories</a>().count() > 0 ) { <a name="l00340"></a>00340 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00341"></a>00341 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"1 Category"</span>, <span class="stringliteral">"%n Categories"</span>, event-><a class="code" href="classKCal_1_1Incidence.html#4eae9f79708ab85745dc6fdea51afb76" title="Return categories as a list of strings.">categories</a>().count() )+ <span class="stringliteral">"</b></td>"</span>; <a name="l00342"></a>00342 tmpStr += <span class="stringliteral">"<td>"</span> + <span class="keyword">event</span>->categoriesStr() + <span class="stringliteral">"</td>"</span>; <a name="l00343"></a>00343 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00344"></a>00344 } <a name="l00345"></a>00345 <a name="l00346"></a>00346 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Incidence.html#81ad15662138be07f0d55be6b075b043" title="Forward to Recurrence::doesRecur().">doesRecur</a>() ) { <a name="l00347"></a>00347 QDateTime dt = <a name="l00348"></a>00348 <span class="keyword">event</span>->recurrence()->getNextDateTime( QDateTime::currentDateTime() ); <a name="l00349"></a>00349 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00350"></a>00350 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Next on"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00351"></a>00351 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l00352"></a>00352 tmpStr += <span class="stringliteral">"<td>"</span> + <a name="l00353"></a>00353 KGlobal::locale()->formatDateTime( dt, <span class="keyword">true</span> ) + <span class="stringliteral">"</td>"</span>; <a name="l00354"></a>00354 } <span class="keywordflow">else</span> { <a name="l00355"></a>00355 tmpStr += <span class="stringliteral">"<td>"</span> + <a name="l00356"></a>00356 KGlobal::locale()->formatDate( dt.date(), true ) + <span class="stringliteral">"</td>"</span>; <a name="l00357"></a>00357 } <a name="l00358"></a>00358 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00359"></a>00359 } <a name="l00360"></a>00360 <a name="l00361"></a>00361 <span class="keywordtype">int</span> attendeeCount = <span class="keyword">event</span>->attendees().count(); <a name="l00362"></a>00362 <span class="keywordflow">if</span> ( attendeeCount > 0 ) { <a name="l00363"></a>00363 tmpStr += <span class="stringliteral">"<tr><td colspan=\"2\">"</span>; <a name="l00364"></a>00364 tmpStr += eventViewerFormatAttendees( event ); <a name="l00365"></a>00365 tmpStr += <span class="stringliteral">"</td></tr>"</span>; <a name="l00366"></a>00366 } <a name="l00367"></a>00367 <a name="l00368"></a>00368 <span class="keywordtype">int</span> attachmentCount = <span class="keyword">event</span>->attachments().count(); <a name="l00369"></a>00369 <span class="keywordflow">if</span> ( attachmentCount > 0 ) { <a name="l00370"></a>00370 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00371"></a>00371 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"1 attachment"</span>, <span class="stringliteral">"%n attachments"</span>, attachmentCount )+ <span class="stringliteral">"</b></td>"</span>; <a name="l00372"></a>00372 tmpStr += <span class="stringliteral">"<td>"</span> + eventViewerFormatAttachments( event ) + <span class="stringliteral">"</td>"</span>; <a name="l00373"></a>00373 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00374"></a>00374 } <a name="l00375"></a>00375 <a name="l00376"></a>00376 tmpStr += <span class="stringliteral">"</table>"</span>; <a name="l00377"></a>00377 tmpStr += <span class="stringliteral">"<em>"</span> + i18n( <span class="stringliteral">"Creation date: %1."</span>).arg( <a name="l00378"></a>00378 KGlobal::locale()->formatDateTime( event-><a class="code" href="classKCal_1_1Incidence.html#8df4ebe490fea07df54e9df82c40c579" title="Return time and date of creation.">created</a>() , true ) ) + <span class="stringliteral">"</em>"</span>; <a name="l00379"></a>00379 <span class="keywordflow">return</span> tmpStr; <a name="l00380"></a>00380 } <a name="l00381"></a>00381 <a name="l00382"></a>00382 <span class="keyword">static</span> QString eventViewerFormatTodo( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l00383"></a>00383 { <a name="l00384"></a>00384 <span class="keywordflow">if</span> ( !todo ) <span class="keywordflow">return</span> QString::null; <a name="l00385"></a>00385 QString tmpStr = eventViewerFormatHeader( todo ); <a name="l00386"></a>00386 <a name="l00387"></a>00387 tmpStr += <span class="stringliteral">"<table>"</span>; <a name="l00388"></a>00388 <a name="l00389"></a>00389 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Todo.html#a40c65f6e9024015f7546e8749436b12" title="Returns true if the todo has a due date, otherwise return false.">hasDueDate</a>() ) { <a name="l00390"></a>00390 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00391"></a>00391 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Due on"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00392"></a>00392 <span class="keywordflow">if</span> ( !todo-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l00393"></a>00393 tmpStr += <span class="stringliteral">"<td>"</span> + <a name="l00394"></a>00394 KGlobal::locale()->formatDateTime( todo-><a class="code" href="classKCal_1_1Todo.html#09d6933ae42390339b27053faee3afec" title="Returns due date and time.">dtDue</a>(), true ) + <a name="l00395"></a>00395 <span class="stringliteral">"</td>"</span>; <a name="l00396"></a>00396 } <span class="keywordflow">else</span> { <a name="l00397"></a>00397 tmpStr += <span class="stringliteral">"<td>"</span> + <a name="l00398"></a>00398 KGlobal::locale()->formatDate( todo-><a class="code" href="classKCal_1_1Todo.html#09d6933ae42390339b27053faee3afec" title="Returns due date and time.">dtDue</a>().date(), true ) + <a name="l00399"></a>00399 <span class="stringliteral">"</td>"</span>; <a name="l00400"></a>00400 } <a name="l00401"></a>00401 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00402"></a>00402 } <a name="l00403"></a>00403 <a name="l00404"></a>00404 <span class="keywordflow">if</span> ( !todo-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty() ) { <a name="l00405"></a>00405 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00406"></a>00406 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Description"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00407"></a>00407 tmpStr += <span class="stringliteral">"<td>"</span> + todo-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() + <span class="stringliteral">"</td>"</span>; <a name="l00408"></a>00408 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00409"></a>00409 } <a name="l00410"></a>00410 <a name="l00411"></a>00411 <span class="keywordflow">if</span> ( !todo-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>().isEmpty() ) { <a name="l00412"></a>00412 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00413"></a>00413 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Location"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00414"></a>00414 tmpStr += <span class="stringliteral">"<td>"</span> + todo-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>() + <span class="stringliteral">"</td>"</span>; <a name="l00415"></a>00415 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00416"></a>00416 } <a name="l00417"></a>00417 <a name="l00418"></a>00418 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Incidence.html#4eae9f79708ab85745dc6fdea51afb76" title="Return categories as a list of strings.">categories</a>().count() > 0 ) { <a name="l00419"></a>00419 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00420"></a>00420 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"1 Category"</span>, <span class="stringliteral">"%n Categories"</span>, todo-><a class="code" href="classKCal_1_1Incidence.html#4eae9f79708ab85745dc6fdea51afb76" title="Return categories as a list of strings.">categories</a>().count() )+ <span class="stringliteral">"</b></td>"</span>; <a name="l00421"></a>00421 tmpStr += <span class="stringliteral">"<td>"</span> + todo-><a class="code" href="classKCal_1_1Incidence.html#6c9c2b897f82509f87594b17223cda3a" title="Return categories as a comma separated string.">categoriesStr</a>() + <span class="stringliteral">"</td>"</span>; <a name="l00422"></a>00422 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00423"></a>00423 } <a name="l00424"></a>00424 <a name="l00425"></a>00425 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00426"></a>00426 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Priority"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00427"></a>00427 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Incidence.html#cbd216cda3ea9d86ee12252e98da6d0b" title="Return priority.">priority</a>() > 0 ) { <a name="l00428"></a>00428 tmpStr += <span class="stringliteral">"<td>"</span> + QString::number( todo-><a class="code" href="classKCal_1_1Incidence.html#cbd216cda3ea9d86ee12252e98da6d0b" title="Return priority.">priority</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00429"></a>00429 } <span class="keywordflow">else</span> { <a name="l00430"></a>00430 tmpStr += <span class="stringliteral">"<td>"</span> + i18n( <span class="stringliteral">"Unspecified"</span> ) + <span class="stringliteral">"</td>"</span>; <a name="l00431"></a>00431 } <a name="l00432"></a>00432 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00433"></a>00433 <a name="l00434"></a>00434 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00435"></a>00435 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Completed"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00436"></a>00436 tmpStr += <span class="stringliteral">"<td>"</span> + i18n( <span class="stringliteral">"%1 %"</span> ).arg( todo-><a class="code" href="classKCal_1_1Todo.html#e269def11f2ac042c997b3d95f8521a1" title="Returns how many percent of the task are completed.">percentComplete</a>() ) + <span class="stringliteral">"</td>"</span>; <a name="l00437"></a>00437 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00438"></a>00438 <a name="l00439"></a>00439 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Incidence.html#81ad15662138be07f0d55be6b075b043" title="Forward to Recurrence::doesRecur().">doesRecur</a>() ) { <a name="l00440"></a>00440 QDateTime dt = <a name="l00441"></a>00441 todo-><a class="code" href="classKCal_1_1Incidence.html#d06004593e064a37d08c96f9ae16735e" title="Return the recurrence rule associated with this incidence.">recurrence</a>()-><a class="code" href="classKCal_1_1Recurrence.html#158561ac748570b0bf058a6b69007df8" title="Returns the date and time of the next recurrence, after the specified date/time.">getNextDateTime</a>( QDateTime::currentDateTime() ); <a name="l00442"></a>00442 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00443"></a>00443 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"Next on"</span> ) + <span class="stringliteral">"</b></td>"</span>; <a name="l00444"></a>00444 <span class="keywordflow">if</span> ( !todo-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l00445"></a>00445 tmpStr += <span class="stringliteral">"<td>"</span> + <a name="l00446"></a>00446 KGlobal::locale()->formatDateTime( dt, <span class="keyword">true</span> ) + <span class="stringliteral">"</td>"</span>; <a name="l00447"></a>00447 } <span class="keywordflow">else</span> { <a name="l00448"></a>00448 tmpStr += <span class="stringliteral">"<td>"</span> + <a name="l00449"></a>00449 KGlobal::locale()->formatDate( dt.date(), true ) + <span class="stringliteral">"</td>"</span>; <a name="l00450"></a>00450 } <a name="l00451"></a>00451 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00452"></a>00452 } <a name="l00453"></a>00453 <a name="l00454"></a>00454 <span class="keywordtype">int</span> attendeeCount = todo-><a class="code" href="classKCal_1_1IncidenceBase.html#df4df93778bfab1d165580946320b0de" title="Return list of attendees.">attendees</a>().count(); <a name="l00455"></a>00455 <span class="keywordflow">if</span> ( attendeeCount > 0 ) { <a name="l00456"></a>00456 tmpStr += <span class="stringliteral">"<tr><td colspan=\"2\">"</span>; <a name="l00457"></a>00457 tmpStr += eventViewerFormatAttendees( todo ); <a name="l00458"></a>00458 tmpStr += <span class="stringliteral">"</td></tr>"</span>; <a name="l00459"></a>00459 } <a name="l00460"></a>00460 <a name="l00461"></a>00461 <span class="keywordtype">int</span> attachmentCount = todo-><a class="code" href="classKCal_1_1Incidence.html#dfc4bb0127ecf371c0707fed9eb21e3e" title="Return list of all associated attachments.">attachments</a>().count(); <a name="l00462"></a>00462 <span class="keywordflow">if</span> ( attachmentCount > 0 ) { <a name="l00463"></a>00463 tmpStr += <span class="stringliteral">"<tr>"</span>; <a name="l00464"></a>00464 tmpStr += <span class="stringliteral">"<td align=\"right\"><b>"</span> + i18n( <span class="stringliteral">"1 attachment"</span>, <span class="stringliteral">"%n attachments"</span>, attachmentCount )+ <span class="stringliteral">"</b></td>"</span>; <a name="l00465"></a>00465 tmpStr += <span class="stringliteral">"<td>"</span> + eventViewerFormatAttachments( todo ) + <span class="stringliteral">"</td>"</span>; <a name="l00466"></a>00466 tmpStr += <span class="stringliteral">"</tr>"</span>; <a name="l00467"></a>00467 } <a name="l00468"></a>00468 <a name="l00469"></a>00469 tmpStr += <span class="stringliteral">"</table>"</span>; <a name="l00470"></a>00470 tmpStr += <span class="stringliteral">"<em>"</span> + i18n( <span class="stringliteral">"Creation date: %1."</span>).arg( <a name="l00471"></a>00471 KGlobal::locale()->formatDateTime( todo-><a class="code" href="classKCal_1_1Incidence.html#8df4ebe490fea07df54e9df82c40c579" title="Return time and date of creation.">created</a>(), true ) ) + <span class="stringliteral">"</em>"</span>; <a name="l00472"></a>00472 <span class="keywordflow">return</span> tmpStr; <a name="l00473"></a>00473 } <a name="l00474"></a>00474 <a name="l00475"></a>00475 <span class="keyword">static</span> QString eventViewerFormatJournal( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l00476"></a>00476 { <a name="l00477"></a>00477 <span class="keywordflow">if</span> ( !journal ) <span class="keywordflow">return</span> QString::null; <a name="l00478"></a>00478 <a name="l00479"></a>00479 QString tmpStr; <a name="l00480"></a>00480 <span class="keywordflow">if</span> ( !journal-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>().isEmpty() ) { <a name="l00481"></a>00481 tmpStr += eventViewerAddTag( <span class="stringliteral">"u"</span>, <a name="l00482"></a>00482 eventViewerAddTag( <span class="stringliteral">"b"</span>, journal-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() ) ); <a name="l00483"></a>00483 } <a name="l00484"></a>00484 tmpStr += eventViewerAddTag( <span class="stringliteral">"b"</span>, i18n(<span class="stringliteral">"Journal for %1"</span>).arg( journal-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>( <span class="keyword">false</span> ) ) ); <a name="l00485"></a>00485 <span class="keywordflow">if</span> ( !journal-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty() ) <a name="l00486"></a>00486 tmpStr += eventViewerAddTag( <span class="stringliteral">"p"</span>, journal-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() ); <a name="l00487"></a>00487 <span class="keywordflow">return</span> tmpStr; <a name="l00488"></a>00488 } <a name="l00489"></a>00489 <a name="l00490"></a>00490 <span class="keyword">static</span> QString eventViewerFormatFreeBusy( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l00491"></a>00491 { <a name="l00492"></a>00492 <span class="keywordflow">if</span> ( !fb ) <span class="keywordflow">return</span> QString::null; <a name="l00493"></a>00493 <a name="l00494"></a>00494 QString tmpStr = <a name="l00495"></a>00495 eventViewerAddTag( <span class="stringliteral">"u"</span>, <a name="l00496"></a>00496 eventViewerAddTag( <span class="stringliteral">"b"</span>, i18n(<span class="stringliteral">"Free/Busy information for %1"</span>) <a name="l00497"></a>00497 .arg( fb-><a class="code" href="classKCal_1_1IncidenceBase.html#eb4c2be5ce3f3961dc10204fbc5206a7">organizer</a>().<a class="code" href="classKCal_1_1Person.html#5928a154f4ff67ef7f67018dd0ec2fbf">fullName</a>() ) ) ); <a name="l00498"></a>00498 tmpStr += eventViewerAddTag( <span class="stringliteral">"i"</span>, i18n(<span class="stringliteral">"Busy times in date range %1 - %2:"</span>) <a name="l00499"></a>00499 .arg( KGlobal::locale()->formatDate( fb-><a class="code" href="classKCal_1_1IncidenceBase.html#5419a946a4e5715a0c34ec2c7e04cd9b" title="returns an event&#39;s starting date/time as a QDateTime.">dtStart</a>().date(), true ) ) <a name="l00500"></a>00500 .arg( KGlobal::locale()->formatDate( fb-><a class="code" href="classKCal_1_1FreeBusy.html#c20a78466c981ba719c43d7257ebf577">dtEnd</a>().date(), true ) ) ); <a name="l00501"></a>00501 <a name="l00502"></a>00502 QValueList<Period> periods = fb-><a class="code" href="classKCal_1_1FreeBusy.html#e4e82fcf1b6b37dd6e2742dc0c0cb2a9">busyPeriods</a>(); <a name="l00503"></a>00503 <a name="l00504"></a>00504 QString text = eventViewerAddTag( <span class="stringliteral">"em"</span>, eventViewerAddTag( <span class="stringliteral">"b"</span>, i18n(<span class="stringliteral">"Busy:"</span>) ) ); <a name="l00505"></a>00505 QValueList<Period>::iterator it; <a name="l00506"></a>00506 <span class="keywordflow">for</span> ( it = periods.begin(); it != periods.end(); ++it ) { <a name="l00507"></a>00507 <a class="code" href="classKCal_1_1Period.html" title="This class represents a period of time.">Period</a> per = *it; <a name="l00508"></a>00508 <span class="keywordflow">if</span> ( per.<a class="code" href="classKCal_1_1Period.html#17932926f71e6457392d60c3f03a320d">hasDuration</a>() ) { <a name="l00509"></a>00509 <span class="keywordtype">int</span> dur = per.<a class="code" href="classKCal_1_1Period.html#8847029b0fb5528a4e994462553ba668">duration</a>().<a class="code" href="classKCal_1_1Duration.html#34b69f5167fc798461a45971619227f6">asSeconds</a>(); <a name="l00510"></a>00510 QString cont; <a name="l00511"></a>00511 <span class="keywordflow">if</span> ( dur >= 3600 ) { <a name="l00512"></a>00512 cont += i18n(<span class="stringliteral">"1 hour "</span>, <span class="stringliteral">"%n hours "</span>, dur / 3600 ); <a name="l00513"></a>00513 dur %= 3600; <a name="l00514"></a>00514 } <a name="l00515"></a>00515 <span class="keywordflow">if</span> ( dur >= 60 ) { <a name="l00516"></a>00516 cont += i18n(<span class="stringliteral">"1 minute "</span>, <span class="stringliteral">"%n minutes "</span>, dur / 60); <a name="l00517"></a>00517 dur %= 60; <a name="l00518"></a>00518 } <a name="l00519"></a>00519 <span class="keywordflow">if</span> ( dur > 0 ) { <a name="l00520"></a>00520 cont += i18n(<span class="stringliteral">"1 second"</span>, <span class="stringliteral">"%n seconds"</span>, dur); <a name="l00521"></a>00521 } <a name="l00522"></a>00522 text += i18n(<span class="stringliteral">"startDate for duration"</span>, <span class="stringliteral">"%1 for %2"</span>) <a name="l00523"></a>00523 .arg( KGlobal::locale()->formatDateTime( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>(), false ) ) <a name="l00524"></a>00524 .arg( cont ); <a name="l00525"></a>00525 text += <span class="stringliteral">"<br>"</span>; <a name="l00526"></a>00526 } <span class="keywordflow">else</span> { <a name="l00527"></a>00527 <span class="keywordflow">if</span> ( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>().date() == per.<a class="code" href="classKCal_1_1Period.html#ba3877554831353f5017b8294748c592">end</a>().date() ) { <a name="l00528"></a>00528 text += i18n(<span class="stringliteral">"date, fromTime - toTime "</span>, <span class="stringliteral">"%1, %2 - %3"</span>) <a name="l00529"></a>00529 .arg( KGlobal::locale()->formatDate( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>().date() ) ) <a name="l00530"></a>00530 .arg( KGlobal::locale()->formatTime( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>().time() ) ) <a name="l00531"></a>00531 .arg( KGlobal::locale()->formatTime( per.<a class="code" href="classKCal_1_1Period.html#ba3877554831353f5017b8294748c592">end</a>().time() ) ); <a name="l00532"></a>00532 } <span class="keywordflow">else</span> { <a name="l00533"></a>00533 text += i18n(<span class="stringliteral">"fromDateTime - toDateTime"</span>, <span class="stringliteral">"%1 - %2"</span>) <a name="l00534"></a>00534 .arg( KGlobal::locale()->formatDateTime( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>(), false ) ) <a name="l00535"></a>00535 .arg( KGlobal::locale()->formatDateTime( per.<a class="code" href="classKCal_1_1Period.html#ba3877554831353f5017b8294748c592">end</a>(), false ) ); <a name="l00536"></a>00536 } <a name="l00537"></a>00537 text += <span class="stringliteral">"<br>"</span>; <a name="l00538"></a>00538 } <a name="l00539"></a>00539 } <a name="l00540"></a>00540 tmpStr += eventViewerAddTag( <span class="stringliteral">"p"</span>, text ); <a name="l00541"></a>00541 <span class="keywordflow">return</span> tmpStr; <a name="l00542"></a>00542 } <a name="l00543"></a>00543 <a name="l00544"></a>00544 <span class="keyword">class </span>IncidenceFormatter::EventViewerVisitor : <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a>::Visitor <a name="l00545"></a>00545 { <a name="l00546"></a>00546 <span class="keyword">public</span>: <a name="l00547"></a>00547 EventViewerVisitor() { mResult = <span class="stringliteral">""</span>; } <a name="l00548"></a>00548 <span class="keywordtype">bool</span> act( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence ) { <span class="keywordflow">return</span> incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#d99ad7b4b99e8de052ffaf8541590ff3" title="Accept IncidenceVisitor.">accept</a>( *<span class="keyword">this</span> ); } <a name="l00549"></a>00549 QString result()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> mResult; } <a name="l00550"></a>00550 <span class="keyword">protected</span>: <a name="l00551"></a>00551 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l00552"></a>00552 { <a name="l00553"></a>00553 mResult = eventViewerFormatEvent( event ); <a name="l00554"></a>00554 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l00555"></a>00555 } <a name="l00556"></a>00556 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l00557"></a>00557 { <a name="l00558"></a>00558 mResult = eventViewerFormatTodo( todo ); <a name="l00559"></a>00559 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l00560"></a>00560 } <a name="l00561"></a>00561 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l00562"></a>00562 { <a name="l00563"></a>00563 mResult = eventViewerFormatJournal( journal ); <a name="l00564"></a>00564 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l00565"></a>00565 } <a name="l00566"></a>00566 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l00567"></a>00567 { <a name="l00568"></a>00568 mResult = eventViewerFormatFreeBusy( fb ); <a name="l00569"></a>00569 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l00570"></a>00570 } <a name="l00571"></a>00571 <a name="l00572"></a>00572 <span class="keyword">protected</span>: <a name="l00573"></a>00573 QString mResult; <a name="l00574"></a>00574 }; <a name="l00575"></a>00575 <a name="l00576"></a>00576 QString IncidenceFormatter::extensiveDisplayString( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence ) <a name="l00577"></a>00577 { <a name="l00578"></a>00578 <span class="keywordflow">if</span> ( !incidence ) <span class="keywordflow">return</span> QString::null; <a name="l00579"></a>00579 EventViewerVisitor v; <a name="l00580"></a>00580 <span class="keywordflow">if</span> ( v.act( incidence ) ) { <a name="l00581"></a>00581 <span class="keywordflow">return</span> v.result(); <a name="l00582"></a>00582 } <span class="keywordflow">else</span> <a name="l00583"></a>00583 <span class="keywordflow">return</span> QString::null; <a name="l00584"></a>00584 } <a name="l00585"></a>00585 <a name="l00586"></a>00586 <a name="l00587"></a>00587 <a name="l00588"></a>00588 <a name="l00589"></a>00589 <span class="comment">/*******************************************************************</span> <a name="l00590"></a>00590 <span class="comment"> * Helper functions for the body part formatter of kmail</span> <a name="l00591"></a>00591 <span class="comment"> *******************************************************************/</span> <a name="l00592"></a>00592 <a name="l00593"></a>00593 <span class="keyword">static</span> QString string2HTML( <span class="keyword">const</span> QString& str ) <a name="l00594"></a>00594 { <a name="l00595"></a>00595 <span class="keywordflow">return</span> QStyleSheet::convertFromPlainText(str, QStyleSheetItem::WhiteSpaceNormal); <a name="l00596"></a>00596 } <a name="l00597"></a>00597 <a name="l00598"></a>00598 <span class="keyword">static</span> QString eventStartTimeStr( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l00599"></a>00599 { <a name="l00600"></a>00600 QString tmp; <a name="l00601"></a>00601 <span class="keywordflow">if</span> ( ! event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l00602"></a>00602 tmp = i18n(<span class="stringliteral">"%1: Start Date, %2: Start Time"</span>, <span class="stringliteral">"%1 %2"</span>) <a name="l00603"></a>00603 .arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>(), <span class="keyword">event</span>->dtStartTimeStr() ); <a name="l00604"></a>00604 } <span class="keywordflow">else</span> { <a name="l00605"></a>00605 tmp = i18n(<span class="stringliteral">"%1: Start Date"</span>, <span class="stringliteral">"%1 (time unspecified)"</span>) <a name="l00606"></a>00606 .arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ); <a name="l00607"></a>00607 } <a name="l00608"></a>00608 <span class="keywordflow">return</span> tmp; <a name="l00609"></a>00609 } <a name="l00610"></a>00610 <a name="l00611"></a>00611 <span class="keyword">static</span> QString eventEndTimeStr( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l00612"></a>00612 { <a name="l00613"></a>00613 QString tmp; <a name="l00614"></a>00614 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Event.html#2f980150df1a3b3883f9605b25fa769f" title="Return whether the event has an end date/time.">hasEndDate</a>() ) { <a name="l00615"></a>00615 <span class="keywordflow">if</span> ( ! event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l00616"></a>00616 tmp = i18n(<span class="stringliteral">"%1: End Date, %2: End Time"</span>, <span class="stringliteral">"%1 %2"</span>) <a name="l00617"></a>00617 .arg( event-><a class="code" href="classKCal_1_1Event.html#4138e4c8a9218b9bdf55e0e8f471341d" title="Return end date as string formatted according to the users locale settings.">dtEndDateStr</a>(), <span class="keyword">event</span>->dtEndTimeStr() ); <a name="l00618"></a>00618 } <span class="keywordflow">else</span> { <a name="l00619"></a>00619 tmp = i18n(<span class="stringliteral">"%1: End Date"</span>, <span class="stringliteral">"%1 (time unspecified)"</span>) <a name="l00620"></a>00620 .arg( event-><a class="code" href="classKCal_1_1Event.html#4138e4c8a9218b9bdf55e0e8f471341d" title="Return end date as string formatted according to the users locale settings.">dtEndDateStr</a>() ); <a name="l00621"></a>00621 } <a name="l00622"></a>00622 } <span class="keywordflow">else</span> { <a name="l00623"></a>00623 tmp = i18n( <span class="stringliteral">"Unspecified"</span> ); <a name="l00624"></a>00624 } <a name="l00625"></a>00625 <span class="keywordflow">return</span> tmp; <a name="l00626"></a>00626 } <a name="l00627"></a>00627 <a name="l00628"></a>00628 <span class="keyword">static</span> QString invitationRow( <span class="keyword">const</span> QString &cell1, <span class="keyword">const</span> QString &cell2 ) <a name="l00629"></a>00629 { <a name="l00630"></a>00630 <span class="keywordflow">return</span> <span class="stringliteral">"<tr><td>"</span> + cell1 + <span class="stringliteral">"</td><td>"</span> + cell2 + <span class="stringliteral">"</td></tr>\n"</span>; <a name="l00631"></a>00631 } <a name="l00632"></a>00632 <a name="l00633"></a>00633 <span class="keyword">static</span> QString invitationsDetailsIncidence( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *incidence ) <a name="l00634"></a>00634 { <a name="l00635"></a>00635 QString html; <a name="l00636"></a>00636 QString descr = incidence-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>(); <a name="l00637"></a>00637 <span class="keywordflow">if</span>( !descr.isEmpty() ) { <a name="l00638"></a>00638 html += <span class="stringliteral">"<br/><u>"</span> + i18n(<span class="stringliteral">"Description:"</span>) <a name="l00639"></a>00639 + <span class="stringliteral">"</u><table border=\"0\"><tr><td>&nbsp;</td><td>"</span>; <a name="l00640"></a>00640 html += string2HTML(descr) + <span class="stringliteral">"</td></tr></table>"</span>; <a name="l00641"></a>00641 } <a name="l00642"></a>00642 QStringList comments = incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#416db24cfef787a1965ae90c7855776b" title="Return all comments associated with this incidence.">comments</a>(); <a name="l00643"></a>00643 <span class="keywordflow">if</span> ( !comments.isEmpty() ) { <a name="l00644"></a>00644 html += <span class="stringliteral">"<br><u>"</span> + i18n(<span class="stringliteral">"Comments:"</span>) <a name="l00645"></a>00645 + <span class="stringliteral">"</u><table border=\"0\"><tr><td>&nbsp;</td><td><ul>"</span>; <a name="l00646"></a>00646 <span class="keywordflow">for</span> ( uint i = 0; i < comments.count(); ++i ) <a name="l00647"></a>00647 html += <span class="stringliteral">"<li>"</span> + string2HTML( comments[i] ) + <span class="stringliteral">"</li>"</span>; <a name="l00648"></a>00648 html += <span class="stringliteral">"</ul></td></tr></table>"</span>; <a name="l00649"></a>00649 } <a name="l00650"></a>00650 <span class="keywordflow">return</span> html; <a name="l00651"></a>00651 } <a name="l00652"></a>00652 <a name="l00653"></a>00653 <span class="keyword">static</span> QString invitationDetailsEvent( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a>* event ) <a name="l00654"></a>00654 { <a name="l00655"></a>00655 <span class="comment">// Meeting details are formatted into an HTML table</span> <a name="l00656"></a>00656 <span class="keywordflow">if</span> ( !event ) <a name="l00657"></a>00657 <span class="keywordflow">return</span> QString::null; <a name="l00658"></a>00658 <a name="l00659"></a>00659 QString html; <a name="l00660"></a>00660 QString tmp; <a name="l00661"></a>00661 <a name="l00662"></a>00662 QString sSummary = i18n( <span class="stringliteral">"Summary unspecified"</span> ); <a name="l00663"></a>00663 <span class="keywordflow">if</span> ( ! event-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>().isEmpty() ) { <a name="l00664"></a>00664 sSummary = string2HTML( event-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() ); <a name="l00665"></a>00665 } <a name="l00666"></a>00666 <a name="l00667"></a>00667 QString sLocation = i18n( <span class="stringliteral">"Location unspecified"</span> ); <a name="l00668"></a>00668 <span class="keywordflow">if</span> ( ! event-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>().isEmpty() ) { <a name="l00669"></a>00669 sLocation = string2HTML( event-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>() ); <a name="l00670"></a>00670 } <a name="l00671"></a>00671 <a name="l00672"></a>00672 QString dir = ( QApplication::reverseLayout() ? <span class="stringliteral">"rtl"</span> : <span class="stringliteral">"ltr"</span> ); <a name="l00673"></a>00673 html = QString(<span class="stringliteral">"<div dir=\"%1\">\n"</span>).arg(dir); <a name="l00674"></a>00674 <a name="l00675"></a>00675 html += <span class="stringliteral">"<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n"</span>; <a name="l00676"></a>00676 <a name="l00677"></a>00677 <span class="comment">// Meeting summary & location rows</span> <a name="l00678"></a>00678 html += invitationRow( i18n( <span class="stringliteral">"What:"</span> ), sSummary ); <a name="l00679"></a>00679 html += invitationRow( i18n( <span class="stringliteral">"Where:"</span> ), sLocation ); <a name="l00680"></a>00680 <a name="l00681"></a>00681 <span class="comment">// Meeting Start Time Row</span> <a name="l00682"></a>00682 html += invitationRow( i18n( <span class="stringliteral">"Start Time:"</span> ), eventStartTimeStr( event ) ); <a name="l00683"></a>00683 <a name="l00684"></a>00684 <span class="comment">// Meeting End Time Row</span> <a name="l00685"></a>00685 html += invitationRow( i18n( <span class="stringliteral">"End Time:"</span> ), eventEndTimeStr( event ) ); <a name="l00686"></a>00686 <a name="l00687"></a>00687 <span class="comment">// Meeting Duration Row</span> <a name="l00688"></a>00688 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() && <span class="keyword">event</span>->hasEndDate() ) { <a name="l00689"></a>00689 tmp = QString::null; <a name="l00690"></a>00690 QTime sDuration(0,0,0), t; <a name="l00691"></a>00691 <span class="keywordtype">int</span> secs = <span class="keyword">event</span>->dtStart().secsTo( event-><a class="code" href="classKCal_1_1Event.html#0bc3052d40d160c7d58a5483dfcff693" title="Return end date and time.">dtEnd</a>() ); <a name="l00692"></a>00692 t = sDuration.addSecs( secs ); <a name="l00693"></a>00693 <span class="keywordflow">if</span> ( t.hour() > 0 ) { <a name="l00694"></a>00694 tmp += i18n( <span class="stringliteral">"1 hour "</span>, <span class="stringliteral">"%n hours "</span>, t.hour() ); <a name="l00695"></a>00695 } <a name="l00696"></a>00696 <span class="keywordflow">if</span> ( t.minute() > 0 ) { <a name="l00697"></a>00697 tmp += i18n( <span class="stringliteral">"1 minute "</span>, <span class="stringliteral">"%n minutes "</span>, t.minute() ); <a name="l00698"></a>00698 } <a name="l00699"></a>00699 <a name="l00700"></a>00700 html += invitationRow( i18n( <span class="stringliteral">"Duration:"</span> ), tmp ); <a name="l00701"></a>00701 } <a name="l00702"></a>00702 <a name="l00703"></a>00703 html += <span class="stringliteral">"</table>\n"</span>; <a name="l00704"></a>00704 html += invitationsDetailsIncidence( event ); <a name="l00705"></a>00705 html += <span class="stringliteral">"</div>\n"</span>; <a name="l00706"></a>00706 <a name="l00707"></a>00707 <span class="keywordflow">return</span> html; <a name="l00708"></a>00708 } <a name="l00709"></a>00709 <a name="l00710"></a>00710 <span class="keyword">static</span> QString invitationDetailsTodo( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l00711"></a>00711 { <a name="l00712"></a>00712 <span class="comment">// Task details are formatted into an HTML table</span> <a name="l00713"></a>00713 <span class="keywordflow">if</span> ( !todo ) <a name="l00714"></a>00714 <span class="keywordflow">return</span> QString::null; <a name="l00715"></a>00715 <a name="l00716"></a>00716 QString sSummary = i18n( <span class="stringliteral">"Summary unspecified"</span> ); <a name="l00717"></a>00717 QString sDescr = i18n( <span class="stringliteral">"Description unspecified"</span> ); <a name="l00718"></a>00718 <span class="keywordflow">if</span> ( ! todo-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>().isEmpty() ) { <a name="l00719"></a>00719 sSummary = todo-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>(); <a name="l00720"></a>00720 } <a name="l00721"></a>00721 <span class="keywordflow">if</span> ( ! todo-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty() ) { <a name="l00722"></a>00722 sDescr = todo-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>(); <a name="l00723"></a>00723 } <a name="l00724"></a>00724 QString html( <span class="stringliteral">"<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n"</span> ); <a name="l00725"></a>00725 html += invitationRow( i18n( <span class="stringliteral">"Summary:"</span> ), sSummary ); <a name="l00726"></a>00726 html += invitationRow( i18n( <span class="stringliteral">"Description:"</span> ), sDescr ); <a name="l00727"></a>00727 html += <span class="stringliteral">"</table>\n"</span>; <a name="l00728"></a>00728 html += invitationsDetailsIncidence( todo ); <a name="l00729"></a>00729 <a name="l00730"></a>00730 <span class="keywordflow">return</span> html; <a name="l00731"></a>00731 } <a name="l00732"></a>00732 <a name="l00733"></a>00733 <span class="keyword">static</span> QString invitationDetailsJournal( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l00734"></a>00734 { <a name="l00735"></a>00735 <span class="keywordflow">if</span> ( !journal ) <a name="l00736"></a>00736 <span class="keywordflow">return</span> QString::null; <a name="l00737"></a>00737 <a name="l00738"></a>00738 QString sSummary = i18n( <span class="stringliteral">"Summary unspecified"</span> ); <a name="l00739"></a>00739 QString sDescr = i18n( <span class="stringliteral">"Description unspecified"</span> ); <a name="l00740"></a>00740 <span class="keywordflow">if</span> ( ! journal-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>().isEmpty() ) { <a name="l00741"></a>00741 sSummary = journal-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>(); <a name="l00742"></a>00742 } <a name="l00743"></a>00743 <span class="keywordflow">if</span> ( ! journal-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty() ) { <a name="l00744"></a>00744 sDescr = journal-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>(); <a name="l00745"></a>00745 } <a name="l00746"></a>00746 QString html( <span class="stringliteral">"<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n"</span> ); <a name="l00747"></a>00747 html += invitationRow( i18n( <span class="stringliteral">"Summary:"</span> ), sSummary ); <a name="l00748"></a>00748 html += invitationRow( i18n( <span class="stringliteral">"Date:"</span> ), journal-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>( <span class="keyword">false</span> ) ); <a name="l00749"></a>00749 html += invitationRow( i18n( <span class="stringliteral">"Description:"</span> ), sDescr ); <a name="l00750"></a>00750 html += <span class="stringliteral">"</table>\n"</span>; <a name="l00751"></a>00751 html += invitationsDetailsIncidence( journal ); <a name="l00752"></a>00752 <a name="l00753"></a>00753 <span class="keywordflow">return</span> html; <a name="l00754"></a>00754 } <a name="l00755"></a>00755 <a name="l00756"></a>00756 <span class="keyword">static</span> QString invitationDetailsFreeBusy( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l00757"></a>00757 { <a name="l00758"></a>00758 <span class="keywordflow">if</span> ( !fb ) <a name="l00759"></a>00759 <span class="keywordflow">return</span> QString::null; <a name="l00760"></a>00760 QString html( <span class="stringliteral">"<table border=\"0\" cellpadding=\"1\" cellspacing=\"1\">\n"</span> ); <a name="l00761"></a>00761 <a name="l00762"></a>00762 html += invitationRow( i18n(<span class="stringliteral">"Person:"</span>), fb-><a class="code" href="classKCal_1_1IncidenceBase.html#eb4c2be5ce3f3961dc10204fbc5206a7">organizer</a>().<a class="code" href="classKCal_1_1Person.html#5928a154f4ff67ef7f67018dd0ec2fbf">fullName</a>() ); <a name="l00763"></a>00763 html += invitationRow( i18n(<span class="stringliteral">"Start date:"</span>), fb-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ); <a name="l00764"></a>00764 html += invitationRow( i18n(<span class="stringliteral">"End date:"</span>), <a name="l00765"></a>00765 KGlobal::locale()->formatDate( fb-><a class="code" href="classKCal_1_1FreeBusy.html#c20a78466c981ba719c43d7257ebf577">dtEnd</a>().date(), true ) ); <a name="l00766"></a>00766 html += <span class="stringliteral">"<tr><td colspan=2><hr></td></tr>\n"</span>; <a name="l00767"></a>00767 html += <span class="stringliteral">"<tr><td colspan=2>Busy periods given in this free/busy object:</td></tr>\n"</span>; <a name="l00768"></a>00768 <a name="l00769"></a>00769 QValueList<Period> periods = fb-><a class="code" href="classKCal_1_1FreeBusy.html#e4e82fcf1b6b37dd6e2742dc0c0cb2a9">busyPeriods</a>(); <a name="l00770"></a>00770 <a name="l00771"></a>00771 QValueList<Period>::iterator it; <a name="l00772"></a>00772 <span class="keywordflow">for</span> ( it = periods.begin(); it != periods.end(); ++it ) { <a name="l00773"></a>00773 <a class="code" href="classKCal_1_1Period.html" title="This class represents a period of time.">Period</a> per = *it; <a name="l00774"></a>00774 <span class="keywordflow">if</span> ( per.<a class="code" href="classKCal_1_1Period.html#17932926f71e6457392d60c3f03a320d">hasDuration</a>() ) { <a name="l00775"></a>00775 <span class="keywordtype">int</span> dur = per.<a class="code" href="classKCal_1_1Period.html#8847029b0fb5528a4e994462553ba668">duration</a>().<a class="code" href="classKCal_1_1Duration.html#34b69f5167fc798461a45971619227f6">asSeconds</a>(); <a name="l00776"></a>00776 QString cont; <a name="l00777"></a>00777 <span class="keywordflow">if</span> ( dur >= 3600 ) { <a name="l00778"></a>00778 cont += i18n(<span class="stringliteral">"1 hour "</span>, <span class="stringliteral">"%n hours "</span>, dur / 3600); <a name="l00779"></a>00779 dur %= 3600; <a name="l00780"></a>00780 } <a name="l00781"></a>00781 <span class="keywordflow">if</span> ( dur >= 60 ) { <a name="l00782"></a>00782 cont += i18n(<span class="stringliteral">"1 minute"</span>, <span class="stringliteral">"%n minutes "</span>, dur / 60); <a name="l00783"></a>00783 dur %= 60; <a name="l00784"></a>00784 } <a name="l00785"></a>00785 <span class="keywordflow">if</span> ( dur > 0 ) { <a name="l00786"></a>00786 cont += i18n(<span class="stringliteral">"1 second"</span>, <span class="stringliteral">"%n seconds"</span>, dur); <a name="l00787"></a>00787 } <a name="l00788"></a>00788 html += invitationRow( QString::null, i18n(<span class="stringliteral">"startDate for duration"</span>, <span class="stringliteral">"%1 for %2"</span>) <a name="l00789"></a>00789 .arg( KGlobal::locale()->formatDateTime( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>(), false ) ) <a name="l00790"></a>00790 .arg(cont) ); <a name="l00791"></a>00791 } <span class="keywordflow">else</span> { <a name="l00792"></a>00792 QString cont; <a name="l00793"></a>00793 <span class="keywordflow">if</span> ( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>().date() == per.<a class="code" href="classKCal_1_1Period.html#ba3877554831353f5017b8294748c592">end</a>().date() ) { <a name="l00794"></a>00794 cont = i18n(<span class="stringliteral">"date, fromTime - toTime "</span>, <span class="stringliteral">"%1, %2 - %3"</span>) <a name="l00795"></a>00795 .arg( KGlobal::locale()->formatDate( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>().date() ) ) <a name="l00796"></a>00796 .arg( KGlobal::locale()->formatTime( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>().time() ) ) <a name="l00797"></a>00797 .arg( KGlobal::locale()->formatTime( per.<a class="code" href="classKCal_1_1Period.html#ba3877554831353f5017b8294748c592">end</a>().time() ) ); <a name="l00798"></a>00798 } <span class="keywordflow">else</span> { <a name="l00799"></a>00799 cont = i18n(<span class="stringliteral">"fromDateTime - toDateTime"</span>, <span class="stringliteral">"%1 - %2"</span>) <a name="l00800"></a>00800 .arg( KGlobal::locale()->formatDateTime( per.<a class="code" href="classKCal_1_1Period.html#90622344d68c2d05a7421f200ea8c80f">start</a>(), false ) ) <a name="l00801"></a>00801 .arg( KGlobal::locale()->formatDateTime( per.<a class="code" href="classKCal_1_1Period.html#ba3877554831353f5017b8294748c592">end</a>(), false ) ); <a name="l00802"></a>00802 } <a name="l00803"></a>00803 <a name="l00804"></a>00804 html += invitationRow( QString::null, cont ); <a name="l00805"></a>00805 } <a name="l00806"></a>00806 } <a name="l00807"></a>00807 <a name="l00808"></a>00808 html += <span class="stringliteral">"</table>\n"</span>; <a name="l00809"></a>00809 <span class="keywordflow">return</span> html; <a name="l00810"></a>00810 } <a name="l00811"></a>00811 <a name="l00812"></a>00812 <span class="keyword">static</span> QString invitationHeaderEvent( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event, <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *msg ) <a name="l00813"></a>00813 { <a name="l00814"></a>00814 <span class="keywordflow">if</span> ( !msg || !event ) <a name="l00815"></a>00815 <span class="keywordflow">return</span> QString::null; <a name="l00816"></a>00816 <span class="keywordflow">switch</span> ( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ) { <a name="l00817"></a>00817 <span class="keywordflow">case</span> Scheduler::Publish: <a name="l00818"></a>00818 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"This event has been published"</span>); <a name="l00819"></a>00819 <span class="keywordflow">case</span> Scheduler::Request: <a name="l00820"></a>00820 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Incidence.html#061b1b33e5105cee5a2a6db2abc04b92" title="Return the number of revisions this event has seen.">revision</a>() > 0 ) <a name="l00821"></a>00821 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This meeting has been updated"</span> ); <a name="l00822"></a>00822 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"You have been invited to this meeting"</span> ); <a name="l00823"></a>00823 <span class="keywordflow">case</span> Scheduler::Refresh: <a name="l00824"></a>00824 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This invitation was refreshed"</span> ); <a name="l00825"></a>00825 <span class="keywordflow">case</span> Scheduler::Cancel: <a name="l00826"></a>00826 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This meeting has been canceled"</span> ); <a name="l00827"></a>00827 <span class="keywordflow">case</span> Scheduler::Add: <a name="l00828"></a>00828 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Addition to the meeting invitation"</span> ); <a name="l00829"></a>00829 <span class="keywordflow">case</span> Scheduler::Reply: { <a name="l00830"></a>00830 Attendee::List attendees = <span class="keyword">event</span>->attendees(); <a name="l00831"></a>00831 <span class="keywordflow">if</span>( attendees.count() == 0 ) { <a name="l00832"></a>00832 kdDebug(5850) << <span class="stringliteral">"No attendees in the iCal reply!\n"</span>; <a name="l00833"></a>00833 <span class="keywordflow">return</span> QString::null; <a name="l00834"></a>00834 } <a name="l00835"></a>00835 <span class="keywordflow">if</span>( attendees.count() != 1 ) <a name="l00836"></a>00836 kdDebug(5850) << <span class="stringliteral">"Warning: attendeecount in the reply should be 1 "</span> <a name="l00837"></a>00837 << <span class="stringliteral">"but is "</span> << attendees.count() << endl; <a name="l00838"></a>00838 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a>* attendee = *attendees.begin(); <a name="l00839"></a>00839 QString attendeeName = attendee-><a class="code" href="classKCal_1_1Person.html#728effd37c750fe1196c063ca7c7e2be">name</a>(); <a name="l00840"></a>00840 <span class="keywordflow">if</span> ( attendeeName.isEmpty() ) <a name="l00841"></a>00841 attendeeName = attendee-><a class="code" href="classKCal_1_1Person.html#b998a684c9d50625dead81ec3f18698c">email</a>(); <a name="l00842"></a>00842 <span class="keywordflow">if</span> ( attendeeName.isEmpty() ) <a name="l00843"></a>00843 attendeeName = i18n( <span class="stringliteral">"Sender"</span> ); <a name="l00844"></a>00844 <a name="l00845"></a>00845 QString delegatorName, dummy; <a name="l00846"></a>00846 KPIM::getNameAndMail( attendee-><a class="code" href="classKCal_1_1Attendee.html#6e353bbfe35df6df4c577c480ff639c9" title="Returns the delegator.">delegator</a>(), delegatorName, dummy ); <a name="l00847"></a>00847 <span class="keywordflow">if</span> ( delegatorName.isEmpty() ) <a name="l00848"></a>00848 delegatorName = attendee-><a class="code" href="classKCal_1_1Attendee.html#6e353bbfe35df6df4c577c480ff639c9" title="Returns the delegator.">delegator</a>(); <a name="l00849"></a>00849 <a name="l00850"></a>00850 <span class="keywordflow">switch</span>( attendee-><a class="code" href="classKCal_1_1Attendee.html#72768a7d915adf124527e51e200286ee" title="Return status.">status</a>() ) { <a name="l00851"></a>00851 <span class="keywordflow">case</span> Attendee::NeedsAction: <a name="l00852"></a>00852 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 indicates this invitation still needs some action"</span> ).arg( attendeeName ); <a name="l00853"></a>00853 <span class="keywordflow">case</span> Attendee::Accepted: <a name="l00854"></a>00854 <span class="keywordflow">if</span> ( delegatorName.isEmpty() ) <a name="l00855"></a>00855 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 accepts this meeting invitation"</span> ).arg( attendeeName ); <a name="l00856"></a>00856 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 accepts this meeting invitation on behalf of %2"</span> ) <a name="l00857"></a>00857 .arg( attendeeName ).arg( delegatorName ); <a name="l00858"></a>00858 <span class="keywordflow">case</span> Attendee::Tentative: <a name="l00859"></a>00859 <span class="keywordflow">if</span> ( delegatorName.isEmpty() ) <a name="l00860"></a>00860 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 tentatively accepts this meeting invitation"</span> ).arg( attendeeName ); <a name="l00861"></a>00861 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 tentatively accepts this meeting invitation on behalf of %2"</span> ) <a name="l00862"></a>00862 .arg( attendeeName ).arg( delegatorName ); <a name="l00863"></a>00863 <span class="keywordflow">case</span> Attendee::Declined: <a name="l00864"></a>00864 <span class="keywordflow">if</span> ( delegatorName.isEmpty() ) <a name="l00865"></a>00865 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 declines this meeting invitation"</span> ).arg( attendeeName ); <a name="l00866"></a>00866 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 declines this meeting invitation on behalf of %2"</span> ) <a name="l00867"></a>00867 .arg( attendeeName ).arg( delegatorName ); <a name="l00868"></a>00868 <span class="keywordflow">case</span> Attendee::Delegated: { <a name="l00869"></a>00869 QString delegate, dummy; <a name="l00870"></a>00870 KPIM::getNameAndMail( attendee-><a class="code" href="classKCal_1_1Attendee.html#ef41d5c9a34d29ef7260158a891c5bc1" title="Returns the delegate.">delegate</a>(), delegate, dummy ); <a name="l00871"></a>00871 <span class="keywordflow">if</span> ( delegate.isEmpty() ) <a name="l00872"></a>00872 delegate = attendee-><a class="code" href="classKCal_1_1Attendee.html#ef41d5c9a34d29ef7260158a891c5bc1" title="Returns the delegate.">delegate</a>(); <a name="l00873"></a>00873 <span class="keywordflow">if</span> ( !delegate.isEmpty() ) <a name="l00874"></a>00874 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 has delegated this meeting invitation to %2"</span> ) <a name="l00875"></a>00875 .arg( attendeeName ) .arg( delegate ); <a name="l00876"></a>00876 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 has delegated this meeting invitation"</span> ).arg( attendeeName ); <a name="l00877"></a>00877 } <a name="l00878"></a>00878 <span class="keywordflow">case</span> Attendee::Completed: <a name="l00879"></a>00879 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This meeting invitation is now completed"</span> ); <a name="l00880"></a>00880 <span class="keywordflow">case</span> Attendee::InProcess: <a name="l00881"></a>00881 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"%1 is still processing the invitation"</span> ).arg( attendeeName ); <a name="l00882"></a>00882 <span class="keywordflow">default</span>: <a name="l00883"></a>00883 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Unknown response to this meeting invitation"</span> ); <a name="l00884"></a>00884 } <a name="l00885"></a>00885 <span class="keywordflow">break</span>; } <a name="l00886"></a>00886 <span class="keywordflow">case</span> Scheduler::Counter: <a name="l00887"></a>00887 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender makes this counter proposal"</span> ); <a name="l00888"></a>00888 <span class="keywordflow">case</span> Scheduler::Declinecounter: <a name="l00889"></a>00889 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender declines the counter proposal"</span> ); <a name="l00890"></a>00890 <span class="keywordflow">case</span> Scheduler::NoMethod: <a name="l00891"></a>00891 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"Error: iMIP message with unknown method: '%1'"</span>) <a name="l00892"></a>00892 .arg( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ); <a name="l00893"></a>00893 } <a name="l00894"></a>00894 <span class="keywordflow">return</span> QString::null; <a name="l00895"></a>00895 } <a name="l00896"></a>00896 <a name="l00897"></a>00897 <span class="keyword">static</span> QString invitationHeaderTodo( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo, <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *msg ) <a name="l00898"></a>00898 { <a name="l00899"></a>00899 <span class="keywordflow">if</span> ( !msg || !todo ) <a name="l00900"></a>00900 <span class="keywordflow">return</span> QString::null; <a name="l00901"></a>00901 <span class="keywordflow">switch</span> ( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ) { <a name="l00902"></a>00902 <span class="keywordflow">case</span> Scheduler::Publish: <a name="l00903"></a>00903 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"This task has been published"</span>); <a name="l00904"></a>00904 <span class="keywordflow">case</span> Scheduler::Request: <a name="l00905"></a>00905 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Incidence.html#061b1b33e5105cee5a2a6db2abc04b92" title="Return the number of revisions this event has seen.">revision</a>() > 0 ) <a name="l00906"></a>00906 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This task has been updated"</span> ); <a name="l00907"></a>00907 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"You have been assigned this task"</span> ); <a name="l00908"></a>00908 <span class="keywordflow">case</span> Scheduler::Refresh: <a name="l00909"></a>00909 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This task was refreshed"</span> ); <a name="l00910"></a>00910 <span class="keywordflow">case</span> Scheduler::Cancel: <a name="l00911"></a>00911 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This task was canceled"</span> ); <a name="l00912"></a>00912 <span class="keywordflow">case</span> Scheduler::Add: <a name="l00913"></a>00913 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Addition to the task"</span> ); <a name="l00914"></a>00914 <span class="keywordflow">case</span> Scheduler::Reply: { <a name="l00915"></a>00915 Attendee::List attendees = todo-><a class="code" href="classKCal_1_1IncidenceBase.html#df4df93778bfab1d165580946320b0de" title="Return list of attendees.">attendees</a>(); <a name="l00916"></a>00916 <span class="keywordflow">if</span>( attendees.count() == 0 ) { <a name="l00917"></a>00917 kdDebug(5850) << <span class="stringliteral">"No attendees in the iCal reply!\n"</span>; <a name="l00918"></a>00918 <span class="keywordflow">return</span> QString::null; <a name="l00919"></a>00919 } <a name="l00920"></a>00920 <span class="keywordflow">if</span>( attendees.count() != 1 ) <a name="l00921"></a>00921 kdDebug(5850) << <span class="stringliteral">"Warning: attendeecount in the reply should be 1 "</span> <a name="l00922"></a>00922 << <span class="stringliteral">"but is "</span> << attendees.count() << endl; <a name="l00923"></a>00923 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a>* attendee = *attendees.begin(); <a name="l00924"></a>00924 <a name="l00925"></a>00925 <span class="keywordflow">switch</span>( attendee-><a class="code" href="classKCal_1_1Attendee.html#72768a7d915adf124527e51e200286ee" title="Return status.">status</a>() ) { <a name="l00926"></a>00926 <span class="keywordflow">case</span> Attendee::NeedsAction: <a name="l00927"></a>00927 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender indicates this task assignment still needs some action"</span> ); <a name="l00928"></a>00928 <span class="keywordflow">case</span> Attendee::Accepted: <a name="l00929"></a>00929 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender accepts this task"</span> ); <a name="l00930"></a>00930 <span class="keywordflow">case</span> Attendee::Tentative: <a name="l00931"></a>00931 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender tentatively accepts this task"</span> ); <a name="l00932"></a>00932 <span class="keywordflow">case</span> Attendee::Declined: <a name="l00933"></a>00933 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender declines this task"</span> ); <a name="l00934"></a>00934 <span class="keywordflow">case</span> Attendee::Delegated: { <a name="l00935"></a>00935 QString delegate, dummy; <a name="l00936"></a>00936 KPIM::getNameAndMail( attendee-><a class="code" href="classKCal_1_1Attendee.html#ef41d5c9a34d29ef7260158a891c5bc1" title="Returns the delegate.">delegate</a>(), delegate, dummy ); <a name="l00937"></a>00937 <span class="keywordflow">if</span> ( delegate.isEmpty() ) <a name="l00938"></a>00938 delegate = attendee-><a class="code" href="classKCal_1_1Attendee.html#ef41d5c9a34d29ef7260158a891c5bc1" title="Returns the delegate.">delegate</a>(); <a name="l00939"></a>00939 <span class="keywordflow">if</span> ( !delegate.isEmpty() ) <a name="l00940"></a>00940 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender has delegated this request for the task to %1"</span> ).arg( delegate ); <a name="l00941"></a>00941 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender has delegated this request for the task "</span> ); <a name="l00942"></a>00942 } <a name="l00943"></a>00943 <span class="keywordflow">case</span> Attendee::Completed: <a name="l00944"></a>00944 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"The request for this task is now completed"</span> ); <a name="l00945"></a>00945 <span class="keywordflow">case</span> Attendee::InProcess: <a name="l00946"></a>00946 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender is still processing the invitation"</span> ); <a name="l00947"></a>00947 <span class="keywordflow">default</span>: <a name="l00948"></a>00948 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Unknown response to this task"</span> ); <a name="l00949"></a>00949 } <a name="l00950"></a>00950 <span class="keywordflow">break</span>; } <a name="l00951"></a>00951 <span class="keywordflow">case</span> Scheduler::Counter: <a name="l00952"></a>00952 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender makes this counter proposal"</span> ); <a name="l00953"></a>00953 <span class="keywordflow">case</span> Scheduler::Declinecounter: <a name="l00954"></a>00954 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender declines the counter proposal"</span> ); <a name="l00955"></a>00955 <span class="keywordflow">case</span> Scheduler::NoMethod: <a name="l00956"></a>00956 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"Error: iMIP message with unknown method: '%1'"</span>) <a name="l00957"></a>00957 .arg( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ); <a name="l00958"></a>00958 } <a name="l00959"></a>00959 <span class="keywordflow">return</span> QString::null; <a name="l00960"></a>00960 } <a name="l00961"></a>00961 <a name="l00962"></a>00962 <span class="keyword">static</span> QString invitationHeaderJournal( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal, <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *msg ) <a name="l00963"></a>00963 { <a name="l00964"></a>00964 <span class="comment">// TODO: Several of the methods are not allowed for journals, so remove them.</span> <a name="l00965"></a>00965 <span class="keywordflow">if</span> ( !msg || !journal ) <a name="l00966"></a>00966 <span class="keywordflow">return</span> QString::null; <a name="l00967"></a>00967 <span class="keywordflow">switch</span> ( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ) { <a name="l00968"></a>00968 <span class="keywordflow">case</span> Scheduler::Publish: <a name="l00969"></a>00969 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"This journal has been published"</span>); <a name="l00970"></a>00970 <span class="keywordflow">case</span> Scheduler::Request: <a name="l00971"></a>00971 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"You have been assigned this journal"</span> ); <a name="l00972"></a>00972 <span class="keywordflow">case</span> Scheduler::Refresh: <a name="l00973"></a>00973 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This journal was refreshed"</span> ); <a name="l00974"></a>00974 <span class="keywordflow">case</span> Scheduler::Cancel: <a name="l00975"></a>00975 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This journal was canceled"</span> ); <a name="l00976"></a>00976 <span class="keywordflow">case</span> Scheduler::Add: <a name="l00977"></a>00977 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Addition to the journal"</span> ); <a name="l00978"></a>00978 <span class="keywordflow">case</span> Scheduler::Reply: { <a name="l00979"></a>00979 Attendee::List attendees = journal-><a class="code" href="classKCal_1_1IncidenceBase.html#df4df93778bfab1d165580946320b0de" title="Return list of attendees.">attendees</a>(); <a name="l00980"></a>00980 <span class="keywordflow">if</span>( attendees.count() == 0 ) { <a name="l00981"></a>00981 kdDebug(5850) << <span class="stringliteral">"No attendees in the iCal reply!\n"</span>; <a name="l00982"></a>00982 <span class="keywordflow">return</span> QString::null; <a name="l00983"></a>00983 } <a name="l00984"></a>00984 <span class="keywordflow">if</span>( attendees.count() != 1 ) <a name="l00985"></a>00985 kdDebug(5850) << <span class="stringliteral">"Warning: attendeecount in the reply should be 1 "</span> <a name="l00986"></a>00986 << <span class="stringliteral">"but is "</span> << attendees.count() << endl; <a name="l00987"></a>00987 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a>* attendee = *attendees.begin(); <a name="l00988"></a>00988 <a name="l00989"></a>00989 <span class="keywordflow">switch</span>( attendee-><a class="code" href="classKCal_1_1Attendee.html#72768a7d915adf124527e51e200286ee" title="Return status.">status</a>() ) { <a name="l00990"></a>00990 <span class="keywordflow">case</span> Attendee::NeedsAction: <a name="l00991"></a>00991 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender indicates this journal assignment still needs some action"</span> ); <a name="l00992"></a>00992 <span class="keywordflow">case</span> Attendee::Accepted: <a name="l00993"></a>00993 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender accepts this journal"</span> ); <a name="l00994"></a>00994 <span class="keywordflow">case</span> Attendee::Tentative: <a name="l00995"></a>00995 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender tentatively accepts this journal"</span> ); <a name="l00996"></a>00996 <span class="keywordflow">case</span> Attendee::Declined: <a name="l00997"></a>00997 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender declines this journal"</span> ); <a name="l00998"></a>00998 <span class="keywordflow">case</span> Attendee::Delegated: <a name="l00999"></a>00999 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender has delegated this request for the journal"</span> ); <a name="l01000"></a>01000 <span class="keywordflow">case</span> Attendee::Completed: <a name="l01001"></a>01001 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"The request for this journal is now completed"</span> ); <a name="l01002"></a>01002 <span class="keywordflow">case</span> Attendee::InProcess: <a name="l01003"></a>01003 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender is still processing the invitation"</span> ); <a name="l01004"></a>01004 <span class="keywordflow">default</span>: <a name="l01005"></a>01005 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Unknown response to this journal"</span> ); <a name="l01006"></a>01006 } <a name="l01007"></a>01007 <span class="keywordflow">break</span>; } <a name="l01008"></a>01008 <span class="keywordflow">case</span> Scheduler::Counter: <a name="l01009"></a>01009 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender makes this counter proposal"</span> ); <a name="l01010"></a>01010 <span class="keywordflow">case</span> Scheduler::Declinecounter: <a name="l01011"></a>01011 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Sender declines the counter proposal"</span> ); <a name="l01012"></a>01012 <span class="keywordflow">case</span> Scheduler::NoMethod: <a name="l01013"></a>01013 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"Error: iMIP message with unknown method: '%1'"</span>) <a name="l01014"></a>01014 .arg( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ); <a name="l01015"></a>01015 } <a name="l01016"></a>01016 <span class="keywordflow">return</span> QString::null; <a name="l01017"></a>01017 } <a name="l01018"></a>01018 <a name="l01019"></a>01019 <span class="keyword">static</span> QString invitationHeaderFreeBusy( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb, <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *msg ) <a name="l01020"></a>01020 { <a name="l01021"></a>01021 <span class="keywordflow">if</span> ( !msg || !fb ) <a name="l01022"></a>01022 <span class="keywordflow">return</span> QString::null; <a name="l01023"></a>01023 <span class="keywordflow">switch</span> ( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ) { <a name="l01024"></a>01024 <span class="keywordflow">case</span> Scheduler::Publish: <a name="l01025"></a>01025 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"This free/busy list has been published"</span>); <a name="l01026"></a>01026 <span class="keywordflow">case</span> Scheduler::Request: <a name="l01027"></a>01027 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"The free/busy list has been requested"</span> ); <a name="l01028"></a>01028 <span class="keywordflow">case</span> Scheduler::Refresh: <a name="l01029"></a>01029 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This free/busy list was refreshed"</span> ); <a name="l01030"></a>01030 <span class="keywordflow">case</span> Scheduler::Cancel: <a name="l01031"></a>01031 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"This free/busy list was canceled"</span> ); <a name="l01032"></a>01032 <span class="keywordflow">case</span> Scheduler::Add: <a name="l01033"></a>01033 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Addition to the free/busy list"</span> ); <a name="l01034"></a>01034 <span class="keywordflow">case</span> Scheduler::NoMethod: <a name="l01035"></a>01035 <span class="keywordflow">default</span>: <a name="l01036"></a>01036 <span class="keywordflow">return</span> i18n(<span class="stringliteral">"Error: Free/Busy iMIP message with unknown method: '%1'"</span>) <a name="l01037"></a>01037 .arg( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ); <a name="l01038"></a>01038 } <a name="l01039"></a>01039 } <a name="l01040"></a>01040 <a name="l01041"></a>01041 <span class="keyword">class </span>IncidenceFormatter::ScheduleMessageVisitor : <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a>::Visitor <a name="l01042"></a>01042 { <a name="l01043"></a>01043 <span class="keyword">public</span>: <a name="l01044"></a>01044 ScheduleMessageVisitor() : mMessage(0) { mResult = <span class="stringliteral">""</span>; } <a name="l01045"></a>01045 <span class="keywordtype">bool</span> act( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence, <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *msg ) { mMessage = msg; <span class="keywordflow">return</span> incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#d99ad7b4b99e8de052ffaf8541590ff3" title="Accept IncidenceVisitor.">accept</a>( *<span class="keyword">this</span> ); } <a name="l01046"></a>01046 QString result()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> mResult; } <a name="l01047"></a>01047 <a name="l01048"></a>01048 <span class="keyword">protected</span>: <a name="l01049"></a>01049 QString mResult; <a name="l01050"></a>01050 <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *mMessage; <a name="l01051"></a>01051 }; <a name="l01052"></a>01052 <a name="l01053"></a>01053 <span class="keyword">class </span>IncidenceFormatter::InvitationHeaderVisitor : <a name="l01054"></a>01054 <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceFormatter.html" title="This class is a helper class that provides several static methods to format an Incidence...">IncidenceFormatter</a>::ScheduleMessageVisitor <a name="l01055"></a>01055 { <a name="l01056"></a>01056 <span class="keyword">protected</span>: <a name="l01057"></a>01057 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l01058"></a>01058 { <a name="l01059"></a>01059 mResult = invitationHeaderEvent( event, mMessage ); <a name="l01060"></a>01060 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01061"></a>01061 } <a name="l01062"></a>01062 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l01063"></a>01063 { <a name="l01064"></a>01064 mResult = invitationHeaderTodo( todo, mMessage ); <a name="l01065"></a>01065 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01066"></a>01066 } <a name="l01067"></a>01067 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l01068"></a>01068 { <a name="l01069"></a>01069 mResult = invitationHeaderJournal( journal, mMessage ); <a name="l01070"></a>01070 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01071"></a>01071 } <a name="l01072"></a>01072 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l01073"></a>01073 { <a name="l01074"></a>01074 mResult = invitationHeaderFreeBusy( fb, mMessage ); <a name="l01075"></a>01075 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01076"></a>01076 } <a name="l01077"></a>01077 }; <a name="l01078"></a>01078 <a name="l01079"></a>01079 <span class="keyword">class </span>IncidenceFormatter::InvitationBodyVisitor : <a name="l01080"></a>01080 <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceFormatter.html" title="This class is a helper class that provides several static methods to format an Incidence...">IncidenceFormatter</a>::ScheduleMessageVisitor <a name="l01081"></a>01081 { <a name="l01082"></a>01082 <span class="keyword">protected</span>: <a name="l01083"></a>01083 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l01084"></a>01084 { <a name="l01085"></a>01085 mResult = invitationDetailsEvent( event ); <a name="l01086"></a>01086 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01087"></a>01087 } <a name="l01088"></a>01088 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l01089"></a>01089 { <a name="l01090"></a>01090 mResult = invitationDetailsTodo( todo ); <a name="l01091"></a>01091 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01092"></a>01092 } <a name="l01093"></a>01093 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l01094"></a>01094 { <a name="l01095"></a>01095 mResult = invitationDetailsJournal( journal ); <a name="l01096"></a>01096 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01097"></a>01097 } <a name="l01098"></a>01098 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l01099"></a>01099 { <a name="l01100"></a>01100 mResult = invitationDetailsFreeBusy( fb ); <a name="l01101"></a>01101 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01102"></a>01102 } <a name="l01103"></a>01103 }; <a name="l01104"></a>01104 <a name="l01105"></a>01105 <span class="keyword">class </span>IncidenceFormatter::IncidenceCompareVisitor : <a name="l01106"></a>01106 <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a>::Visitor <a name="l01107"></a>01107 { <a name="l01108"></a>01108 <span class="keyword">public</span>: <a name="l01109"></a>01109 IncidenceCompareVisitor() : mExistingIncidence(0) {} <a name="l01110"></a>01110 <span class="keywordtype">bool</span> act( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence, <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a>* existingIncidence ) <a name="l01111"></a>01111 { <a name="l01112"></a>01112 mExistingIncidence = existingIncidence; <a name="l01113"></a>01113 <span class="keywordflow">return</span> incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#d99ad7b4b99e8de052ffaf8541590ff3" title="Accept IncidenceVisitor.">accept</a>( *<span class="keyword">this</span> ); <a name="l01114"></a>01114 } <a name="l01115"></a>01115 <a name="l01116"></a>01116 QString result()<span class="keyword"> const</span> <a name="l01117"></a>01117 <span class="keyword"> </span>{ <a name="l01118"></a>01118 <span class="keywordflow">if</span> ( mChanges.isEmpty() ) <a name="l01119"></a>01119 <span class="keywordflow">return</span> QString(); <a name="l01120"></a>01120 QString html = <span class="stringliteral">"<div align=\"left\"><ul><li>"</span>; <a name="l01121"></a>01121 html += mChanges.join( <span class="stringliteral">"</li><li>"</span> ); <a name="l01122"></a>01122 html += <span class="stringliteral">"</li><ul></div>"</span>; <a name="l01123"></a>01123 <span class="keywordflow">return</span> html; <a name="l01124"></a>01124 } <a name="l01125"></a>01125 <a name="l01126"></a>01126 <span class="keyword">protected</span>: <a name="l01127"></a>01127 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l01128"></a>01128 { <a name="l01129"></a>01129 compareEvents( event, dynamic_cast<Event*>( mExistingIncidence ) ); <a name="l01130"></a>01130 compareIncidences( event, mExistingIncidence ); <a name="l01131"></a>01131 <span class="keywordflow">return</span> !mChanges.isEmpty(); <a name="l01132"></a>01132 } <a name="l01133"></a>01133 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l01134"></a>01134 { <a name="l01135"></a>01135 compareIncidences( todo, mExistingIncidence ); <a name="l01136"></a>01136 <span class="keywordflow">return</span> !mChanges.isEmpty(); <a name="l01137"></a>01137 } <a name="l01138"></a>01138 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l01139"></a>01139 { <a name="l01140"></a>01140 compareIncidences( journal, mExistingIncidence ); <a name="l01141"></a>01141 <span class="keywordflow">return</span> !mChanges.isEmpty(); <a name="l01142"></a>01142 } <a name="l01143"></a>01143 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l01144"></a>01144 { <a name="l01145"></a>01145 Q_UNUSED( fb ); <a name="l01146"></a>01146 <span class="keywordflow">return</span> !mChanges.isEmpty(); <a name="l01147"></a>01147 } <a name="l01148"></a>01148 <a name="l01149"></a>01149 <span class="keyword">private</span>: <a name="l01150"></a>01150 <span class="keywordtype">void</span> compareEvents( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *newEvent, <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *oldEvent ) <a name="l01151"></a>01151 { <a name="l01152"></a>01152 <span class="keywordflow">if</span> ( !oldEvent || !newEvent ) <a name="l01153"></a>01153 <span class="keywordflow">return</span>; <a name="l01154"></a>01154 <span class="keywordflow">if</span> ( oldEvent-><a class="code" href="classKCal_1_1IncidenceBase.html#5419a946a4e5715a0c34ec2c7e04cd9b" title="returns an event&#39;s starting date/time as a QDateTime.">dtStart</a>() != newEvent-><a class="code" href="classKCal_1_1IncidenceBase.html#5419a946a4e5715a0c34ec2c7e04cd9b" title="returns an event&#39;s starting date/time as a QDateTime.">dtStart</a>() || oldEvent-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() != newEvent-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) <a name="l01155"></a>01155 mChanges += i18n( <span class="stringliteral">"The begin of the meeting has been changed from %1 to %2"</span> ) <a name="l01156"></a>01156 .arg( eventStartTimeStr( oldEvent ) ).arg( eventStartTimeStr( newEvent ) ); <a name="l01157"></a>01157 <span class="keywordflow">if</span> ( oldEvent-><a class="code" href="classKCal_1_1Event.html#0bc3052d40d160c7d58a5483dfcff693" title="Return end date and time.">dtEnd</a>() != newEvent-><a class="code" href="classKCal_1_1Event.html#0bc3052d40d160c7d58a5483dfcff693" title="Return end date and time.">dtEnd</a>() || oldEvent-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() != newEvent-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) <a name="l01158"></a>01158 mChanges += i18n( <span class="stringliteral">"The end of the meeting has been changed from %1 to %2"</span> ) <a name="l01159"></a>01159 .arg( eventEndTimeStr( oldEvent ) ).arg( eventEndTimeStr( newEvent ) ); <a name="l01160"></a>01160 } <a name="l01161"></a>01161 <a name="l01162"></a>01162 <span class="keywordtype">void</span> compareIncidences( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *newInc, <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *oldInc ) <a name="l01163"></a>01163 { <a name="l01164"></a>01164 <span class="keywordflow">if</span> ( !oldInc || !newInc ) <a name="l01165"></a>01165 <span class="keywordflow">return</span>; <a name="l01166"></a>01166 <span class="keywordflow">if</span> ( oldInc-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() != newInc-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() ) <a name="l01167"></a>01167 mChanges += i18n( <span class="stringliteral">"The summary has been changed to: \"%1\""</span> ).arg( newInc-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() ); <a name="l01168"></a>01168 <span class="keywordflow">if</span> ( oldInc-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>() != newInc-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>() ) <a name="l01169"></a>01169 mChanges += i18n( <span class="stringliteral">"The location has been changed to: \"%1\""</span> ).arg( newInc-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>() ); <a name="l01170"></a>01170 <span class="keywordflow">if</span> ( oldInc-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() != newInc-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() ) <a name="l01171"></a>01171 mChanges += i18n( <span class="stringliteral">"The description has been changed to: \"%1\""</span> ).arg( newInc-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() ); <a name="l01172"></a>01172 Attendee::List oldAttendees = oldInc-><a class="code" href="classKCal_1_1IncidenceBase.html#df4df93778bfab1d165580946320b0de" title="Return list of attendees.">attendees</a>(); <a name="l01173"></a>01173 Attendee::List newAttendees = newInc-><a class="code" href="classKCal_1_1IncidenceBase.html#df4df93778bfab1d165580946320b0de" title="Return list of attendees.">attendees</a>(); <a name="l01174"></a>01174 <span class="keywordflow">for</span> ( Attendee::List::ConstIterator it = newAttendees.constBegin(); it != newAttendees.constEnd(); ++it ) { <a name="l01175"></a>01175 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a> *oldAtt = oldInc-><a class="code" href="classKCal_1_1IncidenceBase.html#86f959675fdababd454eed502b841176" title="Return the Attendee with this email address.">attendeeByMail</a>( (*it)->email() ); <a name="l01176"></a>01176 <span class="keywordflow">if</span> ( !oldAtt ) { <a name="l01177"></a>01177 mChanges += i18n( <span class="stringliteral">"Attendee %1 has been added"</span> ).arg( (*it)->fullName() ); <a name="l01178"></a>01178 } <span class="keywordflow">else</span> { <a name="l01179"></a>01179 <span class="keywordflow">if</span> ( oldAtt-><a class="code" href="classKCal_1_1Attendee.html#72768a7d915adf124527e51e200286ee" title="Return status.">status</a>() != (*it)->status() ) <a name="l01180"></a>01180 mChanges += i18n( <span class="stringliteral">"The status of attendee %1 has been changed to: %2"</span> ).arg( (*it)->fullName() ) <a name="l01181"></a>01181 .arg( (*it)->statusStr() ); <a name="l01182"></a>01182 } <a name="l01183"></a>01183 } <a name="l01184"></a>01184 <span class="keywordflow">for</span> ( Attendee::List::ConstIterator it = oldAttendees.constBegin(); it != oldAttendees.constEnd(); ++it ) { <a name="l01185"></a>01185 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a> *newAtt = newInc-><a class="code" href="classKCal_1_1IncidenceBase.html#86f959675fdababd454eed502b841176" title="Return the Attendee with this email address.">attendeeByMail</a>( (*it)->email() ); <a name="l01186"></a>01186 <span class="keywordflow">if</span> ( !newAtt ) <a name="l01187"></a>01187 mChanges += i18n( <span class="stringliteral">"Attendee %1 has been removed"</span> ).arg( (*it)->fullName() ); <a name="l01188"></a>01188 } <a name="l01189"></a>01189 } <a name="l01190"></a>01190 <a name="l01191"></a>01191 <span class="keyword">private</span>: <a name="l01192"></a>01192 <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a>* mExistingIncidence; <a name="l01193"></a>01193 QStringList mChanges; <a name="l01194"></a>01194 }; <a name="l01195"></a>01195 <a name="l01196"></a>01196 <a name="l01197"></a>01197 QString InvitationFormatterHelper::makeLink( <span class="keyword">const</span> QString &<span class="keywordtype">id</span>, <span class="keyword">const</span> QString &text ) <a name="l01198"></a>01198 { <a name="l01199"></a>01199 QString res( <span class="stringliteral">"<a href=\"%1\"><b>%2</b></a>"</span> ); <a name="l01200"></a>01200 <span class="keywordflow">return</span> res.arg( generateLinkURL( <span class="keywordtype">id</span> ) ).arg( text ); <a name="l01201"></a>01201 <span class="keywordflow">return</span> res; <a name="l01202"></a>01202 } <a name="l01203"></a>01203 <a name="l01204"></a>01204 <a name="l01205"></a>01205 QString IncidenceFormatter::formatICalInvitation( QString invitation, <a class="code" href="classKCal_1_1Calendar.html" title="This is the main &quot;calendar&quot; object class.">Calendar</a> *mCalendar, <a name="l01206"></a>01206 InvitationFormatterHelper *helper ) <a name="l01207"></a>01207 { <a name="l01208"></a>01208 <span class="keywordflow">if</span> ( invitation.isEmpty() ) <span class="keywordflow">return</span> QString::null; <a name="l01209"></a>01209 <a name="l01210"></a>01210 <a class="code" href="classKCal_1_1ICalFormat.html" title="This class implements the iCalendar format.">ICalFormat</a> format; <a name="l01211"></a>01211 <span class="comment">// parseScheduleMessage takes the tz from the calendar, no need to set it manually here for the format!</span> <a name="l01212"></a>01212 <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> *msg = format.<a class="code" href="classKCal_1_1ICalFormat.html#58751e76f49e8019963f50af93ba4571" title="Parse scheduling message provided as string s.">parseScheduleMessage</a>( mCalendar, invitation ); <a name="l01213"></a>01213 <a name="l01214"></a>01214 <span class="keywordflow">if</span>( !msg ) { <a name="l01215"></a>01215 kdDebug( 5850 ) << <span class="stringliteral">"Failed to parse the scheduling message"</span> << endl; <a name="l01216"></a>01216 Q_ASSERT( format.<a class="code" href="classKCal_1_1CalFormat.html#bbc98894ae8c89b897f5c1e0adbb28e2" title="Return exception, if there is any, containing information about the last error that...">exception</a>() ); <a name="l01217"></a>01217 kdDebug( 5850 ) << format.<a class="code" href="classKCal_1_1CalFormat.html#bbc98894ae8c89b897f5c1e0adbb28e2" title="Return exception, if there is any, containing information about the last error that...">exception</a>()-><a class="code" href="classKCal_1_1ErrorFormat.html#66ed2e703af6cac1bca1e53d7e7c702e" title="Return format error message.">message</a>() << endl; <a name="l01218"></a>01218 <span class="keywordflow">return</span> QString::null; <a name="l01219"></a>01219 } <a name="l01220"></a>01220 <a name="l01221"></a>01221 <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incBase = msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#24805f0f67816c9b8610c24bbde16136" title="Return event associated with this message.">event</a>(); <a name="l01222"></a>01222 <a name="l01223"></a>01223 <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a>* existingIncidence = 0; <a name="l01224"></a>01224 <span class="keywordflow">if</span> ( helper->calendar() ) { <a name="l01225"></a>01225 existingIncidence = helper->calendar()->incidence( incBase-><a class="code" href="classKCal_1_1IncidenceBase.html#75c8bd2df73c5a62bd7cf77c2ac4d3c6" title="Return the unique id for the event.">uid</a>() ); <a name="l01226"></a>01226 <span class="keywordflow">if</span> ( !existingIncidence ) { <a name="l01227"></a>01227 <span class="keyword">const</span> Incidence::List list = helper->calendar()->incidences(); <a name="l01228"></a>01228 <span class="keywordflow">for</span> ( Incidence::List::ConstIterator it = list.begin(), end = list.end(); it != end; ++it ) { <a name="l01229"></a>01229 <span class="keywordflow">if</span> ( (*it)->schedulingID() == incBase-><a class="code" href="classKCal_1_1IncidenceBase.html#75c8bd2df73c5a62bd7cf77c2ac4d3c6" title="Return the unique id for the event.">uid</a>() ) { <a name="l01230"></a>01230 existingIncidence = *it; <a name="l01231"></a>01231 <span class="keywordflow">break</span>; <a name="l01232"></a>01232 } <a name="l01233"></a>01233 } <a name="l01234"></a>01234 } <a name="l01235"></a>01235 } <a name="l01236"></a>01236 <a name="l01237"></a>01237 <span class="comment">// First make the text of the message</span> <a name="l01238"></a>01238 QString html; <a name="l01239"></a>01239 <a name="l01240"></a>01240 QString tableStyle = QString::fromLatin1( <a name="l01241"></a>01241 <span class="stringliteral">"style=\"border: solid 1px; margin: 0em;\""</span> ); <a name="l01242"></a>01242 QString tableHead = QString::fromLatin1( <a name="l01243"></a>01243 <span class="stringliteral">"<div align=\"center\">"</span> <a name="l01244"></a>01244 <span class="stringliteral">"<table width=\"80%\" cellpadding=\"1\" cellspacing=\"0\" %1>"</span> <a name="l01245"></a>01245 <span class="stringliteral">"<tr><td>"</span>).arg(tableStyle); <a name="l01246"></a>01246 <a name="l01247"></a>01247 html += tableHead; <a name="l01248"></a>01248 InvitationHeaderVisitor headerVisitor; <a name="l01249"></a>01249 <span class="comment">// The InvitationHeaderVisitor returns false if the incidence is somehow invalid, or not handled</span> <a name="l01250"></a>01250 <span class="keywordflow">if</span> ( !headerVisitor.act( incBase, msg ) ) <a name="l01251"></a>01251 <span class="keywordflow">return</span> QString::null; <a name="l01252"></a>01252 html += <span class="stringliteral">"<b>"</span> + headerVisitor.result() + <span class="stringliteral">"</b>"</span>; <a name="l01253"></a>01253 <a name="l01254"></a>01254 InvitationBodyVisitor bodyVisitor; <a name="l01255"></a>01255 <span class="keywordflow">if</span> ( !bodyVisitor.act( incBase, msg ) ) <a name="l01256"></a>01256 <span class="keywordflow">return</span> QString::null; <a name="l01257"></a>01257 html += bodyVisitor.result(); <a name="l01258"></a>01258 <a name="l01259"></a>01259 <span class="keywordflow">if</span> ( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() == Scheduler::Request ) { <span class="comment">// ### Scheduler::Publish/Refresh/Add as well?</span> <a name="l01260"></a>01260 IncidenceCompareVisitor compareVisitor; <a name="l01261"></a>01261 <span class="keywordflow">if</span> ( compareVisitor.act( incBase, existingIncidence ) ) { <a name="l01262"></a>01262 html += i18n(<span class="stringliteral">"<p align=\"left\">The following changes have been made by the organizer:</p>"</span>); <a name="l01263"></a>01263 html += compareVisitor.result(); <a name="l01264"></a>01264 } <a name="l01265"></a>01265 } <a name="l01266"></a>01266 <a name="l01267"></a>01267 html += <span class="stringliteral">"<br/>"</span>; <a name="l01268"></a>01268 html += <span class="stringliteral">"<table border=\"0\" cellspacing=\"0\"><tr><td>&nbsp;</td></tr><tr>"</span>; <a name="l01269"></a>01269 <a name="l01270"></a>01270 <span class="preprocessor">#if 0</span> <a name="l01271"></a>01271 <span class="preprocessor"></span> html += helper->makeLinkURL( <span class="stringliteral">"accept"</span>, i18n(<span class="stringliteral">"[Enter this into my calendar]"</span>) ); <a name="l01272"></a>01272 html += <span class="stringliteral">"</td><td> &nbsp; </td><td>"</span>; <a name="l01273"></a>01273 <span class="preprocessor">#endif</span> <a name="l01274"></a>01274 <span class="preprocessor"></span> <a name="l01275"></a>01275 <span class="comment">// Add groupware links</span> <a name="l01276"></a>01276 <a name="l01277"></a>01277 <span class="keywordflow">switch</span> ( msg-><a class="code" href="classKCal_1_1ScheduleMessage.html#757cf1ca9629bfba4447969012446e4d" title="Return iTIP method associated with this message.">method</a>() ) { <a name="l01278"></a>01278 <span class="keywordflow">case</span> Scheduler::Publish: <a name="l01279"></a>01279 <span class="keywordflow">case</span> Scheduler::Request: <a name="l01280"></a>01280 <span class="keywordflow">case</span> Scheduler::Refresh: <a name="l01281"></a>01281 <span class="keywordflow">case</span> Scheduler::Add: <a name="l01282"></a>01282 { <a name="l01283"></a>01283 <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *inc = <span class="keyword">dynamic_cast<</span><a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a>*<span class="keyword">></span>( incBase ); <a name="l01284"></a>01284 <span class="keywordflow">if</span> ( inc && inc-><a class="code" href="classKCal_1_1Incidence.html#061b1b33e5105cee5a2a6db2abc04b92" title="Return the number of revisions this event has seen.">revision</a>() > 0 && (existingIncidence || !helper->calendar()) ) { <a name="l01285"></a>01285 <span class="keywordflow">if</span> ( incBase-><a class="code" href="classKCal_1_1IncidenceBase.html#7981c13389e270b9e3e06a79d8564d5b">type</a>() == <span class="stringliteral">"Todo"</span> ) { <a name="l01286"></a>01286 html += <span class="stringliteral">"<td colspan=\"9\">"</span>; <a name="l01287"></a>01287 html += helper->makeLink( <span class="stringliteral">"reply"</span>, i18n( <span class="stringliteral">"[Enter this into my task list]"</span> ) ); <a name="l01288"></a>01288 } <span class="keywordflow">else</span> { <a name="l01289"></a>01289 html += <span class="stringliteral">"<td colspan=\"13\">"</span>; <a name="l01290"></a>01290 html += helper->makeLink( <span class="stringliteral">"reply"</span>, i18n( <span class="stringliteral">"[Enter this into my calendar]"</span> ) ); <a name="l01291"></a>01291 } <a name="l01292"></a>01292 html += <span class="stringliteral">"</td></tr><tr>"</span>; <a name="l01293"></a>01293 } <a name="l01294"></a>01294 html += <span class="stringliteral">"<td>"</span>; <a name="l01295"></a>01295 <a name="l01296"></a>01296 <span class="keywordflow">if</span> ( helper->calendar() && !existingIncidence ) { <a name="l01297"></a>01297 <span class="comment">// Accept</span> <a name="l01298"></a>01298 html += helper->makeLink( <span class="stringliteral">"accept"</span>, i18n( <span class="stringliteral">"[Accept]"</span> ) ); <a name="l01299"></a>01299 html += <span class="stringliteral">"</td><td> &nbsp; </td><td>"</span>; <a name="l01300"></a>01300 html += helper->makeLink( <span class="stringliteral">"accept_conditionally"</span>, <a name="l01301"></a>01301 i18n( <span class="stringliteral">"Accept conditionally"</span>, <span class="stringliteral">"[Accept cond.]"</span> ) ); <a name="l01302"></a>01302 html += <span class="stringliteral">"</td><td> &nbsp; </td><td>"</span>; <a name="l01303"></a>01303 <span class="comment">// counter proposal</span> <a name="l01304"></a>01304 html += helper->makeLink( <span class="stringliteral">"counter"</span>, i18n( <span class="stringliteral">"[Counter proposal]"</span> ) ); <a name="l01305"></a>01305 html += <span class="stringliteral">"</td><td> &nbsp; </td><td>"</span>; <a name="l01306"></a>01306 <span class="comment">// Decline</span> <a name="l01307"></a>01307 html += helper->makeLink( <span class="stringliteral">"decline"</span>, i18n( <span class="stringliteral">"[Decline]"</span> ) ); <a name="l01308"></a>01308 html += <span class="stringliteral">"</td><td> &nbsp; </td><td>"</span>; <a name="l01309"></a>01309 <a name="l01310"></a>01310 <span class="comment">// Delegate</span> <a name="l01311"></a>01311 html += helper->makeLink( <span class="stringliteral">"delegate"</span>, i18n( <span class="stringliteral">"[Delegate]"</span> ) ); <a name="l01312"></a>01312 html += <span class="stringliteral">"</td><td> &nbsp; </td><td>"</span>; <a name="l01313"></a>01313 <a name="l01314"></a>01314 <span class="comment">// Forward</span> <a name="l01315"></a>01315 html += helper->makeLink( <span class="stringliteral">"forward"</span>, i18n( <span class="stringliteral">"[Forward]"</span> ) ); <a name="l01316"></a>01316 <a name="l01317"></a>01317 <span class="keywordflow">if</span> ( incBase-><a class="code" href="classKCal_1_1IncidenceBase.html#7981c13389e270b9e3e06a79d8564d5b">type</a>() == <span class="stringliteral">"Event"</span> ) { <a name="l01318"></a>01318 html += <span class="stringliteral">"</b></a></td><td> &nbsp; </td><td>"</span>; <a name="l01319"></a>01319 html += helper->makeLink( <span class="stringliteral">"check_calendar"</span>, i18n(<span class="stringliteral">"[Check my calendar]"</span> ) ); <a name="l01320"></a>01320 } <a name="l01321"></a>01321 } <a name="l01322"></a>01322 <span class="keywordflow">break</span>; <a name="l01323"></a>01323 } <a name="l01324"></a>01324 <a name="l01325"></a>01325 <span class="keywordflow">case</span> Scheduler::Cancel: <a name="l01326"></a>01326 <span class="comment">// Cancel event from my calendar</span> <a name="l01327"></a>01327 html += helper->makeLink( <span class="stringliteral">"cancel"</span>, i18n( <span class="stringliteral">"[Remove this from my calendar]"</span> ) ); <a name="l01328"></a>01328 <span class="keywordflow">break</span>; <a name="l01329"></a>01329 <a name="l01330"></a>01330 <span class="keywordflow">case</span> Scheduler::Reply: <a name="l01331"></a>01331 <span class="comment">// Enter this into my calendar</span> <a name="l01332"></a>01332 <span class="keywordflow">if</span> ( incBase-><a class="code" href="classKCal_1_1IncidenceBase.html#7981c13389e270b9e3e06a79d8564d5b">type</a>() == <span class="stringliteral">"Todo"</span> ) { <a name="l01333"></a>01333 html += helper->makeLink( <span class="stringliteral">"reply"</span>, i18n( <span class="stringliteral">"[Enter this into my task list]"</span> ) ); <a name="l01334"></a>01334 } <span class="keywordflow">else</span> { <a name="l01335"></a>01335 html += helper->makeLink( <span class="stringliteral">"reply"</span>, i18n( <span class="stringliteral">"[Enter this into my calendar]"</span> ) ); <a name="l01336"></a>01336 } <a name="l01337"></a>01337 <span class="keywordflow">break</span>; <a name="l01338"></a>01338 <a name="l01339"></a>01339 <span class="keywordflow">case</span> Scheduler::Counter: <a name="l01340"></a>01340 <span class="keywordflow">case</span> Scheduler::Declinecounter: <a name="l01341"></a>01341 <span class="keywordflow">case</span> Scheduler::NoMethod: <a name="l01342"></a>01342 <span class="keywordflow">break</span>; <a name="l01343"></a>01343 } <a name="l01344"></a>01344 <a name="l01345"></a>01345 html += <span class="stringliteral">"</td></tr></table>"</span>; <a name="l01346"></a>01346 <a name="l01347"></a>01347 html += <span class="stringliteral">"</td></tr></table><br></div>"</span>; <a name="l01348"></a>01348 <a name="l01349"></a>01349 <span class="keywordflow">return</span> html; <a name="l01350"></a>01350 } <a name="l01351"></a>01351 <a name="l01352"></a>01352 <a name="l01353"></a>01353 <a name="l01354"></a>01354 <a name="l01355"></a>01355 <span class="comment">/*******************************************************************</span> <a name="l01356"></a>01356 <span class="comment"> * Helper functions for the msTNEF -> VPart converter</span> <a name="l01357"></a>01357 <span class="comment"> *******************************************************************/</span> <a name="l01358"></a>01358 <a name="l01359"></a>01359 <a name="l01360"></a>01360 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01361"></a>01361 <a name="l01362"></a>01362 <span class="keyword">static</span> QString stringProp( KTNEFMessage* tnefMsg, <span class="keyword">const</span> Q_UINT32& key, <a name="l01363"></a>01363 <span class="keyword">const</span> QString& fallback = QString::null) <a name="l01364"></a>01364 { <a name="l01365"></a>01365 <span class="keywordflow">return</span> tnefMsg->findProp( key < 0x10000 ? key & 0xFFFF : key >> 16, <a name="l01366"></a>01366 fallback ); <a name="l01367"></a>01367 } <a name="l01368"></a>01368 <a name="l01369"></a>01369 <span class="keyword">static</span> QString sNamedProp( KTNEFMessage* tnefMsg, <span class="keyword">const</span> QString& name, <a name="l01370"></a>01370 <span class="keyword">const</span> QString& fallback = QString::null ) <a name="l01371"></a>01371 { <a name="l01372"></a>01372 <span class="keywordflow">return</span> tnefMsg->findNamedProp( name, fallback ); <a name="l01373"></a>01373 } <a name="l01374"></a>01374 <a name="l01375"></a>01375 <span class="keyword">struct </span>save_tz { <span class="keywordtype">char</span>* old_tz; <span class="keywordtype">char</span>* tz_env_str; }; <a name="l01376"></a>01376 <a name="l01377"></a>01377 <span class="comment">/* temporarily go to a different timezone */</span> <a name="l01378"></a>01378 <span class="keyword">static</span> <span class="keyword">struct </span>save_tz set_tz( const char* _tc ) <a name="l01379"></a>01379 { <a name="l01380"></a>01380 <span class="keyword">const</span> <span class="keywordtype">char</span> *tc = _tc?_tc:<span class="stringliteral">"UTC"</span>; <a name="l01381"></a>01381 <a name="l01382"></a>01382 <span class="keyword">struct </span>save_tz rv; <a name="l01383"></a>01383 <a name="l01384"></a>01384 rv.old_tz = 0; <a name="l01385"></a>01385 rv.tz_env_str = 0; <a name="l01386"></a>01386 <a name="l01387"></a>01387 <span class="comment">//kdDebug(5006) << "set_tz(), timezone before = " << timezone << endl;</span> <a name="l01388"></a>01388 <a name="l01389"></a>01389 <span class="keywordtype">char</span>* tz_env = 0; <a name="l01390"></a>01390 <span class="keywordflow">if</span>( getenv( <span class="stringliteral">"TZ"</span> ) ) { <a name="l01391"></a>01391 tz_env = strdup( getenv( <span class="stringliteral">"TZ"</span> ) ); <a name="l01392"></a>01392 rv.old_tz = tz_env; <a name="l01393"></a>01393 } <a name="l01394"></a>01394 <span class="keywordtype">char</span>* tmp_env = (<span class="keywordtype">char</span>*)malloc( strlen( tc ) + 4 ); <a name="l01395"></a>01395 strcpy( tmp_env, <span class="stringliteral">"TZ="</span> ); <a name="l01396"></a>01396 strcpy( tmp_env+3, tc ); <a name="l01397"></a>01397 putenv( tmp_env ); <a name="l01398"></a>01398 <a name="l01399"></a>01399 rv.tz_env_str = tmp_env; <a name="l01400"></a>01400 <a name="l01401"></a>01401 <span class="comment">/* tmp_env is not free'ed -- it is part of the environment */</span> <a name="l01402"></a>01402 <a name="l01403"></a>01403 tzset(); <a name="l01404"></a>01404 <span class="comment">//kdDebug(5006) << "set_tz(), timezone after = " << timezone << endl;</span> <a name="l01405"></a>01405 <a name="l01406"></a>01406 <span class="keywordflow">return</span> rv; <a name="l01407"></a>01407 } <a name="l01408"></a>01408 <a name="l01409"></a>01409 <span class="comment">/* restore previous timezone */</span> <a name="l01410"></a>01410 <span class="keyword">static</span> <span class="keywordtype">void</span> unset_tz( <span class="keyword">struct</span> save_tz old_tz ) <a name="l01411"></a>01411 { <a name="l01412"></a>01412 <span class="keywordflow">if</span>( old_tz.old_tz ) { <a name="l01413"></a>01413 <span class="keywordtype">char</span>* tmp_env = (<span class="keywordtype">char</span>*)malloc( strlen( old_tz.old_tz ) + 4 ); <a name="l01414"></a>01414 strcpy( tmp_env, <span class="stringliteral">"TZ="</span> ); <a name="l01415"></a>01415 strcpy( tmp_env+3, old_tz.old_tz ); <a name="l01416"></a>01416 putenv( tmp_env ); <a name="l01417"></a>01417 <span class="comment">/* tmp_env is not free'ed -- it is part of the environment */</span> <a name="l01418"></a>01418 free( old_tz.old_tz ); <a name="l01419"></a>01419 } <span class="keywordflow">else</span> { <a name="l01420"></a>01420 <span class="comment">/* clear TZ from env */</span> <a name="l01421"></a>01421 putenv( strdup(<span class="stringliteral">"TZ"</span>) ); <a name="l01422"></a>01422 } <a name="l01423"></a>01423 tzset(); <a name="l01424"></a>01424 <a name="l01425"></a>01425 <span class="comment">/* is this OK? */</span> <a name="l01426"></a>01426 <span class="keywordflow">if</span>( old_tz.tz_env_str ) free( old_tz.tz_env_str ); <a name="l01427"></a>01427 } <a name="l01428"></a>01428 <a name="l01429"></a>01429 <span class="keyword">static</span> QDateTime utc2Local( <span class="keyword">const</span> QDateTime& utcdt ) <a name="l01430"></a>01430 { <a name="l01431"></a>01431 <span class="keyword">struct </span>tm tmL; <a name="l01432"></a>01432 <a name="l01433"></a>01433 save_tz tmp_tz = set_tz(<span class="stringliteral">"UTC"</span>); <a name="l01434"></a>01434 time_t utc = utcdt.toTime_t(); <a name="l01435"></a>01435 unset_tz( tmp_tz ); <a name="l01436"></a>01436 <a name="l01437"></a>01437 localtime_r( &utc, &tmL ); <a name="l01438"></a>01438 <span class="keywordflow">return</span> QDateTime( QDate( tmL.tm_year+1900, tmL.tm_mon+1, tmL.tm_mday ), <a name="l01439"></a>01439 QTime( tmL.tm_hour, tmL.tm_min, tmL.tm_sec ) ); <a name="l01440"></a>01440 } <a name="l01441"></a>01441 <a name="l01442"></a>01442 <a name="l01443"></a>01443 <span class="keyword">static</span> QDateTime pureISOToLocalQDateTime( <span class="keyword">const</span> QString& dtStr, <a name="l01444"></a>01444 <span class="keywordtype">bool</span> bDateOnly = <span class="keyword">false</span> ) <a name="l01445"></a>01445 { <a name="l01446"></a>01446 QDate tmpDate; <a name="l01447"></a>01447 QTime tmpTime; <a name="l01448"></a>01448 <span class="keywordtype">int</span> year, month, day, hour, minute, second; <a name="l01449"></a>01449 <a name="l01450"></a>01450 <span class="keywordflow">if</span>( bDateOnly ) { <a name="l01451"></a>01451 year = dtStr.left( 4 ).toInt(); <a name="l01452"></a>01452 month = dtStr.mid( 4, 2 ).toInt(); <a name="l01453"></a>01453 day = dtStr.mid( 6, 2 ).toInt(); <a name="l01454"></a>01454 hour = 0; <a name="l01455"></a>01455 minute = 0; <a name="l01456"></a>01456 second = 0; <a name="l01457"></a>01457 } <span class="keywordflow">else</span> { <a name="l01458"></a>01458 year = dtStr.left( 4 ).toInt(); <a name="l01459"></a>01459 month = dtStr.mid( 4, 2 ).toInt(); <a name="l01460"></a>01460 day = dtStr.mid( 6, 2 ).toInt(); <a name="l01461"></a>01461 hour = dtStr.mid( 9, 2 ).toInt(); <a name="l01462"></a>01462 minute = dtStr.mid( 11, 2 ).toInt(); <a name="l01463"></a>01463 second = dtStr.mid( 13, 2 ).toInt(); <a name="l01464"></a>01464 } <a name="l01465"></a>01465 tmpDate.setYMD( year, month, day ); <a name="l01466"></a>01466 tmpTime.setHMS( hour, minute, second ); <a name="l01467"></a>01467 <a name="l01468"></a>01468 <span class="keywordflow">if</span>( tmpDate.isValid() && tmpTime.isValid() ) { <a name="l01469"></a>01469 QDateTime dT = QDateTime( tmpDate, tmpTime ); <a name="l01470"></a>01470 <a name="l01471"></a>01471 <span class="keywordflow">if</span>( !bDateOnly ) { <a name="l01472"></a>01472 <span class="comment">// correct for GMT ( == Zulu time == UTC )</span> <a name="l01473"></a>01473 <span class="keywordflow">if</span> (dtStr.at(dtStr.length()-1) == <span class="charliteral">'Z'</span>) { <a name="l01474"></a>01474 <span class="comment">//dT = dT.addSecs( 60 * KRFCDate::localUTCOffset() );</span> <a name="l01475"></a>01475 <span class="comment">//localUTCOffset( dT ) );</span> <a name="l01476"></a>01476 dT = utc2Local( dT ); <a name="l01477"></a>01477 } <a name="l01478"></a>01478 } <a name="l01479"></a>01479 <span class="keywordflow">return</span> dT; <a name="l01480"></a>01480 } <span class="keywordflow">else</span> <a name="l01481"></a>01481 <span class="keywordflow">return</span> QDateTime(); <a name="l01482"></a>01482 } <a name="l01483"></a>01483 <a name="l01484"></a>01484 <a name="l01485"></a>01485 <a name="l01486"></a><a class="code" href="classKCal_1_1IncidenceFormatter.html#b3b6cbbcd5e9027bad9dcd9cb506ec76">01486</a> QString <a class="code" href="classKCal_1_1IncidenceFormatter.html#b3b6cbbcd5e9027bad9dcd9cb506ec76">IncidenceFormatter::msTNEFToVPart</a>( <span class="keyword">const</span> QByteArray& tnef ) <a name="l01487"></a>01487 { <a name="l01488"></a>01488 <span class="keywordtype">bool</span> bOk = <span class="keyword">false</span>; <a name="l01489"></a>01489 <a name="l01490"></a>01490 KTNEFParser parser; <a name="l01491"></a>01491 QBuffer buf( tnef ); <a name="l01492"></a>01492 <a class="code" href="classKCal_1_1CalendarLocal.html" title="This class provides a calendar stored as a local file.">CalendarLocal</a> cal ( QString::fromLatin1( <span class="stringliteral">"UTC"</span> ) ); <a name="l01493"></a>01493 KABC::Addressee addressee; <a name="l01494"></a>01494 KABC::VCardConverter cardConv; <a name="l01495"></a>01495 <a class="code" href="classKCal_1_1ICalFormat.html" title="This class implements the iCalendar format.">ICalFormat</a> calFormat; <a name="l01496"></a>01496 <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a>* <span class="keyword">event</span> = <span class="keyword">new</span> <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a>(); <a name="l01497"></a>01497 <a name="l01498"></a>01498 <span class="keywordflow">if</span>( parser.openDevice( &buf ) ) { <a name="l01499"></a>01499 KTNEFMessage* tnefMsg = parser.message(); <a name="l01500"></a>01500 <span class="comment">//QMap<int,KTNEFProperty*> props = parser.message()->properties();</span> <a name="l01501"></a>01501 <a name="l01502"></a>01502 <span class="comment">// Everything depends from property PR_MESSAGE_CLASS</span> <a name="l01503"></a>01503 <span class="comment">// (this is added by KTNEFParser):</span> <a name="l01504"></a>01504 QString msgClass = tnefMsg->findProp( 0x001A, QString::null, <span class="keyword">true</span> ) <a name="l01505"></a>01505 .upper(); <a name="l01506"></a>01506 <span class="keywordflow">if</span>( !msgClass.isEmpty() ) { <a name="l01507"></a>01507 <span class="comment">// Match the old class names that might be used by Outlook for</span> <a name="l01508"></a>01508 <span class="comment">// compatibility with Microsoft Mail for Windows for Workgroups 3.1.</span> <a name="l01509"></a>01509 <span class="keywordtype">bool</span> bCompatClassAppointment = <span class="keyword">false</span>; <a name="l01510"></a>01510 <span class="keywordtype">bool</span> bCompatMethodRequest = <span class="keyword">false</span>; <a name="l01511"></a>01511 <span class="keywordtype">bool</span> bCompatMethodCancled = <span class="keyword">false</span>; <a name="l01512"></a>01512 <span class="keywordtype">bool</span> bCompatMethodAccepted = <span class="keyword">false</span>; <a name="l01513"></a>01513 <span class="keywordtype">bool</span> bCompatMethodAcceptedCond = <span class="keyword">false</span>; <a name="l01514"></a>01514 <span class="keywordtype">bool</span> bCompatMethodDeclined = <span class="keyword">false</span>; <a name="l01515"></a>01515 <span class="keywordflow">if</span>( msgClass.startsWith( <span class="stringliteral">"IPM.MICROSOFT SCHEDULE."</span> ) ) { <a name="l01516"></a>01516 bCompatClassAppointment = <span class="keyword">true</span>; <a name="l01517"></a>01517 <span class="keywordflow">if</span>( msgClass.endsWith( <span class="stringliteral">".MTGREQ"</span> ) ) <a name="l01518"></a>01518 bCompatMethodRequest = <span class="keyword">true</span>; <a name="l01519"></a>01519 <span class="keywordflow">if</span>( msgClass.endsWith( <span class="stringliteral">".MTGCNCL"</span> ) ) <a name="l01520"></a>01520 bCompatMethodCancled = <span class="keyword">true</span>; <a name="l01521"></a>01521 <span class="keywordflow">if</span>( msgClass.endsWith( <span class="stringliteral">".MTGRESPP"</span> ) ) <a name="l01522"></a>01522 bCompatMethodAccepted = <span class="keyword">true</span>; <a name="l01523"></a>01523 <span class="keywordflow">if</span>( msgClass.endsWith( <span class="stringliteral">".MTGRESPA"</span> ) ) <a name="l01524"></a>01524 bCompatMethodAcceptedCond = <span class="keyword">true</span>; <a name="l01525"></a>01525 <span class="keywordflow">if</span>( msgClass.endsWith( <span class="stringliteral">".MTGRESPN"</span> ) ) <a name="l01526"></a>01526 bCompatMethodDeclined = <span class="keyword">true</span>; <a name="l01527"></a>01527 } <a name="l01528"></a>01528 <span class="keywordtype">bool</span> bCompatClassNote = ( msgClass == <span class="stringliteral">"IPM.MICROSOFT MAIL.NOTE"</span> ); <a name="l01529"></a>01529 <a name="l01530"></a>01530 <span class="keywordflow">if</span>( bCompatClassAppointment || <span class="stringliteral">"IPM.APPOINTMENT"</span> == msgClass ) { <a name="l01531"></a>01531 <span class="comment">// Compose a vCal</span> <a name="l01532"></a>01532 <span class="keywordtype">bool</span> bIsReply = <span class="keyword">false</span>; <a name="l01533"></a>01533 QString prodID = <span class="stringliteral">"-//Microsoft Corporation//Outlook "</span>; <a name="l01534"></a>01534 prodID += tnefMsg->findNamedProp( <span class="stringliteral">"0x8554"</span>, <span class="stringliteral">"9.0"</span> ); <a name="l01535"></a>01535 prodID += <span class="stringliteral">"MIMEDIR/EN\n"</span>; <a name="l01536"></a>01536 prodID += <span class="stringliteral">"VERSION:2.0\n"</span>; <a name="l01537"></a>01537 calFormat.<a class="code" href="classKCal_1_1CalFormat.html#02aec9050e64484ed59706048ba72c35" title="Set the application name for use in unique IDs and error messages, and product ID...">setApplication</a>( <span class="stringliteral">"Outlook"</span>, prodID ); <a name="l01538"></a>01538 <a name="l01539"></a>01539 <a class="code" href="classKCal_1_1Scheduler.html#b5bb0cf1cf4c936a606b1968e85601b1" title="iTIP methods.">Scheduler::Method</a> method; <a name="l01540"></a>01540 <span class="keywordflow">if</span>( bCompatMethodRequest ) <a name="l01541"></a>01541 method = Scheduler::Request; <a name="l01542"></a>01542 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( bCompatMethodCancled ) <a name="l01543"></a>01543 method = Scheduler::Cancel; <a name="l01544"></a>01544 <span class="keywordflow">else</span> <span class="keywordflow">if</span>( bCompatMethodAccepted || bCompatMethodAcceptedCond || <a name="l01545"></a>01545 bCompatMethodDeclined ) { <a name="l01546"></a>01546 method = Scheduler::Reply; <a name="l01547"></a>01547 bIsReply = <span class="keyword">true</span>; <a name="l01548"></a>01548 } <span class="keywordflow">else</span> { <a name="l01549"></a>01549 <span class="comment">// pending(khz): verify whether "0x0c17" is the right tag ???</span> <a name="l01550"></a>01550 <span class="comment">//</span> <a name="l01551"></a>01551 <span class="comment">// at the moment we think there are REQUESTS and UPDATES</span> <a name="l01552"></a>01552 <span class="comment">//</span> <a name="l01553"></a>01553 <span class="comment">// but WHAT ABOUT REPLIES ???</span> <a name="l01554"></a>01554 <span class="comment">//</span> <a name="l01555"></a>01555 <span class="comment">//</span> <a name="l01556"></a>01556 <a name="l01557"></a>01557 <span class="keywordflow">if</span>( tnefMsg->findProp(0x0c17) == <span class="stringliteral">"1"</span> ) <a name="l01558"></a>01558 bIsReply = <span class="keyword">true</span>; <a name="l01559"></a>01559 method = Scheduler::Request; <a name="l01560"></a>01560 } <a name="l01561"></a>01561 <a name="l01563"></a>01563 <a class="code" href="classKCal_1_1ScheduleMessage.html" title="This class provides an encapsulation of a scheduling message.">ScheduleMessage</a> schedMsg(event, method, ScheduleMessage::Unknown ); <a name="l01564"></a>01564 <a name="l01565"></a>01565 QString sSenderSearchKeyEmail( tnefMsg->findProp( 0x0C1D ) ); <a name="l01566"></a>01566 <a name="l01567"></a>01567 <span class="keywordflow">if</span>( !sSenderSearchKeyEmail.isEmpty() ) { <a name="l01568"></a>01568 <span class="keywordtype">int</span> colon = sSenderSearchKeyEmail.find( <span class="charliteral">':'</span> ); <a name="l01569"></a>01569 <span class="comment">// May be e.g. "SMTP:KHZ@KDE.ORG"</span> <a name="l01570"></a>01570 <span class="keywordflow">if</span>( sSenderSearchKeyEmail.find( <span class="charliteral">':'</span> ) == -1 ) <a name="l01571"></a>01571 sSenderSearchKeyEmail.remove( 0, colon+1 ); <a name="l01572"></a>01572 } <a name="l01573"></a>01573 <a name="l01574"></a>01574 QString s( tnefMsg->findProp( 0x0e04 ) ); <a name="l01575"></a>01575 QStringList attendees = QStringList::split( <span class="charliteral">';'</span>, s ); <a name="l01576"></a>01576 <span class="keywordflow">if</span>( attendees.count() ) { <a name="l01577"></a>01577 <span class="keywordflow">for</span>( QStringList::Iterator it = attendees.begin(); <a name="l01578"></a>01578 it != attendees.end(); ++it ) { <a name="l01579"></a>01579 <span class="comment">// Skip all entries that have no '@' since these are</span> <a name="l01580"></a>01580 <span class="comment">// no mail addresses</span> <a name="l01581"></a>01581 <span class="keywordflow">if</span>( (*it).find(<span class="charliteral">'@'</span>) == -1 ) { <a name="l01582"></a>01582 s = (*it).stripWhiteSpace(); <a name="l01583"></a>01583 <a name="l01584"></a>01584 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a> *attendee = <span class="keyword">new</span> <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a>( s, s, <span class="keyword">true</span> ); <a name="l01585"></a>01585 <span class="keywordflow">if</span>( bIsReply ) { <a name="l01586"></a>01586 <span class="keywordflow">if</span>( bCompatMethodAccepted ) <a name="l01587"></a>01587 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>( Attendee::Accepted ); <a name="l01588"></a>01588 <span class="keywordflow">if</span>( bCompatMethodDeclined ) <a name="l01589"></a>01589 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>( Attendee::Declined ); <a name="l01590"></a>01590 <span class="keywordflow">if</span>( bCompatMethodAcceptedCond ) <a name="l01591"></a>01591 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>(Attendee::Tentative); <a name="l01592"></a>01592 } <span class="keywordflow">else</span> { <a name="l01593"></a>01593 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>( Attendee::NeedsAction ); <a name="l01594"></a>01594 attendee-><a class="code" href="classKCal_1_1Attendee.html#14d6f303c7e6389ed263d525118b6aa9" title="Set role of Attendee.">setRole</a>( Attendee::ReqParticipant ); <a name="l01595"></a>01595 } <a name="l01596"></a>01596 <span class="keyword">event</span>->addAttendee(attendee); <a name="l01597"></a>01597 } <a name="l01598"></a>01598 } <a name="l01599"></a>01599 } <span class="keywordflow">else</span> { <a name="l01600"></a>01600 <span class="comment">// Oops, no attendees?</span> <a name="l01601"></a>01601 <span class="comment">// This must be old style, let us use the PR_SENDER_SEARCH_KEY.</span> <a name="l01602"></a>01602 s = sSenderSearchKeyEmail; <a name="l01603"></a>01603 <span class="keywordflow">if</span>( !s.isEmpty() ) { <a name="l01604"></a>01604 <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a> *attendee = <span class="keyword">new</span> <a class="code" href="classKCal_1_1Attendee.html" title="This class represents information related to an attendee of an event.">Attendee</a>( QString::null, QString::null, <a name="l01605"></a>01605 <span class="keyword">true</span> ); <a name="l01606"></a>01606 <span class="keywordflow">if</span>( bIsReply ) { <a name="l01607"></a>01607 <span class="keywordflow">if</span>( bCompatMethodAccepted ) <a name="l01608"></a>01608 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>( Attendee::Accepted ); <a name="l01609"></a>01609 <span class="keywordflow">if</span>( bCompatMethodAcceptedCond ) <a name="l01610"></a>01610 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>( Attendee::Declined ); <a name="l01611"></a>01611 <span class="keywordflow">if</span>( bCompatMethodDeclined ) <a name="l01612"></a>01612 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>( Attendee::Tentative ); <a name="l01613"></a>01613 } <span class="keywordflow">else</span> { <a name="l01614"></a>01614 attendee-><a class="code" href="classKCal_1_1Attendee.html#df95a36a03d37474e3e9c559f9012026" title="Set status.">setStatus</a>(Attendee::NeedsAction); <a name="l01615"></a>01615 attendee-><a class="code" href="classKCal_1_1Attendee.html#14d6f303c7e6389ed263d525118b6aa9" title="Set role of Attendee.">setRole</a>(Attendee::ReqParticipant); <a name="l01616"></a>01616 } <a name="l01617"></a>01617 <span class="keyword">event</span>->addAttendee(attendee); <a name="l01618"></a>01618 } <a name="l01619"></a>01619 } <a name="l01620"></a>01620 s = tnefMsg->findProp( 0x0c1f ); <span class="comment">// look for organizer property</span> <a name="l01621"></a>01621 <span class="keywordflow">if</span>( s.isEmpty() && !bIsReply ) <a name="l01622"></a>01622 s = sSenderSearchKeyEmail; <a name="l01623"></a>01623 <span class="comment">// TODO: Use the common name?</span> <a name="l01624"></a>01624 <span class="keywordflow">if</span>( !s.isEmpty() ) <a name="l01625"></a>01625 event-><a class="code" href="classKCal_1_1IncidenceBase.html#117a09a965803c17635d9a3631a66772" title="sets the organizer for the event">setOrganizer</a>( s ); <a name="l01626"></a>01626 <a name="l01627"></a>01627 s = tnefMsg->findProp( 0x8516 ).replace( QChar( <span class="charliteral">'-'</span> ), QString::null ) <a name="l01628"></a>01628 .replace( QChar( <span class="charliteral">':'</span> ), QString::null ); <a name="l01629"></a>01629 <span class="keyword">event</span>->setDtStart( QDateTime::fromString( s ) ); <span class="comment">// ## Format??</span> <a name="l01630"></a>01630 <a name="l01631"></a>01631 s = tnefMsg->findProp( 0x8517 ).replace( QChar( <span class="charliteral">'-'</span> ), QString::null ) <a name="l01632"></a>01632 .replace( QChar( <span class="charliteral">':'</span> ), QString::null ); <a name="l01633"></a>01633 <span class="keyword">event</span>->setDtEnd( QDateTime::fromString( s ) ); <a name="l01634"></a>01634 <a name="l01635"></a>01635 s = tnefMsg->findProp( 0x8208 ); <a name="l01636"></a>01636 <span class="keyword">event</span>->setLocation( s ); <a name="l01637"></a>01637 <a name="l01638"></a>01638 <span class="comment">// is it OK to set this to OPAQUE always ??</span> <a name="l01639"></a>01639 <span class="comment">//vPart += "TRANSP:OPAQUE\n"; ###FIXME, portme!</span> <a name="l01640"></a>01640 <span class="comment">//vPart += "SEQUENCE:0\n";</span> <a name="l01641"></a>01641 <a name="l01642"></a>01642 <span class="comment">// is "0x0023" OK - or should we look for "0x0003" ??</span> <a name="l01643"></a>01643 s = tnefMsg->findProp( 0x0023 ); <a name="l01644"></a>01644 <span class="keyword">event</span>->setUid( s ); <a name="l01645"></a>01645 <a name="l01646"></a>01646 <span class="comment">// PENDING(khz): is this value in local timezone? Must it be</span> <a name="l01647"></a>01647 <span class="comment">// adjusted? Most likely this is a bug in the server or in</span> <a name="l01648"></a>01648 <span class="comment">// Outlook - we ignore it for now.</span> <a name="l01649"></a>01649 s = tnefMsg->findProp( 0x8202 ).replace( QChar( <span class="charliteral">'-'</span> ), QString::null ) <a name="l01650"></a>01650 .replace( QChar( <span class="charliteral">':'</span> ), QString::null ); <a name="l01651"></a>01651 <span class="comment">// ### libkcal always uses currentDateTime()</span> <a name="l01652"></a>01652 <span class="comment">// event->setDtStamp(QDateTime::fromString(s));</span> <a name="l01653"></a>01653 <a name="l01654"></a>01654 s = tnefMsg->findNamedProp( <span class="stringliteral">"Keywords"</span> ); <a name="l01655"></a>01655 <span class="keyword">event</span>->setCategories( s ); <a name="l01656"></a>01656 <a name="l01657"></a>01657 s = tnefMsg->findProp( 0x1000 ); <a name="l01658"></a>01658 <span class="keyword">event</span>->setDescription( s ); <a name="l01659"></a>01659 <a name="l01660"></a>01660 s = tnefMsg->findProp( 0x0070 ); <a name="l01661"></a>01661 <span class="keyword">event</span>->setSummary( s ); <a name="l01662"></a>01662 <a name="l01663"></a>01663 s = tnefMsg->findProp( 0x0026 ); <a name="l01664"></a>01664 <span class="keyword">event</span>->setPriority( s.toInt() ); <a name="l01665"></a>01665 <a name="l01666"></a>01666 <span class="comment">// is reminder flag set ?</span> <a name="l01667"></a>01667 <span class="keywordflow">if</span>(!tnefMsg->findProp(0x8503).isEmpty()) { <a name="l01668"></a>01668 <a class="code" href="classKCal_1_1Alarm.html" title="This class represents an alarm notification.">Alarm</a> *alarm = <span class="keyword">new</span> <a class="code" href="classKCal_1_1Alarm.html" title="This class represents an alarm notification.">Alarm</a>(event); <a name="l01669"></a>01669 QDateTime highNoonTime = <a name="l01670"></a>01670 pureISOToLocalQDateTime( tnefMsg->findProp( 0x8502 ) <a name="l01671"></a>01671 .replace( QChar( <span class="charliteral">'-'</span> ), <span class="stringliteral">""</span> ) <a name="l01672"></a>01672 .replace( QChar( <span class="charliteral">':'</span> ), <span class="stringliteral">""</span> ) ); <a name="l01673"></a>01673 QDateTime wakeMeUpTime = <a name="l01674"></a>01674 pureISOToLocalQDateTime( tnefMsg->findProp( 0x8560, <span class="stringliteral">""</span> ) <a name="l01675"></a>01675 .replace( QChar( <span class="charliteral">'-'</span> ), <span class="stringliteral">""</span> ) <a name="l01676"></a>01676 .replace( QChar( <span class="charliteral">':'</span> ), <span class="stringliteral">""</span> ) ); <a name="l01677"></a>01677 alarm-><a class="code" href="classKCal_1_1Alarm.html#148abaa601477be008ce0ac348336084" title="Set the time to trigger an alarm.">setTime</a>(wakeMeUpTime); <a name="l01678"></a>01678 <a name="l01679"></a>01679 <span class="keywordflow">if</span>( highNoonTime.isValid() && wakeMeUpTime.isValid() ) <a name="l01680"></a>01680 alarm-><a class="code" href="classKCal_1_1Alarm.html#a8a1584d8039829258846a3c7dfb9e17" title="Set offset of alarm in time relative to the start of the event.">setStartOffset</a>( <a class="code" href="classKCal_1_1Duration.html" title="This class represents a duration.">Duration</a>( highNoonTime, wakeMeUpTime ) ); <a name="l01681"></a>01681 <span class="keywordflow">else</span> <a name="l01682"></a>01682 <span class="comment">// default: wake them up 15 minutes before the appointment</span> <a name="l01683"></a>01683 alarm-><a class="code" href="classKCal_1_1Alarm.html#a8a1584d8039829258846a3c7dfb9e17" title="Set offset of alarm in time relative to the start of the event.">setStartOffset</a>( <a class="code" href="classKCal_1_1Duration.html" title="This class represents a duration.">Duration</a>( 15*60 ) ); <a name="l01684"></a>01684 alarm-><a class="code" href="classKCal_1_1Alarm.html#b5b69003ad8ad9450b8f4f542c234a8d" title="Set the alarm to be a display alarm.">setDisplayAlarm</a>( i18n( <span class="stringliteral">"Reminder"</span> ) ); <a name="l01685"></a>01685 <a name="l01686"></a>01686 <span class="comment">// Sorry: the different action types are not known (yet)</span> <a name="l01687"></a>01687 <span class="comment">// so we always set 'DISPLAY' (no sounds, no images...)</span> <a name="l01688"></a>01688 <span class="keyword">event</span>->addAlarm( alarm ); <a name="l01689"></a>01689 } <a name="l01690"></a>01690 cal.<a class="code" href="classKCal_1_1CalendarLocal.html#92badd294078f18a2c2acbfab8ce10ac" title="Add Event to calendar.">addEvent</a>( event ); <a name="l01691"></a>01691 bOk = <span class="keyword">true</span>; <a name="l01692"></a>01692 <span class="comment">// we finished composing a vCal</span> <a name="l01693"></a>01693 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( bCompatClassNote || <span class="stringliteral">"IPM.CONTACT"</span> == msgClass ) { <a name="l01694"></a>01694 addressee.setUid( stringProp( tnefMsg, attMSGID ) ); <a name="l01695"></a>01695 addressee.setFormattedName( stringProp( tnefMsg, MAPI_TAG_PR_DISPLAY_NAME ) ); <a name="l01696"></a>01696 addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL1EMAILADDRESS ), <span class="keyword">true</span> ); <a name="l01697"></a>01697 addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL2EMAILADDRESS ), <span class="keyword">false</span> ); <a name="l01698"></a>01698 addressee.insertEmail( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_EMAIL3EMAILADDRESS ), <span class="keyword">false</span> ); <a name="l01699"></a>01699 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-IMAddress"</span>, sNamedProp( tnefMsg, MAPI_TAG_CONTACT_IMADDRESS ) ); <a name="l01700"></a>01700 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-SpousesName"</span>, stringProp( tnefMsg, MAPI_TAG_PR_SPOUSE_NAME ) ); <a name="l01701"></a>01701 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-ManagersName"</span>, stringProp( tnefMsg, MAPI_TAG_PR_MANAGER_NAME ) ); <a name="l01702"></a>01702 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-AssistantsName"</span>, stringProp( tnefMsg, MAPI_TAG_PR_ASSISTANT ) ); <a name="l01703"></a>01703 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-Department"</span>, stringProp( tnefMsg, MAPI_TAG_PR_DEPARTMENT_NAME ) ); <a name="l01704"></a>01704 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-Office"</span>, stringProp( tnefMsg, MAPI_TAG_PR_OFFICE_LOCATION ) ); <a name="l01705"></a>01705 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-Profession"</span>, stringProp( tnefMsg, MAPI_TAG_PR_PROFESSION ) ); <a name="l01706"></a>01706 <a name="l01707"></a>01707 QString s = tnefMsg->findProp( MAPI_TAG_PR_WEDDING_ANNIVERSARY ) <a name="l01708"></a>01708 .replace( QChar( <span class="charliteral">'-'</span> ), QString::null ) <a name="l01709"></a>01709 .replace( QChar( <span class="charliteral">':'</span> ), QString::null ); <a name="l01710"></a>01710 <span class="keywordflow">if</span>( !s.isEmpty() ) <a name="l01711"></a>01711 addressee.insertCustom( <span class="stringliteral">"KADDRESSBOOK"</span>, <span class="stringliteral">"X-Anniversary"</span>, s ); <a name="l01712"></a>01712 <a name="l01713"></a>01713 addressee.setUrl( KURL( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_WEBPAGE ) ) ); <a name="l01714"></a>01714 <a name="l01715"></a>01715 <span class="comment">// collect parts of Name entry</span> <a name="l01716"></a>01716 addressee.setFamilyName( stringProp( tnefMsg, MAPI_TAG_PR_SURNAME ) ); <a name="l01717"></a>01717 addressee.setGivenName( stringProp( tnefMsg, MAPI_TAG_PR_GIVEN_NAME ) ); <a name="l01718"></a>01718 addressee.setAdditionalName( stringProp( tnefMsg, MAPI_TAG_PR_MIDDLE_NAME ) ); <a name="l01719"></a>01719 addressee.setPrefix( stringProp( tnefMsg, MAPI_TAG_PR_DISPLAY_NAME_PREFIX ) ); <a name="l01720"></a>01720 addressee.setSuffix( stringProp( tnefMsg, MAPI_TAG_PR_GENERATION ) ); <a name="l01721"></a>01721 <a name="l01722"></a>01722 addressee.setNickName( stringProp( tnefMsg, MAPI_TAG_PR_NICKNAME ) ); <a name="l01723"></a>01723 addressee.setRole( stringProp( tnefMsg, MAPI_TAG_PR_TITLE ) ); <a name="l01724"></a>01724 addressee.setOrganization( stringProp( tnefMsg, MAPI_TAG_PR_COMPANY_NAME ) ); <a name="l01725"></a>01725 <span class="comment">/*</span> <a name="l01726"></a>01726 <span class="comment"> the MAPI property ID of this (multiline) )field is unknown:</span> <a name="l01727"></a>01727 <span class="comment"> vPart += stringProp(tnefMsg, "\n","NOTE", ... , "" );</span> <a name="l01728"></a>01728 <span class="comment"> */</span> <a name="l01729"></a>01729 <a name="l01730"></a>01730 KABC::Address adr; <a name="l01731"></a>01731 adr.setPostOfficeBox( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_PO_BOX ) ); <a name="l01732"></a>01732 adr.setStreet( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_STREET ) ); <a name="l01733"></a>01733 adr.setLocality( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_CITY ) ); <a name="l01734"></a>01734 adr.setRegion( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_STATE_OR_PROVINCE ) ); <a name="l01735"></a>01735 adr.setPostalCode( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_POSTAL_CODE ) ); <a name="l01736"></a>01736 adr.setCountry( stringProp( tnefMsg, MAPI_TAG_PR_HOME_ADDRESS_COUNTRY ) ); <a name="l01737"></a>01737 adr.setType(KABC::Address::Home); <a name="l01738"></a>01738 addressee.insertAddress(adr); <a name="l01739"></a>01739 <a name="l01740"></a>01740 adr.setPostOfficeBox( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSPOBOX ) ); <a name="l01741"></a>01741 adr.setStreet( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSSTREET ) ); <a name="l01742"></a>01742 adr.setLocality( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSCITY ) ); <a name="l01743"></a>01743 adr.setRegion( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSSTATE ) ); <a name="l01744"></a>01744 adr.setPostalCode( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSPOSTALCODE ) ); <a name="l01745"></a>01745 adr.setCountry( sNamedProp( tnefMsg, MAPI_TAG_CONTACT_BUSINESSADDRESSCOUNTRY ) ); <a name="l01746"></a>01746 adr.setType( KABC::Address::Work ); <a name="l01747"></a>01747 addressee.insertAddress( adr ); <a name="l01748"></a>01748 <a name="l01749"></a>01749 adr.setPostOfficeBox( stringProp( tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_PO_BOX ) ); <a name="l01750"></a>01750 adr.setStreet( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_STREET ) ); <a name="l01751"></a>01751 adr.setLocality( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_CITY ) ); <a name="l01752"></a>01752 adr.setRegion( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_STATE_OR_PROVINCE ) ); <a name="l01753"></a>01753 adr.setPostalCode( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_POSTAL_CODE ) ); <a name="l01754"></a>01754 adr.setCountry( stringProp(tnefMsg, MAPI_TAG_PR_OTHER_ADDRESS_COUNTRY ) ); <a name="l01755"></a>01755 adr.setType( KABC::Address::Dom ); <a name="l01756"></a>01756 addressee.insertAddress(adr); <a name="l01757"></a>01757 <a name="l01758"></a>01758 <span class="comment">// problem: the 'other' address was stored by KOrganizer in</span> <a name="l01759"></a>01759 <span class="comment">// a line looking like the following one:</span> <a name="l01760"></a>01760 <span class="comment">// vPart += "\nADR;TYPE=dom;TYPE=intl;TYPE=parcel;TYPE=postal;TYPE=work;TYPE=home:other_pobox;;other_str1\nother_str2;other_loc;other_region;other_pocode;other_country</span> <a name="l01761"></a>01761 <a name="l01762"></a>01762 QString nr; <a name="l01763"></a>01763 nr = stringProp( tnefMsg, MAPI_TAG_PR_HOME_TELEPHONE_NUMBER ); <a name="l01764"></a>01764 addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Home ) ); <a name="l01765"></a>01765 nr = stringProp( tnefMsg, MAPI_TAG_PR_BUSINESS_TELEPHONE_NUMBER ); <a name="l01766"></a>01766 addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Work ) ); <a name="l01767"></a>01767 nr = stringProp( tnefMsg, MAPI_TAG_PR_MOBILE_TELEPHONE_NUMBER ); <a name="l01768"></a>01768 addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Cell ) ); <a name="l01769"></a>01769 nr = stringProp( tnefMsg, MAPI_TAG_PR_HOME_FAX_NUMBER ); <a name="l01770"></a>01770 addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Fax | KABC::PhoneNumber::Home ) ); <a name="l01771"></a>01771 nr = stringProp( tnefMsg, MAPI_TAG_PR_BUSINESS_FAX_NUMBER ); <a name="l01772"></a>01772 addressee.insertPhoneNumber( KABC::PhoneNumber( nr, KABC::PhoneNumber::Fax | KABC::PhoneNumber::Work ) ); <a name="l01773"></a>01773 <a name="l01774"></a>01774 s = tnefMsg->findProp( MAPI_TAG_PR_BIRTHDAY ) <a name="l01775"></a>01775 .replace( QChar( <span class="charliteral">'-'</span> ), QString::null ) <a name="l01776"></a>01776 .replace( QChar( <span class="charliteral">':'</span> ), QString::null ); <a name="l01777"></a>01777 <span class="keywordflow">if</span>( !s.isEmpty() ) <a name="l01778"></a>01778 addressee.setBirthday( QDateTime::fromString( s ) ); <a name="l01779"></a>01779 <a name="l01780"></a>01780 bOk = ( !addressee.isEmpty() ); <a name="l01781"></a>01781 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( <span class="stringliteral">"IPM.NOTE"</span> == msgClass ) { <a name="l01782"></a>01782 <a name="l01783"></a>01783 } <span class="comment">// else if ... and so on ...</span> <a name="l01784"></a>01784 } <a name="l01785"></a>01785 } <a name="l01786"></a>01786 <a name="l01787"></a>01787 <span class="comment">// Compose return string</span> <a name="l01788"></a>01788 QString iCal = calFormat.<a class="code" href="classKCal_1_1ICalFormat.html#eed3930a405f0962bfb54f054fdc8982" title="Return calendar information as string.">toString</a>( &cal ); <a name="l01789"></a>01789 <span class="keywordflow">if</span>( !iCal.isEmpty() ) <a name="l01790"></a>01790 <span class="comment">// This was an iCal</span> <a name="l01791"></a>01791 <span class="keywordflow">return</span> iCal; <a name="l01792"></a>01792 <a name="l01793"></a>01793 <span class="comment">// Not an iCal - try a vCard</span> <a name="l01794"></a>01794 KABC::VCardConverter converter; <a name="l01795"></a>01795 <span class="keywordflow">return</span> converter.createVCard( addressee ); <a name="l01796"></a>01796 } <a name="l01797"></a>01797 <a name="l01798"></a>01798 <a name="l01799"></a>01799 QString IncidenceFormatter::formatTNEFInvitation( <span class="keyword">const</span> QByteArray& tnef, <a name="l01800"></a>01800 <a class="code" href="classKCal_1_1Calendar.html" title="This is the main &quot;calendar&quot; object class.">Calendar</a> *mCalendar, InvitationFormatterHelper *helper ) <a name="l01801"></a>01801 { <a name="l01802"></a>01802 QString vPart = <a class="code" href="classKCal_1_1IncidenceFormatter.html#b3b6cbbcd5e9027bad9dcd9cb506ec76">IncidenceFormatter::msTNEFToVPart</a>( tnef ); <a name="l01803"></a>01803 QString iCal = IncidenceFormatter::formatICalInvitation( vPart, mCalendar, helper ); <a name="l01804"></a>01804 <span class="keywordflow">if</span>( !iCal.isEmpty() ) <a name="l01805"></a>01805 <span class="keywordflow">return</span> iCal; <a name="l01806"></a>01806 <span class="keywordflow">return</span> vPart; <a name="l01807"></a>01807 } <a name="l01808"></a>01808 <a name="l01809"></a>01809 <a name="l01810"></a>01810 <a name="l01811"></a>01811 <a name="l01812"></a>01812 <span class="comment">/*******************************************************************</span> <a name="l01813"></a>01813 <span class="comment"> * Helper functions for the Incidence tooltips</span> <a name="l01814"></a>01814 <span class="comment"> *******************************************************************/</span> <a name="l01815"></a>01815 <a name="l01816"></a>01816 <span class="keyword">class </span>IncidenceFormatter::ToolTipVisitor : <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a>::Visitor <a name="l01817"></a>01817 { <a name="l01818"></a>01818 <span class="keyword">public</span>: <a name="l01819"></a>01819 ToolTipVisitor() : mRichText( true ), mResult( <span class="stringliteral">""</span> ) {} <a name="l01820"></a>01820 <a name="l01821"></a>01821 <span class="keywordtype">bool</span> act( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence, <span class="keywordtype">bool</span> richText=<span class="keyword">true</span>) <a name="l01822"></a>01822 { <a name="l01823"></a>01823 mRichText = richText; <a name="l01824"></a>01824 mResult = <span class="stringliteral">""</span>; <a name="l01825"></a>01825 <span class="keywordflow">return</span> incidence ? incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#d99ad7b4b99e8de052ffaf8541590ff3" title="Accept IncidenceVisitor.">accept</a>( *<span class="keyword">this</span> ) : <span class="keyword">false</span>; <a name="l01826"></a>01826 } <a name="l01827"></a>01827 QString result()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> mResult; } <a name="l01828"></a>01828 <a name="l01829"></a>01829 <span class="keyword">protected</span>: <a name="l01830"></a>01830 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ); <a name="l01831"></a>01831 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ); <a name="l01832"></a>01832 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ); <a name="l01833"></a>01833 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ); <a name="l01834"></a>01834 <a name="l01835"></a>01835 QString dateRangeText( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a>*event ); <a name="l01836"></a>01836 QString dateRangeText( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ); <a name="l01837"></a>01837 QString dateRangeText( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ); <a name="l01838"></a>01838 QString dateRangeText( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ); <a name="l01839"></a>01839 <a name="l01840"></a>01840 QString generateToolTip( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a>* incidence, QString dtRangeText ); <a name="l01841"></a>01841 <a name="l01842"></a>01842 <span class="keyword">protected</span>: <a name="l01843"></a>01843 <span class="keywordtype">bool</span> mRichText; <a name="l01844"></a>01844 QString mResult; <a name="l01845"></a>01845 }; <a name="l01846"></a>01846 <a name="l01847"></a>01847 QString IncidenceFormatter::ToolTipVisitor::dateRangeText( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a>*event ) <a name="l01848"></a>01848 { <a name="l01849"></a>01849 QString ret; <a name="l01850"></a>01850 QString tmp; <a name="l01851"></a>01851 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Event.html#579d969ee1963d287f5662554a5aaa4b" title="Return true if the event spans multiple days, otherwise return false.">isMultiDay</a>() ) { <a name="l01852"></a>01852 <a name="l01853"></a>01853 tmp = <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"Event start"</span>, <span class="stringliteral">"<i>From:</i>&nbsp;%1"</span>); <a name="l01854"></a>01854 <span class="keywordflow">if</span> (event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>()) <a name="l01855"></a>01855 ret += tmp.arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01856"></a>01856 <span class="keywordflow">else</span> <a name="l01857"></a>01857 ret += tmp.arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#94846b495fa6de8138dca8f997e48e57" title="returns an event&#39;s starting date and time as a string formatted according to...">dtStartStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01858"></a>01858 <a name="l01859"></a>01859 tmp = <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"Event end"</span>,<span class="stringliteral">"<i>To:</i>&nbsp;%1"</span>); <a name="l01860"></a>01860 <span class="keywordflow">if</span> (event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>()) <a name="l01861"></a>01861 ret += tmp.arg( event-><a class="code" href="classKCal_1_1Event.html#4138e4c8a9218b9bdf55e0e8f471341d" title="Return end date as string formatted according to the users locale settings.">dtEndDateStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01862"></a>01862 <span class="keywordflow">else</span> <a name="l01863"></a>01863 ret += tmp.arg( event-><a class="code" href="classKCal_1_1Event.html#22e773f909419de771c0635ba1297e12" title="Return end date and time as string formatted according to the users locale settings...">dtEndStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01864"></a>01864 <a name="l01865"></a>01865 } <span class="keywordflow">else</span> { <a name="l01866"></a>01866 <a name="l01867"></a>01867 ret += <span class="stringliteral">"<br>"</span>+i18n(<span class="stringliteral">"<i>Date:</i>&nbsp;%1"</span>). <a name="l01868"></a>01868 arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01869"></a>01869 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l01870"></a>01870 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1IncidenceBase.html#ba22e2b05348fd4f18859b5e434bde3e" title="returns an event&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>() == <span class="keyword">event</span>->dtEndTimeStr() ) { <span class="comment">// to prevent 'Time: 17:00 - 17:00'</span> <a name="l01871"></a>01871 tmp = <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"time for event, &nbsp; to prevent ugly line breaks"</span>, <a name="l01872"></a>01872 <span class="stringliteral">"<i>Time:</i>&nbsp;%1"</span>). <a name="l01873"></a>01873 arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#ba22e2b05348fd4f18859b5e434bde3e" title="returns an event&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01874"></a>01874 } <span class="keywordflow">else</span> { <a name="l01875"></a>01875 tmp = <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"time range for event, &nbsp; to prevent ugly line breaks"</span>, <a name="l01876"></a>01876 <span class="stringliteral">"<i>Time:</i>&nbsp;%1&nbsp;-&nbsp;%2"</span>). <a name="l01877"></a>01877 arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#ba22e2b05348fd4f18859b5e434bde3e" title="returns an event&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ). <a name="l01878"></a>01878 arg( event-><a class="code" href="classKCal_1_1Event.html#90ae758766ab822ee69fc0e4524f5359" title="Return end time as string formatted according to the users locale settings.">dtEndTimeStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01879"></a>01879 } <a name="l01880"></a>01880 ret += tmp; <a name="l01881"></a>01881 } <a name="l01882"></a>01882 <a name="l01883"></a>01883 } <a name="l01884"></a>01884 <span class="keywordflow">return</span> ret; <a name="l01885"></a>01885 } <a name="l01886"></a>01886 <a name="l01887"></a>01887 QString IncidenceFormatter::ToolTipVisitor::dateRangeText( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a>*todo ) <a name="l01888"></a>01888 { <a name="l01889"></a>01889 QString ret; <a name="l01890"></a>01890 <span class="keywordtype">bool</span> floats( todo-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ); <a name="l01891"></a>01891 <span class="keywordflow">if</span> (todo-><a class="code" href="classKCal_1_1Todo.html#1fb5a233b65e2c35f9cb03460bb68c30" title="Returns true if the todo has a start date, otherwise return false.">hasStartDate</a>()) <a name="l01892"></a>01892 <span class="comment">// No need to add <i> here. This is separated issue and each line</span> <a name="l01893"></a>01893 <span class="comment">// is very visible on its own. On the other hand... Yes, I like it</span> <a name="l01894"></a>01894 <span class="comment">// italics here :)</span> <a name="l01895"></a>01895 ret += <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"<i>Start:</i>&nbsp;%1"</span>).arg( <a name="l01896"></a>01896 (floats) <a name="l01897"></a>01897 ?(todo-><a class="code" href="classKCal_1_1Todo.html#76e9a4052617ebb42bd4546e76e5604f" title="Returns an todo&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>)) <a name="l01898"></a>01898 :(todo-><a class="code" href="classKCal_1_1Todo.html#ce7bb432d809d48af76490d69eb27a95" title="Returns an todo&#39;s starting date and time as a string formatted according to the...">dtStartStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>)) ) ; <a name="l01899"></a>01899 <span class="keywordflow">if</span> (todo-><a class="code" href="classKCal_1_1Todo.html#a40c65f6e9024015f7546e8749436b12" title="Returns true if the todo has a due date, otherwise return false.">hasDueDate</a>()) <a name="l01900"></a>01900 ret += <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"<i>Due:</i>&nbsp;%1"</span>).arg( <a name="l01901"></a>01901 (floats) <a name="l01902"></a>01902 ?(todo-><a class="code" href="classKCal_1_1Todo.html#bbae1ac010a13aefaf4c6564a8a610d8" title="Returns due date as string formatted according to the users locale settings.">dtDueDateStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>)) <a name="l01903"></a>01903 :(todo-><a class="code" href="classKCal_1_1Todo.html#59c85e3c3ba760c61b83b30e09bac50b" title="Returns due date and time as string formatted according to the users locale settings...">dtDueStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>)) ); <a name="l01904"></a>01904 <span class="keywordflow">if</span> (todo-><a class="code" href="classKCal_1_1Todo.html#c935ce3f04f7e9d828d3f954de585af6" title="Returns true if the todo is 100% completed, otherwise return false.">isCompleted</a>()) <a name="l01905"></a>01905 ret += <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"<i>Completed:</i>&nbsp;%1"</span>).arg( todo-><a class="code" href="classKCal_1_1Todo.html#cfb13bad32697c0d58a4c5949ca38176" title="Returns string contaiting date and time when the todo was completed formatted according...">completedStr</a>().replace(<span class="stringliteral">" "</span>, <span class="stringliteral">"&nbsp;"</span>) ); <a name="l01906"></a>01906 <span class="keywordflow">else</span> <a name="l01907"></a>01907 ret += <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"%1 % completed"</span>).arg(todo-><a class="code" href="classKCal_1_1Todo.html#e269def11f2ac042c997b3d95f8521a1" title="Returns how many percent of the task are completed.">percentComplete</a>()); <a name="l01908"></a>01908 <a name="l01909"></a>01909 <span class="keywordflow">return</span> ret; <a name="l01910"></a>01910 } <a name="l01911"></a>01911 <a name="l01912"></a>01912 QString IncidenceFormatter::ToolTipVisitor::dateRangeText( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a>*journal ) <a name="l01913"></a>01913 { <a name="l01914"></a>01914 QString ret; <a name="l01915"></a>01915 <span class="keywordflow">if</span> (journal-><a class="code" href="classKCal_1_1IncidenceBase.html#5419a946a4e5715a0c34ec2c7e04cd9b" title="returns an event&#39;s starting date/time as a QDateTime.">dtStart</a>().isValid() ) { <a name="l01916"></a>01916 ret += <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"<i>Date:</i>&nbsp;%1"</span>).arg( journal-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>( <span class="keyword">false</span> ) ); <a name="l01917"></a>01917 } <a name="l01918"></a>01918 <span class="keywordflow">return</span> ret; <a name="l01919"></a>01919 } <a name="l01920"></a>01920 <a name="l01921"></a>01921 QString IncidenceFormatter::ToolTipVisitor::dateRangeText( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l01922"></a>01922 { <a name="l01923"></a>01923 QString tmp( <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"<i>Period start:</i>&nbsp;%1"</span>) ); <a name="l01924"></a>01924 QString ret = tmp.arg( KGlobal::locale()->formatDateTime( fb-><a class="code" href="classKCal_1_1IncidenceBase.html#5419a946a4e5715a0c34ec2c7e04cd9b" title="returns an event&#39;s starting date/time as a QDateTime.">dtStart</a>() ) ); <a name="l01925"></a>01925 tmp = <span class="stringliteral">"<br>"</span> + i18n(<span class="stringliteral">"<i>Period start:</i>&nbsp;%1"</span>); <a name="l01926"></a>01926 ret += tmp.arg( KGlobal::locale()->formatDateTime( fb-><a class="code" href="classKCal_1_1FreeBusy.html#c20a78466c981ba719c43d7257ebf577">dtEnd</a>() ) ); <a name="l01927"></a>01927 <span class="keywordflow">return</span> ret; <a name="l01928"></a>01928 } <a name="l01929"></a>01929 <a name="l01930"></a>01930 <a name="l01931"></a>01931 <a name="l01932"></a>01932 <span class="keywordtype">bool</span> IncidenceFormatter::ToolTipVisitor::visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l01933"></a>01933 { <a name="l01934"></a>01934 mResult = generateToolTip( event, dateRangeText( event ) ); <a name="l01935"></a>01935 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01936"></a>01936 } <a name="l01937"></a>01937 <a name="l01938"></a>01938 <span class="keywordtype">bool</span> IncidenceFormatter::ToolTipVisitor::visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l01939"></a>01939 { <a name="l01940"></a>01940 mResult = generateToolTip( todo, dateRangeText( todo ) ); <a name="l01941"></a>01941 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01942"></a>01942 } <a name="l01943"></a>01943 <a name="l01944"></a>01944 <span class="keywordtype">bool</span> IncidenceFormatter::ToolTipVisitor::visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l01945"></a>01945 { <a name="l01946"></a>01946 mResult = generateToolTip( journal, dateRangeText( journal ) ); <a name="l01947"></a>01947 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01948"></a>01948 } <a name="l01949"></a>01949 <a name="l01950"></a>01950 <span class="keywordtype">bool</span> IncidenceFormatter::ToolTipVisitor::visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> *fb ) <a name="l01951"></a>01951 { <a name="l01952"></a>01952 mResult = <span class="stringliteral">"<qt><b>"</span> + i18n(<span class="stringliteral">"Free/Busy information for %1"</span>) <a name="l01953"></a>01953 .arg(fb-><a class="code" href="classKCal_1_1IncidenceBase.html#eb4c2be5ce3f3961dc10204fbc5206a7">organizer</a>().<a class="code" href="classKCal_1_1Person.html#5928a154f4ff67ef7f67018dd0ec2fbf">fullName</a>()) + <span class="stringliteral">"</b>"</span>; <a name="l01954"></a>01954 mResult += dateRangeText( fb ); <a name="l01955"></a>01955 mResult += <span class="stringliteral">"</qt>"</span>; <a name="l01956"></a>01956 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l01957"></a>01957 } <a name="l01958"></a>01958 <a name="l01959"></a>01959 QString IncidenceFormatter::ToolTipVisitor::generateToolTip( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a>* incidence, QString dtRangeText ) <a name="l01960"></a>01960 { <a name="l01961"></a>01961 <span class="keywordflow">if</span> ( !incidence ) <a name="l01962"></a>01962 <span class="keywordflow">return</span> QString::null; <a name="l01963"></a>01963 <a name="l01964"></a>01964 QString tmp = <span class="stringliteral">"<qt><b>"</span>+ incidence-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>().replace(<span class="stringliteral">"\n"</span>, <span class="stringliteral">"<br>"</span>)+<span class="stringliteral">"</b>"</span>; <a name="l01965"></a>01965 <a name="l01966"></a>01966 tmp += dtRangeText; <a name="l01967"></a>01967 <a name="l01968"></a>01968 <span class="keywordflow">if</span> (!incidence-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>().isEmpty()) { <a name="l01969"></a>01969 <span class="comment">// Put Location: in italics</span> <a name="l01970"></a>01970 tmp += <span class="stringliteral">"<br>"</span>+i18n(<span class="stringliteral">"<i>Location:</i>&nbsp;%1"</span>). <a name="l01971"></a>01971 arg( incidence-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>().replace(<span class="stringliteral">"\n"</span>, <span class="stringliteral">"<br>"</span>) ); <a name="l01972"></a>01972 } <a name="l01973"></a>01973 <span class="keywordflow">if</span> (!incidence-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty()) { <a name="l01974"></a>01974 QString desc(incidence-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>()); <a name="l01975"></a>01975 <span class="keywordflow">if</span> (desc.length()>120) { <a name="l01976"></a>01976 desc = desc.left(120) + <span class="stringliteral">"..."</span>; <a name="l01977"></a>01977 } <a name="l01978"></a>01978 tmp += <span class="stringliteral">"<br>----------<br>"</span> + i18n(<span class="stringliteral">"<i>Description:</i><br>"</span>) + desc.replace(<span class="stringliteral">"\n"</span>, <span class="stringliteral">"<br>"</span>); <a name="l01979"></a>01979 } <a name="l01980"></a>01980 tmp += <span class="stringliteral">"</qt>"</span>; <a name="l01981"></a>01981 <span class="keywordflow">return</span> tmp; <a name="l01982"></a>01982 } <a name="l01983"></a>01983 <a name="l01984"></a>01984 QString IncidenceFormatter::toolTipString( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence, <span class="keywordtype">bool</span> richText ) <a name="l01985"></a>01985 { <a name="l01986"></a>01986 ToolTipVisitor v; <a name="l01987"></a>01987 <span class="keywordflow">if</span> ( v.act( incidence, richText ) ) { <a name="l01988"></a>01988 <span class="keywordflow">return</span> v.result(); <a name="l01989"></a>01989 } <span class="keywordflow">else</span> <a name="l01990"></a>01990 <span class="keywordflow">return</span> QString::null; <a name="l01991"></a>01991 } <a name="l01992"></a>01992 <a name="l01993"></a>01993 <a name="l01994"></a>01994 <a name="l01995"></a>01995 <a name="l01996"></a>01996 <span class="comment">/*******************************************************************</span> <a name="l01997"></a>01997 <span class="comment"> * Helper functions for the Incidence tooltips</span> <a name="l01998"></a>01998 <span class="comment"> *******************************************************************/</span> <a name="l01999"></a>01999 <a name="l02000"></a>02000 <span class="keyword">class </span>IncidenceFormatter::MailBodyVisitor : <span class="keyword">public</span> <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a>::Visitor <a name="l02001"></a>02001 { <a name="l02002"></a>02002 <span class="keyword">public</span>: <a name="l02003"></a>02003 MailBodyVisitor() : mResult( <span class="stringliteral">""</span> ) {} <a name="l02004"></a>02004 <a name="l02005"></a>02005 <span class="keywordtype">bool</span> act( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence ) <a name="l02006"></a>02006 { <a name="l02007"></a>02007 mResult = <span class="stringliteral">""</span>; <a name="l02008"></a>02008 <span class="keywordflow">return</span> incidence ? incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#d99ad7b4b99e8de052ffaf8541590ff3" title="Accept IncidenceVisitor.">accept</a>( *<span class="keyword">this</span> ) : <span class="keyword">false</span>; <a name="l02009"></a>02009 } <a name="l02010"></a>02010 QString result()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> mResult; } <a name="l02011"></a>02011 <a name="l02012"></a>02012 <span class="keyword">protected</span>: <a name="l02013"></a>02013 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ); <a name="l02014"></a>02014 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ); <a name="l02015"></a>02015 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ); <a name="l02016"></a>02016 <span class="keywordtype">bool</span> visit( <a class="code" href="classKCal_1_1FreeBusy.html" title="This class provides information about free/busy time of a calendar user.">FreeBusy</a> * ) { mResult = i18n(<span class="stringliteral">"This is a Free Busy Object"</span>); <span class="keywordflow">return</span> !mResult.isEmpty(); } <a name="l02017"></a>02017 <span class="keyword">protected</span>: <a name="l02018"></a>02018 QString mResult; <a name="l02019"></a>02019 }; <a name="l02020"></a>02020 <a name="l02021"></a>02021 <a name="l02022"></a>02022 <span class="keyword">static</span> QString mailBodyIncidence( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *incidence ) <a name="l02023"></a>02023 { <a name="l02024"></a>02024 QString body; <a name="l02025"></a>02025 <span class="keywordflow">if</span> ( !incidence-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>().isEmpty() ) { <a name="l02026"></a>02026 body += i18n(<span class="stringliteral">"Summary: %1\n"</span>).arg( incidence-><a class="code" href="classKCal_1_1Incidence.html#5f6e41afa4e1b167c4b49e603506b34c" title="Return short summary.">summary</a>() ); <a name="l02027"></a>02027 } <a name="l02028"></a>02028 <span class="keywordflow">if</span> ( !incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#eb4c2be5ce3f3961dc10204fbc5206a7">organizer</a>().<a class="code" href="classKCal_1_1Person.html#518b8f369213cf81edf1be2f68110556">isEmpty</a>() ) { <a name="l02029"></a>02029 body += i18n(<span class="stringliteral">"Organizer: %1\n"</span>).arg( incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#eb4c2be5ce3f3961dc10204fbc5206a7">organizer</a>().<a class="code" href="classKCal_1_1Person.html#5928a154f4ff67ef7f67018dd0ec2fbf">fullName</a>() ); <a name="l02030"></a>02030 } <a name="l02031"></a>02031 <span class="keywordflow">if</span> ( !incidence-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>().isEmpty() ) { <a name="l02032"></a>02032 body += i18n(<span class="stringliteral">"Location: %1\n"</span>).arg( incidence-><a class="code" href="classKCal_1_1Incidence.html#d147473a07f26ad738fbae9501eb1c3d" title="Return the event&#39;s/todo&#39;s location.">location</a>() ); <a name="l02033"></a>02033 } <a name="l02034"></a>02034 <span class="keywordflow">return</span> body; <a name="l02035"></a>02035 } <a name="l02036"></a>02036 <a name="l02037"></a>02037 <span class="keywordtype">bool</span> IncidenceFormatter::MailBodyVisitor::visit( <a class="code" href="classKCal_1_1Event.html" title="This class provides an Event in the sense of RFC2445.">Event</a> *event ) <a name="l02038"></a>02038 { <a name="l02039"></a>02039 QString recurrence[]= {i18n(<span class="stringliteral">"no recurrence"</span>, <span class="stringliteral">"None"</span>), <a name="l02040"></a>02040 i18n(<span class="stringliteral">"Minutely"</span>), i18n(<span class="stringliteral">"Hourly"</span>), i18n(<span class="stringliteral">"Daily"</span>), <a name="l02041"></a>02041 i18n(<span class="stringliteral">"Weekly"</span>), i18n(<span class="stringliteral">"Monthly Same Day"</span>), i18n(<span class="stringliteral">"Monthly Same Position"</span>), <a name="l02042"></a>02042 i18n(<span class="stringliteral">"Yearly"</span>), i18n(<span class="stringliteral">"Yearly"</span>), i18n(<span class="stringliteral">"Yearly"</span>)}; <a name="l02043"></a>02043 <a name="l02044"></a>02044 mResult = mailBodyIncidence( event ); <a name="l02045"></a>02045 mResult += i18n(<span class="stringliteral">"Start Date: %1\n"</span>).arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ); <a name="l02046"></a>02046 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02047"></a>02047 mResult += i18n(<span class="stringliteral">"Start Time: %1\n"</span>).arg( event-><a class="code" href="classKCal_1_1IncidenceBase.html#ba22e2b05348fd4f18859b5e434bde3e" title="returns an event&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>() ); <a name="l02048"></a>02048 } <a name="l02049"></a>02049 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1IncidenceBase.html#5419a946a4e5715a0c34ec2c7e04cd9b" title="returns an event&#39;s starting date/time as a QDateTime.">dtStart</a>() != <span class="keyword">event</span>->dtEnd() ) { <a name="l02050"></a>02050 mResult += i18n(<span class="stringliteral">"End Date: %1\n"</span>).arg( event-><a class="code" href="classKCal_1_1Event.html#4138e4c8a9218b9bdf55e0e8f471341d" title="Return end date as string formatted according to the users locale settings.">dtEndDateStr</a>() ); <a name="l02051"></a>02051 } <a name="l02052"></a>02052 <span class="keywordflow">if</span> ( !event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02053"></a>02053 mResult += i18n(<span class="stringliteral">"End Time: %1\n"</span>).arg( event-><a class="code" href="classKCal_1_1Event.html#90ae758766ab822ee69fc0e4524f5359" title="Return end time as string formatted according to the users locale settings.">dtEndTimeStr</a>() ); <a name="l02054"></a>02054 } <a name="l02055"></a>02055 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1Incidence.html#81ad15662138be07f0d55be6b075b043" title="Forward to Recurrence::doesRecur().">doesRecur</a>() ) { <a name="l02056"></a>02056 <a class="code" href="classKCal_1_1Recurrence.html" title="This class represents a recurrence rule for a calendar incidence.">Recurrence</a> *recur = <span class="keyword">event</span>->recurrence(); <a name="l02057"></a>02057 <span class="comment">// TODO: Merge these two to one of the form "Recurs every 3 days"</span> <a name="l02058"></a>02058 mResult += i18n(<span class="stringliteral">"Recurs: %1\n"</span>) <a name="l02059"></a>02059 .arg( recurrence[ recur-><a class="code" href="classKCal_1_1Recurrence.html#9b3d0a238b28bc8602a2036e11ef2fcf" title="Returns the event&#39;s recurrence status.">recurrenceType</a>() ] ); <a name="l02060"></a>02060 mResult += i18n(<span class="stringliteral">"Frequency: %1\n"</span>) <a name="l02061"></a>02061 .arg( event-><a class="code" href="classKCal_1_1Incidence.html#d06004593e064a37d08c96f9ae16735e" title="Return the recurrence rule associated with this incidence.">recurrence</a>()-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ); <a name="l02062"></a>02062 <a name="l02063"></a>02063 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() > 0 ) { <a name="l02064"></a>02064 mResult += i18n (<span class="stringliteral">"Repeats once"</span>, <span class="stringliteral">"Repeats %n times"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>()); <a name="l02065"></a>02065 mResult += <span class="charliteral">'\n'</span>; <a name="l02066"></a>02066 } <span class="keywordflow">else</span> { <a name="l02067"></a>02067 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) { <a name="l02068"></a>02068 <span class="comment">// TODO_Recurrence: What to do with floating</span> <a name="l02069"></a>02069 QString endstr; <a name="l02070"></a>02070 <span class="keywordflow">if</span> ( event-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02071"></a>02071 endstr = KGlobal::locale()->formatDate( recur-><a class="code" href="classKCal_1_1Recurrence.html#451db06445aa82b0ba7f54bd9d63c94b" title="Returns the date of the last recurrence.">endDate</a>() ); <a name="l02072"></a>02072 } <span class="keywordflow">else</span> { <a name="l02073"></a>02073 endstr = KGlobal::locale()->formatDateTime( recur-><a class="code" href="classKCal_1_1Recurrence.html#6a7814ddb89dd40d01a2b7efe4f3eb6f" title="Returns the date/time of the last recurrence.">endDateTime</a>() ); <a name="l02074"></a>02074 } <a name="l02075"></a>02075 mResult += i18n(<span class="stringliteral">"Repeat until: %1\n"</span>).arg( endstr ); <a name="l02076"></a>02076 } <span class="keywordflow">else</span> { <a name="l02077"></a>02077 mResult += i18n(<span class="stringliteral">"Repeats forever\n"</span>); <a name="l02078"></a>02078 } <a name="l02079"></a>02079 } <a name="l02080"></a>02080 } <a name="l02081"></a>02081 QString details = <span class="keyword">event</span>->description(); <a name="l02082"></a>02082 <span class="keywordflow">if</span> ( !details.isEmpty() ) { <a name="l02083"></a>02083 mResult += i18n(<span class="stringliteral">"Details:\n%1\n"</span>).arg( details ); <a name="l02084"></a>02084 } <a name="l02085"></a>02085 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l02086"></a>02086 } <a name="l02087"></a>02087 <a name="l02088"></a>02088 <span class="keywordtype">bool</span> IncidenceFormatter::MailBodyVisitor::visit( <a class="code" href="classKCal_1_1Todo.html" title="This class provides a Todo in the sense of RFC2445.">Todo</a> *todo ) <a name="l02089"></a>02089 { <a name="l02090"></a>02090 mResult = mailBodyIncidence( todo ); <a name="l02091"></a>02091 <a name="l02092"></a>02092 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Todo.html#1fb5a233b65e2c35f9cb03460bb68c30" title="Returns true if the todo has a start date, otherwise return false.">hasStartDate</a>() ) { <a name="l02093"></a>02093 mResult += i18n(<span class="stringliteral">"Start Date: %1\n"</span>).arg( todo-><a class="code" href="classKCal_1_1Todo.html#76e9a4052617ebb42bd4546e76e5604f" title="Returns an todo&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ); <a name="l02094"></a>02094 <span class="keywordflow">if</span> ( !todo-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02095"></a>02095 mResult += i18n(<span class="stringliteral">"Start Time: %1\n"</span>).arg( todo-><a class="code" href="classKCal_1_1Todo.html#09078d277f64ebd1a1d486616ea0b728" title="Returns an todo&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>() ); <a name="l02096"></a>02096 } <a name="l02097"></a>02097 } <a name="l02098"></a>02098 <span class="keywordflow">if</span> ( todo-><a class="code" href="classKCal_1_1Todo.html#a40c65f6e9024015f7546e8749436b12" title="Returns true if the todo has a due date, otherwise return false.">hasDueDate</a>() ) { <a name="l02099"></a>02099 mResult += i18n(<span class="stringliteral">"Due Date: %1\n"</span>).arg( todo-><a class="code" href="classKCal_1_1Todo.html#bbae1ac010a13aefaf4c6564a8a610d8" title="Returns due date as string formatted according to the users locale settings.">dtDueDateStr</a>() ); <a name="l02100"></a>02100 <span class="keywordflow">if</span> ( !todo-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02101"></a>02101 mResult += i18n(<span class="stringliteral">"Due Time: %1\n"</span>).arg( todo-><a class="code" href="classKCal_1_1Todo.html#1bd3ebeb9b5d9a2c9cae6fbcc70e6653" title="Returns due time as string formatted according to the users locale settings.">dtDueTimeStr</a>() ); <a name="l02102"></a>02102 } <a name="l02103"></a>02103 } <a name="l02104"></a>02104 QString details = todo-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>(); <a name="l02105"></a>02105 <span class="keywordflow">if</span> ( !details.isEmpty() ) { <a name="l02106"></a>02106 mResult += i18n(<span class="stringliteral">"Details:\n%1\n"</span>).arg( details ); <a name="l02107"></a>02107 } <a name="l02108"></a>02108 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l02109"></a>02109 } <a name="l02110"></a>02110 <a name="l02111"></a>02111 <span class="keywordtype">bool</span> IncidenceFormatter::MailBodyVisitor::visit( <a class="code" href="classKCal_1_1Journal.html" title="This class provides a Journal in the sense of RFC2445.">Journal</a> *journal ) <a name="l02112"></a>02112 { <a name="l02113"></a>02113 mResult = mailBodyIncidence( journal ); <a name="l02114"></a>02114 mResult += i18n(<span class="stringliteral">"Date: %1\n"</span>).arg( journal-><a class="code" href="classKCal_1_1IncidenceBase.html#8990090cb365956d18e5296d651ce659" title="returns an event&#39;s starting date as a string formatted according to the users...">dtStartDateStr</a>() ); <a name="l02115"></a>02115 <span class="keywordflow">if</span> ( !journal-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02116"></a>02116 mResult += i18n(<span class="stringliteral">"Time: %1\n"</span>).arg( journal-><a class="code" href="classKCal_1_1IncidenceBase.html#ba22e2b05348fd4f18859b5e434bde3e" title="returns an event&#39;s starting time as a string formatted according to the users...">dtStartTimeStr</a>() ); <a name="l02117"></a>02117 } <a name="l02118"></a>02118 <span class="keywordflow">if</span> ( !journal-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>().isEmpty() ) <a name="l02119"></a>02119 mResult += i18n(<span class="stringliteral">"Text of the journal:\n%1\n"</span>).arg( journal-><a class="code" href="classKCal_1_1Incidence.html#5614d24c09a8909b08c26c5e33918831" title="Return long description.">description</a>() ); <a name="l02120"></a>02120 <span class="keywordflow">return</span> !mResult.isEmpty(); <a name="l02121"></a>02121 } <a name="l02122"></a>02122 <a name="l02123"></a>02123 <a name="l02124"></a>02124 <a name="l02125"></a>02125 QString IncidenceFormatter::mailBodyString( <a class="code" href="classKCal_1_1IncidenceBase.html" title="This class provides the base class common to all calendar components.">IncidenceBase</a> *incidence ) <a name="l02126"></a>02126 { <a name="l02127"></a>02127 <span class="keywordflow">if</span> ( !incidence ) <a name="l02128"></a>02128 <span class="keywordflow">return</span> QString::null; <a name="l02129"></a>02129 <a name="l02130"></a>02130 MailBodyVisitor v; <a name="l02131"></a>02131 <span class="keywordflow">if</span> ( v.act( incidence ) ) { <a name="l02132"></a>02132 <span class="keywordflow">return</span> v.result(); <a name="l02133"></a>02133 } <a name="l02134"></a>02134 <span class="keywordflow">return</span> QString::null; <a name="l02135"></a>02135 } <a name="l02136"></a>02136 <a name="l02137"></a>02137 <span class="keyword">static</span> QString recurEnd( <a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> *incidence ) <a name="l02138"></a>02138 { <a name="l02139"></a>02139 QString endstr; <a name="l02140"></a>02140 <span class="keywordflow">if</span> ( incidence-><a class="code" href="classKCal_1_1IncidenceBase.html#edfe188f8024f1ec9e25972ddd332724" title="Return true or false depending on whether the incidence &quot;floats,&quot; i.e.">doesFloat</a>() ) { <a name="l02141"></a>02141 endstr = KGlobal::locale()->formatDate( incidence-><a class="code" href="classKCal_1_1Incidence.html#d06004593e064a37d08c96f9ae16735e" title="Return the recurrence rule associated with this incidence.">recurrence</a>()-><a class="code" href="classKCal_1_1Recurrence.html#451db06445aa82b0ba7f54bd9d63c94b" title="Returns the date of the last recurrence.">endDate</a>() ); <a name="l02142"></a>02142 } <span class="keywordflow">else</span> { <a name="l02143"></a>02143 endstr = KGlobal::locale()->formatDateTime( incidence-><a class="code" href="classKCal_1_1Incidence.html#d06004593e064a37d08c96f9ae16735e" title="Return the recurrence rule associated with this incidence.">recurrence</a>()-><a class="code" href="classKCal_1_1Recurrence.html#6a7814ddb89dd40d01a2b7efe4f3eb6f" title="Returns the date/time of the last recurrence.">endDateTime</a>() ); <a name="l02144"></a>02144 } <a name="l02145"></a>02145 <span class="keywordflow">return</span> endstr; <a name="l02146"></a>02146 } <a name="l02147"></a>02147 <a name="l02148"></a>02148 QString IncidenceFormatter::recurrenceString(<a class="code" href="classKCal_1_1Incidence.html" title="This class provides the base class common to all calendar components.">Incidence</a> * incidence) <a name="l02149"></a>02149 { <a name="l02150"></a>02150 <span class="keywordflow">if</span> ( !incidence-><a class="code" href="classKCal_1_1Incidence.html#81ad15662138be07f0d55be6b075b043" title="Forward to Recurrence::doesRecur().">doesRecur</a>() ) <a name="l02151"></a>02151 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"No recurrence"</span> ); <a name="l02152"></a>02152 <a name="l02153"></a>02153 <a class="code" href="classKCal_1_1Recurrence.html" title="This class represents a recurrence rule for a calendar incidence.">Recurrence</a> *recur = incidence-><a class="code" href="classKCal_1_1Incidence.html#d06004593e064a37d08c96f9ae16735e" title="Return the recurrence rule associated with this incidence.">recurrence</a>(); <a name="l02154"></a>02154 <span class="keywordflow">switch</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#9b3d0a238b28bc8602a2036e11ef2fcf" title="Returns the event&#39;s recurrence status.">recurrenceType</a>() ) { <a name="l02155"></a>02155 <span class="keywordflow">case</span> Recurrence::rNone: <a name="l02156"></a>02156 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"No recurrence"</span> ); <a name="l02157"></a>02157 <span class="keywordflow">case</span> Recurrence::rMinutely: <a name="l02158"></a>02158 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) <a name="l02159"></a>02159 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs every minute until %1"</span>, <span class="stringliteral">"Recurs every %n minutes until %1"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ) <a name="l02160"></a>02160 .arg( recurEnd( incidence ) ); <a name="l02161"></a>02161 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs every minute"</span>, <span class="stringliteral">"Recurs every %n minutes"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ); <a name="l02162"></a>02162 <span class="keywordflow">case</span> Recurrence::rHourly: <a name="l02163"></a>02163 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) <a name="l02164"></a>02164 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs hourly until %1"</span>, <span class="stringliteral">"Recurs every %n hours until %1"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ) <a name="l02165"></a>02165 .arg( recurEnd( incidence ) ); <a name="l02166"></a>02166 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs hourly"</span>, <span class="stringliteral">"Recurs every %n hours"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ); <a name="l02167"></a>02167 <span class="keywordflow">case</span> Recurrence::rDaily: <a name="l02168"></a>02168 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) <a name="l02169"></a>02169 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs daily until %1"</span>, <span class="stringliteral">"Recurs every %n days until %1"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ) <a name="l02170"></a>02170 .arg( recurEnd( incidence ) ); <a name="l02171"></a>02171 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs daily"</span>, <span class="stringliteral">"Recurs every %n days"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ); <a name="l02172"></a>02172 <span class="keywordflow">case</span> Recurrence::rWeekly: <a name="l02173"></a>02173 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) <a name="l02174"></a>02174 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs weekly until %1"</span>, <span class="stringliteral">"Recurs every %n weeks until %1"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ) <a name="l02175"></a>02175 .arg( recurEnd( incidence ) ); <a name="l02176"></a>02176 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs weekly"</span>, <span class="stringliteral">"Recurs every %n weeks"</span>, recur-><a class="code" href="classKCal_1_1Recurrence.html#85afd958b67570632dece34bc9920849" title="Returns frequency of recurrence, in terms of the recurrence time period type.">frequency</a>() ); <a name="l02177"></a>02177 <span class="keywordflow">case</span> Recurrence::rMonthlyPos: <a name="l02178"></a>02178 <span class="keywordflow">case</span> Recurrence::rMonthlyDay: <a name="l02179"></a>02179 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) <a name="l02180"></a>02180 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs monthly until %1"</span> ).arg( recurEnd( incidence ) ); <a name="l02181"></a>02181 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs monthly"</span> ); <a name="l02182"></a>02182 <span class="keywordflow">case</span> Recurrence::rYearlyMonth: <a name="l02183"></a>02183 <span class="keywordflow">case</span> Recurrence::rYearlyDay: <a name="l02184"></a>02184 <span class="keywordflow">case</span> Recurrence::rYearlyPos: <a name="l02185"></a>02185 <span class="keywordflow">if</span> ( recur-><a class="code" href="classKCal_1_1Recurrence.html#54913d2f0a66bae406a7b11945919a00" title="Returns -1 if the event recurs infinitely, 0 if the end date is set, otherwise the...">duration</a>() != -1 ) <a name="l02186"></a>02186 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs yearly until %1"</span> ).arg( recurEnd( incidence ) ); <a name="l02187"></a>02187 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Recurs yearly"</span> ); <a name="l02188"></a>02188 <span class="keywordflow">default</span>: <a name="l02189"></a>02189 <span class="keywordflow">return</span> i18n( <span class="stringliteral">"Incidence recurs"</span> ); <a name="l02190"></a>02190 } <a name="l02191"></a>02191 } </pre></div></div> </div></div> </td> </tr> <tr> <td valign="top" id="leftmenu" width="25%"> <a name="navigation"></a> <div class="menu_box"><h2>libkcal</h2> <div class="nav_list"> <ul><li><a href="index.html">Main Page</a></li><li><a href="namespaces.html">Namespace List</a></li><li><a href="hierarchy.html">Class Hierarchy</a></li><li><a href="classes.html">Alphabetical List</a></li><li><a href="annotated.html">Class List</a></li><li><a href="files.html">File List</a></li><li><a href="namespacemembers.html">Namespace Members</a></li><li><a href="functions.html">Class Members</a></li></ul> <!-- <h2>Class Picker</h2> <div style="text-align: center;"> <form name="guideform"> <select name="guidelinks" style="width:100%;" onChange="window.location=document.guideform.guidelinks.options[document.guideform.guidelinks.selectedIndex].value"> <option value="annotated.html">-- Choose --</option> <option value="classKCal_1_1Alarm.html">kcal::alarm</option>, <option value="classKCal_1_1Attachment.html">kcal::attachment</option>, <option value="classKCal_1_1Attendee.html">kcal::attendee</option>, <option value="classKCal_1_1Calendar.html">kcal::calendar</option>, <option value="classKCal_1_1Calendar_1_1Observer.html">kcal::calendar::observer</option>, <option value="classKCal_1_1CalendarLocal.html">kcal::calendarlocal</option>, <option value="classKCal_1_1CalendarNull.html">kcal::calendarnull</option>, <option value="classKCal_1_1CalendarResources.html">kcal::calendarresources</option>, <option value="classKCal_1_1CalFilter.html">kcal::calfilter</option>, <option value="classKCal_1_1CalFormat.html">kcal::calformat</option>, <option value="classKCal_1_1CalStorage.html">kcal::calstorage</option>, <option value="classKCal_1_1Compat.html">kcal::compat</option>, <option value="classKCal_1_1CompatFactory.html">kcal::compatfactory</option>, <option value="classKCal_1_1CustomProperties.html">kcal::customproperties</option>, <option value="classKCal_1_1DndFactory.html">kcal::dndfactory</option>, <option value="classKCal_1_1Duration.html">kcal::duration</option>, <option value="classKCal_1_1ErrorFormat.html">kcal::errorformat</option>, <option value="classKCal_1_1Event.html">kcal::event</option>, <option value="classKCal_1_1Exception.html">kcal::exception</option>, <option value="classKCal_1_1FileStorage.html">kcal::filestorage</option>, <option value="classKCal_1_1FreeBusy.html">kcal::freebusy</option>, <option value="classKCal_1_1HtmlExport.html">kcal::htmlexport</option>, <option value="classKCal_1_1ICalDrag.html">kcal::icaldrag</option>, <option value="classKCal_1_1ICalFormat.html">kcal::icalformat</option>, <option value="classKCal_1_1Incidence.html">kcal::incidence</option>, <option value="classKCal_1_1Incidence_1_1AddVisitor.html">kcal::incidence::addvisitor</option>, <option value="classKCal_1_1Incidence_1_1DeleteVisitor.html">kcal::incidence::deletevisitor</option>, <option value="classKCal_1_1IncidenceBase.html">kcal::incidencebase</option>, <option value="classKCal_1_1IncidenceBase_1_1Visitor.html">kcal::incidencebase::visitor</option>, <option value="classKCal_1_1IncidenceFormatter.html">kcal::incidenceformatter</option>, <option value="classKCal_1_1Journal.html">kcal::journal</option>, <option value="classKCal_1_1ListBase.html">kcal::listbase</option>, <option value="classKCal_1_1Period.html">kcal::period</option>, <option value="classKCal_1_1Person.html">kcal::person</option>, <option value="classKCal_1_1QtopiaFormat.html">kcal::qtopiaformat</option>, <option value="classKCal_1_1Recurrence.html">kcal::recurrence</option>, <option value="classKCal_1_1RecurrenceRule.html">kcal::recurrencerule</option>, <option value="classKCal_1_1RecurrenceRule_1_1WDayPos.html">kcal::recurrencerule::wdaypos</option>, <option value="classKCal_1_1ResourceCached.html">kcal::resourcecached</option>, <option value="classKCal_1_1ResourceCachedReloadConfig.html">kcal::resourcecachedreloadconfig</option>, <option value="classKCal_1_1ResourceCachedSaveConfig.html">kcal::resourcecachedsaveconfig</option>, <option value="classKCal_1_1ResourceCalendar.html">kcal::resourcecalendar</option>, <option value="classKCal_1_1ResourceLocal.html">kcal::resourcelocal</option>, <option value="classKCal_1_1ResourceLocalConfig.html">kcal::resourcelocalconfig</option>, <option value="classKCal_1_1ScheduleMessage.html">kcal::schedulemessage</option>, <option value="classKCal_1_1Scheduler.html">kcal::scheduler</option>, <option value="classKCal_1_1Todo.html">kcal::todo</option>, <option value="classKCal_1_1VCalDrag.html">kcal::vcaldrag</option>, <option value="classKCal_1_1VCalFormat.html">kcal::vcalformat</option>, </select> </form> </div> --> </div></div> <div class="menu_box"><h2>API Dox</h2> <div class="nav_list"> <ul> <li><a href="../../akregator/html/index.html">akregator</a></li><li> <a href="../../akregator/src/html/index.html">src</a></li><li> <a href="../../akregator/src/librss/html/index.html">librss</a></li><li><a href="../../certmanager/html/index.html">certmanager</a></li><li> <a href="../../certmanager/lib/html/index.html">lib</a></li><li><a href="../../kaddressbook/html/index.html">kaddressbook</a></li><li><a href="../../kalarm/html/index.html">kalarm</a></li><li> <a href="../../kalarm/lib/html/index.html">lib</a></li><li><a href="../../kandy/html/index.html">kandy</a></li><li><a href="../../karm/html/index.html">karm</a></li><li><a href="../../kdgantt/html/index.html">kdgantt</a></li><li><a href="../../kgantt/html/index.html">kgantt</a></li><li><a href="../../kioslaves/html/index.html">kioslaves</a></li><li> <a href="../../kioslaves/imap4/html/index.html">imap4</a></li><li> <a href="../../kioslaves/mbox/html/index.html">mbox</a></li><li><a href="../../kitchensync/html/index.html">kitchensync</a></li><li><a href="../../kmail/html/index.html">kmail</a></li><li><a href="../../knotes/html/index.html">knotes</a></li><li><a href="../../konsolekalendar/html/index.html">konsolekalendar</a></li><li><a href="../../kontact/html/index.html">kontact</a></li><li><a href="../../korganizer/html/index.html">korganizer</a></li><li><a href="../../kpilot/html/index.html">kpilot</a></li><li> <a href="../../kpilot/kpilot/html/index.html">kpilot</a></li><li> <a href="../../kpilot/lib/html/index.html">lib</a></li><li><a href="../../libemailfunctions/html/index.html">libemailfunctions</a></li><li><a href="../../libkcal/html/index.html">libkcal</a></li><li><a href="../../libkdepim/html/index.html">libkdepim</a></li><li><a href="../../libkholidays/html/index.html">libkholidays</a></li><li><a href="../../libkmime/html/index.html">libkmime</a></li><li><a href="../../libkpgp/html/index.html">libkpgp</a></li><li><a href="../../libkpimidentities/html/index.html">libkpimidentities</a></li> </ul></div></div> </td> </tr> </table> <span class="doNotDisplay"> <a href="http://www.kde.org/" accesskey="8">KDE Home</a> | <a href="http://accessibility.kde.org/" accesskey="9">KDE Accessibility Home</a> | <a href="http://www.kde.org/media/accesskeys.php" accesskey="0">Description of Access Keys</a> </span> <div style="height: 8px"></div> <div id="footer"> <div id="footer_left"> Maintained by <a href="mailto:groot@kde.org">Adriaan de Groot</a> and <a href="mailto:winter@kde.org">Allen Winter</a>. <br/> KDE and K Desktop Environment are trademarks of <a href="http://www.kde.org/areas/kde-ev/" title="Homepage of the KDE non-profit Organization">KDE e.V.</a> | <a href="http://www.kde.org/contact/impressum.php">Legal</a> </div> <div id="footer_right"><img src="/media/images/footer_right.png" style="margin: 0px" alt="" /></div> </div> <!-- WARNING: DO NOT SEND MAIL TO THE FOLLOWING EMAIL ADDRESS! YOU WILL BE BLOCKED INSTANTLY AND PERMANENTLY! <a href="mailto:aaaatrap-425acc3b5374943f@kde.org">Block me</a> WARNING END --> </body> </html>