<?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>kmail: kmmessage.cpp Source File (kmail)</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=".">kmail</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>kmail</h2> <!-- Generated by Doxygen 1.5.5 --> <h1>kmmessage.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// -*- mode: C++; c-file-style: "gnu" -*-</span> <a name="l00002"></a>00002 <span class="comment">// kmmessage.cpp</span> <a name="l00003"></a>00003 <a name="l00004"></a>00004 <span class="comment">// if you do not want GUI elements in here then set ALLOW_GUI to 0.</span> <a name="l00005"></a>00005 <span class="preprocessor">#include <config.h></span> <a name="l00006"></a>00006 <span class="comment">// needed temporarily until KMime is replacing the partNode helper class:</span> <a name="l00007"></a>00007 <span class="preprocessor">#include "partNode.h"</span> <a name="l00008"></a>00008 <a name="l00009"></a>00009 <a name="l00010"></a>00010 <span class="preprocessor">#define ALLOW_GUI 1</span> <a name="l00011"></a>00011 <span class="preprocessor"></span><span class="preprocessor">#include "kmkernel.h"</span> <a name="l00012"></a>00012 <span class="preprocessor">#include "kmmessage.h"</span> <a name="l00013"></a>00013 <span class="preprocessor">#include "mailinglist-magic.h"</span> <a name="l00014"></a>00014 <span class="preprocessor">#include "messageproperty.h"</span> <a name="l00015"></a>00015 <span class="keyword">using</span> KMail::MessageProperty; <a name="l00016"></a>00016 <span class="preprocessor">#include "objecttreeparser.h"</span> <a name="l00017"></a>00017 <span class="keyword">using</span> KMail::ObjectTreeParser; <a name="l00018"></a>00018 <span class="preprocessor">#include "kmfolderindex.h"</span> <a name="l00019"></a>00019 <span class="preprocessor">#include "undostack.h"</span> <a name="l00020"></a>00020 <span class="preprocessor">#include "kmversion.h"</span> <a name="l00021"></a>00021 <span class="preprocessor">#include "headerstrategy.h"</span> <a name="l00022"></a>00022 <span class="preprocessor">#include "globalsettings.h"</span> <a name="l00023"></a>00023 <span class="keyword">using</span> KMail::HeaderStrategy; <a name="l00024"></a>00024 <span class="preprocessor">#include "kmaddrbook.h"</span> <a name="l00025"></a>00025 <span class="preprocessor">#include "kcursorsaver.h"</span> <a name="l00026"></a>00026 <span class="preprocessor">#include "templateparser.h"</span> <a name="l00027"></a>00027 <a name="l00028"></a>00028 <span class="preprocessor">#include <libkpimidentities/identity.h></span> <a name="l00029"></a>00029 <span class="preprocessor">#include <libkpimidentities/identitymanager.h></span> <a name="l00030"></a>00030 <span class="preprocessor">#include <libemailfunctions/email.h></span> <a name="l00031"></a>00031 <a name="l00032"></a>00032 <span class="preprocessor">#include <kasciistringtools.h></span> <a name="l00033"></a>00033 <a name="l00034"></a>00034 <span class="preprocessor">#include <kpgpblock.h></span> <a name="l00035"></a>00035 <span class="preprocessor">#include <kaddrbook.h></span> <a name="l00036"></a>00036 <a name="l00037"></a>00037 <span class="preprocessor">#include <kapplication.h></span> <a name="l00038"></a>00038 <span class="preprocessor">#include <kglobalsettings.h></span> <a name="l00039"></a>00039 <span class="preprocessor">#include <kdebug.h></span> <a name="l00040"></a>00040 <span class="preprocessor">#include <kconfig.h></span> <a name="l00041"></a>00041 <span class="preprocessor">#include <khtml_part.h></span> <a name="l00042"></a>00042 <span class="preprocessor">#include <kuser.h></span> <a name="l00043"></a>00043 <span class="preprocessor">#include <kidna.h></span> <a name="l00044"></a>00044 <span class="preprocessor">#include <kasciistricmp.h></span> <a name="l00045"></a>00045 <a name="l00046"></a>00046 <span class="preprocessor">#include <qcursor.h></span> <a name="l00047"></a>00047 <span class="preprocessor">#include <qtextcodec.h></span> <a name="l00048"></a>00048 <span class="preprocessor">#include <qmessagebox.h></span> <a name="l00049"></a>00049 <span class="preprocessor">#include <kmime_util.h></span> <a name="l00050"></a>00050 <span class="preprocessor">#include <kmime_charfreq.h></span> <a name="l00051"></a>00051 <a name="l00052"></a>00052 <span class="preprocessor">#include <kmime_header_parsing.h></span> <a name="l00053"></a>00053 <span class="keyword">using</span> KMime::HeaderParsing::parseAddressList; <a name="l00054"></a>00054 <span class="keyword">using namespace </span>KMime::Types; <a name="l00055"></a>00055 <a name="l00056"></a>00056 <span class="preprocessor">#include <mimelib/body.h></span> <a name="l00057"></a>00057 <span class="preprocessor">#include <mimelib/field.h></span> <a name="l00058"></a>00058 <span class="preprocessor">#include <mimelib/mimepp.h></span> <a name="l00059"></a>00059 <span class="preprocessor">#include <mimelib/string.h></span> <a name="l00060"></a>00060 <span class="preprocessor">#include <assert.h></span> <a name="l00061"></a>00061 <span class="preprocessor">#include <sys/time.h></span> <a name="l00062"></a>00062 <span class="preprocessor">#include <time.h></span> <a name="l00063"></a>00063 <span class="preprocessor">#include <klocale.h></span> <a name="l00064"></a>00064 <span class="preprocessor">#include <stdlib.h></span> <a name="l00065"></a>00065 <span class="preprocessor">#include <unistd.h></span> <a name="l00066"></a>00066 <span class="preprocessor">#include "util.h"</span> <a name="l00067"></a>00067 <a name="l00068"></a>00068 <span class="preprocessor">#if ALLOW_GUI</span> <a name="l00069"></a>00069 <span class="preprocessor"></span><span class="preprocessor">#include <kmessagebox.h></span> <a name="l00070"></a>00070 <span class="preprocessor">#endif</span> <a name="l00071"></a>00071 <span class="preprocessor"></span> <a name="l00072"></a>00072 <span class="keyword">using namespace </span>KMime; <a name="l00073"></a>00073 <a name="l00074"></a>00074 <span class="keyword">static</span> DwString emptyString(<span class="stringliteral">""</span>); <a name="l00075"></a>00075 <a name="l00076"></a>00076 <span class="comment">// Values that are set from the config file with KMMessage::readConfig()</span> <a name="l00077"></a>00077 <span class="keyword">static</span> QString sReplyLanguage, sReplyStr, sReplyAllStr, sIndentPrefixStr; <a name="l00078"></a>00078 <span class="keyword">static</span> <span class="keywordtype">bool</span> sSmartQuote, <a name="l00079"></a>00079 sWordWrap; <a name="l00080"></a>00080 <span class="keyword">static</span> <span class="keywordtype">int</span> sWrapCol; <a name="l00081"></a>00081 <span class="keyword">static</span> QStringList sPrefCharsets; <a name="l00082"></a>00082 <a name="l00083"></a>00083 QString KMMessage::sForwardStr; <a name="l00084"></a>00084 <span class="keyword">const</span> HeaderStrategy * KMMessage::sHeaderStrategy = HeaderStrategy::rich(); <a name="l00085"></a>00085 <span class="comment">//helper</span> <a name="l00086"></a>00086 <span class="keyword">static</span> <span class="keywordtype">void</span> applyHeadersToMessagePart( DwHeaders& headers, KMMessagePart* aPart ); <a name="l00087"></a>00087 <a name="l00088"></a>00088 QValueList<KMMessage*> KMMessage::sPendingDeletes; <a name="l00089"></a>00089 <a name="l00090"></a>00090 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00091"></a><a class="code" href="classKMMessage.html#a82395f1556a0211e24d083c5a1fa76d">00091</a> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage::KMMessage</a>(DwMessage* aMsg) <a name="l00092"></a>00092 : KMMsgBase() <a name="l00093"></a>00093 { <a name="l00094"></a>00094 init( aMsg ); <a name="l00095"></a>00095 <span class="comment">// aMsg might need assembly</span> <a name="l00096"></a>00096 mNeedsAssembly = <span class="keyword">true</span>; <a name="l00097"></a>00097 } <a name="l00098"></a>00098 <a name="l00099"></a>00099 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00100"></a><a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61">00100</a> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage::KMMessage</a>(<a class="code" href="classKMFolder.html" title="Mail folder.">KMFolder</a>* parent): KMMsgBase(parent) <a name="l00101"></a>00101 { <a name="l00102"></a>00102 init(); <a name="l00103"></a>00103 } <a name="l00104"></a>00104 <a name="l00105"></a>00105 <a name="l00106"></a>00106 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00107"></a><a class="code" href="classKMMessage.html#3479e2dcea0ece250440337f02b173e2">00107</a> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage::KMMessage</a>(KMMsgInfo& <a class="code" href="classKMMessage.html#8a991889002061d8b1dae4f5decd1679" title="Get the KMMsgInfo object that was set with setMsgInfo().">msgInfo</a>): KMMsgBase() <a name="l00108"></a>00108 { <a name="l00109"></a>00109 init(); <a name="l00110"></a>00110 <span class="comment">// now overwrite a few from the msgInfo</span> <a name="l00111"></a>00111 mMsgSize = msgInfo.msgSize(); <a name="l00112"></a>00112 mFolderOffset = msgInfo.folderOffset(); <a name="l00113"></a>00113 mStatus = msgInfo.status(); <a name="l00114"></a>00114 mEncryptionState = msgInfo.encryptionState(); <a name="l00115"></a>00115 mSignatureState = msgInfo.signatureState(); <a name="l00116"></a>00116 mMDNSentState = msgInfo.mdnSentState(); <a name="l00117"></a>00117 mDate = msgInfo.date(); <a name="l00118"></a>00118 mFileName = msgInfo.fileName(); <a name="l00119"></a>00119 KMMsgBase::assign(&msgInfo); <a name="l00120"></a>00120 } <a name="l00121"></a>00121 <a name="l00122"></a>00122 <a name="l00123"></a>00123 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00124"></a><a class="code" href="classKMMessage.html#bf4a74494ac7887994c06762ab6cc9d9">00124</a> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage::KMMessage</a>(<span class="keyword">const</span> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>& other) : <a name="l00125"></a>00125 KMMsgBase( other ), <a name="l00126"></a>00126 ISubject(), <a name="l00127"></a>00127 mMsg(0) <a name="l00128"></a>00128 { <a name="l00129"></a>00129 init(); <span class="comment">// to be safe</span> <a name="l00130"></a>00130 assign( other ); <a name="l00131"></a>00131 } <a name="l00132"></a>00132 <a name="l00133"></a>00133 <span class="keywordtype">void</span> KMMessage::init( DwMessage* aMsg ) <a name="l00134"></a>00134 { <a name="l00135"></a>00135 mNeedsAssembly = <span class="keyword">false</span>; <a name="l00136"></a>00136 <span class="keywordflow">if</span> ( aMsg ) { <a name="l00137"></a>00137 mMsg = aMsg; <a name="l00138"></a>00138 } <span class="keywordflow">else</span> { <a name="l00139"></a>00139 mMsg = <span class="keyword">new</span> DwMessage; <a name="l00140"></a>00140 } <a name="l00141"></a>00141 mOverrideCodec = 0; <a name="l00142"></a>00142 mDecodeHTML = <span class="keyword">false</span>; <a name="l00143"></a>00143 mComplete = <span class="keyword">true</span>; <a name="l00144"></a>00144 mReadyToShow = <span class="keyword">true</span>; <a name="l00145"></a>00145 mMsgSize = 0; <a name="l00146"></a>00146 mMsgLength = 0; <a name="l00147"></a>00147 mFolderOffset = 0; <a name="l00148"></a>00148 mStatus = KMMsgStatusNew; <a name="l00149"></a>00149 mEncryptionState = KMMsgEncryptionStateUnknown; <a name="l00150"></a>00150 mSignatureState = KMMsgSignatureStateUnknown; <a name="l00151"></a>00151 mMDNSentState = KMMsgMDNStateUnknown; <a name="l00152"></a>00152 mDate = 0; <a name="l00153"></a>00153 mUnencryptedMsg = 0; <a name="l00154"></a>00154 mLastUpdated = 0; <a name="l00155"></a>00155 mCursorPos = 0; <a name="l00156"></a>00156 mMsgInfo = 0; <a name="l00157"></a>00157 mIsParsed = <span class="keyword">false</span>; <a name="l00158"></a>00158 } <a name="l00159"></a>00159 <a name="l00160"></a>00160 <span class="keywordtype">void</span> KMMessage::assign( <span class="keyword">const</span> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>& other ) <a name="l00161"></a>00161 { <a name="l00162"></a>00162 MessageProperty::forget( <span class="keyword">this</span> ); <a name="l00163"></a>00163 <span class="keyword">delete</span> mMsg; <a name="l00164"></a>00164 <span class="keyword">delete</span> mUnencryptedMsg; <a name="l00165"></a>00165 <a name="l00166"></a>00166 mNeedsAssembly = <span class="keyword">true</span>;<span class="comment">//other.mNeedsAssembly;</span> <a name="l00167"></a>00167 <span class="keywordflow">if</span>( other.<a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a> ) <a name="l00168"></a>00168 mMsg = <span class="keyword">new</span> DwMessage( *(other.<a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>) ); <a name="l00169"></a>00169 <span class="keywordflow">else</span> <a name="l00170"></a>00170 mMsg = 0; <a name="l00171"></a>00171 mOverrideCodec = other.<a class="code" href="classKMMessage.html#97e8aa55e878437b345e800c31b3feaa">mOverrideCodec</a>; <a name="l00172"></a>00172 mDecodeHTML = other.<a class="code" href="classKMMessage.html#58a1c53655474d82dbde5a3d0faff651">mDecodeHTML</a>; <a name="l00173"></a>00173 mMsgSize = other.<a class="code" href="classKMMessage.html#de14fa89e412216172ad4806e2eaf019">mMsgSize</a>; <a name="l00174"></a>00174 mMsgLength = other.<a class="code" href="classKMMessage.html#d51c1151aa7c965fa86f4f2f83720b94">mMsgLength</a>; <a name="l00175"></a>00175 mFolderOffset = other.<a class="code" href="classKMMessage.html#83f3795e0887343539b3d525c39f5897">mFolderOffset</a>; <a name="l00176"></a>00176 mStatus = other.mStatus; <a name="l00177"></a>00177 mEncryptionState = other.<a class="code" href="classKMMessage.html#af3a2b1cff61758a597fc9290a3cc11b">mEncryptionState</a>; <a name="l00178"></a>00178 mSignatureState = other.<a class="code" href="classKMMessage.html#acbcf4ba83b6bd9b46926b0fe4184afd">mSignatureState</a>; <a name="l00179"></a>00179 mMDNSentState = other.<a class="code" href="classKMMessage.html#63a6b3fc6bf813365473d7fbeceaa548">mMDNSentState</a>; <a name="l00180"></a>00180 mIsParsed = other.<a class="code" href="classKMMessage.html#3145e598244874210aeb2438ea93f08b">mIsParsed</a>; <a name="l00181"></a>00181 mDate = other.<a class="code" href="classKMMessage.html#cf51aeaccb768a21c3742bdaed408a36">mDate</a>; <a name="l00182"></a>00182 <span class="keywordflow">if</span>( other.<a class="code" href="classKMMessage.html#bdf68a102268cc4ace477f1e735d3830" title="Returns TRUE if the message contains an unencrypted copy of itself.">hasUnencryptedMsg</a>() ) <a name="l00183"></a>00183 mUnencryptedMsg = <span class="keyword">new</span> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage</a>( *other.<a class="code" href="classKMMessage.html#1480991a8190ae7714a45933777504bd" title="Returns an unencrypted copy of this message or 0 if none exists.">unencryptedMsg</a>() ); <a name="l00184"></a>00184 <span class="keywordflow">else</span> <a name="l00185"></a>00185 mUnencryptedMsg = 0; <a name="l00186"></a>00186 setDrafts( other.<a class="code" href="classKMMessage.html#527a4d7b97571ff18467e5bcc6acab9a" title="Get or set the &#39;Drafts&#39; folder.">drafts</a>() ); <a name="l00187"></a>00187 setTemplates( other.<a class="code" href="classKMMessage.html#544e24e65dae9fcf8a6008791327ecb2" title="Get or set the &#39;Templates&#39; folder.">templates</a>() ); <a name="l00188"></a>00188 <span class="comment">//mFileName = ""; // we might not want to copy the other messages filename (?)</span> <a name="l00189"></a>00189 <span class="comment">//KMMsgBase::assign( &other );</span> <a name="l00190"></a>00190 } <a name="l00191"></a>00191 <a name="l00192"></a>00192 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00193"></a><a class="code" href="classKMMessage.html#7f07fb924168584c441cfff4498753b4">00193</a> <a class="code" href="classKMMessage.html#7f07fb924168584c441cfff4498753b4" title="Destructor.">KMMessage::~KMMessage</a>() <a name="l00194"></a>00194 { <a name="l00195"></a>00195 <span class="keyword">delete</span> mMsgInfo; <a name="l00196"></a>00196 <span class="keyword">delete</span> mMsg; <a name="l00197"></a>00197 kmkernel->undoStack()->msgDestroyed( <span class="keyword">this</span> ); <a name="l00198"></a>00198 } <a name="l00199"></a>00199 <a name="l00200"></a>00200 <a name="l00201"></a>00201 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00202"></a>00202 <span class="keywordtype">void</span> KMMessage::setReferences(<span class="keyword">const</span> QCString& aStr) <a name="l00203"></a>00203 { <a name="l00204"></a>00204 <span class="keywordflow">if</span> (!aStr) <span class="keywordflow">return</span>; <a name="l00205"></a>00205 mMsg->Headers().References().FromString(aStr); <a name="l00206"></a>00206 mNeedsAssembly = <span class="keyword">true</span>; <a name="l00207"></a>00207 } <a name="l00208"></a>00208 <a name="l00209"></a>00209 <a name="l00210"></a>00210 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00211"></a><a class="code" href="classKMMessage.html#0d8727663192f06834b97ffd7eca6570">00211</a> QCString <a class="code" href="classKMMessage.html#0d8727663192f06834b97ffd7eca6570" title="Returns the message ID, useful for followups.">KMMessage::id</a>()<span class="keyword"> const</span> <a name="l00212"></a>00212 <span class="keyword"></span>{ <a name="l00213"></a>00213 DwHeaders& header = mMsg->Headers(); <a name="l00214"></a>00214 <span class="keywordflow">if</span> (header.HasMessageId()) <a name="l00215"></a>00215 <span class="keywordflow">return</span> <a class="code" href="namespaceKMail_1_1Util.html#7dbcbfd02aa6cf732ac83c2b6d5b6f8b" title="Construct a QCString from a DwString.">KMail::Util::CString</a>( header.MessageId().AsString() ); <a name="l00216"></a>00216 <span class="keywordflow">else</span> <a name="l00217"></a>00217 <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l00218"></a>00218 } <a name="l00219"></a>00219 <a name="l00220"></a>00220 <a name="l00221"></a>00221 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00222"></a>00222 <span class="comment">//WARNING: This method updates the memory resident cache of serial numbers</span> <a name="l00223"></a>00223 <span class="comment">//WARNING: held in MessageProperty, but it does not update the persistent</span> <a name="l00224"></a>00224 <span class="comment">//WARNING: store of serial numbers on the file system that is managed by</span> <a name="l00225"></a>00225 <span class="comment">//WARNING: KMMsgDict</span> <a name="l00226"></a><a class="code" href="classKMMessage.html#a4eacb849513e37fc225b7dafe3be263">00226</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#a4eacb849513e37fc225b7dafe3be263" title="Sets the message serial number.">KMMessage::setMsgSerNum</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> newMsgSerNum) <a name="l00227"></a>00227 { <a name="l00228"></a>00228 MessageProperty::setSerialCache( <span class="keyword">this</span>, newMsgSerNum ); <a name="l00229"></a>00229 } <a name="l00230"></a>00230 <a name="l00231"></a>00231 <a name="l00232"></a>00232 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00233"></a><a class="code" href="classKMMessage.html#a5ab144ecb19891e6ff87b4e535df3bc">00233</a> <span class="keywordtype">bool</span> <a class="code" href="classKMMessage.html#a5ab144ecb19891e6ff87b4e535df3bc" title="Returns TRUE if object is a real message (not KMMsgInfo or KMMsgBase).">KMMessage::isMessage</a>()<span class="keyword"> const</span> <a name="l00234"></a>00234 <span class="keyword"></span>{ <a name="l00235"></a>00235 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l00236"></a>00236 } <a name="l00237"></a>00237 <a name="l00238"></a>00238 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00239"></a><a class="code" href="classKMMessage.html#e1adf17b8b22a8343ed60da3c12ecdb7">00239</a> <span class="keywordtype">bool</span> <a class="code" href="classKMMessage.html#e1adf17b8b22a8343ed60da3c12ecdb7" title="Return, if the message should not be deleted.">KMMessage::transferInProgress</a>()<span class="keyword"> const</span> <a name="l00240"></a>00240 <span class="keyword"></span>{ <a name="l00241"></a>00241 <span class="keywordflow">return</span> MessageProperty::transferInProgress( getMsgSerNum() ); <a name="l00242"></a>00242 } <a name="l00243"></a>00243 <a name="l00244"></a>00244 <a name="l00245"></a>00245 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00246"></a><a class="code" href="classKMMessage.html#32cc9d6f53648fd997efcc4f9d043197">00246</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#32cc9d6f53648fd997efcc4f9d043197" title="Set that the message shall not be deleted because it is still required.">KMMessage::setTransferInProgress</a>(<span class="keywordtype">bool</span> value, <span class="keywordtype">bool</span> force) <a name="l00247"></a>00247 { <a name="l00248"></a>00248 MessageProperty::setTransferInProgress( getMsgSerNum(), value, force ); <a name="l00249"></a>00249 <span class="keywordflow">if</span> ( !<a class="code" href="classKMMessage.html#e1adf17b8b22a8343ed60da3c12ecdb7" title="Return, if the message should not be deleted.">transferInProgress</a>() && sPendingDeletes.contains( <span class="keyword">this</span> ) ) { <a name="l00250"></a>00250 sPendingDeletes.remove( <span class="keyword">this</span> ); <a name="l00251"></a>00251 <span class="keywordflow">if</span> ( parent() ) { <a name="l00252"></a>00252 <span class="keywordtype">int</span> idx = parent()->find( <span class="keyword">this</span> ); <a name="l00253"></a>00253 <span class="keywordflow">if</span> ( idx > 0 ) { <a name="l00254"></a>00254 parent()->removeMsg( idx ); <a name="l00255"></a>00255 } <a name="l00256"></a>00256 } <a name="l00257"></a>00257 } <a name="l00258"></a>00258 } <a name="l00259"></a>00259 <a name="l00260"></a>00260 <a name="l00261"></a>00261 <a name="l00262"></a><a class="code" href="classKMMessage.html#12288e36e978ed165c7f281bd342d805">00262</a> <span class="keywordtype">bool</span> <a class="code" href="classKMMessage.html#12288e36e978ed165c7f281bd342d805">KMMessage::isUrgent</a>()<span class="keyword"> const </span>{ <a name="l00263"></a>00263 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Priority"</span> ).contains( <span class="stringliteral">"urgent"</span>, <span class="keyword">false</span> ) <a name="l00264"></a>00264 || <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-Priority"</span> ).startsWith( <span class="stringliteral">"2"</span> ); <a name="l00265"></a>00265 } <a name="l00266"></a>00266 <a name="l00267"></a>00267 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00268"></a><a class="code" href="classKMMessage.html#50d3a0b18e68f1b4e8d4634debf862e9">00268</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#50d3a0b18e68f1b4e8d4634debf862e9" title="Specifies an unencrypted copy of this message to be stored in a separate member variable...">KMMessage::setUnencryptedMsg</a>( <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* unencrypted ) <a name="l00269"></a>00269 { <a name="l00270"></a>00270 <span class="keyword">delete</span> mUnencryptedMsg; <a name="l00271"></a>00271 mUnencryptedMsg = unencrypted; <a name="l00272"></a>00272 } <a name="l00273"></a>00273 <a name="l00274"></a>00274 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00275"></a>00275 <span class="comment">//FIXME: move to libemailfunctions</span> <a name="l00276"></a><a class="code" href="classKMMessage.html#cd6773fa82df3495c2b8bbf80bbcb4be">00276</a> KPIM::EmailParseResult <a class="code" href="classKMMessage.html#cd6773fa82df3495c2b8bbf80bbcb4be" title="Validate a list of email addresses, and also allow aliases and distribution lists...">KMMessage::isValidEmailAddressList</a>( <span class="keyword">const</span> QString& aStr, <a name="l00277"></a>00277 QString& brokenAddress ) <a name="l00278"></a>00278 { <a name="l00279"></a>00279 <span class="keywordflow">if</span> ( aStr.isEmpty() ) { <a name="l00280"></a>00280 <span class="keywordflow">return</span> KPIM::AddressEmpty; <a name="l00281"></a>00281 } <a name="l00282"></a>00282 <a name="l00283"></a>00283 QStringList list = KPIM::splitEmailAddrList( aStr ); <a name="l00284"></a>00284 <span class="keywordflow">for</span>( QStringList::const_iterator it = list.begin(); it != list.end(); ++it ) { <a name="l00285"></a>00285 KPIM::EmailParseResult errorCode = KPIM::isValidEmailAddress( *it ); <a name="l00286"></a>00286 <span class="keywordflow">if</span> ( errorCode != KPIM::AddressOk ) { <a name="l00287"></a>00287 brokenAddress = ( *it ); <a name="l00288"></a>00288 <span class="keywordflow">return</span> errorCode; <a name="l00289"></a>00289 } <a name="l00290"></a>00290 } <a name="l00291"></a>00291 <span class="keywordflow">return</span> KPIM::AddressOk; <a name="l00292"></a>00292 } <a name="l00293"></a>00293 <a name="l00294"></a>00294 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00295"></a><a class="code" href="classKMMessage.html#49c5b4223492f2d81dcc97bb9462f728">00295</a> <span class="keyword">const</span> DwString& <a class="code" href="classKMMessage.html#49c5b4223492f2d81dcc97bb9462f728" title="Return the entire message contents in the DwString.">KMMessage::asDwString</a>()<span class="keyword"> const</span> <a name="l00296"></a>00296 <span class="keyword"></span>{ <a name="l00297"></a>00297 <span class="keywordflow">if</span> (mNeedsAssembly) <a name="l00298"></a>00298 { <a name="l00299"></a>00299 mNeedsAssembly = <span class="keyword">false</span>; <a name="l00300"></a>00300 mMsg->Assemble(); <a name="l00301"></a>00301 } <a name="l00302"></a>00302 <span class="keywordflow">return</span> mMsg->AsString(); <a name="l00303"></a>00303 } <a name="l00304"></a>00304 <a name="l00305"></a>00305 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00306"></a>00306 <span class="keyword">const</span> DwMessage* KMMessage::asDwMessage() <a name="l00307"></a>00307 { <a name="l00308"></a>00308 <span class="keywordflow">if</span> (mNeedsAssembly) <a name="l00309"></a>00309 { <a name="l00310"></a>00310 mNeedsAssembly = <span class="keyword">false</span>; <a name="l00311"></a>00311 mMsg->Assemble(); <a name="l00312"></a>00312 } <a name="l00313"></a>00313 <span class="keywordflow">return</span> mMsg; <a name="l00314"></a>00314 } <a name="l00315"></a>00315 <a name="l00316"></a>00316 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00317"></a><a class="code" href="classKMMessage.html#b9b4e74c3446bce61e34201fd1e793d8">00317</a> QCString <a class="code" href="classKMMessage.html#b9b4e74c3446bce61e34201fd1e793d8" title="Return the entire message contents as a string.">KMMessage::asString</a>()<span class="keyword"> const </span>{ <a name="l00318"></a>00318 <span class="keywordflow">return</span> <a class="code" href="namespaceKMail_1_1Util.html#7dbcbfd02aa6cf732ac83c2b6d5b6f8b" title="Construct a QCString from a DwString.">KMail::Util::CString</a>( <a class="code" href="classKMMessage.html#49c5b4223492f2d81dcc97bb9462f728" title="Return the entire message contents in the DwString.">asDwString</a>() ); <a name="l00319"></a>00319 } <a name="l00320"></a>00320 <a name="l00321"></a>00321 <a name="l00322"></a><a class="code" href="classKMMessage.html#22bfa4746658b7b032029c381c746b07">00322</a> QByteArray <a class="code" href="classKMMessage.html#22bfa4746658b7b032029c381c746b07" title="Return the message contents with the headers that should not be sent stripped off...">KMMessage::asSendableString</a>()<span class="keyword"> const</span> <a name="l00323"></a>00323 <span class="keyword"></span>{ <a name="l00324"></a>00324 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> msg( <span class="keyword">new</span> DwMessage( *this->mMsg ) ); <a name="l00325"></a>00325 msg.<a class="code" href="classKMMessage.html#9e40cfc4b8ab3360e2a0ef71fd77b932" title="Remove all private header fields: *Status: and X-KMail-*.">removePrivateHeaderFields</a>(); <a name="l00326"></a>00326 msg.<a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Bcc"</span>); <a name="l00327"></a>00327 <span class="keywordflow">return</span> <a class="code" href="namespaceKMail_1_1Util.html#62cdb963731a7eeaeca528f2e2651844" title="Construct a QByteArray from a DwString.">KMail::Util::ByteArray</a>( msg.<a class="code" href="classKMMessage.html#49c5b4223492f2d81dcc97bb9462f728" title="Return the entire message contents in the DwString.">asDwString</a>() ); <span class="comment">// and another copy again!</span> <a name="l00328"></a>00328 } <a name="l00329"></a>00329 <a name="l00330"></a><a class="code" href="classKMMessage.html#90d9a07ca47902ce8bb7674286d9aa26">00330</a> QCString <a class="code" href="classKMMessage.html#90d9a07ca47902ce8bb7674286d9aa26" title="Return the message header with the headers that should not be sent stripped off.">KMMessage::headerAsSendableString</a>()<span class="keyword"> const</span> <a name="l00331"></a>00331 <span class="keyword"></span>{ <a name="l00332"></a>00332 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> msg( <span class="keyword">new</span> DwMessage( *this->mMsg ) ); <a name="l00333"></a>00333 msg.<a class="code" href="classKMMessage.html#9e40cfc4b8ab3360e2a0ef71fd77b932" title="Remove all private header fields: *Status: and X-KMail-*.">removePrivateHeaderFields</a>(); <a name="l00334"></a>00334 msg.<a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Bcc"</span>); <a name="l00335"></a>00335 <span class="keywordflow">return</span> msg.<a class="code" href="classKMMessage.html#81a56c11d9920301421152b9e0afc45d" title="Return header as string.">headerAsString</a>().latin1(); <a name="l00336"></a>00336 } <a name="l00337"></a>00337 <a name="l00338"></a><a class="code" href="classKMMessage.html#9e40cfc4b8ab3360e2a0ef71fd77b932">00338</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#9e40cfc4b8ab3360e2a0ef71fd77b932" title="Remove all private header fields: *Status: and X-KMail-*.">KMMessage::removePrivateHeaderFields</a>() { <a name="l00339"></a>00339 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Status"</span>); <a name="l00340"></a>00340 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-Status"</span>); <a name="l00341"></a>00341 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-EncryptionState"</span>); <a name="l00342"></a>00342 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-SignatureState"</span>); <a name="l00343"></a>00343 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-MDN-Sent"</span>); <a name="l00344"></a>00344 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Transport"</span>); <a name="l00345"></a>00345 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Identity"</span>); <a name="l00346"></a>00346 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Fcc"</span>); <a name="l00347"></a>00347 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Redirect-From"</span>); <a name="l00348"></a>00348 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Link-Message"</span>); <a name="l00349"></a>00349 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Link-Type"</span>); <a name="l00350"></a>00350 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>( <span class="stringliteral">"X-KMail-Markup"</span> ); <a name="l00351"></a>00351 } <a name="l00352"></a>00352 <a name="l00353"></a>00353 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00354"></a><a class="code" href="classKMMessage.html#636d7b4660f0a85c74423104fa4645ac">00354</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#636d7b4660f0a85c74423104fa4645ac" title="Set &quot;Status&quot; and &quot;X-Status&quot; fields of the message from the internal...">KMMessage::setStatusFields</a>() <a name="l00355"></a>00355 { <a name="l00356"></a>00356 <span class="keywordtype">char</span> str[2] = { 0, 0 }; <a name="l00357"></a>00357 <a name="l00358"></a>00358 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"Status"</span>, <a class="code" href="classKMMessage.html#c54ef69572e620a3dcc0301aefca913e" title="Status of the message.">status</a>() & KMMsgStatusNew ? <span class="stringliteral">"R"</span> : <span class="stringliteral">"RO"</span>); <a name="l00359"></a>00359 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-Status"</span>, statusToStr(<a class="code" href="classKMMessage.html#c54ef69572e620a3dcc0301aefca913e" title="Status of the message.">status</a>())); <a name="l00360"></a>00360 <a name="l00361"></a>00361 str[0] = (char)<a class="code" href="classKMMessage.html#5d5ac51a43a80ddbe67f5fbad87520f7" title="Encryption status of the message.">encryptionState</a>(); <a name="l00362"></a>00362 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-EncryptionState"</span>, str); <a name="l00363"></a>00363 <a name="l00364"></a>00364 str[0] = (char)<a class="code" href="classKMMessage.html#3335c731775366975294d7f7e18bbb2c" title="Signature status of the message.">signatureState</a>(); <a name="l00365"></a>00365 <span class="comment">//kdDebug(5006) << "Setting SignatureState header field to " << str[0] << endl;</span> <a name="l00366"></a>00366 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-SignatureState"</span>, str); <a name="l00367"></a>00367 <a name="l00368"></a>00368 str[0] = <span class="keyword">static_cast<</span><span class="keywordtype">char</span><span class="keyword">></span>( mdnSentState() ); <a name="l00369"></a>00369 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-MDN-Sent"</span>, str); <a name="l00370"></a>00370 <a name="l00371"></a>00371 <span class="comment">// We better do the assembling ourselves now to prevent the</span> <a name="l00372"></a>00372 <span class="comment">// mimelib from changing the message *body*. (khz, 10.8.2002)</span> <a name="l00373"></a>00373 mNeedsAssembly = <span class="keyword">false</span>; <a name="l00374"></a>00374 mMsg->Headers().Assemble(); <a name="l00375"></a>00375 mMsg->Assemble( mMsg->Headers(), <a name="l00376"></a>00376 mMsg->Body() ); <a name="l00377"></a>00377 } <a name="l00378"></a>00378 <a name="l00379"></a>00379 <a name="l00380"></a>00380 <span class="comment">//----------------------------------------------------------------------------</span> <a name="l00381"></a><a class="code" href="classKMMessage.html#81a56c11d9920301421152b9e0afc45d">00381</a> QString <a class="code" href="classKMMessage.html#81a56c11d9920301421152b9e0afc45d" title="Return header as string.">KMMessage::headerAsString</a>()<span class="keyword"> const</span> <a name="l00382"></a>00382 <span class="keyword"></span>{ <a name="l00383"></a>00383 DwHeaders& header = mMsg->Headers(); <a name="l00384"></a>00384 header.Assemble(); <a name="l00385"></a>00385 <span class="keywordflow">if</span> ( header.AsString().empty() ) <a name="l00386"></a>00386 <span class="keywordflow">return</span> QString::null; <a name="l00387"></a>00387 <span class="keywordflow">return</span> QString::fromLatin1( header.AsString().c_str() ); <a name="l00388"></a>00388 } <a name="l00389"></a>00389 <a name="l00390"></a>00390 <a name="l00391"></a>00391 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00392"></a><a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c">00392</a> DwMediaType& <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">KMMessage::dwContentType</a>() <a name="l00393"></a>00393 { <a name="l00394"></a>00394 <span class="keywordflow">return</span> mMsg->Headers().ContentType(); <a name="l00395"></a>00395 } <a name="l00396"></a>00396 <a name="l00397"></a>00397 <span class="keywordtype">void</span> KMMessage::fromByteArray( <span class="keyword">const</span> QByteArray & ba, <span class="keywordtype">bool</span> <a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d" title="Set status and mark dirty.">setStatus</a> ) { <a name="l00398"></a>00398 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#765ec32909b2bfde6a205c1b76431381" title="Parse the string and create this message from it.">fromDwString</a>( DwString( ba.data(), ba.size() ), setStatus ); <a name="l00399"></a>00399 } <a name="l00400"></a>00400 <a name="l00401"></a>00401 <span class="keywordtype">void</span> KMMessage::fromString( <span class="keyword">const</span> QCString & str, <span class="keywordtype">bool</span> aSetStatus ) { <a name="l00402"></a>00402 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#765ec32909b2bfde6a205c1b76431381" title="Parse the string and create this message from it.">fromDwString</a>( <a class="code" href="namespaceKMail_1_1Util.html#cce0cde4fda85ac6422fd7c96f793896" title="Construct a DwString from a QCString.">KMail::Util::dwString</a>( str ), aSetStatus ); <a name="l00403"></a>00403 } <a name="l00404"></a>00404 <a name="l00405"></a><a class="code" href="classKMMessage.html#765ec32909b2bfde6a205c1b76431381">00405</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#765ec32909b2bfde6a205c1b76431381" title="Parse the string and create this message from it.">KMMessage::fromDwString</a>(<span class="keyword">const</span> DwString& str, <span class="keywordtype">bool</span> aSetStatus) <a name="l00406"></a>00406 { <a name="l00407"></a>00407 <span class="keyword">delete</span> mMsg; <a name="l00408"></a>00408 mMsg = <span class="keyword">new</span> DwMessage; <a name="l00409"></a>00409 mMsg->FromString( str ); <a name="l00410"></a>00410 mMsg->Parse(); <a name="l00411"></a>00411 <a name="l00412"></a>00412 <span class="keywordflow">if</span> (aSetStatus) { <a name="l00413"></a>00413 <a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d" title="Set status and mark dirty.">setStatus</a>(<a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Status"</span>).latin1(), <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-Status"</span>).latin1()); <a name="l00414"></a>00414 setEncryptionStateChar( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-EncryptionState"</span>).at(0) ); <a name="l00415"></a>00415 setSignatureStateChar( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-SignatureState"</span>).at(0) ); <a name="l00416"></a>00416 setMDNSentState( static_cast<KMMsgMDNSentState>( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-MDN-Sent"</span>).at(0).latin1() ) ); <a name="l00417"></a>00417 } <a name="l00418"></a>00418 <span class="keywordflow">if</span> (attachmentState() == KMMsgAttachmentUnknown && <a class="code" href="classKMMessage.html#d32312c0e44c459d84e0469b8f10d631" title="Return if the message is ready to be shown.">readyToShow</a>()) <a name="l00419"></a>00419 updateAttachmentState(); <a name="l00420"></a>00420 <a name="l00421"></a>00421 mNeedsAssembly = <span class="keyword">false</span>; <a name="l00422"></a>00422 mDate = date(); <a name="l00423"></a>00423 } <a name="l00424"></a>00424 <a name="l00425"></a>00425 <a name="l00426"></a>00426 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00427"></a><a class="code" href="classKMMessage.html#24747aa80d1e0694b47045faef4fc383">00427</a> QString <a class="code" href="classKMMessage.html#24747aa80d1e0694b47045faef4fc383" title="Convert wildcards into normal string.">KMMessage::formatString</a>(<span class="keyword">const</span> QString& aStr)<span class="keyword"> const</span> <a name="l00428"></a>00428 <span class="keyword"></span>{ <a name="l00429"></a>00429 QString result, str; <a name="l00430"></a>00430 QChar ch; <a name="l00431"></a>00431 uint j; <a name="l00432"></a>00432 <a name="l00433"></a>00433 <span class="keywordflow">if</span> (aStr.isEmpty()) <a name="l00434"></a>00434 <span class="keywordflow">return</span> aStr; <a name="l00435"></a>00435 <a name="l00436"></a>00436 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLength(aStr.length()); <a name="l00437"></a>00437 <span class="keywordflow">for</span> (uint i=0; i<strLength;) { <a name="l00438"></a>00438 ch = aStr[i++]; <a name="l00439"></a>00439 <span class="keywordflow">if</span> (ch == <span class="charliteral">'%'</span>) { <a name="l00440"></a>00440 ch = aStr[i++]; <a name="l00441"></a>00441 <span class="keywordflow">switch</span> ((<span class="keywordtype">char</span>)ch) { <a name="l00442"></a>00442 <span class="keywordflow">case</span> <span class="charliteral">'D'</span>: <a name="l00443"></a>00443 <span class="comment">/* I'm not too sure about this change. Is it not possible</span> <a name="l00444"></a>00444 <span class="comment"> to have a long form of the date used? I don't</span> <a name="l00445"></a>00445 <span class="comment"> like this change to a short XX/XX/YY date format.</span> <a name="l00446"></a>00446 <span class="comment"> At least not for the default. -sanders */</span> <a name="l00447"></a>00447 result += KMime::DateFormatter::formatDate( KMime::DateFormatter::Localized, <a name="l00448"></a>00448 date(), sReplyLanguage, <span class="keyword">false</span> ); <a name="l00449"></a>00449 <span class="keywordflow">break</span>; <a name="l00450"></a>00450 <span class="keywordflow">case</span> <span class="charliteral">'e'</span>: <a name="l00451"></a>00451 result += <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l00452"></a>00452 <span class="keywordflow">break</span>; <a name="l00453"></a>00453 <span class="keywordflow">case</span> <span class="charliteral">'F'</span>: <a name="l00454"></a>00454 result += fromStrip(); <a name="l00455"></a>00455 <span class="keywordflow">break</span>; <a name="l00456"></a>00456 <span class="keywordflow">case</span> <span class="charliteral">'f'</span>: <a name="l00457"></a>00457 { <a name="l00458"></a>00458 str = fromStrip(); <a name="l00459"></a>00459 <a name="l00460"></a>00460 <span class="keywordflow">for</span> (j=0; str[j]><span class="charliteral">' '</span>; j++) <a name="l00461"></a>00461 ; <a name="l00462"></a>00462 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLength(str.length()); <a name="l00463"></a>00463 <span class="keywordflow">for</span> (; j < strLength && str[j] <= <span class="charliteral">' '</span>; j++) <a name="l00464"></a>00464 ; <a name="l00465"></a>00465 result += str[0]; <a name="l00466"></a>00466 <span class="keywordflow">if</span> (str[j]><span class="charliteral">' '</span>) <a name="l00467"></a>00467 result += str[j]; <a name="l00468"></a>00468 <span class="keywordflow">else</span> <a name="l00469"></a>00469 <span class="keywordflow">if</span> (str[1]><span class="charliteral">' '</span>) <a name="l00470"></a>00470 result += str[1]; <a name="l00471"></a>00471 } <a name="l00472"></a>00472 <span class="keywordflow">break</span>; <a name="l00473"></a>00473 <span class="keywordflow">case</span> <span class="charliteral">'T'</span>: <a name="l00474"></a>00474 result += toStrip(); <a name="l00475"></a>00475 <span class="keywordflow">break</span>; <a name="l00476"></a>00476 <span class="keywordflow">case</span> <span class="charliteral">'t'</span>: <a name="l00477"></a>00477 result += <a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>(); <a name="l00478"></a>00478 <span class="keywordflow">break</span>; <a name="l00479"></a>00479 <span class="keywordflow">case</span> <span class="charliteral">'C'</span>: <a name="l00480"></a>00480 result += ccStrip(); <a name="l00481"></a>00481 <span class="keywordflow">break</span>; <a name="l00482"></a>00482 <span class="keywordflow">case</span> <span class="charliteral">'c'</span>: <a name="l00483"></a>00483 result += <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>(); <a name="l00484"></a>00484 <span class="keywordflow">break</span>; <a name="l00485"></a>00485 <span class="keywordflow">case</span> <span class="charliteral">'S'</span>: <a name="l00486"></a>00486 result += <a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda" title="Get or set the &#39;Subject&#39; header field.">subject</a>(); <a name="l00487"></a>00487 <span class="keywordflow">break</span>; <a name="l00488"></a>00488 <span class="keywordflow">case</span> <span class="charliteral">'_'</span>: <a name="l00489"></a>00489 result += <span class="charliteral">' '</span>; <a name="l00490"></a>00490 <span class="keywordflow">break</span>; <a name="l00491"></a>00491 <span class="keywordflow">case</span> <span class="charliteral">'L'</span>: <a name="l00492"></a>00492 result += <span class="stringliteral">"\n"</span>; <a name="l00493"></a>00493 <span class="keywordflow">break</span>; <a name="l00494"></a>00494 <span class="keywordflow">case</span> <span class="charliteral">'%'</span>: <a name="l00495"></a>00495 result += <span class="charliteral">'%'</span>; <a name="l00496"></a>00496 <span class="keywordflow">break</span>; <a name="l00497"></a>00497 <span class="keywordflow">default</span>: <a name="l00498"></a>00498 result += <span class="charliteral">'%'</span>; <a name="l00499"></a>00499 result += ch; <a name="l00500"></a>00500 <span class="keywordflow">break</span>; <a name="l00501"></a>00501 } <a name="l00502"></a>00502 } <span class="keywordflow">else</span> <a name="l00503"></a>00503 result += ch; <a name="l00504"></a>00504 } <a name="l00505"></a>00505 <span class="keywordflow">return</span> result; <a name="l00506"></a>00506 } <a name="l00507"></a>00507 <a name="l00508"></a>00508 <span class="keyword">static</span> <span class="keywordtype">void</span> removeTrailingSpace( QString &line ) <a name="l00509"></a>00509 { <a name="l00510"></a>00510 <span class="keywordtype">int</span> i = line.length()-1; <a name="l00511"></a>00511 <span class="keywordflow">while</span>( (i >= 0) && ((line[i] == <span class="charliteral">' '</span>) || (line[i] == <span class="charliteral">'\t'</span>))) <a name="l00512"></a>00512 i--; <a name="l00513"></a>00513 line.truncate( i+1); <a name="l00514"></a>00514 } <a name="l00515"></a>00515 <a name="l00516"></a>00516 <span class="keyword">static</span> QString splitLine( QString &line) <a name="l00517"></a>00517 { <a name="l00518"></a>00518 removeTrailingSpace( line ); <a name="l00519"></a>00519 <span class="keywordtype">int</span> i = 0; <a name="l00520"></a>00520 <span class="keywordtype">int</span> j = -1; <a name="l00521"></a>00521 <span class="keywordtype">int</span> l = line.length(); <a name="l00522"></a>00522 <a name="l00523"></a>00523 <span class="comment">// TODO: Replace tabs with spaces first.</span> <a name="l00524"></a>00524 <a name="l00525"></a>00525 <span class="keywordflow">while</span>(i < l) <a name="l00526"></a>00526 { <a name="l00527"></a>00527 QChar c = line[i]; <a name="l00528"></a>00528 <span class="keywordflow">if</span> ((c == <span class="charliteral">'>'</span>) || (c == <span class="charliteral">':'</span>) || (c == <span class="charliteral">'|'</span>)) <a name="l00529"></a>00529 j = i+1; <a name="l00530"></a>00530 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ((c != <span class="charliteral">' '</span>) && (c != <span class="charliteral">'\t'</span>)) <a name="l00531"></a>00531 <span class="keywordflow">break</span>; <a name="l00532"></a>00532 i++; <a name="l00533"></a>00533 } <a name="l00534"></a>00534 <a name="l00535"></a>00535 <span class="keywordflow">if</span> ( j <= 0 ) <a name="l00536"></a>00536 { <a name="l00537"></a>00537 <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l00538"></a>00538 } <a name="l00539"></a>00539 <span class="keywordflow">if</span> ( i == l ) <a name="l00540"></a>00540 { <a name="l00541"></a>00541 QString result = line.left(j); <a name="l00542"></a>00542 line = QString::null; <a name="l00543"></a>00543 <span class="keywordflow">return</span> result; <a name="l00544"></a>00544 } <a name="l00545"></a>00545 <a name="l00546"></a>00546 QString result = line.left(j); <a name="l00547"></a>00547 line = line.mid(j); <a name="l00548"></a>00548 <span class="keywordflow">return</span> result; <a name="l00549"></a>00549 } <a name="l00550"></a>00550 <a name="l00551"></a>00551 <span class="keyword">static</span> QString flowText(QString &text, <span class="keyword">const</span> QString& indent, <span class="keywordtype">int</span> maxLength) <a name="l00552"></a>00552 { <a name="l00553"></a>00553 maxLength--; <a name="l00554"></a>00554 <span class="keywordflow">if</span> (text.isEmpty()) <a name="l00555"></a>00555 { <a name="l00556"></a>00556 <span class="keywordflow">return</span> indent+<span class="stringliteral">"<NULL>\n"</span>; <a name="l00557"></a>00557 } <a name="l00558"></a>00558 QString result; <a name="l00559"></a>00559 <span class="keywordflow">while</span> (1) <a name="l00560"></a>00560 { <a name="l00561"></a>00561 <span class="keywordtype">int</span> i; <a name="l00562"></a>00562 <span class="keywordflow">if</span> ((<span class="keywordtype">int</span>) text.length() > maxLength) <a name="l00563"></a>00563 { <a name="l00564"></a>00564 i = maxLength; <a name="l00565"></a>00565 <span class="keywordflow">while</span>( (i >= 0) && (text[i] != <span class="charliteral">' '</span>)) <a name="l00566"></a>00566 i--; <a name="l00567"></a>00567 <span class="keywordflow">if</span> (i <= 0) <a name="l00568"></a>00568 { <a name="l00569"></a>00569 <span class="comment">// Couldn't break before maxLength.</span> <a name="l00570"></a>00570 i = maxLength; <a name="l00571"></a>00571 <span class="comment">// while( (i < (int) text.length()) && (text[i] != ' '))</span> <a name="l00572"></a>00572 <span class="comment">// i++;</span> <a name="l00573"></a>00573 } <a name="l00574"></a>00574 } <a name="l00575"></a>00575 <span class="keywordflow">else</span> <a name="l00576"></a>00576 { <a name="l00577"></a>00577 i = text.length(); <a name="l00578"></a>00578 } <a name="l00579"></a>00579 <a name="l00580"></a>00580 QString line = text.left(i); <a name="l00581"></a>00581 <span class="keywordflow">if</span> (i < (<span class="keywordtype">int</span>) text.length()) <a name="l00582"></a>00582 text = text.mid(i); <a name="l00583"></a>00583 <span class="keywordflow">else</span> <a name="l00584"></a>00584 text = QString::null; <a name="l00585"></a>00585 <a name="l00586"></a>00586 result += indent + line + <span class="charliteral">'\n'</span>; <a name="l00587"></a>00587 <a name="l00588"></a>00588 <span class="keywordflow">if</span> (text.isEmpty()) <a name="l00589"></a>00589 <span class="keywordflow">return</span> result; <a name="l00590"></a>00590 } <a name="l00591"></a>00591 } <a name="l00592"></a>00592 <a name="l00593"></a>00593 <span class="keyword">static</span> <span class="keywordtype">bool</span> flushPart(QString &msg, QStringList &part, <a name="l00594"></a>00594 <span class="keyword">const</span> QString &indent, <span class="keywordtype">int</span> maxLength) <a name="l00595"></a>00595 { <a name="l00596"></a>00596 maxLength -= indent.length(); <a name="l00597"></a>00597 <span class="keywordflow">if</span> (maxLength < 20) maxLength = 20; <a name="l00598"></a>00598 <a name="l00599"></a>00599 <span class="comment">// Remove empty lines at end of quote</span> <a name="l00600"></a>00600 <span class="keywordflow">while</span> ((part.begin() != part.end()) && part.last().isEmpty()) <a name="l00601"></a>00601 { <a name="l00602"></a>00602 part.remove(part.fromLast()); <a name="l00603"></a>00603 } <a name="l00604"></a>00604 <a name="l00605"></a>00605 QString text; <a name="l00606"></a>00606 <span class="keywordflow">for</span>(QStringList::Iterator it2 = part.begin(); <a name="l00607"></a>00607 it2 != part.end(); <a name="l00608"></a>00608 it2++) <a name="l00609"></a>00609 { <a name="l00610"></a>00610 QString line = (*it2); <a name="l00611"></a>00611 <a name="l00612"></a>00612 <span class="keywordflow">if</span> (line.isEmpty()) <a name="l00613"></a>00613 { <a name="l00614"></a>00614 <span class="keywordflow">if</span> (!text.isEmpty()) <a name="l00615"></a>00615 msg += flowText(text, indent, maxLength); <a name="l00616"></a>00616 msg += indent + <span class="charliteral">'\n'</span>; <a name="l00617"></a>00617 } <a name="l00618"></a>00618 <span class="keywordflow">else</span> <a name="l00619"></a>00619 { <a name="l00620"></a>00620 <span class="keywordflow">if</span> (text.isEmpty()) <a name="l00621"></a>00621 text = line; <a name="l00622"></a>00622 <span class="keywordflow">else</span> <a name="l00623"></a>00623 text += <span class="charliteral">' '</span>+line.stripWhiteSpace(); <a name="l00624"></a>00624 <a name="l00625"></a>00625 <span class="keywordflow">if</span> (((<span class="keywordtype">int</span>) text.length() < maxLength) || ((<span class="keywordtype">int</span>) line.length() < (maxLength-10))) <a name="l00626"></a>00626 msg += flowText(text, indent, maxLength); <a name="l00627"></a>00627 } <a name="l00628"></a>00628 } <a name="l00629"></a>00629 <span class="keywordflow">if</span> (!text.isEmpty()) <a name="l00630"></a>00630 msg += flowText(text, indent, maxLength); <a name="l00631"></a>00631 <a name="l00632"></a>00632 <span class="keywordtype">bool</span> appendEmptyLine = <span class="keyword">true</span>; <a name="l00633"></a>00633 <span class="keywordflow">if</span> (!part.count()) <a name="l00634"></a>00634 appendEmptyLine = <span class="keyword">false</span>; <a name="l00635"></a>00635 <a name="l00636"></a>00636 part.clear(); <a name="l00637"></a>00637 <span class="keywordflow">return</span> appendEmptyLine; <a name="l00638"></a>00638 } <a name="l00639"></a>00639 <a name="l00640"></a>00640 <span class="keyword">static</span> QString stripSignature( <span class="keyword">const</span> QString & msg, <span class="keywordtype">bool</span> clearSigned ) { <a name="l00641"></a>00641 <span class="keywordflow">if</span> ( clearSigned ) <a name="l00642"></a>00642 <span class="keywordflow">return</span> msg.left( msg.findRev( QRegExp( <span class="stringliteral">"\n--\\s?\n"</span> ) ) ); <a name="l00643"></a>00643 <span class="keywordflow">else</span> <a name="l00644"></a>00644 <span class="keywordflow">return</span> msg.left( msg.findRev( <span class="stringliteral">"\n-- \n"</span> ) ); <a name="l00645"></a>00645 } <a name="l00646"></a>00646 <a name="l00647"></a><a class="code" href="classKMMessage.html#d0933db089e196f333e4bfeb52b67ea3">00647</a> QString <a class="code" href="classKMMessage.html#d0933db089e196f333e4bfeb52b67ea3" title="Given argument msg add quoting characters and relayout for max width maxLength.">KMMessage::smartQuote</a>( <span class="keyword">const</span> QString & msg, <span class="keywordtype">int</span> maxLineLength ) <a name="l00648"></a>00648 { <a name="l00649"></a>00649 QStringList part; <a name="l00650"></a>00650 QString oldIndent; <a name="l00651"></a>00651 <span class="keywordtype">bool</span> firstPart = <span class="keyword">true</span>; <a name="l00652"></a>00652 <a name="l00653"></a>00653 <a name="l00654"></a>00654 <span class="keyword">const</span> QStringList lines = QStringList::split(<span class="charliteral">'\n'</span>, msg, <span class="keyword">true</span>); <a name="l00655"></a>00655 <a name="l00656"></a>00656 QString result; <a name="l00657"></a>00657 <span class="keywordflow">for</span>(QStringList::const_iterator it = lines.begin(); <a name="l00658"></a>00658 it != lines.end(); <a name="l00659"></a>00659 ++it) <a name="l00660"></a>00660 { <a name="l00661"></a>00661 QString line = *it; <a name="l00662"></a>00662 <a name="l00663"></a>00663 <span class="keyword">const</span> QString indent = splitLine( line ); <a name="l00664"></a>00664 <a name="l00665"></a>00665 <span class="keywordflow">if</span> ( line.isEmpty()) <a name="l00666"></a>00666 { <a name="l00667"></a>00667 <span class="keywordflow">if</span> (!firstPart) <a name="l00668"></a>00668 part.append(QString::null); <a name="l00669"></a>00669 <span class="keywordflow">continue</span>; <a name="l00670"></a>00670 }; <a name="l00671"></a>00671 <a name="l00672"></a>00672 <span class="keywordflow">if</span> (firstPart) <a name="l00673"></a>00673 { <a name="l00674"></a>00674 oldIndent = indent; <a name="l00675"></a>00675 firstPart = <span class="keyword">false</span>; <a name="l00676"></a>00676 } <a name="l00677"></a>00677 <a name="l00678"></a>00678 <span class="keywordflow">if</span> (oldIndent != indent) <a name="l00679"></a>00679 { <a name="l00680"></a>00680 QString fromLine; <a name="l00681"></a>00681 <span class="comment">// Search if the last non-blank line could be "From" line</span> <a name="l00682"></a>00682 <span class="keywordflow">if</span> (part.count() && (oldIndent.length() < indent.length())) <a name="l00683"></a>00683 { <a name="l00684"></a>00684 QStringList::Iterator it2 = part.fromLast(); <a name="l00685"></a>00685 <span class="keywordflow">while</span>( (it2 != part.end()) && (*it2).isEmpty()) <a name="l00686"></a>00686 --it2; <a name="l00687"></a>00687 <a name="l00688"></a>00688 <span class="keywordflow">if</span> ((it2 != part.end()) && ((*it2).endsWith(<span class="stringliteral">":"</span>))) <a name="l00689"></a>00689 { <a name="l00690"></a>00690 fromLine = oldIndent + (*it2) + <span class="charliteral">'\n'</span>; <a name="l00691"></a>00691 part.remove(it2); <a name="l00692"></a>00692 } <a name="l00693"></a>00693 } <a name="l00694"></a>00694 <span class="keywordflow">if</span> (flushPart( result, part, oldIndent, maxLineLength)) <a name="l00695"></a>00695 { <a name="l00696"></a>00696 <span class="keywordflow">if</span> (oldIndent.length() > indent.length()) <a name="l00697"></a>00697 result += indent + <span class="charliteral">'\n'</span>; <a name="l00698"></a>00698 <span class="keywordflow">else</span> <a name="l00699"></a>00699 result += oldIndent + <span class="charliteral">'\n'</span>; <a name="l00700"></a>00700 } <a name="l00701"></a>00701 <span class="keywordflow">if</span> (!fromLine.isEmpty()) <a name="l00702"></a>00702 { <a name="l00703"></a>00703 result += fromLine; <a name="l00704"></a>00704 } <a name="l00705"></a>00705 oldIndent = indent; <a name="l00706"></a>00706 } <a name="l00707"></a>00707 part.append(line); <a name="l00708"></a>00708 } <a name="l00709"></a>00709 flushPart( result, part, oldIndent, maxLineLength); <a name="l00710"></a>00710 <span class="keywordflow">return</span> result; <a name="l00711"></a>00711 } <a name="l00712"></a>00712 <a name="l00713"></a>00713 <a name="l00714"></a>00714 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00715"></a><a class="code" href="classKMMessage.html#ace7f8928e65b15f571b847817859b37">00715</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#ace7f8928e65b15f571b847817859b37" title="Returns a decoded body part string to be further processed by function asQuotedString()...">KMMessage::parseTextStringFromDwPart</a>( partNode * root, <a name="l00716"></a>00716 QCString& parsedString, <a name="l00717"></a>00717 <span class="keyword">const</span> QTextCodec*& <a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">codec</a>, <a name="l00718"></a>00718 <span class="keywordtype">bool</span>& isHTML )<span class="keyword"> const</span> <a name="l00719"></a>00719 <span class="keyword"></span>{ <a name="l00720"></a>00720 <span class="keywordflow">if</span> ( !root ) <span class="keywordflow">return</span>; <a name="l00721"></a>00721 <a name="l00722"></a>00722 isHTML = <span class="keyword">false</span>; <a name="l00723"></a>00723 <span class="comment">// initialy parse the complete message to decrypt any encrypted parts</span> <a name="l00724"></a>00724 { <a name="l00725"></a>00725 ObjectTreeParser otp( 0, 0, <span class="keyword">true</span>, <span class="keyword">false</span>, <span class="keyword">true</span> ); <a name="l00726"></a>00726 otp.parseObjectTree( root ); <a name="l00727"></a>00727 } <a name="l00728"></a>00728 partNode * curNode = root->findType( DwMime::kTypeText, <a name="l00729"></a>00729 DwMime::kSubtypeUnknown, <a name="l00730"></a>00730 <span class="keyword">true</span>, <a name="l00731"></a>00731 <span class="keyword">false</span> ); <a name="l00732"></a>00732 kdDebug(5006) << <span class="stringliteral">"\n\n======= KMMessage::parseTextStringFromDwPart() - "</span> <a name="l00733"></a>00733 << ( curNode ? <span class="stringliteral">"text part found!\n"</span> : <span class="stringliteral">"sorry, no text node!\n"</span> ) << endl; <a name="l00734"></a>00734 <span class="keywordflow">if</span>( curNode ) { <a name="l00735"></a>00735 isHTML = DwMime::kSubtypeHtml == curNode->subType(); <a name="l00736"></a>00736 <span class="comment">// now parse the TEXT message part we want to quote</span> <a name="l00737"></a>00737 ObjectTreeParser otp( 0, 0, <span class="keyword">true</span>, <span class="keyword">false</span>, <span class="keyword">true</span> ); <a name="l00738"></a>00738 otp.parseObjectTree( curNode ); <a name="l00739"></a>00739 parsedString = otp.rawReplyString(); <a name="l00740"></a>00740 codec = curNode->msgPart().codec(); <a name="l00741"></a>00741 } <a name="l00742"></a>00742 } <a name="l00743"></a>00743 <a name="l00744"></a>00744 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00745"></a>00745 <a name="l00746"></a><a class="code" href="classKMMessage.html#8fe0431152d4847465b9342b4cfb3a4f">00746</a> QString <a class="code" href="classKMMessage.html#8fe0431152d4847465b9342b4cfb3a4f" title="Return the textual content of the message as plain text, converting HTML to plain...">KMMessage::asPlainText</a>( <span class="keywordtype">bool</span> aStripSignature, <span class="keywordtype">bool</span> allowDecryption )<span class="keyword"> const </span>{ <a name="l00747"></a>00747 QCString parsedString; <a name="l00748"></a>00748 <span class="keywordtype">bool</span> isHTML = <span class="keyword">false</span>; <a name="l00749"></a>00749 <span class="keyword">const</span> QTextCodec * <a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">codec</a> = 0; <a name="l00750"></a>00750 <a name="l00751"></a>00751 partNode * root = partNode::fromMessage( <span class="keyword">this</span> ); <a name="l00752"></a>00752 <span class="keywordflow">if</span> ( !root ) <span class="keywordflow">return</span> QString::null; <a name="l00753"></a>00753 <a class="code" href="classKMMessage.html#ace7f8928e65b15f571b847817859b37" title="Returns a decoded body part string to be further processed by function asQuotedString()...">parseTextStringFromDwPart</a>( root, parsedString, codec, isHTML ); <a name="l00754"></a>00754 <span class="keyword">delete</span> root; <a name="l00755"></a>00755 <a name="l00756"></a>00756 <span class="keywordflow">if</span> ( mOverrideCodec || !codec ) <a name="l00757"></a>00757 codec = this-><a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">codec</a>(); <a name="l00758"></a>00758 <a name="l00759"></a>00759 <span class="keywordflow">if</span> ( parsedString.isEmpty() ) <a name="l00760"></a>00760 <span class="keywordflow">return</span> QString::null; <a name="l00761"></a>00761 <a name="l00762"></a>00762 <span class="keywordtype">bool</span> clearSigned = <span class="keyword">false</span>; <a name="l00763"></a>00763 QString result; <a name="l00764"></a>00764 <a name="l00765"></a>00765 <span class="comment">// decrypt</span> <a name="l00766"></a>00766 <span class="keywordflow">if</span> ( allowDecryption ) { <a name="l00767"></a>00767 QPtrList<Kpgp::Block> pgpBlocks; <a name="l00768"></a>00768 QStrList nonPgpBlocks; <a name="l00769"></a>00769 <span class="keywordflow">if</span> ( Kpgp::Module::prepareMessageForDecryption( parsedString, <a name="l00770"></a>00770 pgpBlocks, <a name="l00771"></a>00771 nonPgpBlocks ) ) { <a name="l00772"></a>00772 <span class="comment">// Only decrypt/strip off the signature if there is only one OpenPGP</span> <a name="l00773"></a>00773 <span class="comment">// block in the message</span> <a name="l00774"></a>00774 <span class="keywordflow">if</span> ( pgpBlocks.count() == 1 ) { <a name="l00775"></a>00775 Kpgp::Block * block = pgpBlocks.first(); <a name="l00776"></a>00776 <span class="keywordflow">if</span> ( block->type() == Kpgp::PgpMessageBlock || <a name="l00777"></a>00777 block->type() == Kpgp::ClearsignedBlock ) { <a name="l00778"></a>00778 <span class="keywordflow">if</span> ( block->type() == Kpgp::PgpMessageBlock ) { <a name="l00779"></a>00779 <span class="comment">// try to decrypt this OpenPGP block</span> <a name="l00780"></a>00780 block->decrypt(); <a name="l00781"></a>00781 } <span class="keywordflow">else</span> { <a name="l00782"></a>00782 <span class="comment">// strip off the signature</span> <a name="l00783"></a>00783 block->verify(); <a name="l00784"></a>00784 clearSigned = <span class="keyword">true</span>; <a name="l00785"></a>00785 } <a name="l00786"></a>00786 <a name="l00787"></a>00787 result = codec->toUnicode( nonPgpBlocks.first() ) <a name="l00788"></a>00788 + codec->toUnicode( block->text() ) <a name="l00789"></a>00789 + codec->toUnicode( nonPgpBlocks.last() ); <a name="l00790"></a>00790 } <a name="l00791"></a>00791 } <a name="l00792"></a>00792 } <a name="l00793"></a>00793 } <a name="l00794"></a>00794 <a name="l00795"></a>00795 <span class="keywordflow">if</span> ( result.isEmpty() ) { <a name="l00796"></a>00796 result = codec->toUnicode( parsedString ); <a name="l00797"></a>00797 <span class="keywordflow">if</span> ( result.isEmpty() ) <a name="l00798"></a>00798 <span class="keywordflow">return</span> result; <a name="l00799"></a>00799 } <a name="l00800"></a>00800 <a name="l00801"></a>00801 <span class="comment">// html -> plaintext conversion, if necessary:</span> <a name="l00802"></a>00802 <span class="keywordflow">if</span> ( isHTML && mDecodeHTML ) { <a name="l00803"></a>00803 KHTMLPart htmlPart; <a name="l00804"></a>00804 htmlPart.setOnlyLocalReferences( <span class="keyword">true</span> ); <a name="l00805"></a>00805 htmlPart.setMetaRefreshEnabled( <span class="keyword">false</span> ); <a name="l00806"></a>00806 htmlPart.setPluginsEnabled( <span class="keyword">false</span> ); <a name="l00807"></a>00807 htmlPart.setJScriptEnabled( <span class="keyword">false</span> ); <a name="l00808"></a>00808 htmlPart.setJavaEnabled( <span class="keyword">false</span> ); <a name="l00809"></a>00809 htmlPart.begin(); <a name="l00810"></a>00810 htmlPart.write( result ); <a name="l00811"></a>00811 htmlPart.end(); <a name="l00812"></a>00812 htmlPart.selectAll(); <a name="l00813"></a>00813 result = htmlPart.selectedText(); <a name="l00814"></a>00814 } <a name="l00815"></a>00815 <a name="l00816"></a>00816 <span class="comment">// strip the signature (footer):</span> <a name="l00817"></a>00817 <span class="keywordflow">if</span> ( aStripSignature ) <a name="l00818"></a>00818 <span class="keywordflow">return</span> stripSignature( result, clearSigned ); <a name="l00819"></a>00819 <span class="keywordflow">else</span> <a name="l00820"></a>00820 <span class="keywordflow">return</span> result; <a name="l00821"></a>00821 } <a name="l00822"></a>00822 <a name="l00823"></a><a class="code" href="classKMMessage.html#d7702f7d5f9a01b436581701ffcea154">00823</a> QString <a class="code" href="classKMMessage.html#d7702f7d5f9a01b436581701ffcea154" title="Returns message body with quoting header and indented by the given indentation string...">KMMessage::asQuotedString</a>( <span class="keyword">const</span> QString& aHeaderStr, <a name="l00824"></a>00824 <span class="keyword">const</span> QString& aIndentStr, <a name="l00825"></a>00825 <span class="keyword">const</span> QString& selection <span class="comment">/* = QString::null */</span>, <a name="l00826"></a>00826 <span class="keywordtype">bool</span> aStripSignature <span class="comment">/* = true */</span>, <a name="l00827"></a>00827 <span class="keywordtype">bool</span> allowDecryption <span class="comment">/* = true */</span>)<span class="keyword"> const</span> <a name="l00828"></a>00828 <span class="keyword"></span>{ <a name="l00829"></a>00829 QString content = selection.isEmpty() ? <a name="l00830"></a>00830 <a class="code" href="classKMMessage.html#8fe0431152d4847465b9342b4cfb3a4f" title="Return the textual content of the message as plain text, converting HTML to plain...">asPlainText</a>( aStripSignature, allowDecryption ) : selection ; <a name="l00831"></a>00831 <a name="l00832"></a>00832 <span class="comment">// Remove blank lines at the beginning:</span> <a name="l00833"></a>00833 <span class="keyword">const</span> <span class="keywordtype">int</span> firstNonWS = content.find( QRegExp( <span class="stringliteral">"\\S"</span> ) ); <a name="l00834"></a>00834 <span class="keyword">const</span> <span class="keywordtype">int</span> lineStart = content.findRev( <span class="charliteral">'\n'</span>, firstNonWS ); <a name="l00835"></a>00835 <span class="keywordflow">if</span> ( lineStart >= 0 ) <a name="l00836"></a>00836 content.remove( 0, static_cast<unsigned int>( lineStart ) ); <a name="l00837"></a>00837 <a name="l00838"></a>00838 <span class="keyword">const</span> QString indentStr = <a class="code" href="classKMMessage.html#24747aa80d1e0694b47045faef4fc383" title="Convert wildcards into normal string.">formatString</a>( aIndentStr ); <a name="l00839"></a>00839 <a name="l00840"></a>00840 content.replace( <span class="charliteral">'\n'</span>, <span class="charliteral">'\n'</span> + indentStr ); <a name="l00841"></a>00841 content.prepend( indentStr ); <a name="l00842"></a>00842 content += <span class="charliteral">'\n'</span>; <a name="l00843"></a>00843 <a name="l00844"></a>00844 <span class="keyword">const</span> QString headerStr = <a class="code" href="classKMMessage.html#24747aa80d1e0694b47045faef4fc383" title="Convert wildcards into normal string.">formatString</a>( aHeaderStr ); <a name="l00845"></a>00845 <span class="keywordflow">if</span> ( sSmartQuote && sWordWrap ) <a name="l00846"></a>00846 <span class="keywordflow">return</span> headerStr + <a class="code" href="classKMMessage.html#d0933db089e196f333e4bfeb52b67ea3" title="Given argument msg add quoting characters and relayout for max width maxLength.">smartQuote</a>( content, sWrapCol ); <a name="l00847"></a>00847 <span class="keywordflow">return</span> headerStr + content; <a name="l00848"></a>00848 } <a name="l00849"></a>00849 <a name="l00850"></a>00850 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l00851"></a><a class="code" href="classKMMessage.html#bb0171befe57c922617b37bd58a35002">00851</a> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* <a class="code" href="classKMMessage.html#bb0171befe57c922617b37bd58a35002" title="Create a new message that is a reply to this message, filling all required header...">KMMessage::createReply</a>( KMail::ReplyStrategy replyStrategy, <a name="l00852"></a>00852 QString selection <span class="comment">/* = QString::null */</span>, <a name="l00853"></a>00853 <span class="keywordtype">bool</span> noQuote <span class="comment">/* = false */</span>, <a name="l00854"></a>00854 <span class="keywordtype">bool</span> allowDecryption <span class="comment">/* = true */</span>, <a name="l00855"></a>00855 <span class="keywordtype">bool</span> selectionIsBody <span class="comment">/* = false */</span>, <a name="l00856"></a>00856 <span class="keyword">const</span> QString &tmpl <span class="comment">/* = QString::null */</span> ) <a name="l00857"></a>00857 { <a name="l00858"></a>00858 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* msg = <span class="keyword">new</span> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>; <a name="l00859"></a>00859 QString str, replyStr, mailingListStr, replyToStr, toStr; <a name="l00860"></a>00860 QStringList mailingListAddresses; <a name="l00861"></a>00861 QCString refStr, headerName; <a name="l00862"></a>00862 <span class="keywordtype">bool</span> replyAll = <span class="keyword">true</span>; <a name="l00863"></a>00863 <a name="l00864"></a>00864 msg-><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">initFromMessage</a>(<span class="keyword">this</span>); <a name="l00865"></a>00865 <a name="l00866"></a>00866 MailingList::name(<span class="keyword">this</span>, headerName, mailingListStr); <a name="l00867"></a>00867 replyToStr = <a class="code" href="classKMMessage.html#0b6c3e40ef5369159f1f2abead43469e" title="Get or set the &#39;ReplyTo&#39; header field.">replyTo</a>(); <a name="l00868"></a>00868 <a name="l00869"></a>00869 msg-><a class="code" href="classKMMessage.html#6c6413b3690538964ac810f4c6755a5b" title="Set the message charset.">setCharset</a>(<span class="stringliteral">"utf-8"</span>); <a name="l00870"></a>00870 <a name="l00871"></a>00871 <span class="comment">// determine the mailing list posting address</span> <a name="l00872"></a>00872 <span class="keywordflow">if</span> ( parent() && parent()->isMailingListEnabled() && <a name="l00873"></a>00873 !parent()->mailingListPostAddress().isEmpty() ) { <a name="l00874"></a>00874 mailingListAddresses << parent()->mailingListPostAddress(); <a name="l00875"></a>00875 } <a name="l00876"></a>00876 <span class="keywordflow">if</span> ( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"List-Post"</span>).find( <span class="stringliteral">"mailto:"</span>, 0, <span class="keyword">false</span> ) != -1 ) { <a name="l00877"></a>00877 QString listPost = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"List-Post"</span>); <a name="l00878"></a>00878 QRegExp rx( <span class="stringliteral">"<mailto:([^@>]+)@([^>]+)>"</span>, <span class="keyword">false</span> ); <a name="l00879"></a>00879 <span class="keywordflow">if</span> ( rx.search( listPost, 0 ) != -1 ) <span class="comment">// matched</span> <a name="l00880"></a>00880 mailingListAddresses << rx.cap(1) + <span class="charliteral">'@'</span> + rx.cap(2); <a name="l00881"></a>00881 } <a name="l00882"></a>00882 <a name="l00883"></a>00883 <span class="comment">// use the "On ... Joe User wrote:" header by default</span> <a name="l00884"></a>00884 replyStr = sReplyAllStr; <a name="l00885"></a>00885 <a name="l00886"></a>00886 <span class="keywordflow">switch</span>( replyStrategy ) { <a name="l00887"></a>00887 <span class="keywordflow">case</span> KMail::ReplySmart : { <a name="l00888"></a>00888 <span class="keywordflow">if</span> ( !<a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Mail-Followup-To"</span> ).isEmpty() ) { <a name="l00889"></a>00889 toStr = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Mail-Followup-To"</span> ); <a name="l00890"></a>00890 } <a name="l00891"></a>00891 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !replyToStr.isEmpty() ) { <a name="l00892"></a>00892 <span class="comment">// assume a Reply-To header mangling mailing list</span> <a name="l00893"></a>00893 toStr = replyToStr; <a name="l00894"></a>00894 } <a name="l00895"></a>00895 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !mailingListAddresses.isEmpty() ) { <a name="l00896"></a>00896 toStr = mailingListAddresses[0]; <a name="l00897"></a>00897 } <a name="l00898"></a>00898 <span class="keywordflow">else</span> { <a name="l00899"></a>00899 <span class="comment">// doesn't seem to be a mailing list, reply to From: address</span> <a name="l00900"></a>00900 toStr = <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l00901"></a>00901 replyStr = sReplyStr; <span class="comment">// reply to author, so use "On ... you wrote:"</span> <a name="l00902"></a>00902 replyAll = <span class="keyword">false</span>; <a name="l00903"></a>00903 } <a name="l00904"></a>00904 <span class="comment">// strip all my addresses from the list of recipients</span> <a name="l00905"></a>00905 QStringList recipients = KPIM::splitEmailAddrList( toStr ); <a name="l00906"></a>00906 toStr = <a class="code" href="classKMMessage.html#e4f03358c3283c037353a3683876f781" title="Strips all the user&#39;s addresses from an address list.">stripMyAddressesFromAddressList</a>( recipients ).join(<span class="stringliteral">", "</span>); <a name="l00907"></a>00907 <span class="comment">// ... unless the list contains only my addresses (reply to self)</span> <a name="l00908"></a>00908 <span class="keywordflow">if</span> ( toStr.isEmpty() && !recipients.isEmpty() ) <a name="l00909"></a>00909 toStr = recipients[0]; <a name="l00910"></a>00910 <a name="l00911"></a>00911 <span class="keywordflow">break</span>; <a name="l00912"></a>00912 } <a name="l00913"></a>00913 <span class="keywordflow">case</span> KMail::ReplyList : { <a name="l00914"></a>00914 <span class="keywordflow">if</span> ( !<a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Mail-Followup-To"</span> ).isEmpty() ) { <a name="l00915"></a>00915 toStr = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Mail-Followup-To"</span> ); <a name="l00916"></a>00916 } <a name="l00917"></a>00917 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !mailingListAddresses.isEmpty() ) { <a name="l00918"></a>00918 toStr = mailingListAddresses[0]; <a name="l00919"></a>00919 } <a name="l00920"></a>00920 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !replyToStr.isEmpty() ) { <a name="l00921"></a>00921 <span class="comment">// assume a Reply-To header mangling mailing list</span> <a name="l00922"></a>00922 toStr = replyToStr; <a name="l00923"></a>00923 } <a name="l00924"></a>00924 <span class="comment">// strip all my addresses from the list of recipients</span> <a name="l00925"></a>00925 QStringList recipients = KPIM::splitEmailAddrList( toStr ); <a name="l00926"></a>00926 toStr = <a class="code" href="classKMMessage.html#e4f03358c3283c037353a3683876f781" title="Strips all the user&#39;s addresses from an address list.">stripMyAddressesFromAddressList</a>( recipients ).join(<span class="stringliteral">", "</span>); <a name="l00927"></a>00927 <a name="l00928"></a>00928 <span class="keywordflow">break</span>; <a name="l00929"></a>00929 } <a name="l00930"></a>00930 <span class="keywordflow">case</span> KMail::ReplyAll : { <a name="l00931"></a>00931 QStringList recipients; <a name="l00932"></a>00932 QStringList ccRecipients; <a name="l00933"></a>00933 <a name="l00934"></a>00934 <span class="comment">// add addresses from the Reply-To header to the list of recipients</span> <a name="l00935"></a>00935 <span class="keywordflow">if</span>( !replyToStr.isEmpty() ) { <a name="l00936"></a>00936 recipients += KPIM::splitEmailAddrList( replyToStr ); <a name="l00937"></a>00937 <span class="comment">// strip all possible mailing list addresses from the list of Reply-To</span> <a name="l00938"></a>00938 <span class="comment">// addresses</span> <a name="l00939"></a>00939 <span class="keywordflow">for</span> ( QStringList::const_iterator it = mailingListAddresses.begin(); <a name="l00940"></a>00940 it != mailingListAddresses.end(); <a name="l00941"></a>00941 ++it ) { <a name="l00942"></a>00942 recipients = <a class="code" href="classKMMessage.html#9f7653629787483e4e812562381b07d2" title="Strips an address from an address list.">stripAddressFromAddressList</a>( *it, recipients ); <a name="l00943"></a>00943 } <a name="l00944"></a>00944 } <a name="l00945"></a>00945 <a name="l00946"></a>00946 <span class="keywordflow">if</span> ( !mailingListAddresses.isEmpty() ) { <a name="l00947"></a>00947 <span class="comment">// this is a mailing list message</span> <a name="l00948"></a>00948 <span class="keywordflow">if</span> ( recipients.isEmpty() && !<a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>().isEmpty() ) { <a name="l00949"></a>00949 <span class="comment">// The sender didn't set a Reply-to address, so we add the From</span> <a name="l00950"></a>00950 <span class="comment">// address to the list of CC recipients.</span> <a name="l00951"></a>00951 ccRecipients += <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l00952"></a>00952 kdDebug(5006) << <span class="stringliteral">"Added "</span> << <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>() << <span class="stringliteral">" to the list of CC recipients"</span> <a name="l00953"></a>00953 << endl; <a name="l00954"></a>00954 } <a name="l00955"></a>00955 <span class="comment">// if it is a mailing list, add the posting address</span> <a name="l00956"></a>00956 recipients.prepend( mailingListAddresses[0] ); <a name="l00957"></a>00957 } <a name="l00958"></a>00958 <span class="keywordflow">else</span> { <a name="l00959"></a>00959 <span class="comment">// this is a normal message</span> <a name="l00960"></a>00960 <span class="keywordflow">if</span> ( recipients.isEmpty() && !<a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>().isEmpty() ) { <a name="l00961"></a>00961 <span class="comment">// in case of replying to a normal message only then add the From</span> <a name="l00962"></a>00962 <span class="comment">// address to the list of recipients if there was no Reply-to address</span> <a name="l00963"></a>00963 recipients += <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l00964"></a>00964 kdDebug(5006) << <span class="stringliteral">"Added "</span> << <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>() << <span class="stringliteral">" to the list of recipients"</span> <a name="l00965"></a>00965 << endl; <a name="l00966"></a>00966 } <a name="l00967"></a>00967 } <a name="l00968"></a>00968 <a name="l00969"></a>00969 <span class="comment">// strip all my addresses from the list of recipients</span> <a name="l00970"></a>00970 toStr = <a class="code" href="classKMMessage.html#e4f03358c3283c037353a3683876f781" title="Strips all the user&#39;s addresses from an address list.">stripMyAddressesFromAddressList</a>( recipients ).join(<span class="stringliteral">", "</span>); <a name="l00971"></a>00971 <a name="l00972"></a>00972 <span class="comment">// merge To header and CC header into a list of CC recipients</span> <a name="l00973"></a>00973 <span class="keywordflow">if</span>( !<a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>().isEmpty() || !<a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>().isEmpty() ) { <a name="l00974"></a>00974 QStringList list; <a name="l00975"></a>00975 <span class="keywordflow">if</span> (!<a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>().isEmpty()) <a name="l00976"></a>00976 list += KPIM::splitEmailAddrList(<a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>()); <a name="l00977"></a>00977 <span class="keywordflow">if</span> (!<a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>().isEmpty()) <a name="l00978"></a>00978 list += KPIM::splitEmailAddrList(<a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>()); <a name="l00979"></a>00979 <span class="keywordflow">for</span>( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) { <a name="l00980"></a>00980 <span class="keywordflow">if</span>( !<a class="code" href="classKMMessage.html#c334bfce5b6d1dafe916a42e2cf8a2e2" title="Returns true if the given address is contained in the given address list.">addressIsInAddressList</a>( *it, recipients ) <a name="l00981"></a>00981 && !<a class="code" href="classKMMessage.html#c334bfce5b6d1dafe916a42e2cf8a2e2" title="Returns true if the given address is contained in the given address list.">addressIsInAddressList</a>( *it, ccRecipients ) ) { <a name="l00982"></a>00982 ccRecipients += *it; <a name="l00983"></a>00983 kdDebug(5006) << <span class="stringliteral">"Added "</span> << *it << <span class="stringliteral">" to the list of CC recipients"</span> <a name="l00984"></a>00984 << endl; <a name="l00985"></a>00985 } <a name="l00986"></a>00986 } <a name="l00987"></a>00987 } <a name="l00988"></a>00988 <a name="l00989"></a>00989 <span class="keywordflow">if</span> ( !ccRecipients.isEmpty() ) { <a name="l00990"></a>00990 <span class="comment">// strip all my addresses from the list of CC recipients</span> <a name="l00991"></a>00991 ccRecipients = <a class="code" href="classKMMessage.html#e4f03358c3283c037353a3683876f781" title="Strips all the user&#39;s addresses from an address list.">stripMyAddressesFromAddressList</a>( ccRecipients ); <a name="l00992"></a>00992 <a name="l00993"></a>00993 <span class="comment">// in case of a reply to self toStr might be empty. if that's the case</span> <a name="l00994"></a>00994 <span class="comment">// then propagate a cc recipient to To: (if there is any).</span> <a name="l00995"></a>00995 <span class="keywordflow">if</span> ( toStr.isEmpty() && !ccRecipients.isEmpty() ) { <a name="l00996"></a>00996 toStr = ccRecipients[0]; <a name="l00997"></a>00997 ccRecipients.pop_front(); <a name="l00998"></a>00998 } <a name="l00999"></a>00999 <a name="l01000"></a>01000 msg-><a class="code" href="classKMMessage.html#3bf036f0a5f466a614154a749fb4ac54">setCc</a>( ccRecipients.join(<span class="stringliteral">", "</span>) ); <a name="l01001"></a>01001 } <a name="l01002"></a>01002 <a name="l01003"></a>01003 <span class="keywordflow">if</span> ( toStr.isEmpty() && !recipients.isEmpty() ) { <a name="l01004"></a>01004 <span class="comment">// reply to self without other recipients</span> <a name="l01005"></a>01005 toStr = recipients[0]; <a name="l01006"></a>01006 } <a name="l01007"></a>01007 <span class="keywordflow">break</span>; <a name="l01008"></a>01008 } <a name="l01009"></a>01009 <span class="keywordflow">case</span> KMail::ReplyAuthor : { <a name="l01010"></a>01010 <span class="keywordflow">if</span> ( !replyToStr.isEmpty() ) { <a name="l01011"></a>01011 QStringList recipients = KPIM::splitEmailAddrList( replyToStr ); <a name="l01012"></a>01012 <span class="comment">// strip the mailing list post address from the list of Reply-To</span> <a name="l01013"></a>01013 <span class="comment">// addresses since we want to reply in private</span> <a name="l01014"></a>01014 <span class="keywordflow">for</span> ( QStringList::const_iterator it = mailingListAddresses.begin(); <a name="l01015"></a>01015 it != mailingListAddresses.end(); <a name="l01016"></a>01016 ++it ) { <a name="l01017"></a>01017 recipients = <a class="code" href="classKMMessage.html#9f7653629787483e4e812562381b07d2" title="Strips an address from an address list.">stripAddressFromAddressList</a>( *it, recipients ); <a name="l01018"></a>01018 } <a name="l01019"></a>01019 <span class="keywordflow">if</span> ( !recipients.isEmpty() ) { <a name="l01020"></a>01020 toStr = recipients.join(<span class="stringliteral">", "</span>); <a name="l01021"></a>01021 } <a name="l01022"></a>01022 <span class="keywordflow">else</span> { <a name="l01023"></a>01023 <span class="comment">// there was only the mailing list post address in the Reply-To header,</span> <a name="l01024"></a>01024 <span class="comment">// so use the From address instead</span> <a name="l01025"></a>01025 toStr = <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l01026"></a>01026 } <a name="l01027"></a>01027 } <a name="l01028"></a>01028 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !<a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>().isEmpty() ) { <a name="l01029"></a>01029 toStr = <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l01030"></a>01030 } <a name="l01031"></a>01031 replyStr = sReplyStr; <span class="comment">// reply to author, so use "On ... you wrote:"</span> <a name="l01032"></a>01032 replyAll = <span class="keyword">false</span>; <a name="l01033"></a>01033 <span class="keywordflow">break</span>; <a name="l01034"></a>01034 } <a name="l01035"></a>01035 <span class="keywordflow">case</span> KMail::ReplyNone : { <a name="l01036"></a>01036 <span class="comment">// the addressees will be set by the caller</span> <a name="l01037"></a>01037 } <a name="l01038"></a>01038 } <a name="l01039"></a>01039 <a name="l01040"></a>01040 msg-><a class="code" href="classKMMessage.html#5bb40f8b006d66c80cff9a43fa3018d6">setTo</a>(toStr); <a name="l01041"></a>01041 <a name="l01042"></a>01042 refStr = <a class="code" href="classKMMessage.html#bc854b6e0a96fe46b7d7fa3bdd809ac9" title="Creates reference string for reply to messages.">getRefStr</a>(); <a name="l01043"></a>01043 <span class="keywordflow">if</span> (!refStr.isEmpty()) <a name="l01044"></a>01044 msg-><a class="code" href="classKMMessage.html#913eeb9b59c05f0cd47421cce084a066">setReferences</a>(refStr); <a name="l01045"></a>01045 <span class="comment">//In-Reply-To = original msg-id</span> <a name="l01046"></a>01046 msg-><a class="code" href="classKMMessage.html#f1b40aad4353b8e2199701c4650456b8">setReplyToId</a>(<a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &#39;Message-Id&#39; header field.">msgId</a>()); <a name="l01047"></a>01047 <a name="l01048"></a>01048 <span class="comment">// if (!noQuote) {</span> <a name="l01049"></a>01049 <span class="comment">// if( selectionIsBody ){</span> <a name="l01050"></a>01050 <span class="comment">// QCString cStr = selection.latin1();</span> <a name="l01051"></a>01051 <span class="comment">// msg->setBody( cStr );</span> <a name="l01052"></a>01052 <span class="comment">// }else{</span> <a name="l01053"></a>01053 <span class="comment">// msg->setBody(asQuotedString(replyStr + "\n", sIndentPrefixStr, selection,</span> <a name="l01054"></a>01054 <span class="comment">// sSmartQuote, allowDecryption).utf8());</span> <a name="l01055"></a>01055 <span class="comment">// }</span> <a name="l01056"></a>01056 <span class="comment">// }</span> <a name="l01057"></a>01057 <a name="l01058"></a>01058 msg-><a class="code" href="classKMMessage.html#dc02d16017d248f9f7c9dc980aee25b4">setSubject</a>( replySubject() ); <a name="l01059"></a>01059 <a name="l01060"></a>01060 TemplateParser parser( msg, (replyAll ? TemplateParser::ReplyAll : TemplateParser::Reply), <a name="l01061"></a>01061 selection, sSmartQuote, noQuote, allowDecryption, selectionIsBody ); <a name="l01062"></a>01062 <span class="keywordflow">if</span> ( !tmpl.isEmpty() ) { <a name="l01063"></a>01063 parser.process( tmpl, <span class="keyword">this</span> ); <a name="l01064"></a>01064 } <span class="keywordflow">else</span> { <a name="l01065"></a>01065 parser.process( <span class="keyword">this</span> ); <a name="l01066"></a>01066 } <a name="l01067"></a>01067 <a name="l01068"></a>01068 <span class="comment">// setStatus(KMMsgStatusReplied);</span> <a name="l01069"></a>01069 msg-><a class="code" href="classKMMessage.html#03dc17ebd4de0cad4977d28040ed16fd" title="Links this message to aMsg, setting link type to aStatus.">link</a>(<span class="keyword">this</span>, KMMsgStatusReplied); <a name="l01070"></a>01070 <a name="l01071"></a>01071 <span class="keywordflow">if</span> ( parent() && parent()->putRepliesInSameFolder() ) <a name="l01072"></a>01072 msg-><a class="code" href="classKMMessage.html#ab7979cc09a6cd989751264051d2012e">setFcc</a>( parent()->idString() ); <a name="l01073"></a>01073 <a name="l01074"></a>01074 <span class="comment">// replies to an encrypted message should be encrypted as well</span> <a name="l01075"></a>01075 <span class="keywordflow">if</span> ( <a class="code" href="classKMMessage.html#5d5ac51a43a80ddbe67f5fbad87520f7" title="Encryption status of the message.">encryptionState</a>() == KMMsgPartiallyEncrypted || <a name="l01076"></a>01076 <a class="code" href="classKMMessage.html#5d5ac51a43a80ddbe67f5fbad87520f7" title="Encryption status of the message.">encryptionState</a>() == KMMsgFullyEncrypted ) { <a name="l01077"></a>01077 msg-><a class="code" href="classKMMessage.html#deaf253ad2f0d86779d5991f13731d08" title="Set encryption status of the message.">setEncryptionState</a>( KMMsgFullyEncrypted ); <a name="l01078"></a>01078 } <a name="l01079"></a>01079 <a name="l01080"></a>01080 <span class="keywordflow">return</span> msg; <a name="l01081"></a>01081 } <a name="l01082"></a>01082 <a name="l01083"></a>01083 <a name="l01084"></a>01084 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01085"></a><a class="code" href="classKMMessage.html#bc854b6e0a96fe46b7d7fa3bdd809ac9">01085</a> QCString <a class="code" href="classKMMessage.html#bc854b6e0a96fe46b7d7fa3bdd809ac9" title="Creates reference string for reply to messages.">KMMessage::getRefStr</a>()<span class="keyword"> const</span> <a name="l01086"></a>01086 <span class="keyword"></span>{ <a name="l01087"></a>01087 QCString firstRef, lastRef, refStr, retRefStr; <a name="l01088"></a>01088 <span class="keywordtype">int</span> i, j; <a name="l01089"></a>01089 <a name="l01090"></a>01090 refStr = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"References"</span>).stripWhiteSpace().latin1(); <a name="l01091"></a>01091 <a name="l01092"></a>01092 <span class="keywordflow">if</span> (refStr.isEmpty()) <a name="l01093"></a>01093 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Message-Id"</span>).latin1(); <a name="l01094"></a>01094 <a name="l01095"></a>01095 i = refStr.find(<span class="charliteral">'<'</span>); <a name="l01096"></a>01096 j = refStr.find(<span class="charliteral">'>'</span>); <a name="l01097"></a>01097 firstRef = refStr.mid(i, j-i+1); <a name="l01098"></a>01098 <span class="keywordflow">if</span> (!firstRef.isEmpty()) <a name="l01099"></a>01099 retRefStr = firstRef + <span class="charliteral">' '</span>; <a name="l01100"></a>01100 <a name="l01101"></a>01101 i = refStr.findRev(<span class="charliteral">'<'</span>); <a name="l01102"></a>01102 j = refStr.findRev(<span class="charliteral">'>'</span>); <a name="l01103"></a>01103 <a name="l01104"></a>01104 lastRef = refStr.mid(i, j-i+1); <a name="l01105"></a>01105 <span class="keywordflow">if</span> (!lastRef.isEmpty() && lastRef != firstRef) <a name="l01106"></a>01106 retRefStr += lastRef + <span class="charliteral">' '</span>; <a name="l01107"></a>01107 <a name="l01108"></a>01108 retRefStr += <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Message-Id"</span>).latin1(); <a name="l01109"></a>01109 <span class="keywordflow">return</span> retRefStr; <a name="l01110"></a>01110 } <a name="l01111"></a>01111 <a name="l01112"></a>01112 <a name="l01113"></a><a class="code" href="classKMMessage.html#75c36eac5a71cbf40330d7648e19baf9">01113</a> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* <a class="code" href="classKMMessage.html#75c36eac5a71cbf40330d7648e19baf9" title="Create a new message that is a redirect to this message, filling all required header...">KMMessage::createRedirect</a>( <span class="keyword">const</span> QString &toStr ) <a name="l01114"></a>01114 { <a name="l01115"></a>01115 <span class="comment">// copy the message 1:1</span> <a name="l01116"></a>01116 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* msg = <span class="keyword">new</span> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage</a>( <span class="keyword">new</span> DwMessage( *this->mMsg ) ); <a name="l01117"></a>01117 KMMessagePart msgPart; <a name="l01118"></a>01118 <a name="l01119"></a>01119 uint <span class="keywordtype">id</span> = 0; <a name="l01120"></a>01120 QString strId = msg-><a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-KMail-Identity"</span> ).stripWhiteSpace(); <a name="l01121"></a>01121 <span class="keywordflow">if</span> ( !strId.isEmpty()) <a name="l01122"></a>01122 <span class="keywordtype">id</span> = strId.toUInt(); <a name="l01123"></a>01123 <span class="keyword">const</span> KPIM::Identity & ident = <a name="l01124"></a>01124 kmkernel->identityManager()->identityForUoidOrDefault( <span class="keywordtype">id</span> ); <a name="l01125"></a>01125 <a name="l01126"></a>01126 <span class="comment">// X-KMail-Redirect-From: content</span> <a name="l01127"></a>01127 QString strByWayOf = QString(<span class="stringliteral">"%1 (by way of %2 <%3>)"</span>) <a name="l01128"></a>01128 .arg( <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>() ) <a name="l01129"></a>01129 .arg( ident.fullName() ) <a name="l01130"></a>01130 .arg( ident.emailAddr() ); <a name="l01131"></a>01131 <a name="l01132"></a>01132 <span class="comment">// Resent-From: content</span> <a name="l01133"></a>01133 QString strFrom = QString(<span class="stringliteral">"%1 <%2>"</span>) <a name="l01134"></a>01134 .arg( ident.fullName() ) <a name="l01135"></a>01135 .arg( ident.emailAddr() ); <a name="l01136"></a>01136 <a name="l01137"></a>01137 <span class="comment">// format the current date to be used in Resent-Date:</span> <a name="l01138"></a>01138 QString origDate = msg-><a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Date"</span> ); <a name="l01139"></a>01139 msg-><a class="code" href="classKMMessage.html#2c0f165afcca50d3b7f5a03bc29d42b6" title="Set the &#39;Date&#39; header field to the current date.">setDateToday</a>(); <a name="l01140"></a>01140 QString newDate = msg-><a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"Date"</span> ); <a name="l01141"></a>01141 <span class="comment">// make sure the Date: header is valid</span> <a name="l01142"></a>01142 <span class="keywordflow">if</span> ( origDate.isEmpty() ) <a name="l01143"></a>01143 msg-><a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>( <span class="stringliteral">"Date"</span> ); <a name="l01144"></a>01144 <span class="keywordflow">else</span> <a name="l01145"></a>01145 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Date"</span>, origDate ); <a name="l01146"></a>01146 <a name="l01147"></a>01147 <span class="comment">// prepend Resent-*: headers (c.f. RFC2822 3.6.6)</span> <a name="l01148"></a>01148 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Resent-Message-ID"</span>, <a class="code" href="classKMMessage.html#66d82f92b132f0d6b2fc619befd5986f" title="Generates the Message-Id.">generateMessageId</a>( msg-><a class="code" href="classKMMessage.html#27edbb00d94ce8115413f2ddb2b4f10b">sender</a>() ), <a name="l01149"></a>01149 Structured, <span class="keyword">true</span>); <a name="l01150"></a>01150 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Resent-Date"</span>, newDate, Structured, <span class="keyword">true</span> ); <a name="l01151"></a>01151 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Resent-To"</span>, toStr, Address, <span class="keyword">true</span> ); <a name="l01152"></a>01152 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Resent-From"</span>, strFrom, Address, <span class="keyword">true</span> ); <a name="l01153"></a>01153 <a name="l01154"></a>01154 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"X-KMail-Redirect-From"</span>, strByWayOf ); <a name="l01155"></a>01155 msg-><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"X-KMail-Recipients"</span>, toStr, Address ); <a name="l01156"></a>01156 <a name="l01157"></a>01157 msg-><a class="code" href="classKMMessage.html#03dc17ebd4de0cad4977d28040ed16fd" title="Links this message to aMsg, setting link type to aStatus.">link</a>(<span class="keyword">this</span>, KMMsgStatusForwarded); <a name="l01158"></a>01158 <a name="l01159"></a>01159 <span class="keywordflow">return</span> msg; <a name="l01160"></a>01160 } <a name="l01161"></a>01161 <a name="l01162"></a>01162 <a name="l01163"></a>01163 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01164"></a><a class="code" href="classKMMessage.html#ab3d626b12ab11266a130c25d5f75def">01164</a> QCString <a class="code" href="classKMMessage.html#ab3d626b12ab11266a130c25d5f75def" title="Create the forwarded body for the message.">KMMessage::createForwardBody</a>() <a name="l01165"></a>01165 { <a name="l01166"></a>01166 QString s; <a name="l01167"></a>01167 QCString str; <a name="l01168"></a>01168 <a name="l01169"></a>01169 <span class="keywordflow">if</span> (sHeaderStrategy == HeaderStrategy::all()) { <a name="l01170"></a>01170 s = <span class="stringliteral">"\n\n---------- "</span> + sForwardStr + <span class="stringliteral">" ----------\n\n"</span>; <a name="l01171"></a>01171 s += <a class="code" href="classKMMessage.html#81a56c11d9920301421152b9e0afc45d" title="Return header as string.">headerAsString</a>(); <a name="l01172"></a>01172 str = <a class="code" href="classKMMessage.html#d7702f7d5f9a01b436581701ffcea154" title="Returns message body with quoting header and indented by the given indentation string...">asQuotedString</a>(s, <span class="stringliteral">""</span>, QString::null, <span class="keyword">false</span>, <span class="keyword">false</span>).utf8(); <a name="l01173"></a>01173 str += <span class="stringliteral">"\n-------------------------------------------------------\n"</span>; <a name="l01174"></a>01174 } <span class="keywordflow">else</span> { <a name="l01175"></a>01175 s = <span class="stringliteral">"\n\n---------- "</span> + sForwardStr + <span class="stringliteral">" ----------\n\n"</span>; <a name="l01176"></a>01176 s += <span class="stringliteral">"Subject: "</span> + <a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda" title="Get or set the &#39;Subject&#39; header field.">subject</a>() + <span class="stringliteral">"\n"</span>; <a name="l01177"></a>01177 s += <span class="stringliteral">"Date: "</span> <a name="l01178"></a>01178 + KMime::DateFormatter::formatDate( KMime::DateFormatter::Localized, <a name="l01179"></a>01179 date(), sReplyLanguage, <span class="keyword">false</span> ) <a name="l01180"></a>01180 + <span class="stringliteral">"\n"</span>; <a name="l01181"></a>01181 s += <span class="stringliteral">"From: "</span> + <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>() + <span class="stringliteral">"\n"</span>; <a name="l01182"></a>01182 s += <span class="stringliteral">"To: "</span> + <a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>() + <span class="stringliteral">"\n"</span>; <a name="l01183"></a>01183 <span class="keywordflow">if</span> (!<a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>().isEmpty()) s += <span class="stringliteral">"Cc: "</span> + <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>() + <span class="stringliteral">"\n"</span>; <a name="l01184"></a>01184 s += <span class="stringliteral">"\n"</span>; <a name="l01185"></a>01185 str = <a class="code" href="classKMMessage.html#d7702f7d5f9a01b436581701ffcea154" title="Returns message body with quoting header and indented by the given indentation string...">asQuotedString</a>(s, <span class="stringliteral">""</span>, QString::null, <span class="keyword">false</span>, <span class="keyword">false</span>).utf8(); <a name="l01186"></a>01186 str += <span class="stringliteral">"\n-------------------------------------------------------\n"</span>; <a name="l01187"></a>01187 } <a name="l01188"></a>01188 <a name="l01189"></a>01189 <span class="keywordflow">return</span> str; <a name="l01190"></a>01190 } <a name="l01191"></a>01191 <a name="l01192"></a><a class="code" href="classKMMessage.html#7a5df78062e4283cebd3eccba0fcb5ad">01192</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#7a5df78062e4283cebd3eccba0fcb5ad" title="Remove all headers but the content description ones, and those in the white list...">KMMessage::sanitizeHeaders</a>( <span class="keyword">const</span> QStringList& whiteList ) <a name="l01193"></a>01193 { <a name="l01194"></a>01194 <span class="comment">// Strip out all headers apart from the content description and other</span> <a name="l01195"></a>01195 <span class="comment">// whitelisted ones, because we don't want to inherit them.</span> <a name="l01196"></a>01196 DwHeaders& header = mMsg->Headers(); <a name="l01197"></a>01197 DwField* field = header.FirstField(); <a name="l01198"></a>01198 DwField* nextField; <a name="l01199"></a>01199 <span class="keywordflow">while</span> (field) <a name="l01200"></a>01200 { <a name="l01201"></a>01201 nextField = field->Next(); <a name="l01202"></a>01202 <span class="keywordflow">if</span> ( field->FieldNameStr().find( <span class="stringliteral">"ontent"</span> ) == DwString::npos <a name="l01203"></a>01203 && !whiteList.contains( QString::fromLatin1( field->FieldNameStr().c_str() ) ) ) <a name="l01204"></a>01204 header.RemoveField(field); <a name="l01205"></a>01205 field = nextField; <a name="l01206"></a>01206 } <a name="l01207"></a>01207 mMsg->Assemble(); <a name="l01208"></a>01208 } <a name="l01209"></a>01209 <a name="l01210"></a>01210 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01211"></a><a class="code" href="classKMMessage.html#86a19707a3ab205ef6272b2acc0181c9">01211</a> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* <a class="code" href="classKMMessage.html#86a19707a3ab205ef6272b2acc0181c9" title="Create a new message that is a forward of this message, filling all required header...">KMMessage::createForward</a>( <span class="keyword">const</span> QString &tmpl <span class="comment">/* = QString::null */</span> ) <a name="l01212"></a>01212 { <a name="l01213"></a>01213 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* msg = <span class="keyword">new</span> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage</a>(); <a name="l01214"></a>01214 QString <a class="code" href="classKMMessage.html#0d8727663192f06834b97ffd7eca6570" title="Returns the message ID, useful for followups.">id</a>; <a name="l01215"></a>01215 <a name="l01216"></a>01216 <span class="comment">// If this is a multipart mail or if the main part is only the text part,</span> <a name="l01217"></a>01217 <span class="comment">// Make an identical copy of the mail, minus headers, so attachments are</span> <a name="l01218"></a>01218 <span class="comment">// preserved</span> <a name="l01219"></a>01219 <span class="keywordflow">if</span> ( type() == DwMime::kTypeMultipart || <a name="l01220"></a>01220 ( type() == DwMime::kTypeText && subtype() == DwMime::kSubtypePlain ) ) { <a name="l01221"></a>01221 <span class="comment">// ## slow, we could probably use: delete msg->mMsg; msg->mMsg = new DwMessage( this->mMsg );</span> <a name="l01222"></a>01222 msg-><a class="code" href="classKMMessage.html#765ec32909b2bfde6a205c1b76431381" title="Parse the string and create this message from it.">fromDwString</a>( this-><a class="code" href="classKMMessage.html#49c5b4223492f2d81dcc97bb9462f728" title="Return the entire message contents in the DwString.">asDwString</a>() ); <a name="l01223"></a>01223 <span class="comment">// remember the type and subtype, initFromMessage sets the contents type to</span> <a name="l01224"></a>01224 <span class="comment">// text/plain, via initHeader, for unclear reasons</span> <a name="l01225"></a>01225 <span class="keyword">const</span> <span class="keywordtype">int</span> type = msg-><a class="code" href="classKMMessage.html#8a9f60e2f0e6bf9300e269810aac30ba">type</a>(); <a name="l01226"></a>01226 <span class="keyword">const</span> <span class="keywordtype">int</span> subtype = msg-><a class="code" href="classKMMessage.html#30782f41ed9b25f9e61e138c7e549cea">subtype</a>(); <a name="l01227"></a>01227 <a name="l01228"></a>01228 msg-><a class="code" href="classKMMessage.html#7a5df78062e4283cebd3eccba0fcb5ad" title="Remove all headers but the content description ones, and those in the white list...">sanitizeHeaders</a>(); <a name="l01229"></a>01229 <a name="l01230"></a>01230 <span class="comment">// strip blacklisted parts</span> <a name="l01231"></a>01231 QStringList blacklist = GlobalSettings::self()->mimetypesToStripWhenInlineForwarding(); <a name="l01232"></a>01232 <span class="keywordflow">for</span> ( QStringList::Iterator it = blacklist.begin(); it != blacklist.end(); ++it ) { <a name="l01233"></a>01233 QString entry = (*it); <a name="l01234"></a>01234 <span class="keywordtype">int</span> sep = entry.find( <span class="charliteral">'/'</span> ); <a name="l01235"></a>01235 QCString type = entry.left( sep ).latin1(); <a name="l01236"></a>01236 QCString subtype = entry.mid( sep+1 ).latin1(); <a name="l01237"></a>01237 kdDebug( 5006 ) << <span class="stringliteral">"Looking for blacklisted type: "</span> << type << <span class="stringliteral">"/"</span> << subtype << endl; <a name="l01238"></a>01238 <span class="keywordflow">while</span> ( DwBodyPart * part = msg-><a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( type, subtype ) ) { <a name="l01239"></a>01239 msg-><a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>->Body().RemoveBodyPart( part ); <a name="l01240"></a>01240 } <a name="l01241"></a>01241 } <a name="l01242"></a>01242 msg-><a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>->Assemble(); <a name="l01243"></a>01243 <a name="l01244"></a>01244 msg-><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">initFromMessage</a>( <span class="keyword">this</span> ); <a name="l01245"></a>01245 <span class="comment">//restore type</span> <a name="l01246"></a>01246 msg-><a class="code" href="classKMMessage.html#e8dcba97a80b0db0c33df23d08b62f55">setType</a>( type ); <a name="l01247"></a>01247 msg-><a class="code" href="classKMMessage.html#2f6fd47b46942b7ad77596514a98ec04">setSubtype</a>( subtype ); <a name="l01248"></a>01248 } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( type() == DwMime::kTypeText && subtype() == DwMime::kSubtypeHtml ) { <a name="l01249"></a>01249 <span class="comment">// This is non-multipart html mail. Let`s make it text/plain and allow</span> <a name="l01250"></a>01250 <span class="comment">// template parser do the hard job.</span> <a name="l01251"></a>01251 msg-><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">initFromMessage</a>( <span class="keyword">this</span> ); <a name="l01252"></a>01252 msg-><a class="code" href="classKMMessage.html#e8dcba97a80b0db0c33df23d08b62f55">setType</a>( DwMime::kTypeText ); <a name="l01253"></a>01253 msg-><a class="code" href="classKMMessage.html#2f6fd47b46942b7ad77596514a98ec04">setSubtype</a>( DwMime::kSubtypeHtml ); <a name="l01254"></a>01254 msg-><a class="code" href="classKMMessage.html#32e5730c58e6434c27cda32566cc99b3">mNeedsAssembly</a> = <span class="keyword">true</span>; <a name="l01255"></a>01255 msg-><a class="code" href="classKMMessage.html#c3593abb0275a61f2206eaf51435d64d" title="Removes empty fields from the header, e.g.">cleanupHeader</a>(); <a name="l01256"></a>01256 } <span class="keywordflow">else</span> { <a name="l01257"></a>01257 <span class="comment">// This is a non-multipart, non-text mail (e.g. text/calendar). Construct</span> <a name="l01258"></a>01258 <span class="comment">// a multipart/mixed mail and add the original body as an attachment.</span> <a name="l01259"></a>01259 msg-><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">initFromMessage</a>( <span class="keyword">this</span> ); <a name="l01260"></a>01260 msg-><a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Content-Type"</span>); <a name="l01261"></a>01261 msg-><a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Content-Transfer-Encoding"</span>); <a name="l01262"></a>01262 <span class="comment">// Modify the ContentType directly (replaces setAutomaticFields(true))</span> <a name="l01263"></a>01263 DwHeaders & header = msg-><a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>->Headers(); <a name="l01264"></a>01264 header.MimeVersion().FromString(<span class="stringliteral">"1.0"</span>); <a name="l01265"></a>01265 DwMediaType & contentType = msg-><a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>(); <a name="l01266"></a>01266 contentType.SetType( DwMime::kTypeMultipart ); <a name="l01267"></a>01267 contentType.SetSubtype( DwMime::kSubtypeMixed ); <a name="l01268"></a>01268 contentType.CreateBoundary(0); <a name="l01269"></a>01269 contentType.Assemble(); <a name="l01270"></a>01270 <a name="l01271"></a>01271 <span class="comment">// empty text part</span> <a name="l01272"></a>01272 KMMessagePart msgPart; <a name="l01273"></a>01273 <a class="code" href="classKMMessage.html#2b942616accf9ac39e19351ce2bba17d" title="Fill the KMMessagePart structure for a given DwBodyPart.">bodyPart</a>( 0, &msgPart ); <a name="l01274"></a>01274 msg-><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>(&msgPart); <a name="l01275"></a>01275 <span class="comment">// the old contents of the mail</span> <a name="l01276"></a>01276 KMMessagePart secondPart; <a name="l01277"></a>01277 secondPart.setType( type() ); <a name="l01278"></a>01278 secondPart.setSubtype( subtype() ); <a name="l01279"></a>01279 secondPart.setBody( mMsg->Body().AsString() ); <a name="l01280"></a>01280 <span class="comment">// use the headers of the original mail</span> <a name="l01281"></a>01281 applyHeadersToMessagePart( mMsg->Headers(), &secondPart ); <a name="l01282"></a>01282 msg-><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>(&secondPart); <a name="l01283"></a>01283 msg-><a class="code" href="classKMMessage.html#32e5730c58e6434c27cda32566cc99b3">mNeedsAssembly</a> = <span class="keyword">true</span>; <a name="l01284"></a>01284 msg-><a class="code" href="classKMMessage.html#c3593abb0275a61f2206eaf51435d64d" title="Removes empty fields from the header, e.g.">cleanupHeader</a>(); <a name="l01285"></a>01285 } <a name="l01286"></a>01286 <span class="comment">// QString st = QString::fromUtf8(createForwardBody());</span> <a name="l01287"></a>01287 <a name="l01288"></a>01288 msg-><a class="code" href="classKMMessage.html#dc02d16017d248f9f7c9dc980aee25b4">setSubject</a>( forwardSubject() ); <a name="l01289"></a>01289 <a name="l01290"></a>01290 TemplateParser parser( msg, TemplateParser::Forward, <a name="l01291"></a>01291 <a class="code" href="classKMMessage.html#8fe0431152d4847465b9342b4cfb3a4f" title="Return the textual content of the message as plain text, converting HTML to plain...">asPlainText</a>( <span class="keyword">false</span>, <span class="keyword">false</span> ), <a name="l01292"></a>01292 <span class="keyword">false</span>, <span class="keyword">false</span>, <span class="keyword">false</span>, <span class="keyword">false</span>); <a name="l01293"></a>01293 <span class="keywordflow">if</span> ( !tmpl.isEmpty() ) { <a name="l01294"></a>01294 parser.process( tmpl, <span class="keyword">this</span> ); <a name="l01295"></a>01295 } <span class="keywordflow">else</span> { <a name="l01296"></a>01296 parser.process( <span class="keyword">this</span> ); <a name="l01297"></a>01297 } <a name="l01298"></a>01298 <a name="l01299"></a>01299 <span class="comment">// QCString encoding = autoDetectCharset(charset(), sPrefCharsets, msg->body());</span> <a name="l01300"></a>01300 <span class="comment">// if (encoding.isEmpty()) encoding = "utf-8";</span> <a name="l01301"></a>01301 <span class="comment">// msg->setCharset(encoding);</span> <a name="l01302"></a>01302 <a name="l01303"></a>01303 <span class="comment">// force utf-8</span> <a name="l01304"></a>01304 <span class="comment">// msg->setCharset( "utf-8" );</span> <a name="l01305"></a>01305 <a name="l01306"></a>01306 msg-><a class="code" href="classKMMessage.html#03dc17ebd4de0cad4977d28040ed16fd" title="Links this message to aMsg, setting link type to aStatus.">link</a>(<span class="keyword">this</span>, KMMsgStatusForwarded); <a name="l01307"></a>01307 <span class="keywordflow">return</span> msg; <a name="l01308"></a>01308 } <a name="l01309"></a>01309 <a name="l01310"></a>01310 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">struct </span>{ <a name="l01311"></a>01311 <span class="keyword">const</span> <span class="keywordtype">char</span> * dontAskAgainID; <a name="l01312"></a>01312 <span class="keywordtype">bool</span> canDeny; <a name="l01313"></a>01313 <span class="keyword">const</span> <span class="keywordtype">char</span> * text; <a name="l01314"></a>01314 } mdnMessageBoxes[] = { <a name="l01315"></a>01315 { <span class="stringliteral">"mdnNormalAsk"</span>, <span class="keyword">true</span>, <a name="l01316"></a>01316 I18N_NOOP(<span class="stringliteral">"This message contains a request to return a notification "</span> <a name="l01317"></a>01317 <span class="stringliteral">"about your reception of the message.\n"</span> <a name="l01318"></a>01318 <span class="stringliteral">"You can either ignore the request or let KMail send a "</span> <a name="l01319"></a>01319 <span class="stringliteral">"\"denied\" or normal response."</span>) }, <a name="l01320"></a>01320 { <span class="stringliteral">"mdnUnknownOption"</span>, <span class="keyword">false</span>, <a name="l01321"></a>01321 I18N_NOOP(<span class="stringliteral">"This message contains a request to send a notification "</span> <a name="l01322"></a>01322 <span class="stringliteral">"about your reception of the message.\n"</span> <a name="l01323"></a>01323 <span class="stringliteral">"It contains a processing instruction that is marked as "</span> <a name="l01324"></a>01324 <span class="stringliteral">"\"required\", but which is unknown to KMail.\n"</span> <a name="l01325"></a>01325 <span class="stringliteral">"You can either ignore the request or let KMail send a "</span> <a name="l01326"></a>01326 <span class="stringliteral">"\"failed\" response."</span>) }, <a name="l01327"></a>01327 { <span class="stringliteral">"mdnMultipleAddressesInReceiptTo"</span>, <span class="keyword">true</span>, <a name="l01328"></a>01328 I18N_NOOP(<span class="stringliteral">"This message contains a request to send a notification "</span> <a name="l01329"></a>01329 <span class="stringliteral">"about your reception of the message,\n"</span> <a name="l01330"></a>01330 <span class="stringliteral">"but it is requested to send the notification to more "</span> <a name="l01331"></a>01331 <span class="stringliteral">"than one address.\n"</span> <a name="l01332"></a>01332 <span class="stringliteral">"You can either ignore the request or let KMail send a "</span> <a name="l01333"></a>01333 <span class="stringliteral">"\"denied\" or normal response."</span>) }, <a name="l01334"></a>01334 { <span class="stringliteral">"mdnReturnPathEmpty"</span>, <span class="keyword">true</span>, <a name="l01335"></a>01335 I18N_NOOP(<span class="stringliteral">"This message contains a request to send a notification "</span> <a name="l01336"></a>01336 <span class="stringliteral">"about your reception of the message,\n"</span> <a name="l01337"></a>01337 <span class="stringliteral">"but there is no return-path set.\n"</span> <a name="l01338"></a>01338 <span class="stringliteral">"You can either ignore the request or let KMail send a "</span> <a name="l01339"></a>01339 <span class="stringliteral">"\"denied\" or normal response."</span>) }, <a name="l01340"></a>01340 { <span class="stringliteral">"mdnReturnPathNotInReceiptTo"</span>, <span class="keyword">true</span>, <a name="l01341"></a>01341 I18N_NOOP(<span class="stringliteral">"This message contains a request to send a notification "</span> <a name="l01342"></a>01342 <span class="stringliteral">"about your reception of the message,\n"</span> <a name="l01343"></a>01343 <span class="stringliteral">"but the return-path address differs from the address "</span> <a name="l01344"></a>01344 <span class="stringliteral">"the notification was requested to be sent to.\n"</span> <a name="l01345"></a>01345 <span class="stringliteral">"You can either ignore the request or let KMail send a "</span> <a name="l01346"></a>01346 <span class="stringliteral">"\"denied\" or normal response."</span>) }, <a name="l01347"></a>01347 }; <a name="l01348"></a>01348 <a name="l01349"></a>01349 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> numMdnMessageBoxes <a name="l01350"></a>01350 = <span class="keyword">sizeof</span> mdnMessageBoxes / <span class="keyword">sizeof</span> *mdnMessageBoxes; <a name="l01351"></a>01351 <a name="l01352"></a>01352 <a name="l01353"></a>01353 <span class="keyword">static</span> <span class="keywordtype">int</span> requestAdviceOnMDN( <span class="keyword">const</span> <span class="keywordtype">char</span> * what ) { <a name="l01354"></a>01354 <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> i = 0 ; i < numMdnMessageBoxes ; ++i ) <a name="l01355"></a>01355 <span class="keywordflow">if</span> ( !qstrcmp( what, mdnMessageBoxes[i].dontAskAgainID ) ) <a name="l01356"></a>01356 <span class="keywordflow">if</span> ( mdnMessageBoxes[i].canDeny ) { <a name="l01357"></a>01357 <span class="keyword">const</span> <a class="code" href="classKCursorSaver.html" title="sets a cursor and makes sure it&#39;s restored on destruction Create a KCursorSaver...">KCursorSaver</a> saver( QCursor::ArrowCursor ); <a name="l01358"></a>01358 <span class="keywordtype">int</span> answer = QMessageBox::information( 0, <a name="l01359"></a>01359 i18n(<span class="stringliteral">"Message Disposition Notification Request"</span>), <a name="l01360"></a>01360 i18n( mdnMessageBoxes[i].text ), <a name="l01361"></a>01361 i18n(<span class="stringliteral">"&Ignore"</span>), i18n(<span class="stringliteral">"Send \"&denied\""</span>), i18n(<span class="stringliteral">"&Send"</span>) ); <a name="l01362"></a>01362 <span class="keywordflow">return</span> answer ? answer + 1 : 0 ; <span class="comment">// map to "mode" in createMDN</span> <a name="l01363"></a>01363 } <span class="keywordflow">else</span> { <a name="l01364"></a>01364 <span class="keyword">const</span> <a class="code" href="classKCursorSaver.html" title="sets a cursor and makes sure it&#39;s restored on destruction Create a KCursorSaver...">KCursorSaver</a> saver( QCursor::ArrowCursor ); <a name="l01365"></a>01365 <span class="keywordtype">int</span> answer = QMessageBox::information( 0, <a name="l01366"></a>01366 i18n(<span class="stringliteral">"Message Disposition Notification Request"</span>), <a name="l01367"></a>01367 i18n( mdnMessageBoxes[i].text ), <a name="l01368"></a>01368 i18n(<span class="stringliteral">"&Ignore"</span>), i18n(<span class="stringliteral">"&Send"</span>) ); <a name="l01369"></a>01369 <span class="keywordflow">return</span> answer ? answer + 2 : 0 ; <span class="comment">// map to "mode" in createMDN</span> <a name="l01370"></a>01370 } <a name="l01371"></a>01371 kdWarning(5006) << <span class="stringliteral">"didn't find data for message box \""</span> <a name="l01372"></a>01372 << what << <span class="stringliteral">"\""</span> << endl; <a name="l01373"></a>01373 <span class="keywordflow">return</span> 0; <a name="l01374"></a>01374 } <a name="l01375"></a>01375 <a name="l01376"></a>01376 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* <a class="code" href="classKMMessage.html#74527145a35cc524c4f37b5c16b783e3" title="Create a new message that is a MDN for this message, filling all required fields...">KMMessage::createMDN</a>( MDN::ActionMode a, <a name="l01377"></a>01377 MDN::DispositionType d, <a name="l01378"></a>01378 <span class="keywordtype">bool</span> allowGUI, <a name="l01379"></a>01379 QValueList<MDN::DispositionModifier> m ) <a name="l01380"></a>01380 { <a name="l01381"></a>01381 <span class="comment">// RFC 2298: At most one MDN may be issued on behalf of each</span> <a name="l01382"></a>01382 <span class="comment">// particular recipient by their user agent. That is, once an MDN</span> <a name="l01383"></a>01383 <span class="comment">// has been issued on behalf of a recipient, no further MDNs may be</span> <a name="l01384"></a>01384 <span class="comment">// issued on behalf of that recipient, even if another disposition</span> <a name="l01385"></a>01385 <span class="comment">// is performed on the message.</span> <a name="l01386"></a>01386 <span class="comment">//#define MDN_DEBUG 1</span> <a name="l01387"></a>01387 <span class="preprocessor">#ifndef MDN_DEBUG</span> <a name="l01388"></a>01388 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( mdnSentState() != KMMsgMDNStateUnknown && <a name="l01389"></a>01389 mdnSentState() != KMMsgMDNNone ) <a name="l01390"></a>01390 <span class="keywordflow">return</span> 0; <a name="l01391"></a>01391 <span class="preprocessor">#else</span> <a name="l01392"></a>01392 <span class="preprocessor"></span> <span class="keywordtype">char</span> st[2]; st[0] = (char)mdnSentState(); st[1] = 0; <a name="l01393"></a>01393 kdDebug(5006) << <span class="stringliteral">"mdnSentState() == '"</span> << st << <span class="stringliteral">"'"</span> << endl; <a name="l01394"></a>01394 <span class="preprocessor">#endif</span> <a name="l01395"></a>01395 <span class="preprocessor"></span> <a name="l01396"></a>01396 <span class="comment">// RFC 2298: An MDN MUST NOT be generated in response to an MDN.</span> <a name="l01397"></a>01397 <span class="keywordflow">if</span> ( <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( DwMime::kTypeMessage, <a name="l01398"></a>01398 DwMime::kSubtypeDispositionNotification ) ) { <a name="l01399"></a>01399 setMDNSentState( KMMsgMDNIgnore ); <a name="l01400"></a>01400 <span class="keywordflow">return</span> 0; <a name="l01401"></a>01401 } <a name="l01402"></a>01402 <a name="l01403"></a>01403 <span class="comment">// extract where to send to:</span> <a name="l01404"></a>01404 QString receiptTo = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Disposition-Notification-To"</span>); <a name="l01405"></a>01405 <span class="keywordflow">if</span> ( receiptTo.stripWhiteSpace().isEmpty() ) <span class="keywordflow">return</span> 0; <a name="l01406"></a>01406 receiptTo.remove( <span class="charliteral">'\n'</span> ); <a name="l01407"></a>01407 <a name="l01408"></a>01408 <a name="l01409"></a>01409 MDN::SendingMode s = MDN::SentAutomatically; <span class="comment">// set to manual if asked user</span> <a name="l01410"></a>01410 QString special; <span class="comment">// fill in case of error, warning or failure</span> <a name="l01411"></a>01411 KConfigGroup mdnConfig( KMKernel::config(), <span class="stringliteral">"MDN"</span> ); <a name="l01412"></a>01412 <a name="l01413"></a>01413 <span class="comment">// default:</span> <a name="l01414"></a>01414 <span class="keywordtype">int</span> mode = mdnConfig.readNumEntry( <span class="stringliteral">"default-policy"</span>, 0 ); <a name="l01415"></a>01415 <span class="keywordflow">if</span> ( !mode || mode < 0 || mode > 3 ) { <a name="l01416"></a>01416 <span class="comment">// early out for ignore:</span> <a name="l01417"></a>01417 setMDNSentState( KMMsgMDNIgnore ); <a name="l01418"></a>01418 <span class="keywordflow">return</span> 0; <a name="l01419"></a>01419 } <a name="l01420"></a>01420 <a name="l01421"></a>01421 <span class="comment">// RFC 2298: An importance of "required" indicates that</span> <a name="l01422"></a>01422 <span class="comment">// interpretation of the parameter is necessary for proper</span> <a name="l01423"></a>01423 <span class="comment">// generation of an MDN in response to this request. If a UA does</span> <a name="l01424"></a>01424 <span class="comment">// not understand the meaning of the parameter, it MUST NOT generate</span> <a name="l01425"></a>01425 <span class="comment">// an MDN with any disposition type other than "failed" in response</span> <a name="l01426"></a>01426 <span class="comment">// to the request.</span> <a name="l01427"></a>01427 QString notificationOptions = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Disposition-Notification-Options"</span>); <a name="l01428"></a>01428 <span class="keywordflow">if</span> ( notificationOptions.contains( <span class="stringliteral">"required"</span>, <span class="keyword">false</span> ) ) { <a name="l01429"></a>01429 <span class="comment">// ### hacky; should parse...</span> <a name="l01430"></a>01430 <span class="comment">// There is a required option that we don't understand. We need to</span> <a name="l01431"></a>01431 <span class="comment">// ask the user what we should do:</span> <a name="l01432"></a>01432 <span class="keywordflow">if</span> ( !allowGUI ) <span class="keywordflow">return</span> 0; <span class="comment">// don't setMDNSentState here!</span> <a name="l01433"></a>01433 mode = requestAdviceOnMDN( <span class="stringliteral">"mdnUnknownOption"</span> ); <a name="l01434"></a>01434 s = MDN::SentManually; <a name="l01435"></a>01435 <a name="l01436"></a>01436 special = i18n(<span class="stringliteral">"Header \"Disposition-Notification-Options\" contained "</span> <a name="l01437"></a>01437 <span class="stringliteral">"required, but unknown parameter"</span>); <a name="l01438"></a>01438 d = MDN::Failed; <a name="l01439"></a>01439 m.clear(); <span class="comment">// clear modifiers</span> <a name="l01440"></a>01440 } <a name="l01441"></a>01441 <a name="l01442"></a>01442 <span class="comment">// RFC 2298: [ Confirmation from the user SHOULD be obtained (or no</span> <a name="l01443"></a>01443 <span class="comment">// MDN sent) ] if there is more than one distinct address in the</span> <a name="l01444"></a>01444 <span class="comment">// Disposition-Notification-To header.</span> <a name="l01445"></a>01445 kdDebug(5006) << <span class="stringliteral">"KPIM::splitEmailAddrList(receiptTo): "</span> <a name="l01446"></a>01446 << KPIM::splitEmailAddrList(receiptTo).join(<span class="stringliteral">"\n"</span>) << endl; <a name="l01447"></a>01447 <span class="keywordflow">if</span> ( KPIM::splitEmailAddrList(receiptTo).count() > 1 ) { <a name="l01448"></a>01448 <span class="keywordflow">if</span> ( !allowGUI ) <span class="keywordflow">return</span> 0; <span class="comment">// don't setMDNSentState here!</span> <a name="l01449"></a>01449 mode = requestAdviceOnMDN( <span class="stringliteral">"mdnMultipleAddressesInReceiptTo"</span> ); <a name="l01450"></a>01450 s = MDN::SentManually; <a name="l01451"></a>01451 } <a name="l01452"></a>01452 <a name="l01453"></a>01453 <span class="comment">// RFC 2298: MDNs SHOULD NOT be sent automatically if the address in</span> <a name="l01454"></a>01454 <span class="comment">// the Disposition-Notification-To header differs from the address</span> <a name="l01455"></a>01455 <span class="comment">// in the Return-Path header. [...] Confirmation from the user</span> <a name="l01456"></a>01456 <span class="comment">// SHOULD be obtained (or no MDN sent) if there is no Return-Path</span> <a name="l01457"></a>01457 <span class="comment">// header in the message [...]</span> <a name="l01458"></a>01458 AddrSpecList returnPathList = extractAddrSpecs(<span class="stringliteral">"Return-Path"</span>); <a name="l01459"></a>01459 QString returnPath = returnPathList.isEmpty() ? QString::null <a name="l01460"></a>01460 : returnPathList.front().localPart + <span class="charliteral">'@'</span> + returnPathList.front().domain ; <a name="l01461"></a>01461 kdDebug(5006) << <span class="stringliteral">"clean return path: "</span> << returnPath << endl; <a name="l01462"></a>01462 <span class="keywordflow">if</span> ( returnPath.isEmpty() || !receiptTo.contains( returnPath, <span class="keyword">false</span> ) ) { <a name="l01463"></a>01463 <span class="keywordflow">if</span> ( !allowGUI ) <span class="keywordflow">return</span> 0; <span class="comment">// don't setMDNSentState here!</span> <a name="l01464"></a>01464 mode = requestAdviceOnMDN( returnPath.isEmpty() ? <a name="l01465"></a>01465 <span class="stringliteral">"mdnReturnPathEmpty"</span> : <a name="l01466"></a>01466 <span class="stringliteral">"mdnReturnPathNotInReceiptTo"</span> ); <a name="l01467"></a>01467 s = MDN::SentManually; <a name="l01468"></a>01468 } <a name="l01469"></a>01469 <a name="l01470"></a>01470 <span class="keywordflow">if</span> ( a != KMime::MDN::AutomaticAction ) { <a name="l01471"></a>01471 <span class="comment">//TODO: only ingore user settings for AutomaticAction if requested</span> <a name="l01472"></a>01472 <span class="keywordflow">if</span> ( mode == 1 ) { <span class="comment">// ask</span> <a name="l01473"></a>01473 <span class="keywordflow">if</span> ( !allowGUI ) <span class="keywordflow">return</span> 0; <span class="comment">// don't setMDNSentState here!</span> <a name="l01474"></a>01474 mode = requestAdviceOnMDN( <span class="stringliteral">"mdnNormalAsk"</span> ); <a name="l01475"></a>01475 s = MDN::SentManually; <span class="comment">// asked user</span> <a name="l01476"></a>01476 } <a name="l01477"></a>01477 <a name="l01478"></a>01478 <span class="keywordflow">switch</span> ( mode ) { <a name="l01479"></a>01479 <span class="keywordflow">case</span> 0: <span class="comment">// ignore:</span> <a name="l01480"></a>01480 setMDNSentState( KMMsgMDNIgnore ); <a name="l01481"></a>01481 <span class="keywordflow">return</span> 0; <a name="l01482"></a>01482 <span class="keywordflow">default</span>: <a name="l01483"></a>01483 <span class="keywordflow">case</span> 1: <a name="l01484"></a>01484 kdFatal(5006) << <span class="stringliteral">"KMMessage::createMDN(): The \"ask\" mode should "</span> <a name="l01485"></a>01485 << <span class="stringliteral">"never appear here!"</span> << endl; <a name="l01486"></a>01486 <span class="keywordflow">break</span>; <a name="l01487"></a>01487 <span class="keywordflow">case</span> 2: <span class="comment">// deny</span> <a name="l01488"></a>01488 d = MDN::Denied; <a name="l01489"></a>01489 m.clear(); <a name="l01490"></a>01490 <span class="keywordflow">break</span>; <a name="l01491"></a>01491 <span class="keywordflow">case</span> 3: <a name="l01492"></a>01492 <span class="keywordflow">break</span>; <a name="l01493"></a>01493 } <a name="l01494"></a>01494 } <a name="l01495"></a>01495 <a name="l01496"></a>01496 <a name="l01497"></a>01497 <span class="comment">// extract where to send from:</span> <a name="l01498"></a>01498 QString finalRecipient = kmkernel->identityManager() <a name="l01499"></a>01499 ->identityForUoidOrDefault( <a class="code" href="classKMMessage.html#c48977675781b8337b2bee6487070ac4">identityUoid</a>() ).fullEmailAddr(); <a name="l01500"></a>01500 <a name="l01501"></a>01501 <span class="comment">//</span> <a name="l01502"></a>01502 <span class="comment">// Generate message:</span> <a name="l01503"></a>01503 <span class="comment">//</span> <a name="l01504"></a>01504 <a name="l01505"></a>01505 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> * receipt = <span class="keyword">new</span> <a class="code" href="classKMMessage.html#cdefe60902b88abc22b706bd89aede61" title="Straight forward initialization.">KMMessage</a>(); <a name="l01506"></a>01506 receipt-><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">initFromMessage</a>( <span class="keyword">this</span> ); <a name="l01507"></a>01507 receipt-><a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Content-Type"</span>); <a name="l01508"></a>01508 receipt-><a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Content-Transfer-Encoding"</span>); <a name="l01509"></a>01509 <span class="comment">// Modify the ContentType directly (replaces setAutomaticFields(true))</span> <a name="l01510"></a>01510 DwHeaders & header = receipt-><a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>->Headers(); <a name="l01511"></a>01511 header.MimeVersion().FromString(<span class="stringliteral">"1.0"</span>); <a name="l01512"></a>01512 DwMediaType & contentType = receipt-><a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>(); <a name="l01513"></a>01513 contentType.SetType( DwMime::kTypeMultipart ); <a name="l01514"></a>01514 contentType.SetSubtype( DwMime::kSubtypeReport ); <a name="l01515"></a>01515 contentType.CreateBoundary(0); <a name="l01516"></a>01516 receipt-><a class="code" href="classKMMessage.html#32e5730c58e6434c27cda32566cc99b3">mNeedsAssembly</a> = <span class="keyword">true</span>; <a name="l01517"></a>01517 receipt-><a class="code" href="classKMMessage.html#8e90f98312878b54680d11e0d332c006" title="add or change a parameter of the Content-Type field">setContentTypeParam</a>( <span class="stringliteral">"report-type"</span>, <span class="stringliteral">"disposition-notification"</span> ); <a name="l01518"></a>01518 <a name="l01519"></a>01519 QString description = <a class="code" href="classKMMessage.html#c3324fb4b60066c9ae2d295421d76870" title="Replaces every occurrence of &quot;${foo}&quot; in s with headerField(&quot;foo&quot;)...">replaceHeadersInString</a>( MDN::descriptionFor( d, m ) ); <a name="l01520"></a>01520 <a name="l01521"></a>01521 <span class="comment">// text/plain part:</span> <a name="l01522"></a>01522 KMMessagePart firstMsgPart; <a name="l01523"></a>01523 firstMsgPart.setTypeStr( <span class="stringliteral">"text"</span> ); <a name="l01524"></a>01524 firstMsgPart.setSubtypeStr( <span class="stringliteral">"plain"</span> ); <a name="l01525"></a>01525 firstMsgPart.setBodyFromUnicode( description ); <a name="l01526"></a>01526 receipt-><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &firstMsgPart ); <a name="l01527"></a>01527 <a name="l01528"></a>01528 <span class="comment">// message/disposition-notification part:</span> <a name="l01529"></a>01529 KMMessagePart secondMsgPart; <a name="l01530"></a>01530 secondMsgPart.setType( DwMime::kTypeMessage ); <a name="l01531"></a>01531 secondMsgPart.setSubtype( DwMime::kSubtypeDispositionNotification ); <a name="l01532"></a>01532 <span class="comment">//secondMsgPart.setCharset( "us-ascii" );</span> <a name="l01533"></a>01533 <span class="comment">//secondMsgPart.setCteStr( "7bit" );</span> <a name="l01534"></a>01534 secondMsgPart.setBodyEncoded( MDN::dispositionNotificationBodyContent( <a name="l01535"></a>01535 finalRecipient, <a name="l01536"></a>01536 <a class="code" href="classKMMessage.html#7fdcc69aab16473b8031e02e0505763d" title="Returns the raw value of a header field with the given name.">rawHeaderField</a>(<span class="stringliteral">"Original-Recipient"</span>), <a name="l01537"></a>01537 <span class="keywordtype">id</span>(), <span class="comment">/* Message-ID */</span> <a name="l01538"></a>01538 d, a, s, m, special ) ); <a name="l01539"></a>01539 receipt-><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &secondMsgPart ); <a name="l01540"></a>01540 <a name="l01541"></a>01541 <span class="comment">// message/rfc822 or text/rfc822-headers body part:</span> <a name="l01542"></a>01542 <span class="keywordtype">int</span> num = mdnConfig.readNumEntry( <span class="stringliteral">"quote-message"</span>, 0 ); <a name="l01543"></a>01543 <span class="keywordflow">if</span> ( num < 0 || num > 2 ) num = 0; <a name="l01544"></a>01544 MDN::ReturnContent returnContent = <span class="keyword">static_cast<</span>MDN::ReturnContent<span class="keyword">></span>( num ); <a name="l01545"></a>01545 <a name="l01546"></a>01546 KMMessagePart thirdMsgPart; <a name="l01547"></a>01547 <span class="keywordflow">switch</span> ( returnContent ) { <a name="l01548"></a>01548 <span class="keywordflow">case</span> MDN::All: <a name="l01549"></a>01549 thirdMsgPart.setTypeStr( <span class="stringliteral">"message"</span> ); <a name="l01550"></a>01550 thirdMsgPart.setSubtypeStr( <span class="stringliteral">"rfc822"</span> ); <a name="l01551"></a>01551 thirdMsgPart.setBody( <a class="code" href="classKMMessage.html#22bfa4746658b7b032029c381c746b07" title="Return the message contents with the headers that should not be sent stripped off...">asSendableString</a>() ); <a name="l01552"></a>01552 receipt-><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &thirdMsgPart ); <a name="l01553"></a>01553 <span class="keywordflow">break</span>; <a name="l01554"></a>01554 <span class="keywordflow">case</span> MDN::HeadersOnly: <a name="l01555"></a>01555 thirdMsgPart.setTypeStr( <span class="stringliteral">"text"</span> ); <a name="l01556"></a>01556 thirdMsgPart.setSubtypeStr( <span class="stringliteral">"rfc822-headers"</span> ); <a name="l01557"></a>01557 thirdMsgPart.setBody( <a class="code" href="classKMMessage.html#90d9a07ca47902ce8bb7674286d9aa26" title="Return the message header with the headers that should not be sent stripped off.">headerAsSendableString</a>() ); <a name="l01558"></a>01558 receipt-><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &thirdMsgPart ); <a name="l01559"></a>01559 <span class="keywordflow">break</span>; <a name="l01560"></a>01560 <span class="keywordflow">case</span> MDN::Nothing: <a name="l01561"></a>01561 <span class="keywordflow">default</span>: <a name="l01562"></a>01562 <span class="keywordflow">break</span>; <a name="l01563"></a>01563 }; <a name="l01564"></a>01564 <a name="l01565"></a>01565 receipt-><a class="code" href="classKMMessage.html#5bb40f8b006d66c80cff9a43fa3018d6">setTo</a>( receiptTo ); <a name="l01566"></a>01566 receipt-><a class="code" href="classKMMessage.html#dc02d16017d248f9f7c9dc980aee25b4">setSubject</a>( <span class="stringliteral">"Message Disposition Notification"</span> ); <a name="l01567"></a>01567 receipt-><a class="code" href="classKMMessage.html#f1b40aad4353b8e2199701c4650456b8">setReplyToId</a>( <a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &#39;Message-Id&#39; header field.">msgId</a>() ); <a name="l01568"></a>01568 receipt-><a class="code" href="classKMMessage.html#913eeb9b59c05f0cd47421cce084a066">setReferences</a>( <a class="code" href="classKMMessage.html#bc854b6e0a96fe46b7d7fa3bdd809ac9" title="Creates reference string for reply to messages.">getRefStr</a>() ); <a name="l01569"></a>01569 <a name="l01570"></a>01570 receipt-><a class="code" href="classKMMessage.html#c3593abb0275a61f2206eaf51435d64d" title="Removes empty fields from the header, e.g.">cleanupHeader</a>(); <a name="l01571"></a>01571 <a name="l01572"></a>01572 kdDebug(5006) << <span class="stringliteral">"final message:\n"</span> + receipt-><a class="code" href="classKMMessage.html#b9b4e74c3446bce61e34201fd1e793d8" title="Return the entire message contents as a string.">asString</a>() << endl; <a name="l01573"></a>01573 <a name="l01574"></a>01574 <span class="comment">//</span> <a name="l01575"></a>01575 <span class="comment">// Set "MDN sent" status:</span> <a name="l01576"></a>01576 <span class="comment">//</span> <a name="l01577"></a>01577 KMMsgMDNSentState state = KMMsgMDNStateUnknown; <a name="l01578"></a>01578 <span class="keywordflow">switch</span> ( d ) { <a name="l01579"></a>01579 <span class="keywordflow">case</span> MDN::Displayed: state = KMMsgMDNDisplayed; <span class="keywordflow">break</span>; <a name="l01580"></a>01580 <span class="keywordflow">case</span> MDN::Deleted: state = KMMsgMDNDeleted; <span class="keywordflow">break</span>; <a name="l01581"></a>01581 <span class="keywordflow">case</span> MDN::Dispatched: state = KMMsgMDNDispatched; <span class="keywordflow">break</span>; <a name="l01582"></a>01582 <span class="keywordflow">case</span> MDN::Processed: state = KMMsgMDNProcessed; <span class="keywordflow">break</span>; <a name="l01583"></a>01583 <span class="keywordflow">case</span> MDN::Denied: state = KMMsgMDNDenied; <span class="keywordflow">break</span>; <a name="l01584"></a>01584 <span class="keywordflow">case</span> MDN::Failed: state = KMMsgMDNFailed; <span class="keywordflow">break</span>; <a name="l01585"></a>01585 }; <a name="l01586"></a>01586 setMDNSentState( state ); <a name="l01587"></a>01587 <a name="l01588"></a>01588 <span class="keywordflow">return</span> receipt; <a name="l01589"></a>01589 } <a name="l01590"></a>01590 <a name="l01591"></a><a class="code" href="classKMMessage.html#c3324fb4b60066c9ae2d295421d76870">01591</a> QString <a class="code" href="classKMMessage.html#c3324fb4b60066c9ae2d295421d76870" title="Replaces every occurrence of &quot;${foo}&quot; in s with headerField(&quot;foo&quot;)...">KMMessage::replaceHeadersInString</a>( <span class="keyword">const</span> QString & s )<span class="keyword"> const </span>{ <a name="l01592"></a>01592 QString result = s; <a name="l01593"></a>01593 QRegExp rx( <span class="stringliteral">"\\$\\{([a-z0-9-]+)\\}"</span>, <span class="keyword">false</span> ); <a name="l01594"></a>01594 Q_ASSERT( rx.isValid() ); <a name="l01595"></a>01595 <a name="l01596"></a>01596 QRegExp rxDate( <span class="stringliteral">"\\$\\{date\\}"</span> ); <a name="l01597"></a>01597 Q_ASSERT( rxDate.isValid() ); <a name="l01598"></a>01598 <a name="l01599"></a>01599 QString sDate = KMime::DateFormatter::formatDate( <a name="l01600"></a>01600 KMime::DateFormatter::Localized, date() ); <a name="l01601"></a>01601 <a name="l01602"></a>01602 <span class="keywordtype">int</span> idx = 0; <a name="l01603"></a>01603 <span class="keywordflow">if</span>( ( idx = rxDate.search( result, idx ) ) != -1 ) { <a name="l01604"></a>01604 result.replace( idx, rxDate.matchedLength(), sDate ); <a name="l01605"></a>01605 } <a name="l01606"></a>01606 <a name="l01607"></a>01607 idx = 0; <a name="l01608"></a>01608 <span class="keywordflow">while</span> ( ( idx = rx.search( result, idx ) ) != -1 ) { <a name="l01609"></a>01609 QString replacement = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( rx.cap(1).latin1() ); <a name="l01610"></a>01610 result.replace( idx, rx.matchedLength(), replacement ); <a name="l01611"></a>01611 idx += replacement.length(); <a name="l01612"></a>01612 } <a name="l01613"></a>01613 <span class="keywordflow">return</span> result; <a name="l01614"></a>01614 } <a name="l01615"></a>01615 <a name="l01616"></a><a class="code" href="classKMMessage.html#6ba60b89f95b9bef64f944ef59118054">01616</a> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* <a class="code" href="classKMMessage.html#6ba60b89f95b9bef64f944ef59118054" title="Create a new message that is a delivery receipt of this message, filling required...">KMMessage::createDeliveryReceipt</a>()<span class="keyword"> const</span> <a name="l01617"></a>01617 <span class="keyword"></span>{ <a name="l01618"></a>01618 QString str, receiptTo; <a name="l01619"></a>01619 <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> *receipt; <a name="l01620"></a>01620 <a name="l01621"></a>01621 receiptTo = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Disposition-Notification-To"</span>); <a name="l01622"></a>01622 <span class="keywordflow">if</span> ( receiptTo.stripWhiteSpace().isEmpty() ) <span class="keywordflow">return</span> 0; <a name="l01623"></a>01623 receiptTo.remove( <span class="charliteral">'\n'</span> ); <a name="l01624"></a>01624 <a name="l01625"></a>01625 receipt = <span class="keyword">new</span> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>; <a name="l01626"></a>01626 receipt-><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">initFromMessage</a>(<span class="keyword">this</span>); <a name="l01627"></a>01627 receipt-><a class="code" href="classKMMessage.html#5bb40f8b006d66c80cff9a43fa3018d6">setTo</a>(receiptTo); <a name="l01628"></a>01628 receipt-><a class="code" href="classKMMessage.html#dc02d16017d248f9f7c9dc980aee25b4">setSubject</a>(i18n(<span class="stringliteral">"Receipt: "</span>) + <a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda" title="Get or set the &#39;Subject&#39; header field.">subject</a>()); <a name="l01629"></a>01629 <a name="l01630"></a>01630 str = <span class="stringliteral">"Your message was successfully delivered."</span>; <a name="l01631"></a>01631 str += <span class="stringliteral">"\n\n---------- Message header follows ----------\n"</span>; <a name="l01632"></a>01632 str += <a class="code" href="classKMMessage.html#81a56c11d9920301421152b9e0afc45d" title="Return header as string.">headerAsString</a>(); <a name="l01633"></a>01633 str += <span class="stringliteral">"--------------------------------------------\n"</span>; <a name="l01634"></a>01634 <span class="comment">// Conversion to latin1 is correct here as Mail headers should contain</span> <a name="l01635"></a>01635 <span class="comment">// ascii only</span> <a name="l01636"></a>01636 receipt-><a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7" title="Set the message body.">setBody</a>(str.latin1()); <a name="l01637"></a>01637 receipt-><a class="code" href="classKMMessage.html#3d877210924a2a0ba380e0ef11ff4e10" title="Set fields that are either automatically set (Message-id) or that do not change from...">setAutomaticFields</a>(); <a name="l01638"></a>01638 <a name="l01639"></a>01639 <span class="keywordflow">return</span> receipt; <a name="l01640"></a>01640 } <a name="l01641"></a>01641 <a name="l01642"></a>01642 <a name="l01643"></a><a class="code" href="classKMMessage.html#af14defee2f25d286fb7019688008280">01643</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#af14defee2f25d286fb7019688008280" title="Set the from, to, cc, bcc, encrytion etc headers as specified in the given identity...">KMMessage::applyIdentity</a>( uint <span class="keywordtype">id</span> ) <a name="l01644"></a>01644 { <a name="l01645"></a>01645 <span class="keyword">const</span> KPIM::Identity & ident = <a name="l01646"></a>01646 kmkernel->identityManager()->identityForUoidOrDefault( <span class="keywordtype">id</span> ); <a name="l01647"></a>01647 <a name="l01648"></a>01648 <span class="keywordflow">if</span>(ident.fullEmailAddr().isEmpty()) <a name="l01649"></a>01649 setFrom(<span class="stringliteral">""</span>); <a name="l01650"></a>01650 <span class="keywordflow">else</span> <a name="l01651"></a>01651 setFrom(ident.fullEmailAddr()); <a name="l01652"></a>01652 <a name="l01653"></a>01653 <span class="keywordflow">if</span>(ident.replyToAddr().isEmpty()) <a name="l01654"></a>01654 setReplyTo(<span class="stringliteral">""</span>); <a name="l01655"></a>01655 <span class="keywordflow">else</span> <a name="l01656"></a>01656 setReplyTo(ident.replyToAddr()); <a name="l01657"></a>01657 <a name="l01658"></a>01658 <span class="keywordflow">if</span>(ident.bcc().isEmpty()) <a name="l01659"></a>01659 setBcc(<span class="stringliteral">""</span>); <a name="l01660"></a>01660 <span class="keywordflow">else</span> <a name="l01661"></a>01661 setBcc(ident.bcc()); <a name="l01662"></a>01662 <a name="l01663"></a>01663 <span class="keywordflow">if</span> (ident.organization().isEmpty()) <a name="l01664"></a>01664 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"Organization"</span>); <a name="l01665"></a>01665 <span class="keywordflow">else</span> <a name="l01666"></a>01666 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"Organization"</span>, ident.organization()); <a name="l01667"></a>01667 <a name="l01668"></a>01668 <span class="keywordflow">if</span> (ident.isDefault()) <a name="l01669"></a>01669 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>(<span class="stringliteral">"X-KMail-Identity"</span>); <a name="l01670"></a>01670 <span class="keywordflow">else</span> <a name="l01671"></a>01671 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-Identity"</span>, QString::number( ident.uoid() )); <a name="l01672"></a>01672 <a name="l01673"></a>01673 <span class="keywordflow">if</span> ( ident.transport().isEmpty() ) <a name="l01674"></a>01674 <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">removeHeaderField</a>( <span class="stringliteral">"X-KMail-Transport"</span> ); <a name="l01675"></a>01675 <span class="keywordflow">else</span> <a name="l01676"></a>01676 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"X-KMail-Transport"</span>, ident.transport() ); <a name="l01677"></a>01677 <a name="l01678"></a>01678 <span class="keywordflow">if</span> ( ident.fcc().isEmpty() ) <a name="l01679"></a>01679 setFcc( QString::null ); <a name="l01680"></a>01680 <span class="keywordflow">else</span> <a name="l01681"></a>01681 setFcc( ident.fcc() ); <a name="l01682"></a>01682 <a name="l01683"></a>01683 <span class="keywordflow">if</span> ( ident.drafts().isEmpty() ) <a name="l01684"></a>01684 setDrafts( QString::null ); <a name="l01685"></a>01685 <span class="keywordflow">else</span> <a name="l01686"></a>01686 setDrafts( ident.drafts() ); <a name="l01687"></a>01687 <a name="l01688"></a>01688 <span class="keywordflow">if</span> ( ident.templates().isEmpty() ) <a name="l01689"></a>01689 setTemplates( QString::null ); <a name="l01690"></a>01690 <span class="keywordflow">else</span> <a name="l01691"></a>01691 setTemplates( ident.templates() ); <a name="l01692"></a>01692 <a name="l01693"></a>01693 } <a name="l01694"></a>01694 <a name="l01695"></a>01695 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01696"></a><a class="code" href="classKMMessage.html#f3fe6794874214ffa4ad07a3992590e7">01696</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#f3fe6794874214ffa4ad07a3992590e7" title="Initialize header fields.">KMMessage::initHeader</a>( uint <span class="keywordtype">id</span> ) <a name="l01697"></a>01697 { <a name="l01698"></a>01698 <a class="code" href="classKMMessage.html#af14defee2f25d286fb7019688008280" title="Set the from, to, cc, bcc, encrytion etc headers as specified in the given identity...">applyIdentity</a>( <span class="keywordtype">id</span> ); <a name="l01699"></a>01699 setTo(<span class="stringliteral">""</span>); <a name="l01700"></a>01700 setSubject(<span class="stringliteral">""</span>); <a name="l01701"></a>01701 <a class="code" href="classKMMessage.html#2c0f165afcca50d3b7f5a03bc29d42b6" title="Set the &#39;Date&#39; header field to the current date.">setDateToday</a>(); <a name="l01702"></a>01702 <a name="l01703"></a>01703 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"User-Agent"</span>, <span class="stringliteral">"KMail/"</span> KMAIL_VERSION ); <a name="l01704"></a>01704 <span class="comment">// This will allow to change Content-Type:</span> <a name="l01705"></a>01705 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"Content-Type"</span>,<span class="stringliteral">"text/plain"</span>); <a name="l01706"></a>01706 } <a name="l01707"></a>01707 <a name="l01708"></a><a class="code" href="classKMMessage.html#c48977675781b8337b2bee6487070ac4">01708</a> uint <a class="code" href="classKMMessage.html#c48977675781b8337b2bee6487070ac4">KMMessage::identityUoid</a>()<span class="keyword"> const </span>{ <a name="l01709"></a>01709 QString idString = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-Identity"</span>).stripWhiteSpace(); <a name="l01710"></a>01710 <span class="keywordtype">bool</span> ok = <span class="keyword">false</span>; <a name="l01711"></a>01711 <span class="keywordtype">int</span> <span class="keywordtype">id</span> = idString.toUInt( &ok ); <a name="l01712"></a>01712 <a name="l01713"></a>01713 <span class="keywordflow">if</span> ( !ok || <span class="keywordtype">id</span> == 0 ) <a name="l01714"></a>01714 <span class="keywordtype">id</span> = kmkernel->identityManager()->identityForAddress( <a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>() + <span class="stringliteral">", "</span> + <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>() ).uoid(); <a name="l01715"></a>01715 <span class="keywordflow">if</span> ( <span class="keywordtype">id</span> == 0 && parent() ) <a name="l01716"></a>01716 <span class="keywordtype">id</span> = parent()->identity(); <a name="l01717"></a>01717 <a name="l01718"></a>01718 <span class="keywordflow">return</span> id; <a name="l01719"></a>01719 } <a name="l01720"></a>01720 <a name="l01721"></a>01721 <a name="l01722"></a>01722 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01723"></a><a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca">01723</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#bf1ee113db641a10046e49c3986e00ca" title="Initialize headers fields according to the identity and the transport header of the...">KMMessage::initFromMessage</a>(<span class="keyword">const</span> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> *msg, <span class="keywordtype">bool</span> idHeaders) <a name="l01724"></a>01724 { <a name="l01725"></a>01725 uint <span class="keywordtype">id</span> = msg-><a class="code" href="classKMMessage.html#c48977675781b8337b2bee6487070ac4">identityUoid</a>(); <a name="l01726"></a>01726 <a name="l01727"></a>01727 <span class="keywordflow">if</span> ( idHeaders ) <a class="code" href="classKMMessage.html#f3fe6794874214ffa4ad07a3992590e7" title="Initialize header fields.">initHeader</a>(<span class="keywordtype">id</span>); <a name="l01728"></a>01728 <span class="keywordflow">else</span> <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-Identity"</span>, QString::number(<span class="keywordtype">id</span>)); <a name="l01729"></a>01729 <span class="keywordflow">if</span> (!msg-><a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-Transport"</span>).isEmpty()) <a name="l01730"></a>01730 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-Transport"</span>, msg-><a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-Transport"</span>)); <a name="l01731"></a>01731 } <a name="l01732"></a>01732 <a name="l01733"></a>01733 <a name="l01734"></a>01734 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01735"></a><a class="code" href="classKMMessage.html#c3593abb0275a61f2206eaf51435d64d">01735</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#c3593abb0275a61f2206eaf51435d64d" title="Removes empty fields from the header, e.g.">KMMessage::cleanupHeader</a>() <a name="l01736"></a>01736 { <a name="l01737"></a>01737 DwHeaders& header = mMsg->Headers(); <a name="l01738"></a>01738 DwField* field = header.FirstField(); <a name="l01739"></a>01739 DwField* nextField; <a name="l01740"></a>01740 <a name="l01741"></a>01741 <span class="keywordflow">if</span> (mNeedsAssembly) mMsg->Assemble(); <a name="l01742"></a>01742 mNeedsAssembly = <span class="keyword">false</span>; <a name="l01743"></a>01743 <a name="l01744"></a>01744 <span class="keywordflow">while</span> (field) <a name="l01745"></a>01745 { <a name="l01746"></a>01746 nextField = field->Next(); <a name="l01747"></a>01747 <span class="keywordflow">if</span> (field->FieldBody()->AsString().empty()) <a name="l01748"></a>01748 { <a name="l01749"></a>01749 header.RemoveField(field); <a name="l01750"></a>01750 mNeedsAssembly = <span class="keyword">true</span>; <a name="l01751"></a>01751 } <a name="l01752"></a>01752 field = nextField; <a name="l01753"></a>01753 } <a name="l01754"></a>01754 } <a name="l01755"></a>01755 <a name="l01756"></a>01756 <a name="l01757"></a>01757 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01758"></a><a class="code" href="classKMMessage.html#3d877210924a2a0ba380e0ef11ff4e10">01758</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#3d877210924a2a0ba380e0ef11ff4e10" title="Set fields that are either automatically set (Message-id) or that do not change from...">KMMessage::setAutomaticFields</a>(<span class="keywordtype">bool</span> aIsMulti) <a name="l01759"></a>01759 { <a name="l01760"></a>01760 DwHeaders& header = mMsg->Headers(); <a name="l01761"></a>01761 header.MimeVersion().FromString(<span class="stringliteral">"1.0"</span>); <a name="l01762"></a>01762 <a name="l01763"></a>01763 <span class="keywordflow">if</span> (aIsMulti || <a class="code" href="classKMMessage.html#bf2ef4edbfad52a94367b31e248345e8" title="Number of body parts the message has.">numBodyParts</a>() > 1) <a name="l01764"></a>01764 { <a name="l01765"></a>01765 <span class="comment">// Set the type to 'Multipart' and the subtype to 'Mixed'</span> <a name="l01766"></a>01766 DwMediaType& contentType = <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>(); <a name="l01767"></a>01767 contentType.SetType( DwMime::kTypeMultipart); <a name="l01768"></a>01768 contentType.SetSubtype(DwMime::kSubtypeMixed ); <a name="l01769"></a>01769 <a name="l01770"></a>01770 <span class="comment">// Create a random printable string and set it as the boundary parameter</span> <a name="l01771"></a>01771 contentType.CreateBoundary(0); <a name="l01772"></a>01772 } <a name="l01773"></a>01773 mNeedsAssembly = <span class="keyword">true</span>; <a name="l01774"></a>01774 } <a name="l01775"></a>01775 <a name="l01776"></a>01776 <a name="l01777"></a>01777 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01778"></a><a class="code" href="classKMMessage.html#dc0c5523e610a960a4d913d7e27ff04a">01778</a> QString <a class="code" href="classKMMessage.html#dc0c5523e610a960a4d913d7e27ff04a" title="Get or set the &#39;Date&#39; header field.">KMMessage::dateStr</a>()<span class="keyword"> const</span> <a name="l01779"></a>01779 <span class="keyword"></span>{ <a name="l01780"></a>01780 KConfigGroup general( KMKernel::config(), <span class="stringliteral">"General"</span> ); <a name="l01781"></a>01781 DwHeaders& header = mMsg->Headers(); <a name="l01782"></a>01782 time_t unixTime; <a name="l01783"></a>01783 <a name="l01784"></a>01784 <span class="keywordflow">if</span> (!header.HasDate()) <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l01785"></a>01785 unixTime = header.Date().AsUnixTime(); <a name="l01786"></a>01786 <a name="l01787"></a>01787 <span class="comment">//kdDebug(5006)<<"#### Date = "<<header.Date().AsString().c_str()<<endl;</span> <a name="l01788"></a>01788 <a name="l01789"></a>01789 <span class="keywordflow">return</span> KMime::DateFormatter::formatDate( <a name="l01790"></a>01790 static_cast<KMime::DateFormatter::FormatType>(general.readNumEntry( <span class="stringliteral">"dateFormat"</span>, KMime::DateFormatter::Fancy )), <a name="l01791"></a>01791 unixTime, general.readEntry( <span class="stringliteral">"customDateFormat"</span> )); <a name="l01792"></a>01792 } <a name="l01793"></a>01793 <a name="l01794"></a>01794 <a name="l01795"></a>01795 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01796"></a><a class="code" href="classKMMessage.html#571d8a05d72eac05cc0bacffa0fae4c5">01796</a> QCString <a class="code" href="classKMMessage.html#571d8a05d72eac05cc0bacffa0fae4c5" title="Returns the message date in asctime format or an empty string if the message lacks...">KMMessage::dateShortStr</a>()<span class="keyword"> const</span> <a name="l01797"></a>01797 <span class="keyword"></span>{ <a name="l01798"></a>01798 DwHeaders& header = mMsg->Headers(); <a name="l01799"></a>01799 time_t unixTime; <a name="l01800"></a>01800 <a name="l01801"></a>01801 <span class="keywordflow">if</span> (!header.HasDate()) <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l01802"></a>01802 unixTime = header.Date().AsUnixTime(); <a name="l01803"></a>01803 <a name="l01804"></a>01804 QCString result = ctime(&unixTime); <a name="l01805"></a>01805 <span class="keywordtype">int</span> len = result.length(); <a name="l01806"></a>01806 <span class="keywordflow">if</span> (result[len-1]==<span class="charliteral">'\n'</span>) <a name="l01807"></a>01807 result.truncate(len-1); <a name="l01808"></a>01808 <a name="l01809"></a>01809 <span class="keywordflow">return</span> result; <a name="l01810"></a>01810 } <a name="l01811"></a>01811 <a name="l01812"></a>01812 <a name="l01813"></a>01813 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01814"></a>01814 QString KMMessage::dateIsoStr()<span class="keyword"> const</span> <a name="l01815"></a>01815 <span class="keyword"></span>{ <a name="l01816"></a>01816 DwHeaders& header = mMsg->Headers(); <a name="l01817"></a>01817 time_t unixTime; <a name="l01818"></a>01818 <a name="l01819"></a>01819 <span class="keywordflow">if</span> (!header.HasDate()) <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l01820"></a>01820 unixTime = header.Date().AsUnixTime(); <a name="l01821"></a>01821 <a name="l01822"></a>01822 <span class="keywordtype">char</span> cstr[64]; <a name="l01823"></a>01823 strftime(cstr, 63, <span class="stringliteral">"%Y-%m-%d %H:%M:%S"</span>, localtime(&unixTime)); <a name="l01824"></a>01824 <span class="keywordflow">return</span> QString(cstr); <a name="l01825"></a>01825 } <a name="l01826"></a>01826 <a name="l01827"></a>01827 <a name="l01828"></a>01828 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01829"></a>01829 time_t KMMessage::date()<span class="keyword"> const</span> <a name="l01830"></a>01830 <span class="keyword"></span>{ <a name="l01831"></a>01831 time_t res = ( time_t )-1; <a name="l01832"></a>01832 DwHeaders& header = mMsg->Headers(); <a name="l01833"></a>01833 <span class="keywordflow">if</span> (header.HasDate()) <a name="l01834"></a>01834 res = header.Date().AsUnixTime(); <a name="l01835"></a>01835 <span class="keywordflow">return</span> res; <a name="l01836"></a>01836 } <a name="l01837"></a>01837 <a name="l01838"></a>01838 <a name="l01839"></a>01839 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01840"></a><a class="code" href="classKMMessage.html#2c0f165afcca50d3b7f5a03bc29d42b6">01840</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#2c0f165afcca50d3b7f5a03bc29d42b6" title="Set the &#39;Date&#39; header field to the current date.">KMMessage::setDateToday</a>() <a name="l01841"></a>01841 { <a name="l01842"></a>01842 <span class="keyword">struct </span>timeval tval; <a name="l01843"></a>01843 gettimeofday(&tval, 0); <a name="l01844"></a>01844 setDate((time_t)tval.tv_sec); <a name="l01845"></a>01845 } <a name="l01846"></a>01846 <a name="l01847"></a>01847 <a name="l01848"></a>01848 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01849"></a>01849 <span class="keywordtype">void</span> KMMessage::setDate(time_t aDate) <a name="l01850"></a>01850 { <a name="l01851"></a>01851 mDate = aDate; <a name="l01852"></a>01852 mMsg->Headers().Date().FromCalendarTime(aDate); <a name="l01853"></a>01853 mMsg->Headers().Date().Assemble(); <a name="l01854"></a>01854 mNeedsAssembly = <span class="keyword">true</span>; <a name="l01855"></a>01855 mDirty = <span class="keyword">true</span>; <a name="l01856"></a>01856 } <a name="l01857"></a>01857 <a name="l01858"></a>01858 <a name="l01859"></a>01859 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01860"></a>01860 <span class="keywordtype">void</span> KMMessage::setDate(<span class="keyword">const</span> QCString& aStr) <a name="l01861"></a>01861 { <a name="l01862"></a>01862 DwHeaders& header = mMsg->Headers(); <a name="l01863"></a>01863 <a name="l01864"></a>01864 header.Date().FromString(aStr); <a name="l01865"></a>01865 header.Date().Parse(); <a name="l01866"></a>01866 mNeedsAssembly = <span class="keyword">true</span>; <a name="l01867"></a>01867 mDirty = <span class="keyword">true</span>; <a name="l01868"></a>01868 <a name="l01869"></a>01869 <span class="keywordflow">if</span> (header.HasDate()) <a name="l01870"></a>01870 mDate = header.Date().AsUnixTime(); <a name="l01871"></a>01871 } <a name="l01872"></a>01872 <a name="l01873"></a>01873 <a name="l01874"></a>01874 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01875"></a><a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b">01875</a> QString <a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">KMMessage::to</a>()<span class="keyword"> const</span> <a name="l01876"></a>01876 <span class="keyword"></span>{ <a name="l01877"></a>01877 <span class="comment">// handle To same as Cc below, bug 80747</span> <a name="l01878"></a>01878 <span class="keywordflow">return</span> KPIM::normalizeAddressesAndDecodeIDNs( <a class="code" href="classKMMessage.html#f83509f2f6a758a9db87d5158f1e0321" title="Returns a list of the values of all header fields with the given name.">headerFields</a>( <span class="stringliteral">"To"</span> ).join( <span class="stringliteral">", "</span> ) ); <a name="l01879"></a>01879 } <a name="l01880"></a>01880 <a name="l01881"></a>01881 <a name="l01882"></a>01882 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01883"></a>01883 <span class="keywordtype">void</span> KMMessage::setTo(<span class="keyword">const</span> QString& aStr) <a name="l01884"></a>01884 { <a name="l01885"></a>01885 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"To"</span>, aStr, Address ); <a name="l01886"></a>01886 } <a name="l01887"></a>01887 <a name="l01888"></a>01888 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01889"></a>01889 QString KMMessage::toStrip()<span class="keyword"> const</span> <a name="l01890"></a>01890 <span class="keyword"></span>{ <a name="l01891"></a>01891 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616" title="This function generates a displayable string from a list of email addresses.">stripEmailAddr</a>( <a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &#39;To&#39; header field.">to</a>() ); <a name="l01892"></a>01892 } <a name="l01893"></a>01893 <a name="l01894"></a>01894 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01895"></a><a class="code" href="classKMMessage.html#0b6c3e40ef5369159f1f2abead43469e">01895</a> QString <a class="code" href="classKMMessage.html#0b6c3e40ef5369159f1f2abead43469e" title="Get or set the &#39;ReplyTo&#39; header field.">KMMessage::replyTo</a>()<span class="keyword"> const</span> <a name="l01896"></a>01896 <span class="keyword"></span>{ <a name="l01897"></a>01897 <span class="keywordflow">return</span> KPIM::normalizeAddressesAndDecodeIDNs( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Reply-To"</span>) ); <a name="l01898"></a>01898 } <a name="l01899"></a>01899 <a name="l01900"></a>01900 <a name="l01901"></a>01901 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01902"></a>01902 <span class="keywordtype">void</span> KMMessage::setReplyTo(<span class="keyword">const</span> QString& aStr) <a name="l01903"></a>01903 { <a name="l01904"></a>01904 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Reply-To"</span>, aStr, Address ); <a name="l01905"></a>01905 } <a name="l01906"></a>01906 <a name="l01907"></a>01907 <a name="l01908"></a>01908 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01909"></a>01909 <span class="keywordtype">void</span> KMMessage::setReplyTo(<a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a>* aMsg) <a name="l01910"></a>01910 { <a name="l01911"></a>01911 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Reply-To"</span>, aMsg-><a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(), Address ); <a name="l01912"></a>01912 } <a name="l01913"></a>01913 <a name="l01914"></a>01914 <a name="l01915"></a>01915 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01916"></a><a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a">01916</a> QString <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">KMMessage::cc</a>()<span class="keyword"> const</span> <a name="l01917"></a>01917 <span class="keyword"></span>{ <a name="l01918"></a>01918 <span class="comment">// get the combined contents of all Cc headers (as workaround for invalid</span> <a name="l01919"></a>01919 <span class="comment">// messages with multiple Cc headers)</span> <a name="l01920"></a>01920 <span class="keywordflow">return</span> KPIM::normalizeAddressesAndDecodeIDNs( <a class="code" href="classKMMessage.html#f83509f2f6a758a9db87d5158f1e0321" title="Returns a list of the values of all header fields with the given name.">headerFields</a>( <span class="stringliteral">"Cc"</span> ).join( <span class="stringliteral">", "</span> ) ); <a name="l01921"></a>01921 } <a name="l01922"></a>01922 <a name="l01923"></a>01923 <a name="l01924"></a>01924 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01925"></a>01925 <span class="keywordtype">void</span> KMMessage::setCc(<span class="keyword">const</span> QString& aStr) <a name="l01926"></a>01926 { <a name="l01927"></a>01927 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Cc"</span>, aStr, Address ); <a name="l01928"></a>01928 } <a name="l01929"></a>01929 <a name="l01930"></a>01930 <a name="l01931"></a>01931 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01932"></a>01932 QString KMMessage::ccStrip()<span class="keyword"> const</span> <a name="l01933"></a>01933 <span class="keyword"></span>{ <a name="l01934"></a>01934 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616" title="This function generates a displayable string from a list of email addresses.">stripEmailAddr</a>( <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &#39;Cc&#39; header field.">cc</a>() ); <a name="l01935"></a>01935 } <a name="l01936"></a>01936 <a name="l01937"></a>01937 <a name="l01938"></a>01938 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01939"></a><a class="code" href="classKMMessage.html#5c7f567c4f71da87ae5b116d84a83450">01939</a> QString <a class="code" href="classKMMessage.html#5c7f567c4f71da87ae5b116d84a83450" title="Get or set the &#39;Bcc&#39; header field.">KMMessage::bcc</a>()<span class="keyword"> const</span> <a name="l01940"></a>01940 <span class="keyword"></span>{ <a name="l01941"></a>01941 <span class="keywordflow">return</span> KPIM::normalizeAddressesAndDecodeIDNs( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Bcc"</span>) ); <a name="l01942"></a>01942 } <a name="l01943"></a>01943 <a name="l01944"></a>01944 <a name="l01945"></a>01945 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01946"></a>01946 <span class="keywordtype">void</span> KMMessage::setBcc(<span class="keyword">const</span> QString& aStr) <a name="l01947"></a>01947 { <a name="l01948"></a>01948 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"Bcc"</span>, aStr, Address ); <a name="l01949"></a>01949 } <a name="l01950"></a>01950 <a name="l01951"></a>01951 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01952"></a><a class="code" href="classKMMessage.html#c16dcba46572efe32ad85857847e8cdc">01952</a> QString <a class="code" href="classKMMessage.html#c16dcba46572efe32ad85857847e8cdc" title="Get or set the &#39;Fcc&#39; header field.">KMMessage::fcc</a>()<span class="keyword"> const</span> <a name="l01953"></a>01953 <span class="keyword"></span>{ <a name="l01954"></a>01954 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-KMail-Fcc"</span> ); <a name="l01955"></a>01955 } <a name="l01956"></a>01956 <a name="l01957"></a>01957 <a name="l01958"></a>01958 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01959"></a>01959 <span class="keywordtype">void</span> KMMessage::setFcc( <span class="keyword">const</span> QString &aStr ) <a name="l01960"></a>01960 { <a name="l01961"></a>01961 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"X-KMail-Fcc"</span>, aStr ); <a name="l01962"></a>01962 } <a name="l01963"></a>01963 <a name="l01964"></a>01964 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01965"></a>01965 <span class="keywordtype">void</span> KMMessage::setDrafts( <span class="keyword">const</span> QString &aStr ) <a name="l01966"></a>01966 { <a name="l01967"></a>01967 mDrafts = aStr; <a name="l01968"></a>01968 } <a name="l01969"></a>01969 <a name="l01970"></a>01970 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01971"></a>01971 <span class="keywordtype">void</span> KMMessage::setTemplates( <span class="keyword">const</span> QString &aStr ) <a name="l01972"></a>01972 { <a name="l01973"></a>01973 mTemplates = aStr; <a name="l01974"></a>01974 } <a name="l01975"></a>01975 <a name="l01976"></a>01976 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01977"></a><a class="code" href="classKMMessage.html#cdc3f23d572d421b649a4767cf52cdc9">01977</a> QString <a class="code" href="classKMMessage.html#cdc3f23d572d421b649a4767cf52cdc9" title="Get or set the &#39;Who&#39; header field.">KMMessage::who</a>()<span class="keyword"> const</span> <a name="l01978"></a>01978 <span class="keyword"></span>{ <a name="l01979"></a>01979 <span class="keywordflow">if</span> (mParent) <a name="l01980"></a>01980 <span class="keywordflow">return</span> KPIM::normalizeAddressesAndDecodeIDNs( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(mParent->whoField().utf8()) ); <a name="l01981"></a>01981 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>(); <a name="l01982"></a>01982 } <a name="l01983"></a>01983 <a name="l01984"></a>01984 <a name="l01985"></a>01985 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01986"></a><a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe">01986</a> QString <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">KMMessage::from</a>()<span class="keyword"> const</span> <a name="l01987"></a>01987 <span class="keyword"></span>{ <a name="l01988"></a>01988 <span class="keywordflow">return</span> KPIM::normalizeAddressesAndDecodeIDNs( <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"From"</span>) ); <a name="l01989"></a>01989 } <a name="l01990"></a>01990 <a name="l01991"></a>01991 <a name="l01992"></a>01992 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l01993"></a>01993 <span class="keywordtype">void</span> KMMessage::setFrom(<span class="keyword">const</span> QString& bStr) <a name="l01994"></a>01994 { <a name="l01995"></a>01995 QString aStr = bStr; <a name="l01996"></a>01996 <span class="keywordflow">if</span> (aStr.isNull()) <a name="l01997"></a>01997 aStr = <span class="stringliteral">""</span>; <a name="l01998"></a>01998 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"From"</span>, aStr, Address ); <a name="l01999"></a>01999 mDirty = <span class="keyword">true</span>; <a name="l02000"></a>02000 } <a name="l02001"></a>02001 <a name="l02002"></a>02002 <a name="l02003"></a>02003 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02004"></a>02004 QString KMMessage::fromStrip()<span class="keyword"> const</span> <a name="l02005"></a>02005 <span class="keyword"></span>{ <a name="l02006"></a>02006 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616" title="This function generates a displayable string from a list of email addresses.">stripEmailAddr</a>( <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &#39;From&#39; header field.">from</a>() ); <a name="l02007"></a>02007 } <a name="l02008"></a>02008 <a name="l02009"></a>02009 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02010"></a><a class="code" href="classKMMessage.html#27edbb00d94ce8115413f2ddb2b4f10b">02010</a> QString <a class="code" href="classKMMessage.html#27edbb00d94ce8115413f2ddb2b4f10b">KMMessage::sender</a>()<span class="keyword"> const </span>{ <a name="l02011"></a>02011 AddrSpecList asl = extractAddrSpecs( <span class="stringliteral">"Sender"</span> ); <a name="l02012"></a>02012 <span class="keywordflow">if</span> ( asl.empty() ) <a name="l02013"></a>02013 asl = extractAddrSpecs( <span class="stringliteral">"From"</span> ); <a name="l02014"></a>02014 <span class="keywordflow">if</span> ( asl.empty() ) <a name="l02015"></a>02015 <span class="keywordflow">return</span> QString::null; <a name="l02016"></a>02016 <span class="keywordflow">return</span> asl.front().asString(); <a name="l02017"></a>02017 } <a name="l02018"></a>02018 <a name="l02019"></a>02019 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02020"></a><a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda">02020</a> QString <a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda" title="Get or set the &#39;Subject&#39; header field.">KMMessage::subject</a>()<span class="keyword"> const</span> <a name="l02021"></a>02021 <span class="keyword"></span>{ <a name="l02022"></a>02022 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Subject"</span>); <a name="l02023"></a>02023 } <a name="l02024"></a>02024 <a name="l02025"></a>02025 <a name="l02026"></a>02026 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02027"></a>02027 <span class="keywordtype">void</span> KMMessage::setSubject(<span class="keyword">const</span> QString& aStr) <a name="l02028"></a>02028 { <a name="l02029"></a>02029 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"Subject"</span>,aStr); <a name="l02030"></a>02030 mDirty = <span class="keyword">true</span>; <a name="l02031"></a>02031 } <a name="l02032"></a>02032 <a name="l02033"></a>02033 <a name="l02034"></a>02034 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02035"></a><a class="code" href="classKMMessage.html#e27529e64217576af43e7fc21f6e956f">02035</a> QString <a class="code" href="classKMMessage.html#e27529e64217576af43e7fc21f6e956f" title="Get or set the &#39;X-Mark&#39; header field.">KMMessage::xmark</a>()<span class="keyword"> const</span> <a name="l02036"></a>02036 <span class="keyword"></span>{ <a name="l02037"></a>02037 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-Mark"</span>); <a name="l02038"></a>02038 } <a name="l02039"></a>02039 <a name="l02040"></a>02040 <a name="l02041"></a>02041 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02042"></a>02042 <span class="keywordtype">void</span> KMMessage::setXMark(<span class="keyword">const</span> QString& aStr) <a name="l02043"></a>02043 { <a name="l02044"></a>02044 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-KMail-Mark"</span>, aStr); <a name="l02045"></a>02045 mDirty = <span class="keyword">true</span>; <a name="l02046"></a>02046 } <a name="l02047"></a>02047 <a name="l02048"></a>02048 <a name="l02049"></a>02049 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02050"></a><a class="code" href="classKMMessage.html#49e63645961bc9ea4521c8dc2a098e77">02050</a> QString <a class="code" href="classKMMessage.html#49e63645961bc9ea4521c8dc2a098e77" title="Get or set the &#39;In-Reply-To&#39; header field.">KMMessage::replyToId</a>()<span class="keyword"> const</span> <a name="l02051"></a>02051 <span class="keyword"></span>{ <a name="l02052"></a>02052 <span class="keywordtype">int</span> leftAngle, rightAngle; <a name="l02053"></a>02053 QString <a class="code" href="classKMMessage.html#0b6c3e40ef5369159f1f2abead43469e" title="Get or set the &#39;ReplyTo&#39; header field.">replyTo</a>, <a class="code" href="classKMMessage.html#8446e25e7669f1a1da81b3913fb762c8" title="Get or set the references for this message.">references</a>; <a name="l02054"></a>02054 <a name="l02055"></a>02055 replyTo = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"In-Reply-To"</span>); <a name="l02056"></a>02056 <span class="comment">// search the end of the (first) message id in the In-Reply-To header</span> <a name="l02057"></a>02057 rightAngle = replyTo.find( <span class="charliteral">'>'</span> ); <a name="l02058"></a>02058 <span class="keywordflow">if</span> (rightAngle != -1) <a name="l02059"></a>02059 replyTo.truncate( rightAngle + 1 ); <a name="l02060"></a>02060 <span class="comment">// now search the start of the message id</span> <a name="l02061"></a>02061 leftAngle = replyTo.findRev( <span class="charliteral">'<'</span> ); <a name="l02062"></a>02062 <span class="keywordflow">if</span> (leftAngle != -1) <a name="l02063"></a>02063 replyTo = replyTo.mid( leftAngle ); <a name="l02064"></a>02064 <a name="l02065"></a>02065 <span class="comment">// if we have found a good message id we can return immediately</span> <a name="l02066"></a>02066 <span class="comment">// We ignore mangled In-Reply-To headers which are created by a</span> <a name="l02067"></a>02067 <span class="comment">// misconfigured Mutt. They look like this <"from foo"@bar.baz>, i.e.</span> <a name="l02068"></a>02068 <span class="comment">// they contain double quotes and spaces. We only check for '"'.</span> <a name="l02069"></a>02069 <span class="keywordflow">if</span> (!replyTo.isEmpty() && (replyTo[0] == <span class="charliteral">'<'</span>) && <a name="l02070"></a>02070 ( -1 == replyTo.find( <span class="charliteral">'"'</span> ) ) ) <a name="l02071"></a>02071 <span class="keywordflow">return</span> replyTo; <a name="l02072"></a>02072 <a name="l02073"></a>02073 references = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"References"</span>); <a name="l02074"></a>02074 leftAngle = references.findRev( <span class="charliteral">'<'</span> ); <a name="l02075"></a>02075 <span class="keywordflow">if</span> (leftAngle != -1) <a name="l02076"></a>02076 references = references.mid( leftAngle ); <a name="l02077"></a>02077 rightAngle = references.find( <span class="charliteral">'>'</span> ); <a name="l02078"></a>02078 <span class="keywordflow">if</span> (rightAngle != -1) <a name="l02079"></a>02079 references.truncate( rightAngle + 1 ); <a name="l02080"></a>02080 <a name="l02081"></a>02081 <span class="comment">// if we found a good message id in the References header return it</span> <a name="l02082"></a>02082 <span class="keywordflow">if</span> (!references.isEmpty() && references[0] == <span class="charliteral">'<'</span>) <a name="l02083"></a>02083 <span class="keywordflow">return</span> references; <a name="l02084"></a>02084 <span class="comment">// else return the broken message id we found in the In-Reply-To header</span> <a name="l02085"></a>02085 <span class="keywordflow">else</span> <a name="l02086"></a>02086 <span class="keywordflow">return</span> replyTo; <a name="l02087"></a>02087 } <a name="l02088"></a>02088 <a name="l02089"></a>02089 <a name="l02090"></a>02090 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02091"></a>02091 QString KMMessage::replyToIdMD5()<span class="keyword"> const </span>{ <a name="l02092"></a>02092 <span class="keywordflow">return</span> base64EncodedMD5( <a class="code" href="classKMMessage.html#49e63645961bc9ea4521c8dc2a098e77" title="Get or set the &#39;In-Reply-To&#39; header field.">replyToId</a>() ); <a name="l02093"></a>02093 } <a name="l02094"></a>02094 <a name="l02095"></a>02095 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02096"></a><a class="code" href="classKMMessage.html#8446e25e7669f1a1da81b3913fb762c8">02096</a> QString <a class="code" href="classKMMessage.html#8446e25e7669f1a1da81b3913fb762c8" title="Get or set the references for this message.">KMMessage::references</a>()<span class="keyword"> const</span> <a name="l02097"></a>02097 <span class="keyword"></span>{ <a name="l02098"></a>02098 <span class="keywordtype">int</span> leftAngle, rightAngle; <a name="l02099"></a>02099 QString <a class="code" href="classKMMessage.html#8446e25e7669f1a1da81b3913fb762c8" title="Get or set the references for this message.">references</a> = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"References"</span> ); <a name="l02100"></a>02100 <a name="l02101"></a>02101 <span class="comment">// keep the last two entries for threading</span> <a name="l02102"></a>02102 leftAngle = references.findRev( <span class="charliteral">'<'</span> ); <a name="l02103"></a>02103 leftAngle = references.findRev( <span class="charliteral">'<'</span>, leftAngle - 1 ); <a name="l02104"></a>02104 <span class="keywordflow">if</span>( leftAngle != -1 ) <a name="l02105"></a>02105 references = references.mid( leftAngle ); <a name="l02106"></a>02106 rightAngle = references.findRev( <span class="charliteral">'>'</span> ); <a name="l02107"></a>02107 <span class="keywordflow">if</span>( rightAngle != -1 ) <a name="l02108"></a>02108 references.truncate( rightAngle + 1 ); <a name="l02109"></a>02109 <a name="l02110"></a>02110 <span class="keywordflow">if</span>( !references.isEmpty() && references[0] == <span class="charliteral">'<'</span> ) <a name="l02111"></a>02111 <span class="keywordflow">return</span> references; <a name="l02112"></a>02112 <span class="keywordflow">else</span> <a name="l02113"></a>02113 <span class="keywordflow">return</span> QString::null; <a name="l02114"></a>02114 } <a name="l02115"></a>02115 <a name="l02116"></a>02116 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02117"></a><a class="code" href="classKMMessage.html#8eb153b46d0542d4b11c2b612e4fbf00">02117</a> QString <a class="code" href="classKMMessage.html#8eb153b46d0542d4b11c2b612e4fbf00" title="Get the second to last id from the References header field.">KMMessage::replyToAuxIdMD5</a>()<span class="keyword"> const</span> <a name="l02118"></a>02118 <span class="keyword"></span>{ <a name="l02119"></a>02119 QString result = <a class="code" href="classKMMessage.html#8446e25e7669f1a1da81b3913fb762c8" title="Get or set the references for this message.">references</a>(); <a name="l02120"></a>02120 <span class="comment">// references contains two items, use the first one</span> <a name="l02121"></a>02121 <span class="comment">// (the second to last reference)</span> <a name="l02122"></a>02122 <span class="keyword">const</span> <span class="keywordtype">int</span> rightAngle = result.find( <span class="charliteral">'>'</span> ); <a name="l02123"></a>02123 <span class="keywordflow">if</span>( rightAngle != -1 ) <a name="l02124"></a>02124 result.truncate( rightAngle + 1 ); <a name="l02125"></a>02125 <a name="l02126"></a>02126 <span class="keywordflow">return</span> base64EncodedMD5( result ); <a name="l02127"></a>02127 } <a name="l02128"></a>02128 <a name="l02129"></a>02129 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02130"></a><a class="code" href="classKMMessage.html#a4b7d25328ff81e373ecc0877323edda">02130</a> QString <a class="code" href="classKMMessage.html#a4b7d25328ff81e373ecc0877323edda" title="Get a hash of the subject with all prefixes such as Re: removed.">KMMessage::strippedSubjectMD5</a>()<span class="keyword"> const </span>{ <a name="l02131"></a>02131 <span class="keywordflow">return</span> base64EncodedMD5( stripOffPrefixes( <a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda" title="Get or set the &#39;Subject&#39; header field.">subject</a>() ), <span class="keyword">true</span> <span class="comment">/*utf8*/</span> ); <a name="l02132"></a>02132 } <a name="l02133"></a>02133 <a name="l02134"></a>02134 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02135"></a><a class="code" href="classKMMessage.html#de0080762e813b85350766a7701925e1">02135</a> QString <a class="code" href="classKMMessage.html#de0080762e813b85350766a7701925e1" title="Get a hash of the subject.">KMMessage::subjectMD5</a>()<span class="keyword"> const </span>{ <a name="l02136"></a>02136 <span class="keywordflow">return</span> base64EncodedMD5( <a class="code" href="classKMMessage.html#8f39a479d6704ce51bcdb1de1fc28bda" title="Get or set the &#39;Subject&#39; header field.">subject</a>(), <span class="keyword">true</span> <span class="comment">/*utf8*/</span> ); <a name="l02137"></a>02137 } <a name="l02138"></a>02138 <a name="l02139"></a>02139 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02140"></a><a class="code" href="classKMMessage.html#3dbe2662033a7b845415755e72cc8af2">02140</a> <span class="keywordtype">bool</span> <a class="code" href="classKMMessage.html#3dbe2662033a7b845415755e72cc8af2" title="Is the subject prefixed by Re: or similar?">KMMessage::subjectIsPrefixed</a>()<span class="keyword"> const </span>{ <a name="l02141"></a>02141 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#de0080762e813b85350766a7701925e1" title="Get a hash of the subject.">subjectMD5</a>() != <a class="code" href="classKMMessage.html#a4b7d25328ff81e373ecc0877323edda" title="Get a hash of the subject with all prefixes such as Re: removed.">strippedSubjectMD5</a>(); <a name="l02142"></a>02142 } <a name="l02143"></a>02143 <a name="l02144"></a>02144 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02145"></a>02145 <span class="keywordtype">void</span> KMMessage::setReplyToId(<span class="keyword">const</span> QString& aStr) <a name="l02146"></a>02146 { <a name="l02147"></a>02147 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"In-Reply-To"</span>, aStr); <a name="l02148"></a>02148 mDirty = <span class="keyword">true</span>; <a name="l02149"></a>02149 } <a name="l02150"></a>02150 <a name="l02151"></a>02151 <a name="l02152"></a>02152 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02153"></a><a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1">02153</a> QString <a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &#39;Message-Id&#39; header field.">KMMessage::msgId</a>()<span class="keyword"> const</span> <a name="l02154"></a>02154 <span class="keyword"></span>{ <a name="l02155"></a>02155 QString <a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &#39;Message-Id&#39; header field.">msgId</a> = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"Message-Id"</span>); <a name="l02156"></a>02156 <a name="l02157"></a>02157 <span class="comment">// search the end of the message id</span> <a name="l02158"></a>02158 <span class="keyword">const</span> <span class="keywordtype">int</span> rightAngle = msgId.find( <span class="charliteral">'>'</span> ); <a name="l02159"></a>02159 <span class="keywordflow">if</span> (rightAngle != -1) <a name="l02160"></a>02160 msgId.truncate( rightAngle + 1 ); <a name="l02161"></a>02161 <span class="comment">// now search the start of the message id</span> <a name="l02162"></a>02162 <span class="keyword">const</span> <span class="keywordtype">int</span> leftAngle = msgId.findRev( <span class="charliteral">'<'</span> ); <a name="l02163"></a>02163 <span class="keywordflow">if</span> (leftAngle != -1) <a name="l02164"></a>02164 msgId = msgId.mid( leftAngle ); <a name="l02165"></a>02165 <span class="keywordflow">return</span> msgId; <a name="l02166"></a>02166 } <a name="l02167"></a>02167 <a name="l02168"></a>02168 <a name="l02169"></a>02169 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02170"></a>02170 QString KMMessage::msgIdMD5()<span class="keyword"> const </span>{ <a name="l02171"></a>02171 <span class="keywordflow">return</span> base64EncodedMD5( <a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &#39;Message-Id&#39; header field.">msgId</a>() ); <a name="l02172"></a>02172 } <a name="l02173"></a>02173 <a name="l02174"></a>02174 <a name="l02175"></a>02175 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02176"></a>02176 <span class="keywordtype">void</span> KMMessage::setMsgId(<span class="keyword">const</span> QString& aStr) <a name="l02177"></a>02177 { <a name="l02178"></a>02178 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"Message-Id"</span>, aStr); <a name="l02179"></a>02179 mDirty = <span class="keyword">true</span>; <a name="l02180"></a>02180 } <a name="l02181"></a>02181 <a name="l02182"></a>02182 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02183"></a><a class="code" href="classKMMessage.html#a2c7bb7de2908ff534a6c34d8538dffa">02183</a> <span class="keywordtype">size_t</span> <a class="code" href="classKMMessage.html#a2c7bb7de2908ff534a6c34d8538dffa" title="Get/set size on server.">KMMessage::msgSizeServer</a>()<span class="keyword"> const </span>{ <a name="l02184"></a>02184 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-Length"</span> ).toULong(); <a name="l02185"></a>02185 } <a name="l02186"></a>02186 <a name="l02187"></a>02187 <a name="l02188"></a>02188 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02189"></a>02189 <span class="keywordtype">void</span> KMMessage::setMsgSizeServer(<span class="keywordtype">size_t</span> size) <a name="l02190"></a>02190 { <a name="l02191"></a>02191 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-Length"</span>, QCString().setNum(size)); <a name="l02192"></a>02192 mDirty = <span class="keyword">true</span>; <a name="l02193"></a>02193 } <a name="l02194"></a>02194 <a name="l02195"></a>02195 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02196"></a><a class="code" href="classKMMessage.html#faaaea3bf64efcdbeceafbe146e1addf">02196</a> ulong <a class="code" href="classKMMessage.html#faaaea3bf64efcdbeceafbe146e1addf" title="Get/set UID.">KMMessage::UID</a>()<span class="keyword"> const </span>{ <a name="l02197"></a>02197 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-UID"</span> ).toULong(); <a name="l02198"></a>02198 } <a name="l02199"></a>02199 <a name="l02200"></a>02200 <a name="l02201"></a>02201 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02202"></a>02202 <span class="keywordtype">void</span> KMMessage::setUID(ulong uid) <a name="l02203"></a>02203 { <a name="l02204"></a>02204 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>(<span class="stringliteral">"X-UID"</span>, QCString().setNum(uid)); <a name="l02205"></a>02205 mDirty = <span class="keyword">true</span>; <a name="l02206"></a>02206 } <a name="l02207"></a>02207 <a name="l02208"></a>02208 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02209"></a><a class="code" href="classKMMessage.html#8379ac4237b3f5094a6db07cfce7a830">02209</a> AddressList <a class="code" href="classKMMessage.html#8379ac4237b3f5094a6db07cfce7a830" title="Splits the given address list into separate addresses.">KMMessage::splitAddrField</a>( <span class="keyword">const</span> QCString & str ) <a name="l02210"></a>02210 { <a name="l02211"></a>02211 AddressList result; <a name="l02212"></a>02212 <span class="keyword">const</span> <span class="keywordtype">char</span> * scursor = str.begin(); <a name="l02213"></a>02213 <span class="keywordflow">if</span> ( !scursor ) <a name="l02214"></a>02214 <span class="keywordflow">return</span> AddressList(); <a name="l02215"></a>02215 <span class="keyword">const</span> <span class="keywordtype">char</span> * <span class="keyword">const</span> send = str.begin() + str.length(); <a name="l02216"></a>02216 <span class="keywordflow">if</span> ( !parseAddressList( scursor, send, result ) ) <a name="l02217"></a>02217 kdDebug(5006) << <span class="stringliteral">"Error in address splitting: parseAddressList returned false!"</span> <a name="l02218"></a>02218 << endl; <a name="l02219"></a>02219 <span class="keywordflow">return</span> result; <a name="l02220"></a>02220 } <a name="l02221"></a>02221 <a name="l02222"></a><a class="code" href="classKMMessage.html#0eb814689485d6696a3937c0242cbaaa">02222</a> AddressList <a class="code" href="classKMMessage.html#0eb814689485d6696a3937c0242cbaaa" title="Returns header address list as string list.">KMMessage::headerAddrField</a>( <span class="keyword">const</span> QCString & aName )<span class="keyword"> const </span>{ <a name="l02223"></a>02223 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#8379ac4237b3f5094a6db07cfce7a830" title="Splits the given address list into separate addresses.">KMMessage::splitAddrField</a>( <a class="code" href="classKMMessage.html#7fdcc69aab16473b8031e02e0505763d" title="Returns the raw value of a header field with the given name.">rawHeaderField</a>( aName ) ); <a name="l02224"></a>02224 } <a name="l02225"></a>02225 <a name="l02226"></a>02226 AddrSpecList KMMessage::extractAddrSpecs( <span class="keyword">const</span> QCString & header )<span class="keyword"> const </span>{ <a name="l02227"></a>02227 AddressList al = <a class="code" href="classKMMessage.html#0eb814689485d6696a3937c0242cbaaa" title="Returns header address list as string list.">headerAddrField</a>( header ); <a name="l02228"></a>02228 AddrSpecList result; <a name="l02229"></a>02229 <span class="keywordflow">for</span> ( AddressList::const_iterator ait = al.begin() ; ait != al.end() ; ++ait ) <a name="l02230"></a>02230 <span class="keywordflow">for</span> ( MailboxList::const_iterator mit = (*ait).mailboxList.begin() ; mit != (*ait).mailboxList.end() ; ++mit ) <a name="l02231"></a>02231 result.push_back( (*mit).addrSpec ); <a name="l02232"></a>02232 <span class="keywordflow">return</span> result; <a name="l02233"></a>02233 } <a name="l02234"></a>02234 <a name="l02235"></a><a class="code" href="classKMMessage.html#7fdcc69aab16473b8031e02e0505763d">02235</a> QCString <a class="code" href="classKMMessage.html#7fdcc69aab16473b8031e02e0505763d" title="Returns the raw value of a header field with the given name.">KMMessage::rawHeaderField</a>( <span class="keyword">const</span> QCString & name )<span class="keyword"> const </span>{ <a name="l02236"></a>02236 <span class="keywordflow">if</span> ( name.isEmpty() ) <span class="keywordflow">return</span> QCString(); <a name="l02237"></a>02237 <a name="l02238"></a>02238 DwHeaders & header = mMsg->Headers(); <a name="l02239"></a>02239 DwField * field = header.FindField( name ); <a name="l02240"></a>02240 <a name="l02241"></a>02241 <span class="keywordflow">if</span> ( !field ) <span class="keywordflow">return</span> QCString(); <a name="l02242"></a>02242 <a name="l02243"></a>02243 <span class="keywordflow">return</span> header.FieldBody( name.data() ).AsString().c_str(); <a name="l02244"></a>02244 } <a name="l02245"></a>02245 <a name="l02246"></a><a class="code" href="classKMMessage.html#73e25a3ad922e433998d25236dd7adbc">02246</a> QValueList<QCString> <a class="code" href="classKMMessage.html#73e25a3ad922e433998d25236dd7adbc" title="Returns a list of the raw values of all header fields with the given name.">KMMessage::rawHeaderFields</a>( <span class="keyword">const</span> QCString& field )<span class="keyword"> const</span> <a name="l02247"></a>02247 <span class="keyword"></span>{ <a name="l02248"></a>02248 <span class="keywordflow">if</span> ( field.isEmpty() || !mMsg->Headers().FindField( field ) ) <a name="l02249"></a>02249 <span class="keywordflow">return</span> QValueList<QCString>(); <a name="l02250"></a>02250 <a name="l02251"></a>02251 std::vector<DwFieldBody*> v = mMsg->Headers().AllFieldBodies( field.data() ); <a name="l02252"></a>02252 QValueList<QCString> <a class="code" href="classKMMessage.html#f83509f2f6a758a9db87d5158f1e0321" title="Returns a list of the values of all header fields with the given name.">headerFields</a>; <a name="l02253"></a>02253 <span class="keywordflow">for</span> ( uint i = 0; i < v.size(); ++i ) { <a name="l02254"></a>02254 headerFields.append( v[i]->AsString().c_str() ); <a name="l02255"></a>02255 } <a name="l02256"></a>02256 <a name="l02257"></a>02257 <span class="keywordflow">return</span> headerFields; <a name="l02258"></a>02258 } <a name="l02259"></a>02259 <a name="l02260"></a><a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727">02260</a> QString <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">KMMessage::headerField</a>(<span class="keyword">const</span> QCString& aName)<span class="keyword"> const</span> <a name="l02261"></a>02261 <span class="keyword"></span>{ <a name="l02262"></a>02262 <span class="keywordflow">if</span> ( aName.isEmpty() ) <a name="l02263"></a>02263 <span class="keywordflow">return</span> QString::null; <a name="l02264"></a>02264 <a name="l02265"></a>02265 <span class="keywordflow">if</span> ( !mMsg->Headers().FindField( aName ) ) <a name="l02266"></a>02266 <span class="keywordflow">return</span> QString::null; <a name="l02267"></a>02267 <a name="l02268"></a>02268 <span class="keywordflow">return</span> decodeRFC2047String( mMsg->Headers().FieldBody( aName.data() ).AsString().c_str(), <a name="l02269"></a>02269 <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">charset</a>() ); <a name="l02270"></a>02270 <a name="l02271"></a>02271 } <a name="l02272"></a>02272 <a name="l02273"></a><a class="code" href="classKMMessage.html#f83509f2f6a758a9db87d5158f1e0321">02273</a> QStringList <a class="code" href="classKMMessage.html#f83509f2f6a758a9db87d5158f1e0321" title="Returns a list of the values of all header fields with the given name.">KMMessage::headerFields</a>( <span class="keyword">const</span> QCString& field )<span class="keyword"> const</span> <a name="l02274"></a>02274 <span class="keyword"></span>{ <a name="l02275"></a>02275 <span class="keywordflow">if</span> ( field.isEmpty() || !mMsg->Headers().FindField( field ) ) <a name="l02276"></a>02276 <span class="keywordflow">return</span> QStringList(); <a name="l02277"></a>02277 <a name="l02278"></a>02278 std::vector<DwFieldBody*> v = mMsg->Headers().AllFieldBodies( field.data() ); <a name="l02279"></a>02279 QStringList <a class="code" href="classKMMessage.html#f83509f2f6a758a9db87d5158f1e0321" title="Returns a list of the values of all header fields with the given name.">headerFields</a>; <a name="l02280"></a>02280 <span class="keywordflow">for</span> ( uint i = 0; i < v.size(); ++i ) { <a name="l02281"></a>02281 headerFields.append( decodeRFC2047String( v[i]->AsString().c_str(), <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">charset</a>() ) ); <a name="l02282"></a>02282 } <a name="l02283"></a>02283 <a name="l02284"></a>02284 <span class="keywordflow">return</span> headerFields; <a name="l02285"></a>02285 } <a name="l02286"></a>02286 <a name="l02287"></a>02287 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02288"></a><a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78">02288</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#d01b9784ec819c2aa44e916098e76f78" title="Remove header field with given name.">KMMessage::removeHeaderField</a>(<span class="keyword">const</span> QCString& aName) <a name="l02289"></a>02289 { <a name="l02290"></a>02290 DwHeaders & header = mMsg->Headers(); <a name="l02291"></a>02291 DwField * field = header.FindField(aName); <a name="l02292"></a>02292 <span class="keywordflow">if</span> (!field) <span class="keywordflow">return</span>; <a name="l02293"></a>02293 <a name="l02294"></a>02294 header.RemoveField(field); <a name="l02295"></a>02295 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02296"></a>02296 } <a name="l02297"></a>02297 <a name="l02298"></a>02298 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02299"></a><a class="code" href="classKMMessage.html#97fca22e84873efcba5593c61cd57528">02299</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#97fca22e84873efcba5593c61cd57528" title="Remove all header fields with given name.">KMMessage::removeHeaderFields</a>(<span class="keyword">const</span> QCString& aName) <a name="l02300"></a>02300 { <a name="l02301"></a>02301 DwHeaders & header = mMsg->Headers(); <a name="l02302"></a>02302 <span class="keywordflow">while</span> ( DwField * field = header.FindField(aName) ) { <a name="l02303"></a>02303 header.RemoveField(field); <a name="l02304"></a>02304 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02305"></a>02305 } <a name="l02306"></a>02306 } <a name="l02307"></a>02307 <a name="l02308"></a>02308 <a name="l02309"></a>02309 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02310"></a><a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6">02310</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">KMMessage::setHeaderField</a>( <span class="keyword">const</span> QCString& aName, <span class="keyword">const</span> QString& bValue, <a name="l02311"></a>02311 HeaderFieldType type, <span class="keywordtype">bool</span> prepend ) <a name="l02312"></a>02312 { <a name="l02313"></a>02313 <span class="preprocessor">#if 0</span> <a name="l02314"></a>02314 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( type != Unstructured ) <a name="l02315"></a>02315 kdDebug(5006) << <span class="stringliteral">"KMMessage::setHeaderField( \""</span> << aName << <span class="stringliteral">"\", \""</span> <a name="l02316"></a>02316 << bValue << <span class="stringliteral">"\", "</span> << type << <span class="stringliteral">" )"</span> << endl; <a name="l02317"></a>02317 <span class="preprocessor">#endif</span> <a name="l02318"></a>02318 <span class="preprocessor"></span> <span class="keywordflow">if</span> (aName.isEmpty()) <span class="keywordflow">return</span>; <a name="l02319"></a>02319 <a name="l02320"></a>02320 DwHeaders& header = mMsg->Headers(); <a name="l02321"></a>02321 <a name="l02322"></a>02322 DwString str; <a name="l02323"></a>02323 DwField* field; <a name="l02324"></a>02324 QCString aValue; <a name="l02325"></a>02325 <span class="keywordflow">if</span> (!bValue.isEmpty()) <a name="l02326"></a>02326 { <a name="l02327"></a>02327 QString value = bValue; <a name="l02328"></a>02328 <span class="keywordflow">if</span> ( type == Address ) <a name="l02329"></a>02329 value = KPIM::normalizeAddressesAndEncodeIDNs( value ); <a name="l02330"></a>02330 <span class="preprocessor">#if 0</span> <a name="l02331"></a>02331 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( type != Unstructured ) <a name="l02332"></a>02332 kdDebug(5006) << <span class="stringliteral">"value: \""</span> << value << <span class="stringliteral">"\""</span> << endl; <a name="l02333"></a>02333 <span class="preprocessor">#endif</span> <a name="l02334"></a>02334 <span class="preprocessor"></span> QCString encoding = autoDetectCharset( <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">charset</a>(), sPrefCharsets, value ); <a name="l02335"></a>02335 <span class="keywordflow">if</span> (encoding.isEmpty()) <a name="l02336"></a>02336 encoding = <span class="stringliteral">"utf-8"</span>; <a name="l02337"></a>02337 aValue = encodeRFC2047String( value, encoding ); <a name="l02338"></a>02338 <span class="preprocessor">#if 0</span> <a name="l02339"></a>02339 <span class="preprocessor"></span> <span class="keywordflow">if</span> ( type != Unstructured ) <a name="l02340"></a>02340 kdDebug(5006) << <span class="stringliteral">"aValue: \""</span> << aValue << <span class="stringliteral">"\""</span> << endl; <a name="l02341"></a>02341 <span class="preprocessor">#endif</span> <a name="l02342"></a>02342 <span class="preprocessor"></span> } <a name="l02343"></a>02343 str = aName; <a name="l02344"></a>02344 <span class="keywordflow">if</span> (str[str.length()-1] != <span class="charliteral">':'</span>) str += <span class="stringliteral">": "</span>; <a name="l02345"></a>02345 <span class="keywordflow">else</span> str += <span class="charliteral">' '</span>; <a name="l02346"></a>02346 <span class="keywordflow">if</span> ( !aValue.isEmpty() ) <a name="l02347"></a>02347 str += aValue; <a name="l02348"></a>02348 <span class="keywordflow">if</span> (str[str.length()-1] != <span class="charliteral">'\n'</span>) str += <span class="charliteral">'\n'</span>; <a name="l02349"></a>02349 <a name="l02350"></a>02350 field = <span class="keyword">new</span> DwField(str, mMsg); <a name="l02351"></a>02351 field->Parse(); <a name="l02352"></a>02352 <a name="l02353"></a>02353 <span class="keywordflow">if</span> ( prepend ) <a name="l02354"></a>02354 header.AddFieldAt( 1, field ); <a name="l02355"></a>02355 <span class="keywordflow">else</span> <a name="l02356"></a>02356 header.AddOrReplaceField( field ); <a name="l02357"></a>02357 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02358"></a>02358 } <a name="l02359"></a>02359 <a name="l02360"></a>02360 <a name="l02361"></a>02361 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02362"></a><a class="code" href="classKMMessage.html#15644ca49b0cfa3d3a65d9ab3412accd">02362</a> QCString <a class="code" href="classKMMessage.html#15644ca49b0cfa3d3a65d9ab3412accd" title="Get or set the &#39;Content-Type&#39; header field The member functions that involve...">KMMessage::typeStr</a>()<span class="keyword"> const</span> <a name="l02363"></a>02363 <span class="keyword"></span>{ <a name="l02364"></a>02364 DwHeaders& header = mMsg->Headers(); <a name="l02365"></a>02365 <span class="keywordflow">if</span> (header.HasContentType()) <span class="keywordflow">return</span> header.ContentType().TypeStr().c_str(); <a name="l02366"></a>02366 <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l02367"></a>02367 } <a name="l02368"></a>02368 <a name="l02369"></a>02369 <a name="l02370"></a>02370 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02371"></a>02371 <span class="keywordtype">int</span> KMMessage::type()<span class="keyword"> const</span> <a name="l02372"></a>02372 <span class="keyword"></span>{ <a name="l02373"></a>02373 DwHeaders& header = mMsg->Headers(); <a name="l02374"></a>02374 <span class="keywordflow">if</span> (header.HasContentType()) <span class="keywordflow">return</span> header.ContentType().Type(); <a name="l02375"></a>02375 <span class="keywordflow">else</span> <span class="keywordflow">return</span> DwMime::kTypeNull; <a name="l02376"></a>02376 } <a name="l02377"></a>02377 <a name="l02378"></a>02378 <a name="l02379"></a>02379 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02380"></a>02380 <span class="keywordtype">void</span> KMMessage::setTypeStr(<span class="keyword">const</span> QCString& aStr) <a name="l02381"></a>02381 { <a name="l02382"></a>02382 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().SetTypeStr(DwString(aStr)); <a name="l02383"></a>02383 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().Parse(); <a name="l02384"></a>02384 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02385"></a>02385 } <a name="l02386"></a>02386 <a name="l02387"></a>02387 <a name="l02388"></a>02388 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02389"></a>02389 <span class="keywordtype">void</span> KMMessage::setType(<span class="keywordtype">int</span> aType) <a name="l02390"></a>02390 { <a name="l02391"></a>02391 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().SetType(aType); <a name="l02392"></a>02392 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().Assemble(); <a name="l02393"></a>02393 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02394"></a>02394 } <a name="l02395"></a>02395 <a name="l02396"></a>02396 <a name="l02397"></a>02397 <a name="l02398"></a>02398 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02399"></a><a class="code" href="classKMMessage.html#e2dfa921f919dbaf97269c8ee4b4aa07">02399</a> QCString <a class="code" href="classKMMessage.html#e2dfa921f919dbaf97269c8ee4b4aa07" title="Subtype.">KMMessage::subtypeStr</a>()<span class="keyword"> const</span> <a name="l02400"></a>02400 <span class="keyword"></span>{ <a name="l02401"></a>02401 DwHeaders& header = mMsg->Headers(); <a name="l02402"></a>02402 <span class="keywordflow">if</span> (header.HasContentType()) <span class="keywordflow">return</span> header.ContentType().SubtypeStr().c_str(); <a name="l02403"></a>02403 <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l02404"></a>02404 } <a name="l02405"></a>02405 <a name="l02406"></a>02406 <a name="l02407"></a>02407 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02408"></a>02408 <span class="keywordtype">int</span> KMMessage::subtype()<span class="keyword"> const</span> <a name="l02409"></a>02409 <span class="keyword"></span>{ <a name="l02410"></a>02410 DwHeaders& header = mMsg->Headers(); <a name="l02411"></a>02411 <span class="keywordflow">if</span> (header.HasContentType()) <span class="keywordflow">return</span> header.ContentType().Subtype(); <a name="l02412"></a>02412 <span class="keywordflow">else</span> <span class="keywordflow">return</span> DwMime::kSubtypeNull; <a name="l02413"></a>02413 } <a name="l02414"></a>02414 <a name="l02415"></a>02415 <a name="l02416"></a>02416 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02417"></a>02417 <span class="keywordtype">void</span> KMMessage::setSubtypeStr(<span class="keyword">const</span> QCString& aStr) <a name="l02418"></a>02418 { <a name="l02419"></a>02419 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().SetSubtypeStr(DwString(aStr)); <a name="l02420"></a>02420 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().Parse(); <a name="l02421"></a>02421 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02422"></a>02422 } <a name="l02423"></a>02423 <a name="l02424"></a>02424 <a name="l02425"></a>02425 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02426"></a>02426 <span class="keywordtype">void</span> KMMessage::setSubtype(<span class="keywordtype">int</span> aSubtype) <a name="l02427"></a>02427 { <a name="l02428"></a>02428 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().SetSubtype(aSubtype); <a name="l02429"></a>02429 <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>().Assemble(); <a name="l02430"></a>02430 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02431"></a>02431 } <a name="l02432"></a>02432 <a name="l02433"></a>02433 <a name="l02434"></a>02434 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02435"></a><a class="code" href="classKMMessage.html#39decc3c3bf5ad3adb77d0ea66235416">02435</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#39decc3c3bf5ad3adb77d0ea66235416" title="add or change a parameter of a DwMediaType field">KMMessage::setDwMediaTypeParam</a>( DwMediaType &mType, <a name="l02436"></a>02436 <span class="keyword">const</span> QCString& attr, <a name="l02437"></a>02437 <span class="keyword">const</span> QCString& val ) <a name="l02438"></a>02438 { <a name="l02439"></a>02439 mType.Parse(); <a name="l02440"></a>02440 DwParameter *param = mType.FirstParameter(); <a name="l02441"></a>02441 <span class="keywordflow">while</span>(param) { <a name="l02442"></a>02442 <span class="keywordflow">if</span> (!kasciistricmp(param->Attribute().c_str(), attr)) <a name="l02443"></a>02443 <span class="keywordflow">break</span>; <a name="l02444"></a>02444 <span class="keywordflow">else</span> <a name="l02445"></a>02445 param = param->Next(); <a name="l02446"></a>02446 } <a name="l02447"></a>02447 <span class="keywordflow">if</span> (!param){ <a name="l02448"></a>02448 param = <span class="keyword">new</span> DwParameter; <a name="l02449"></a>02449 param->SetAttribute(DwString( attr )); <a name="l02450"></a>02450 mType.AddParameter( param ); <a name="l02451"></a>02451 } <a name="l02452"></a>02452 <span class="keywordflow">else</span> <a name="l02453"></a>02453 mType.SetModified(); <a name="l02454"></a>02454 param->SetValue(DwString( val )); <a name="l02455"></a>02455 mType.Assemble(); <a name="l02456"></a>02456 } <a name="l02457"></a>02457 <a name="l02458"></a>02458 <a name="l02459"></a>02459 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02460"></a><a class="code" href="classKMMessage.html#8e90f98312878b54680d11e0d332c006">02460</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#8e90f98312878b54680d11e0d332c006" title="add or change a parameter of the Content-Type field">KMMessage::setContentTypeParam</a>(<span class="keyword">const</span> QCString& attr, <span class="keyword">const</span> QCString& val) <a name="l02461"></a>02461 { <a name="l02462"></a>02462 <span class="keywordflow">if</span> (mNeedsAssembly) mMsg->Assemble(); <a name="l02463"></a>02463 mNeedsAssembly = <span class="keyword">false</span>; <a name="l02464"></a>02464 <a class="code" href="classKMMessage.html#39decc3c3bf5ad3adb77d0ea66235416" title="add or change a parameter of a DwMediaType field">setDwMediaTypeParam</a>( <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>(), attr, val ); <a name="l02465"></a>02465 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02466"></a>02466 } <a name="l02467"></a>02467 <a name="l02468"></a>02468 <a name="l02469"></a>02469 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02470"></a><a class="code" href="classKMMessage.html#9c0645c915f65d9b91d7ed1c1ddbf288">02470</a> QCString <a class="code" href="classKMMessage.html#9c0645c915f65d9b91d7ed1c1ddbf288" title="Get or set the &#39;Content-Transfer-Encoding&#39; header field The member functions...">KMMessage::contentTransferEncodingStr</a>()<span class="keyword"> const</span> <a name="l02471"></a>02471 <span class="keyword"></span>{ <a name="l02472"></a>02472 DwHeaders& header = mMsg->Headers(); <a name="l02473"></a>02473 <span class="keywordflow">if</span> (header.HasContentTransferEncoding()) <a name="l02474"></a>02474 <span class="keywordflow">return</span> header.ContentTransferEncoding().AsString().c_str(); <a name="l02475"></a>02475 <span class="keywordflow">else</span> <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <a name="l02476"></a>02476 } <a name="l02477"></a>02477 <a name="l02478"></a>02478 <a name="l02479"></a>02479 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02480"></a>02480 <span class="keywordtype">int</span> KMMessage::contentTransferEncoding()<span class="keyword"> const</span> <a name="l02481"></a>02481 <span class="keyword"></span>{ <a name="l02482"></a>02482 DwHeaders& header = mMsg->Headers(); <a name="l02483"></a>02483 <span class="keywordflow">if</span> (header.HasContentTransferEncoding()) <a name="l02484"></a>02484 <span class="keywordflow">return</span> header.ContentTransferEncoding().AsEnum(); <a name="l02485"></a>02485 <span class="keywordflow">else</span> <span class="keywordflow">return</span> DwMime::kCteNull; <a name="l02486"></a>02486 } <a name="l02487"></a>02487 <a name="l02488"></a>02488 <a name="l02489"></a>02489 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02490"></a>02490 <span class="keywordtype">void</span> KMMessage::setContentTransferEncodingStr(<span class="keyword">const</span> QCString& aStr) <a name="l02491"></a>02491 { <a name="l02492"></a>02492 mMsg->Headers().ContentTransferEncoding().FromString(aStr); <a name="l02493"></a>02493 mMsg->Headers().ContentTransferEncoding().Parse(); <a name="l02494"></a>02494 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02495"></a>02495 } <a name="l02496"></a>02496 <a name="l02497"></a>02497 <a name="l02498"></a>02498 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02499"></a>02499 <span class="keywordtype">void</span> KMMessage::setContentTransferEncoding(<span class="keywordtype">int</span> aCte) <a name="l02500"></a>02500 { <a name="l02501"></a>02501 mMsg->Headers().ContentTransferEncoding().FromEnum(aCte); <a name="l02502"></a>02502 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02503"></a>02503 } <a name="l02504"></a>02504 <a name="l02505"></a>02505 <a name="l02506"></a>02506 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02507"></a><a class="code" href="classKMMessage.html#7dd06ebd026305292fd380c9acb283b6">02507</a> DwHeaders& <a class="code" href="classKMMessage.html#7dd06ebd026305292fd380c9acb283b6" title="get the DwHeaders (make sure to call setNeedsAssembly() function after directly modyfying...">KMMessage::headers</a>()<span class="keyword"> const</span> <a name="l02508"></a>02508 <span class="keyword"></span>{ <a name="l02509"></a>02509 <span class="keywordflow">return</span> mMsg->Headers(); <a name="l02510"></a>02510 } <a name="l02511"></a>02511 <a name="l02512"></a>02512 <a name="l02513"></a>02513 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02514"></a><a class="code" href="classKMMessage.html#4e359dbe2c3eab4c558bba7431d14ba5">02514</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#4e359dbe2c3eab4c558bba7431d14ba5" title="tell the message that internal data were changed (must be called after directly modifying...">KMMessage::setNeedsAssembly</a>() <a name="l02515"></a>02515 { <a name="l02516"></a>02516 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02517"></a>02517 } <a name="l02518"></a>02518 <a name="l02519"></a>02519 <a name="l02520"></a>02520 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02521"></a><a class="code" href="classKMMessage.html#00680f46ef6e512a0febc53fa671c6a9">02521</a> QCString <a class="code" href="classKMMessage.html#00680f46ef6e512a0febc53fa671c6a9" title="Get the message body.">KMMessage::body</a>()<span class="keyword"> const</span> <a name="l02522"></a>02522 <span class="keyword"></span>{ <a name="l02523"></a>02523 <span class="keyword">const</span> DwString& <a class="code" href="classKMMessage.html#00680f46ef6e512a0febc53fa671c6a9" title="Get the message body.">body</a> = mMsg->Body().AsString(); <a name="l02524"></a>02524 QCString str = <a class="code" href="namespaceKMail_1_1Util.html#7dbcbfd02aa6cf732ac83c2b6d5b6f8b" title="Construct a QCString from a DwString.">KMail::Util::CString</a>( body ); <a name="l02525"></a>02525 <span class="comment">// Calls length() -> slow</span> <a name="l02526"></a>02526 <span class="comment">//kdWarning( str.length() != body.length(), 5006 )</span> <a name="l02527"></a>02527 <span class="comment">// << "KMMessage::body(): body is binary but used as text!" << endl;</span> <a name="l02528"></a>02528 <span class="keywordflow">return</span> str; <a name="l02529"></a>02529 } <a name="l02530"></a>02530 <a name="l02531"></a>02531 <a name="l02532"></a>02532 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02533"></a>02533 QByteArray KMMessage::bodyDecodedBinary()<span class="keyword"> const</span> <a name="l02534"></a>02534 <span class="keyword"></span>{ <a name="l02535"></a>02535 DwString dwstr; <a name="l02536"></a>02536 <span class="keyword">const</span> DwString& dwsrc = mMsg->Body().AsString(); <a name="l02537"></a>02537 <a name="l02538"></a>02538 <span class="keywordflow">switch</span> (cte()) <a name="l02539"></a>02539 { <a name="l02540"></a>02540 <span class="keywordflow">case</span> DwMime::kCteBase64: <a name="l02541"></a>02541 DwDecodeBase64(dwsrc, dwstr); <a name="l02542"></a>02542 <span class="keywordflow">break</span>; <a name="l02543"></a>02543 <span class="keywordflow">case</span> DwMime::kCteQuotedPrintable: <a name="l02544"></a>02544 DwDecodeQuotedPrintable(dwsrc, dwstr); <a name="l02545"></a>02545 <span class="keywordflow">break</span>; <a name="l02546"></a>02546 <span class="keywordflow">default</span>: <a name="l02547"></a>02547 dwstr = dwsrc; <a name="l02548"></a>02548 <span class="keywordflow">break</span>; <a name="l02549"></a>02549 } <a name="l02550"></a>02550 <a name="l02551"></a>02551 <span class="keywordtype">int</span> len = dwstr.size(); <a name="l02552"></a>02552 QByteArray ba(len); <a name="l02553"></a>02553 memcpy(ba.data(),dwstr.data(),len); <a name="l02554"></a>02554 <span class="keywordflow">return</span> ba; <a name="l02555"></a>02555 } <a name="l02556"></a>02556 <a name="l02557"></a>02557 <a name="l02558"></a>02558 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02559"></a><a class="code" href="classKMMessage.html#e4e5fdc4bbafb1397801381b91313e91">02559</a> QCString <a class="code" href="classKMMessage.html#e4e5fdc4bbafb1397801381b91313e91" title="Returns a decoded version of the body from the current content transfer encoding...">KMMessage::bodyDecoded</a>()<span class="keyword"> const</span> <a name="l02560"></a>02560 <span class="keyword"></span>{ <a name="l02561"></a>02561 DwString dwstr; <a name="l02562"></a>02562 DwString dwsrc = mMsg->Body().AsString(); <a name="l02563"></a>02563 <a name="l02564"></a>02564 <span class="keywordflow">switch</span> (cte()) <a name="l02565"></a>02565 { <a name="l02566"></a>02566 <span class="keywordflow">case</span> DwMime::kCteBase64: <a name="l02567"></a>02567 DwDecodeBase64(dwsrc, dwstr); <a name="l02568"></a>02568 <span class="keywordflow">break</span>; <a name="l02569"></a>02569 <span class="keywordflow">case</span> DwMime::kCteQuotedPrintable: <a name="l02570"></a>02570 DwDecodeQuotedPrintable(dwsrc, dwstr); <a name="l02571"></a>02571 <span class="keywordflow">break</span>; <a name="l02572"></a>02572 <span class="keywordflow">default</span>: <a name="l02573"></a>02573 dwstr = dwsrc; <a name="l02574"></a>02574 <span class="keywordflow">break</span>; <a name="l02575"></a>02575 } <a name="l02576"></a>02576 <a name="l02577"></a>02577 <span class="keywordflow">return</span> <a class="code" href="namespaceKMail_1_1Util.html#7dbcbfd02aa6cf732ac83c2b6d5b6f8b" title="Construct a QCString from a DwString.">KMail::Util::CString</a>( dwstr ); <a name="l02578"></a>02578 <a name="l02579"></a>02579 <span class="comment">// Calling QCString::length() is slow</span> <a name="l02580"></a>02580 <span class="comment">//QCString result = KMail::Util::CString( dwstr );</span> <a name="l02581"></a>02581 <span class="comment">//kdWarning(result.length() != len, 5006)</span> <a name="l02582"></a>02582 <span class="comment">// << "KMMessage::bodyDecoded(): body is binary but used as text!" << endl;</span> <a name="l02583"></a>02583 <span class="comment">//return result;</span> <a name="l02584"></a>02584 } <a name="l02585"></a>02585 <a name="l02586"></a>02586 <a name="l02587"></a>02587 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02588"></a>02588 QValueList<int> <a class="code" href="classKMMessage.html#769fc55cf40e35ab10cd9eed5b40f306" title="Returns a list of content-transfer-encodings that can be used with the given result...">KMMessage::determineAllowedCtes</a>( <span class="keyword">const</span> CharFreq& cf, <a name="l02589"></a>02589 <span class="keywordtype">bool</span> allow8Bit, <a name="l02590"></a>02590 <span class="keywordtype">bool</span> willBeSigned ) <a name="l02591"></a>02591 { <a name="l02592"></a>02592 QValueList<int> allowedCtes; <a name="l02593"></a>02593 <a name="l02594"></a>02594 <span class="keywordflow">switch</span> ( cf.type() ) { <a name="l02595"></a>02595 <span class="keywordflow">case</span> CharFreq::SevenBitText: <a name="l02596"></a>02596 allowedCtes << DwMime::kCte7bit; <a name="l02597"></a>02597 <span class="keywordflow">case</span> CharFreq::EightBitText: <a name="l02598"></a>02598 <span class="keywordflow">if</span> ( allow8Bit ) <a name="l02599"></a>02599 allowedCtes << DwMime::kCte8bit; <a name="l02600"></a>02600 <span class="keywordflow">case</span> CharFreq::SevenBitData: <a name="l02601"></a>02601 <span class="keywordflow">if</span> ( cf.printableRatio() > 5.0/6.0 ) { <a name="l02602"></a>02602 <span class="comment">// let n the length of data and p the number of printable chars.</span> <a name="l02603"></a>02603 <span class="comment">// Then base64 \approx 4n/3; qp \approx p + 3(n-p)</span> <a name="l02604"></a>02604 <span class="comment">// => qp < base64 iff p > 5n/6.</span> <a name="l02605"></a>02605 allowedCtes << DwMime::kCteQp; <a name="l02606"></a>02606 allowedCtes << DwMime::kCteBase64; <a name="l02607"></a>02607 } <span class="keywordflow">else</span> { <a name="l02608"></a>02608 allowedCtes << DwMime::kCteBase64; <a name="l02609"></a>02609 allowedCtes << DwMime::kCteQp; <a name="l02610"></a>02610 } <a name="l02611"></a>02611 <span class="keywordflow">break</span>; <a name="l02612"></a>02612 <span class="keywordflow">case</span> CharFreq::EightBitData: <a name="l02613"></a>02613 allowedCtes << DwMime::kCteBase64; <a name="l02614"></a>02614 <span class="keywordflow">break</span>; <a name="l02615"></a>02615 <span class="keywordflow">case</span> CharFreq::None: <a name="l02616"></a>02616 <span class="keywordflow">default</span>: <a name="l02617"></a>02617 <span class="comment">// just nothing (avoid compiler warning)</span> <a name="l02618"></a>02618 ; <a name="l02619"></a>02619 } <a name="l02620"></a>02620 <a name="l02621"></a>02621 <span class="comment">// In the following cases only QP and Base64 are allowed:</span> <a name="l02622"></a>02622 <span class="comment">// - the buffer will be OpenPGP/MIME signed and it contains trailing</span> <a name="l02623"></a>02623 <span class="comment">// whitespace (cf. RFC 3156)</span> <a name="l02624"></a>02624 <span class="comment">// - a line starts with "From "</span> <a name="l02625"></a>02625 <span class="keywordflow">if</span> ( ( willBeSigned && cf.hasTrailingWhitespace() ) || <a name="l02626"></a>02626 cf.hasLeadingFrom() ) { <a name="l02627"></a>02627 allowedCtes.remove( DwMime::kCte8bit ); <a name="l02628"></a>02628 allowedCtes.remove( DwMime::kCte7bit ); <a name="l02629"></a>02629 } <a name="l02630"></a>02630 <a name="l02631"></a>02631 <span class="keywordflow">return</span> allowedCtes; <a name="l02632"></a>02632 } <a name="l02633"></a>02633 <a name="l02634"></a>02634 <a name="l02635"></a>02635 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02636"></a><a class="code" href="classKMMessage.html#ef11573b865ace4d6886b9f8a48e6303">02636</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#ef11573b865ace4d6886b9f8a48e6303" title="Sets body, encoded in the best fitting content-transfer-encoding, which is determined...">KMMessage::setBodyAndGuessCte</a>( <span class="keyword">const</span> QByteArray& aBuf, <a name="l02637"></a>02637 QValueList<int> & allowedCte, <a name="l02638"></a>02638 <span class="keywordtype">bool</span> allow8Bit, <a name="l02639"></a>02639 <span class="keywordtype">bool</span> willBeSigned ) <a name="l02640"></a>02640 { <a name="l02641"></a>02641 CharFreq cf( aBuf ); <span class="comment">// it's safe to pass null arrays</span> <a name="l02642"></a>02642 <a name="l02643"></a>02643 allowedCte = <a class="code" href="classKMMessage.html#769fc55cf40e35ab10cd9eed5b40f306" title="Returns a list of content-transfer-encodings that can be used with the given result...">determineAllowedCtes</a>( cf, allow8Bit, willBeSigned ); <a name="l02644"></a>02644 <a name="l02645"></a>02645 <span class="preprocessor">#ifndef NDEBUG</span> <a name="l02646"></a>02646 <span class="preprocessor"></span> DwString dwCte; <a name="l02647"></a>02647 DwCteEnumToStr(allowedCte[0], dwCte); <a name="l02648"></a>02648 kdDebug(5006) << <span class="stringliteral">"CharFreq returned "</span> << cf.type() << <span class="stringliteral">"/"</span> <a name="l02649"></a>02649 << cf.printableRatio() << <span class="stringliteral">" and I chose "</span> <a name="l02650"></a>02650 << dwCte.c_str() << endl; <a name="l02651"></a>02651 <span class="preprocessor">#endif</span> <a name="l02652"></a>02652 <span class="preprocessor"></span> <a name="l02653"></a>02653 setCte( allowedCte[0] ); <span class="comment">// choose best fitting</span> <a name="l02654"></a>02654 setBodyEncodedBinary( aBuf ); <a name="l02655"></a>02655 } <a name="l02656"></a>02656 <a name="l02657"></a>02657 <a name="l02658"></a>02658 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02659"></a>02659 <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#ef11573b865ace4d6886b9f8a48e6303" title="Sets body, encoded in the best fitting content-transfer-encoding, which is determined...">KMMessage::setBodyAndGuessCte</a>( <span class="keyword">const</span> QCString& aBuf, <a name="l02660"></a>02660 QValueList<int> & allowedCte, <a name="l02661"></a>02661 <span class="keywordtype">bool</span> allow8Bit, <a name="l02662"></a>02662 <span class="keywordtype">bool</span> willBeSigned ) <a name="l02663"></a>02663 { <a name="l02664"></a>02664 CharFreq cf( aBuf.data(), aBuf.size()-1 ); <span class="comment">// it's safe to pass null strings</span> <a name="l02665"></a>02665 <a name="l02666"></a>02666 allowedCte = <a class="code" href="classKMMessage.html#769fc55cf40e35ab10cd9eed5b40f306" title="Returns a list of content-transfer-encodings that can be used with the given result...">determineAllowedCtes</a>( cf, allow8Bit, willBeSigned ); <a name="l02667"></a>02667 <a name="l02668"></a>02668 <span class="preprocessor">#ifndef NDEBUG</span> <a name="l02669"></a>02669 <span class="preprocessor"></span> DwString dwCte; <a name="l02670"></a>02670 DwCteEnumToStr(allowedCte[0], dwCte); <a name="l02671"></a>02671 kdDebug(5006) << <span class="stringliteral">"CharFreq returned "</span> << cf.type() << <span class="stringliteral">"/"</span> <a name="l02672"></a>02672 << cf.printableRatio() << <span class="stringliteral">" and I chose "</span> <a name="l02673"></a>02673 << dwCte.c_str() << endl; <a name="l02674"></a>02674 <span class="preprocessor">#endif</span> <a name="l02675"></a>02675 <span class="preprocessor"></span> <a name="l02676"></a>02676 setCte( allowedCte[0] ); <span class="comment">// choose best fitting</span> <a name="l02677"></a>02677 <a class="code" href="classKMMessage.html#7e6ee8707a192b15c0394b69dcc10fb8" title="Set the message body, encoding it according to the current content transfer encoding...">setBodyEncoded</a>( aBuf ); <a name="l02678"></a>02678 } <a name="l02679"></a>02679 <a name="l02680"></a>02680 <a name="l02681"></a>02681 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02682"></a><a class="code" href="classKMMessage.html#7e6ee8707a192b15c0394b69dcc10fb8">02682</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#7e6ee8707a192b15c0394b69dcc10fb8" title="Set the message body, encoding it according to the current content transfer encoding...">KMMessage::setBodyEncoded</a>(<span class="keyword">const</span> QCString& aStr) <a name="l02683"></a>02683 { <a name="l02684"></a>02684 DwString dwSrc(aStr.data(), aStr.size()-1 <span class="comment">/* not the trailing NUL */</span>); <a name="l02685"></a>02685 DwString dwResult; <a name="l02686"></a>02686 <a name="l02687"></a>02687 <span class="keywordflow">switch</span> (cte()) <a name="l02688"></a>02688 { <a name="l02689"></a>02689 <span class="keywordflow">case</span> DwMime::kCteBase64: <a name="l02690"></a>02690 DwEncodeBase64(dwSrc, dwResult); <a name="l02691"></a>02691 <span class="keywordflow">break</span>; <a name="l02692"></a>02692 <span class="keywordflow">case</span> DwMime::kCteQuotedPrintable: <a name="l02693"></a>02693 DwEncodeQuotedPrintable(dwSrc, dwResult); <a name="l02694"></a>02694 <span class="keywordflow">break</span>; <a name="l02695"></a>02695 <span class="keywordflow">default</span>: <a name="l02696"></a>02696 dwResult = dwSrc; <a name="l02697"></a>02697 <span class="keywordflow">break</span>; <a name="l02698"></a>02698 } <a name="l02699"></a>02699 <a name="l02700"></a>02700 mMsg->Body().FromString(dwResult); <a name="l02701"></a>02701 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02702"></a>02702 } <a name="l02703"></a>02703 <a name="l02704"></a>02704 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02705"></a>02705 <span class="keywordtype">void</span> KMMessage::setBodyEncodedBinary(<span class="keyword">const</span> QByteArray& aStr) <a name="l02706"></a>02706 { <a name="l02707"></a>02707 DwString dwSrc(aStr.data(), aStr.size()); <a name="l02708"></a>02708 DwString dwResult; <a name="l02709"></a>02709 <a name="l02710"></a>02710 <span class="keywordflow">switch</span> (cte()) <a name="l02711"></a>02711 { <a name="l02712"></a>02712 <span class="keywordflow">case</span> DwMime::kCteBase64: <a name="l02713"></a>02713 DwEncodeBase64(dwSrc, dwResult); <a name="l02714"></a>02714 <span class="keywordflow">break</span>; <a name="l02715"></a>02715 <span class="keywordflow">case</span> DwMime::kCteQuotedPrintable: <a name="l02716"></a>02716 DwEncodeQuotedPrintable(dwSrc, dwResult); <a name="l02717"></a>02717 <span class="keywordflow">break</span>; <a name="l02718"></a>02718 <span class="keywordflow">default</span>: <a name="l02719"></a>02719 dwResult = dwSrc; <a name="l02720"></a>02720 <span class="keywordflow">break</span>; <a name="l02721"></a>02721 } <a name="l02722"></a>02722 <a name="l02723"></a>02723 mMsg->Body().FromString(dwResult); <a name="l02724"></a>02724 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02725"></a>02725 } <a name="l02726"></a>02726 <a name="l02727"></a>02727 <a name="l02728"></a>02728 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02729"></a><a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7">02729</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7" title="Set the message body.">KMMessage::setBody</a>(<span class="keyword">const</span> QCString& aStr) <a name="l02730"></a>02730 { <a name="l02731"></a>02731 mMsg->Body().FromString(<a class="code" href="namespaceKMail_1_1Util.html#cce0cde4fda85ac6422fd7c96f793896" title="Construct a DwString from a QCString.">KMail::Util::dwString</a>(aStr)); <a name="l02732"></a>02732 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02733"></a>02733 } <a name="l02734"></a>02734 <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7" title="Set the message body.">KMMessage::setBody</a>(<span class="keyword">const</span> DwString& aStr) <a name="l02735"></a>02735 { <a name="l02736"></a>02736 mMsg->Body().FromString(aStr); <a name="l02737"></a>02737 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02738"></a>02738 } <a name="l02739"></a>02739 <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7" title="Set the message body.">KMMessage::setBody</a>(<span class="keyword">const</span> <span class="keywordtype">char</span>* aStr) <a name="l02740"></a>02740 { <a name="l02741"></a>02741 mMsg->Body().FromString(aStr); <a name="l02742"></a>02742 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02743"></a>02743 } <a name="l02744"></a>02744 <a name="l02745"></a><a class="code" href="classKMMessage.html#f10f1992dfda5c1838a0e7208ab2fe37">02745</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#f10f1992dfda5c1838a0e7208ab2fe37" title="Hack to enable structured body parts to be set as flat text.">KMMessage::setMultiPartBody</a>( <span class="keyword">const</span> QCString & aStr ) { <a name="l02746"></a>02746 <a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7" title="Set the message body.">setBody</a>( aStr ); <a name="l02747"></a>02747 mMsg->Body().Parse(); <a name="l02748"></a>02748 mNeedsAssembly = <span class="keyword">true</span>; <a name="l02749"></a>02749 } <a name="l02750"></a>02750 <a name="l02751"></a>02751 <a name="l02752"></a>02752 <span class="comment">// Patched by Daniel Moisset <dmoisset@grulic.org.ar></span> <a name="l02753"></a>02753 <span class="comment">// modified numbodyparts, bodypart to take nested body parts as</span> <a name="l02754"></a>02754 <span class="comment">// a linear sequence.</span> <a name="l02755"></a>02755 <span class="comment">// third revision, Sep 26 2000</span> <a name="l02756"></a>02756 <a name="l02757"></a>02757 <span class="comment">// this is support structure for traversing tree without recursion</span> <a name="l02758"></a>02758 <a name="l02759"></a>02759 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02760"></a><a class="code" href="classKMMessage.html#bf2ef4edbfad52a94367b31e248345e8">02760</a> <span class="keywordtype">int</span> <a class="code" href="classKMMessage.html#bf2ef4edbfad52a94367b31e248345e8" title="Number of body parts the message has.">KMMessage::numBodyParts</a>()<span class="keyword"> const</span> <a name="l02761"></a>02761 <span class="keyword"></span>{ <a name="l02762"></a>02762 <span class="keywordtype">int</span> count = 0; <a name="l02763"></a>02763 DwBodyPart* part = <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(); <a name="l02764"></a>02764 QPtrList< DwBodyPart > parts; <a name="l02765"></a>02765 <a name="l02766"></a>02766 <span class="keywordflow">while</span> (part) <a name="l02767"></a>02767 { <a name="l02768"></a>02768 <span class="comment">//dive into multipart messages</span> <a name="l02769"></a>02769 <span class="keywordflow">while</span> ( part <a name="l02770"></a>02770 && part->hasHeaders() <a name="l02771"></a>02771 && part->Headers().HasContentType() <a name="l02772"></a>02772 && part->Body().FirstBodyPart() <a name="l02773"></a>02773 && (DwMime::kTypeMultipart == part->Headers().ContentType().Type()) ) <a name="l02774"></a>02774 { <a name="l02775"></a>02775 parts.append( part ); <a name="l02776"></a>02776 part = part->Body().FirstBodyPart(); <a name="l02777"></a>02777 } <a name="l02778"></a>02778 <span class="comment">// this is where currPart->msgPart contains a leaf message part</span> <a name="l02779"></a>02779 count++; <a name="l02780"></a>02780 <span class="comment">// go up in the tree until reaching a node with next</span> <a name="l02781"></a>02781 <span class="comment">// (or the last top-level node)</span> <a name="l02782"></a>02782 <span class="keywordflow">while</span> (part && !(part->Next()) && !(parts.isEmpty())) <a name="l02783"></a>02783 { <a name="l02784"></a>02784 part = parts.getLast(); <a name="l02785"></a>02785 parts.removeLast(); <a name="l02786"></a>02786 } <a name="l02787"></a>02787 <a name="l02788"></a>02788 <span class="keywordflow">if</span> (part && part->Body().Message() && <a name="l02789"></a>02789 part->Body().Message()->Body().FirstBodyPart()) <a name="l02790"></a>02790 { <a name="l02791"></a>02791 part = part->Body().Message()->Body().FirstBodyPart(); <a name="l02792"></a>02792 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (part) { <a name="l02793"></a>02793 part = part->Next(); <a name="l02794"></a>02794 } <a name="l02795"></a>02795 } <a name="l02796"></a>02796 <a name="l02797"></a>02797 <span class="keywordflow">return</span> count; <a name="l02798"></a>02798 } <a name="l02799"></a>02799 <a name="l02800"></a>02800 <a name="l02801"></a>02801 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02802"></a><a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714">02802</a> DwBodyPart * <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">KMMessage::getFirstDwBodyPart</a>()<span class="keyword"> const</span> <a name="l02803"></a>02803 <span class="keyword"></span>{ <a name="l02804"></a>02804 <span class="keywordflow">return</span> mMsg->Body().FirstBodyPart(); <a name="l02805"></a>02805 } <a name="l02806"></a>02806 <a name="l02807"></a>02807 <a name="l02808"></a>02808 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02809"></a><a class="code" href="classKMMessage.html#afb12852bf19f862832331f5d01670a1">02809</a> <span class="keywordtype">int</span> <a class="code" href="classKMMessage.html#afb12852bf19f862832331f5d01670a1" title="Get the number of the given DwBodyPart.">KMMessage::partNumber</a>( DwBodyPart * aDwBodyPart )<span class="keyword"> const</span> <a name="l02810"></a>02810 <span class="keyword"></span>{ <a name="l02811"></a>02811 DwBodyPart *curpart; <a name="l02812"></a>02812 QPtrList< DwBodyPart > parts; <a name="l02813"></a>02813 <span class="keywordtype">int</span> curIdx = 0; <a name="l02814"></a>02814 <span class="keywordtype">int</span> idx = 0; <a name="l02815"></a>02815 <span class="comment">// Get the DwBodyPart for this index</span> <a name="l02816"></a>02816 <a name="l02817"></a>02817 curpart = <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(); <a name="l02818"></a>02818 <a name="l02819"></a>02819 <span class="keywordflow">while</span> (curpart && !idx) { <a name="l02820"></a>02820 <span class="comment">//dive into multipart messages</span> <a name="l02821"></a>02821 <span class="keywordflow">while</span>( curpart <a name="l02822"></a>02822 && curpart->hasHeaders() <a name="l02823"></a>02823 && curpart->Headers().HasContentType() <a name="l02824"></a>02824 && curpart->Body().FirstBodyPart() <a name="l02825"></a>02825 && (DwMime::kTypeMultipart == curpart->Headers().ContentType().Type()) ) <a name="l02826"></a>02826 { <a name="l02827"></a>02827 parts.append( curpart ); <a name="l02828"></a>02828 curpart = curpart->Body().FirstBodyPart(); <a name="l02829"></a>02829 } <a name="l02830"></a>02830 <span class="comment">// this is where currPart->msgPart contains a leaf message part</span> <a name="l02831"></a>02831 <span class="keywordflow">if</span> (curpart == aDwBodyPart) <a name="l02832"></a>02832 idx = curIdx; <a name="l02833"></a>02833 curIdx++; <a name="l02834"></a>02834 <span class="comment">// go up in the tree until reaching a node with next</span> <a name="l02835"></a>02835 <span class="comment">// (or the last top-level node)</span> <a name="l02836"></a>02836 <span class="keywordflow">while</span> (curpart && !(curpart->Next()) && !(parts.isEmpty())) <a name="l02837"></a>02837 { <a name="l02838"></a>02838 curpart = parts.getLast(); <a name="l02839"></a>02839 parts.removeLast(); <a name="l02840"></a>02840 } ; <a name="l02841"></a>02841 <span class="keywordflow">if</span> (curpart) <a name="l02842"></a>02842 curpart = curpart->Next(); <a name="l02843"></a>02843 } <a name="l02844"></a>02844 <span class="keywordflow">return</span> idx; <a name="l02845"></a>02845 } <a name="l02846"></a>02846 <a name="l02847"></a>02847 <a name="l02848"></a>02848 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02849"></a><a class="code" href="classKMMessage.html#d29d08c00132080dd384caa3861a872f">02849</a> DwBodyPart * <a class="code" href="classKMMessage.html#d29d08c00132080dd384caa3861a872f" title="Get the DwBodyPart at position in aIdx.">KMMessage::dwBodyPart</a>( <span class="keywordtype">int</span> aIdx )<span class="keyword"> const</span> <a name="l02850"></a>02850 <span class="keyword"></span>{ <a name="l02851"></a>02851 DwBodyPart *part, *curpart; <a name="l02852"></a>02852 QPtrList< DwBodyPart > parts; <a name="l02853"></a>02853 <span class="keywordtype">int</span> curIdx = 0; <a name="l02854"></a>02854 <span class="comment">// Get the DwBodyPart for this index</span> <a name="l02855"></a>02855 <a name="l02856"></a>02856 curpart = <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(); <a name="l02857"></a>02857 part = 0; <a name="l02858"></a>02858 <a name="l02859"></a>02859 <span class="keywordflow">while</span> (curpart && !part) { <a name="l02860"></a>02860 <span class="comment">//dive into multipart messages</span> <a name="l02861"></a>02861 <span class="keywordflow">while</span>( curpart <a name="l02862"></a>02862 && curpart->hasHeaders() <a name="l02863"></a>02863 && curpart->Headers().HasContentType() <a name="l02864"></a>02864 && curpart->Body().FirstBodyPart() <a name="l02865"></a>02865 && (DwMime::kTypeMultipart == curpart->Headers().ContentType().Type()) ) <a name="l02866"></a>02866 { <a name="l02867"></a>02867 parts.append( curpart ); <a name="l02868"></a>02868 curpart = curpart->Body().FirstBodyPart(); <a name="l02869"></a>02869 } <a name="l02870"></a>02870 <span class="comment">// this is where currPart->msgPart contains a leaf message part</span> <a name="l02871"></a>02871 <span class="keywordflow">if</span> (curIdx==aIdx) <a name="l02872"></a>02872 part = curpart; <a name="l02873"></a>02873 curIdx++; <a name="l02874"></a>02874 <span class="comment">// go up in the tree until reaching a node with next</span> <a name="l02875"></a>02875 <span class="comment">// (or the last top-level node)</span> <a name="l02876"></a>02876 <span class="keywordflow">while</span> (curpart && !(curpart->Next()) && !(parts.isEmpty())) <a name="l02877"></a>02877 { <a name="l02878"></a>02878 curpart = parts.getLast(); <a name="l02879"></a>02879 parts.removeLast(); <a name="l02880"></a>02880 } <a name="l02881"></a>02881 <span class="keywordflow">if</span> (curpart) <a name="l02882"></a>02882 curpart = curpart->Next(); <a name="l02883"></a>02883 } <a name="l02884"></a>02884 <span class="keywordflow">return</span> part; <a name="l02885"></a>02885 } <a name="l02886"></a>02886 <a name="l02887"></a>02887 <a name="l02888"></a>02888 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02889"></a><a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da">02889</a> DwBodyPart * <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">KMMessage::findDwBodyPart</a>( <span class="keywordtype">int</span> type, <span class="keywordtype">int</span> subtype )<span class="keyword"> const</span> <a name="l02890"></a>02890 <span class="keyword"></span>{ <a name="l02891"></a>02891 DwBodyPart *part, *curpart; <a name="l02892"></a>02892 QPtrList< DwBodyPart > parts; <a name="l02893"></a>02893 <span class="comment">// Get the DwBodyPart for this index</span> <a name="l02894"></a>02894 <a name="l02895"></a>02895 curpart = <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(); <a name="l02896"></a>02896 part = 0; <a name="l02897"></a>02897 <a name="l02898"></a>02898 <span class="keywordflow">while</span> (curpart && !part) { <a name="l02899"></a>02899 <span class="comment">//dive into multipart messages</span> <a name="l02900"></a>02900 <span class="keywordflow">while</span>(curpart <a name="l02901"></a>02901 && curpart->hasHeaders() <a name="l02902"></a>02902 && curpart->Headers().HasContentType() <a name="l02903"></a>02903 && curpart->Body().FirstBodyPart() <a name="l02904"></a>02904 && (DwMime::kTypeMultipart == curpart->Headers().ContentType().Type()) ) { <a name="l02905"></a>02905 parts.append( curpart ); <a name="l02906"></a>02906 curpart = curpart->Body().FirstBodyPart(); <a name="l02907"></a>02907 } <a name="l02908"></a>02908 <span class="comment">// this is where curPart->msgPart contains a leaf message part</span> <a name="l02909"></a>02909 <a name="l02910"></a>02910 <span class="comment">// pending(khz): Find out WHY this look does not travel down *into* an</span> <a name="l02911"></a>02911 <span class="comment">// embedded "Message/RfF822" message containing a "Multipart/Mixed"</span> <a name="l02912"></a>02912 <span class="keywordflow">if</span> ( curpart && curpart->hasHeaders() && curpart->Headers().HasContentType() ) { <a name="l02913"></a>02913 kdDebug(5006) << curpart->Headers().ContentType().TypeStr().c_str() <a name="l02914"></a>02914 << <span class="stringliteral">" "</span> << curpart->Headers().ContentType().SubtypeStr().c_str() << endl; <a name="l02915"></a>02915 } <a name="l02916"></a>02916 <a name="l02917"></a>02917 <span class="keywordflow">if</span> (curpart && <a name="l02918"></a>02918 curpart->hasHeaders() && <a name="l02919"></a>02919 curpart->Headers().HasContentType() && <a name="l02920"></a>02920 curpart->Headers().ContentType().Type() == type && <a name="l02921"></a>02921 curpart->Headers().ContentType().Subtype() == subtype) { <a name="l02922"></a>02922 part = curpart; <a name="l02923"></a>02923 } <span class="keywordflow">else</span> { <a name="l02924"></a>02924 <span class="comment">// go up in the tree until reaching a node with next</span> <a name="l02925"></a>02925 <span class="comment">// (or the last top-level node)</span> <a name="l02926"></a>02926 <span class="keywordflow">while</span> (curpart && !(curpart->Next()) && !(parts.isEmpty())) { <a name="l02927"></a>02927 curpart = parts.getLast(); <a name="l02928"></a>02928 parts.removeLast(); <a name="l02929"></a>02929 } ; <a name="l02930"></a>02930 <span class="keywordflow">if</span> (curpart) <a name="l02931"></a>02931 curpart = curpart->Next(); <a name="l02932"></a>02932 } <a name="l02933"></a>02933 } <a name="l02934"></a>02934 <span class="keywordflow">return</span> part; <a name="l02935"></a>02935 } <a name="l02936"></a>02936 <a name="l02937"></a>02937 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l02938"></a><a class="code" href="classKMMessage.html#36588ccf8bb5d7947beba69f2221c35f">02938</a> DwBodyPart * <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">KMMessage::findDwBodyPart</a>( <span class="keyword">const</span> QCString& type, <span class="keyword">const</span> QCString& subtype )<span class="keyword"> const</span> <a name="l02939"></a>02939 <span class="keyword"></span>{ <a name="l02940"></a>02940 DwBodyPart *part, *curpart; <a name="l02941"></a>02941 QPtrList< DwBodyPart > parts; <a name="l02942"></a>02942 <span class="comment">// Get the DwBodyPart for this index</span> <a name="l02943"></a>02943 <a name="l02944"></a>02944 curpart = <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(); <a name="l02945"></a>02945 part = 0; <a name="l02946"></a>02946 <a name="l02947"></a>02947 <span class="keywordflow">while</span> (curpart && !part) { <a name="l02948"></a>02948 <span class="comment">//dive into multipart messages</span> <a name="l02949"></a>02949 <span class="keywordflow">while</span>(curpart <a name="l02950"></a>02950 && curpart->hasHeaders() <a name="l02951"></a>02951 && curpart->Headers().HasContentType() <a name="l02952"></a>02952 && curpart->Body().FirstBodyPart() <a name="l02953"></a>02953 && (DwMime::kTypeMultipart == curpart->Headers().ContentType().Type()) ) { <a name="l02954"></a>02954 parts.append( curpart ); <a name="l02955"></a>02955 curpart = curpart->Body().FirstBodyPart(); <a name="l02956"></a>02956 } <a name="l02957"></a>02957 <span class="comment">// this is where curPart->msgPart contains a leaf message part</span> <a name="l02958"></a>02958 <a name="l02959"></a>02959 <span class="comment">// pending(khz): Find out WHY this look does not travel down *into* an</span> <a name="l02960"></a>02960 <span class="comment">// embedded "Message/RfF822" message containing a "Multipart/Mixed"</span> <a name="l02961"></a>02961 <span class="keywordflow">if</span> (curpart && curpart->hasHeaders() && curpart->Headers().HasContentType() ) { <a name="l02962"></a>02962 kdDebug(5006) << curpart->Headers().ContentType().TypeStr().c_str() <a name="l02963"></a>02963 << <span class="stringliteral">" "</span> << curpart->Headers().ContentType().SubtypeStr().c_str() << endl; <a name="l02964"></a>02964 } <a name="l02965"></a>02965 <a name="l02966"></a>02966 <span class="keywordflow">if</span> (curpart && <a name="l02967"></a>02967 curpart->hasHeaders() && <a name="l02968"></a>02968 curpart->Headers().HasContentType() && <a name="l02969"></a>02969 curpart->Headers().ContentType().TypeStr().c_str() == type && <a name="l02970"></a>02970 curpart->Headers().ContentType().SubtypeStr().c_str() == subtype) { <a name="l02971"></a>02971 part = curpart; <a name="l02972"></a>02972 } <span class="keywordflow">else</span> { <a name="l02973"></a>02973 <span class="comment">// go up in the tree until reaching a node with next</span> <a name="l02974"></a>02974 <span class="comment">// (or the last top-level node)</span> <a name="l02975"></a>02975 <span class="keywordflow">while</span> (curpart && !(curpart->Next()) && !(parts.isEmpty())) { <a name="l02976"></a>02976 curpart = parts.getLast(); <a name="l02977"></a>02977 parts.removeLast(); <a name="l02978"></a>02978 } ; <a name="l02979"></a>02979 <span class="keywordflow">if</span> (curpart) <a name="l02980"></a>02980 curpart = curpart->Next(); <a name="l02981"></a>02981 } <a name="l02982"></a>02982 } <a name="l02983"></a>02983 <span class="keywordflow">return</span> part; <a name="l02984"></a>02984 } <a name="l02985"></a>02985 <a name="l02986"></a>02986 <a name="l02987"></a>02987 <span class="keywordtype">void</span> applyHeadersToMessagePart( DwHeaders& <a class="code" href="classKMMessage.html#7dd06ebd026305292fd380c9acb283b6" title="get the DwHeaders (make sure to call setNeedsAssembly() function after directly modyfying...">headers</a>, KMMessagePart* aPart ) <a name="l02988"></a>02988 { <a name="l02989"></a>02989 <span class="comment">// TODO: Instead of manually implementing RFC2231 header encoding (i.e.</span> <a name="l02990"></a>02990 <span class="comment">// possibly multiple values given as paramname*0=..; parmaname*1=..;...</span> <a name="l02991"></a>02991 <span class="comment">// or par as paramname*0*=..; parmaname*1*=..;..., which should be</span> <a name="l02992"></a>02992 <span class="comment">// concatenated), use a generic method to decode the header, using RFC</span> <a name="l02993"></a>02993 <span class="comment">// 2047 or 2231, or whatever future RFC might be appropriate!</span> <a name="l02994"></a>02994 <span class="comment">// Right now, some fields are decoded, while others are not. E.g.</span> <a name="l02995"></a>02995 <span class="comment">// Content-Disposition is not decoded here, rather only on demand in</span> <a name="l02996"></a>02996 <span class="comment">// KMMsgPart::fileName; Name however is decoded here and stored as a</span> <a name="l02997"></a>02997 <span class="comment">// decoded String in KMMsgPart...</span> <a name="l02998"></a>02998 <span class="comment">// Content-type</span> <a name="l02999"></a>02999 QCString additionalCTypeParams; <a name="l03000"></a>03000 <span class="keywordflow">if</span> (headers.HasContentType()) <a name="l03001"></a>03001 { <a name="l03002"></a>03002 DwMediaType& ct = headers.ContentType(); <a name="l03003"></a>03003 aPart->setOriginalContentTypeStr( ct.AsString().c_str() ); <a name="l03004"></a>03004 aPart->setTypeStr(ct.TypeStr().c_str()); <a name="l03005"></a>03005 aPart->setSubtypeStr(ct.SubtypeStr().c_str()); <a name="l03006"></a>03006 DwParameter *param = ct.FirstParameter(); <a name="l03007"></a>03007 <span class="keywordflow">while</span>(param) <a name="l03008"></a>03008 { <a name="l03009"></a>03009 <span class="keywordflow">if</span> (!qstricmp(param->Attribute().c_str(), <span class="stringliteral">"charset"</span>)) <a name="l03010"></a>03010 aPart->setCharset(QCString(param->Value().c_str()).lower()); <a name="l03011"></a>03011 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!qstrnicmp(param->Attribute().c_str(), <span class="stringliteral">"name*"</span>, 5)) <a name="l03012"></a>03012 aPart->setName(KMMsgBase::decodeRFC2231String(KMMsgBase::extractRFC2231HeaderField( param->Value().c_str(), <span class="stringliteral">"name"</span> ))); <a name="l03013"></a>03013 <span class="keywordflow">else</span> { <a name="l03014"></a>03014 additionalCTypeParams += <span class="charliteral">';'</span>; <a name="l03015"></a>03015 additionalCTypeParams += param->AsString().c_str(); <a name="l03016"></a>03016 } <a name="l03017"></a>03017 param=param->Next(); <a name="l03018"></a>03018 } <a name="l03019"></a>03019 } <a name="l03020"></a>03020 <span class="keywordflow">else</span> <a name="l03021"></a>03021 { <a name="l03022"></a>03022 aPart->setTypeStr(<span class="stringliteral">"text"</span>); <span class="comment">// Set to defaults</span> <a name="l03023"></a>03023 aPart->setSubtypeStr(<span class="stringliteral">"plain"</span>); <a name="l03024"></a>03024 } <a name="l03025"></a>03025 aPart->setAdditionalCTypeParamStr( additionalCTypeParams ); <a name="l03026"></a>03026 <span class="comment">// Modification by Markus</span> <a name="l03027"></a>03027 <span class="keywordflow">if</span> (aPart->name().isEmpty()) <a name="l03028"></a>03028 { <a name="l03029"></a>03029 <span class="keywordflow">if</span> (headers.HasContentType() && !headers.ContentType().Name().empty()) { <a name="l03030"></a>03030 aPart->setName(KMMsgBase::decodeRFC2047String(headers. <a name="l03031"></a>03031 ContentType().Name().c_str()) ); <a name="l03032"></a>03032 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (headers.HasSubject() && !headers.Subject().AsString().empty()) { <a name="l03033"></a>03033 aPart->setName( KMMsgBase::decodeRFC2047String(headers. <a name="l03034"></a>03034 Subject().AsString().c_str()) ); <a name="l03035"></a>03035 } <a name="l03036"></a>03036 } <a name="l03037"></a>03037 <a name="l03038"></a>03038 <span class="comment">// Content-transfer-encoding</span> <a name="l03039"></a>03039 <span class="keywordflow">if</span> (headers.HasContentTransferEncoding()) <a name="l03040"></a>03040 aPart->setCteStr(headers.ContentTransferEncoding().AsString().c_str()); <a name="l03041"></a>03041 <span class="keywordflow">else</span> <a name="l03042"></a>03042 aPart->setCteStr(<span class="stringliteral">"7bit"</span>); <a name="l03043"></a>03043 <a name="l03044"></a>03044 <span class="comment">// Content-description</span> <a name="l03045"></a>03045 <span class="keywordflow">if</span> (headers.HasContentDescription()) <a name="l03046"></a>03046 aPart->setContentDescription(headers.ContentDescription().AsString().c_str()); <a name="l03047"></a>03047 <span class="keywordflow">else</span> <a name="l03048"></a>03048 aPart->setContentDescription(<span class="stringliteral">""</span>); <a name="l03049"></a>03049 <a name="l03050"></a>03050 <span class="comment">// Content-disposition</span> <a name="l03051"></a>03051 <span class="keywordflow">if</span> (headers.HasContentDisposition()) <a name="l03052"></a>03052 aPart->setContentDisposition(headers.ContentDisposition().AsString().c_str()); <a name="l03053"></a>03053 <span class="keywordflow">else</span> <a name="l03054"></a>03054 aPart->setContentDisposition(<span class="stringliteral">""</span>); <a name="l03055"></a>03055 } <a name="l03056"></a>03056 <a name="l03057"></a>03057 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03058"></a><a class="code" href="classKMMessage.html#2b942616accf9ac39e19351ce2bba17d">03058</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#2b942616accf9ac39e19351ce2bba17d" title="Fill the KMMessagePart structure for a given DwBodyPart.">KMMessage::bodyPart</a>(DwBodyPart* aDwBodyPart, KMMessagePart* aPart, <a name="l03059"></a>03059 <span class="keywordtype">bool</span> withBody) <a name="l03060"></a>03060 { <a name="l03061"></a>03061 <span class="keywordflow">if</span> ( !aPart ) <a name="l03062"></a>03062 <span class="keywordflow">return</span>; <a name="l03063"></a>03063 <a name="l03064"></a>03064 aPart->clear(); <a name="l03065"></a>03065 <a name="l03066"></a>03066 <span class="keywordflow">if</span>( aDwBodyPart && aDwBodyPart->hasHeaders() ) { <a name="l03067"></a>03067 <span class="comment">// This must not be an empty string, because we'll get a</span> <a name="l03068"></a>03068 <span class="comment">// spurious empty Subject: line in some of the parts.</span> <a name="l03069"></a>03069 <span class="comment">//aPart->setName(" ");</span> <a name="l03070"></a>03070 <span class="comment">// partSpecifier</span> <a name="l03071"></a>03071 QString partId( aDwBodyPart->partId() ); <a name="l03072"></a>03072 aPart->setPartSpecifier( partId ); <a name="l03073"></a>03073 <a name="l03074"></a>03074 DwHeaders& headers = aDwBodyPart->Headers(); <a name="l03075"></a>03075 applyHeadersToMessagePart( headers, aPart ); <a name="l03076"></a>03076 <a name="l03077"></a>03077 <span class="comment">// Body</span> <a name="l03078"></a>03078 <span class="keywordflow">if</span> (withBody) <a name="l03079"></a>03079 aPart->setBody( aDwBodyPart->Body().AsString() ); <a name="l03080"></a>03080 <span class="keywordflow">else</span> <a name="l03081"></a>03081 aPart->setBody( QCString(<span class="stringliteral">""</span>) ); <a name="l03082"></a>03082 <a name="l03083"></a>03083 <span class="comment">// Content-id</span> <a name="l03084"></a>03084 <span class="keywordflow">if</span> ( headers.HasContentId() ) { <a name="l03085"></a>03085 <span class="keyword">const</span> QCString contentId = headers.ContentId().AsString().c_str(); <a name="l03086"></a>03086 <span class="comment">// ignore leading '<' and trailing '>'</span> <a name="l03087"></a>03087 aPart->setContentId( contentId.mid( 1, contentId.length() - 2 ) ); <a name="l03088"></a>03088 } <a name="l03089"></a>03089 } <a name="l03090"></a>03090 <span class="comment">// If no valid body part was given,</span> <a name="l03091"></a>03091 <span class="comment">// set all MultipartBodyPart attributes to empty values.</span> <a name="l03092"></a>03092 <span class="keywordflow">else</span> <a name="l03093"></a>03093 { <a name="l03094"></a>03094 aPart->setTypeStr(<span class="stringliteral">""</span>); <a name="l03095"></a>03095 aPart->setSubtypeStr(<span class="stringliteral">""</span>); <a name="l03096"></a>03096 aPart->setCteStr(<span class="stringliteral">""</span>); <a name="l03097"></a>03097 <span class="comment">// This must not be an empty string, because we'll get a</span> <a name="l03098"></a>03098 <span class="comment">// spurious empty Subject: line in some of the parts.</span> <a name="l03099"></a>03099 <span class="comment">//aPart->setName(" ");</span> <a name="l03100"></a>03100 aPart->setContentDescription(<span class="stringliteral">""</span>); <a name="l03101"></a>03101 aPart->setContentDisposition(<span class="stringliteral">""</span>); <a name="l03102"></a>03102 aPart->setBody(QCString(<span class="stringliteral">""</span>)); <a name="l03103"></a>03103 aPart->setContentId(<span class="stringliteral">""</span>); <a name="l03104"></a>03104 } <a name="l03105"></a>03105 } <a name="l03106"></a>03106 <a name="l03107"></a>03107 <a name="l03108"></a>03108 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03109"></a><a class="code" href="classKMMessage.html#cf8afc510cc52e9a168d7c28c2969583">03109</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#2b942616accf9ac39e19351ce2bba17d" title="Fill the KMMessagePart structure for a given DwBodyPart.">KMMessage::bodyPart</a>(<span class="keywordtype">int</span> aIdx, KMMessagePart* aPart)<span class="keyword"> const</span> <a name="l03110"></a>03110 <span class="keyword"></span>{ <a name="l03111"></a>03111 <span class="keywordflow">if</span> ( !aPart ) <a name="l03112"></a>03112 <span class="keywordflow">return</span>; <a name="l03113"></a>03113 <a name="l03114"></a>03114 <span class="comment">// If the DwBodyPart was found get the header fields and body</span> <a name="l03115"></a>03115 <span class="keywordflow">if</span> ( DwBodyPart *part = <a class="code" href="classKMMessage.html#d29d08c00132080dd384caa3861a872f" title="Get the DwBodyPart at position in aIdx.">dwBodyPart</a>( aIdx ) ) { <a name="l03116"></a>03116 <a class="code" href="classKMMessage.html#2b942616accf9ac39e19351ce2bba17d" title="Fill the KMMessagePart structure for a given DwBodyPart.">KMMessage::bodyPart</a>(part, aPart); <a name="l03117"></a>03117 <span class="keywordflow">if</span>( aPart->name().isEmpty() ) <a name="l03118"></a>03118 aPart->setName( i18n(<span class="stringliteral">"Attachment: %1"</span>).arg( aIdx ) ); <a name="l03119"></a>03119 } <a name="l03120"></a>03120 } <a name="l03121"></a>03121 <a name="l03122"></a>03122 <a name="l03123"></a>03123 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03124"></a><a class="code" href="classKMMessage.html#fc64c26a395d55c6ca96c00051f72c63">03124</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#fc64c26a395d55c6ca96c00051f72c63" title="Delete all body parts.">KMMessage::deleteBodyParts</a>() <a name="l03125"></a>03125 { <a name="l03126"></a>03126 mMsg->Body().DeleteBodyParts(); <a name="l03127"></a>03127 } <a name="l03128"></a>03128 <a name="l03129"></a><a class="code" href="classKMMessage.html#1858f691f77ad3420ae34e575b9ef2e5">03129</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#1858f691f77ad3420ae34e575b9ef2e5" title="Removes the given body part.">KMMessage::removeBodyPart</a>(DwBodyPart * dwPart) <a name="l03130"></a>03130 { <a name="l03131"></a>03131 mMsg->Body().RemoveBodyPart( dwPart ); <a name="l03132"></a>03132 mNeedsAssembly = <span class="keyword">true</span>; <a name="l03133"></a>03133 } <a name="l03134"></a>03134 <a name="l03135"></a>03135 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03136"></a><a class="code" href="classKMMessage.html#fd780c436fe7879034871767c6dc1f18">03136</a> DwBodyPart* <a class="code" href="classKMMessage.html#fd780c436fe7879034871767c6dc1f18" title="Compose a DwBodyPart (needed for adding a part to the message).">KMMessage::createDWBodyPart</a>(<span class="keyword">const</span> KMMessagePart* aPart) <a name="l03137"></a>03137 { <a name="l03138"></a>03138 DwBodyPart* part = DwBodyPart::NewBodyPart(emptyString, 0); <a name="l03139"></a>03139 <a name="l03140"></a>03140 <span class="keywordflow">if</span> ( !aPart ) <a name="l03141"></a>03141 <span class="keywordflow">return</span> part; <a name="l03142"></a>03142 <a name="l03143"></a>03143 QCString <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">charset</a> = aPart->charset(); <a name="l03144"></a>03144 QCString type = aPart->typeStr(); <a name="l03145"></a>03145 QCString subtype = aPart->subtypeStr(); <a name="l03146"></a>03146 QCString cte = aPart->cteStr(); <a name="l03147"></a>03147 QCString contDesc = aPart->contentDescriptionEncoded(); <a name="l03148"></a>03148 QCString contDisp = aPart->contentDisposition(); <a name="l03149"></a>03149 QCString encoding = autoDetectCharset(charset, sPrefCharsets, aPart->name()); <a name="l03150"></a>03150 <span class="keywordflow">if</span> (encoding.isEmpty()) encoding = <span class="stringliteral">"utf-8"</span>; <a name="l03151"></a>03151 QCString name = KMMsgBase::encodeRFC2231String(aPart->name(), encoding); <a name="l03152"></a>03152 <span class="keywordtype">bool</span> RFC2231encoded = aPart->name() != QString(name); <a name="l03153"></a>03153 QCString paramAttr = aPart->parameterAttribute(); <a name="l03154"></a>03154 <a name="l03155"></a>03155 DwHeaders& headers = part->Headers(); <a name="l03156"></a>03156 <a name="l03157"></a>03157 DwMediaType& ct = headers.ContentType(); <a name="l03158"></a>03158 <span class="keywordflow">if</span> (!type.isEmpty() && !subtype.isEmpty()) <a name="l03159"></a>03159 { <a name="l03160"></a>03160 ct.SetTypeStr(type.data()); <a name="l03161"></a>03161 ct.SetSubtypeStr(subtype.data()); <a name="l03162"></a>03162 <span class="keywordflow">if</span> (!charset.isEmpty()){ <a name="l03163"></a>03163 DwParameter *param; <a name="l03164"></a>03164 param=<span class="keyword">new</span> DwParameter; <a name="l03165"></a>03165 param->SetAttribute(<span class="stringliteral">"charset"</span>); <a name="l03166"></a>03166 param->SetValue(charset.data()); <a name="l03167"></a>03167 ct.AddParameter(param); <a name="l03168"></a>03168 } <a name="l03169"></a>03169 } <a name="l03170"></a>03170 <a name="l03171"></a>03171 QCString additionalParam = aPart->additionalCTypeParamStr(); <a name="l03172"></a>03172 <span class="keywordflow">if</span>( !additionalParam.isEmpty() ) <a name="l03173"></a>03173 { <a name="l03174"></a>03174 QCString parAV; <a name="l03175"></a>03175 DwString parA, parV; <a name="l03176"></a>03176 <span class="keywordtype">int</span> iL, i1, i2, iM; <a name="l03177"></a>03177 iL = additionalParam.length(); <a name="l03178"></a>03178 i1 = 0; <a name="l03179"></a>03179 i2 = additionalParam.find(<span class="charliteral">';'</span>, i1, <span class="keyword">false</span>); <a name="l03180"></a>03180 <span class="keywordflow">while</span> ( i1 < iL ) <a name="l03181"></a>03181 { <a name="l03182"></a>03182 <span class="keywordflow">if</span>( -1 == i2 ) <a name="l03183"></a>03183 i2 = iL; <a name="l03184"></a>03184 <span class="keywordflow">if</span>( i1+1 < i2 ) { <a name="l03185"></a>03185 parAV = additionalParam.mid( i1, (i2-i1) ); <a name="l03186"></a>03186 iM = parAV.find(<span class="charliteral">'='</span>); <a name="l03187"></a>03187 <span class="keywordflow">if</span>( -1 < iM ) <a name="l03188"></a>03188 { <a name="l03189"></a>03189 parA = parAV.left( iM ); <a name="l03190"></a>03190 parV = parAV.right( parAV.length() - iM - 1 ); <a name="l03191"></a>03191 <span class="keywordflow">if</span>( (<span class="charliteral">'"'</span> == parV.at(0)) && (<span class="charliteral">'"'</span> == parV.at(parV.length()-1)) ) <a name="l03192"></a>03192 { <a name="l03193"></a>03193 parV.erase( 0, 1); <a name="l03194"></a>03194 parV.erase( parV.length()-1 ); <a name="l03195"></a>03195 } <a name="l03196"></a>03196 } <a name="l03197"></a>03197 <span class="keywordflow">else</span> <a name="l03198"></a>03198 { <a name="l03199"></a>03199 parA = parAV; <a name="l03200"></a>03200 parV = <span class="stringliteral">""</span>; <a name="l03201"></a>03201 } <a name="l03202"></a>03202 DwParameter *param; <a name="l03203"></a>03203 param = <span class="keyword">new</span> DwParameter; <a name="l03204"></a>03204 param->SetAttribute( parA ); <a name="l03205"></a>03205 param->SetValue( parV ); <a name="l03206"></a>03206 ct.AddParameter( param ); <a name="l03207"></a>03207 } <a name="l03208"></a>03208 i1 = i2+1; <a name="l03209"></a>03209 i2 = additionalParam.find(<span class="charliteral">';'</span>, i1, <span class="keyword">false</span>); <a name="l03210"></a>03210 } <a name="l03211"></a>03211 } <a name="l03212"></a>03212 <a name="l03213"></a>03213 <span class="keywordflow">if</span> ( !name.isEmpty() ) { <a name="l03214"></a>03214 <span class="keywordflow">if</span> (RFC2231encoded) <a name="l03215"></a>03215 { <a name="l03216"></a>03216 DwParameter *nameParam; <a name="l03217"></a>03217 nameParam = <span class="keyword">new</span> DwParameter; <a name="l03218"></a>03218 nameParam->SetAttribute(<span class="stringliteral">"name*"</span>); <a name="l03219"></a>03219 nameParam->SetValue(name.data(),<span class="keyword">true</span>); <a name="l03220"></a>03220 ct.AddParameter(nameParam); <a name="l03221"></a>03221 } <span class="keywordflow">else</span> { <a name="l03222"></a>03222 ct.SetName(name.data()); <a name="l03223"></a>03223 } <a name="l03224"></a>03224 } <a name="l03225"></a>03225 <a name="l03226"></a>03226 <span class="keywordflow">if</span> (!paramAttr.isEmpty()) <a name="l03227"></a>03227 { <a name="l03228"></a>03228 QCString encoding = autoDetectCharset(charset, sPrefCharsets, <a name="l03229"></a>03229 aPart->parameterValue()); <a name="l03230"></a>03230 <span class="keywordflow">if</span> (encoding.isEmpty()) encoding = <span class="stringliteral">"utf-8"</span>; <a name="l03231"></a>03231 QCString paramValue; <a name="l03232"></a>03232 paramValue = KMMsgBase::encodeRFC2231String(aPart->parameterValue(), <a name="l03233"></a>03233 encoding); <a name="l03234"></a>03234 DwParameter *param = <span class="keyword">new</span> DwParameter; <a name="l03235"></a>03235 <span class="keywordflow">if</span> (aPart->parameterValue() != QString(paramValue)) <a name="l03236"></a>03236 { <a name="l03237"></a>03237 param->SetAttribute((paramAttr + <span class="charliteral">'*'</span>).data()); <a name="l03238"></a>03238 param->SetValue(paramValue.data(),<span class="keyword">true</span>); <a name="l03239"></a>03239 } <span class="keywordflow">else</span> { <a name="l03240"></a>03240 param->SetAttribute(paramAttr.data()); <a name="l03241"></a>03241 param->SetValue(paramValue.data()); <a name="l03242"></a>03242 } <a name="l03243"></a>03243 ct.AddParameter(param); <a name="l03244"></a>03244 } <a name="l03245"></a>03245 <a name="l03246"></a>03246 <span class="keywordflow">if</span> (!cte.isEmpty()) <a name="l03247"></a>03247 headers.Cte().FromString(cte); <a name="l03248"></a>03248 <a name="l03249"></a>03249 <span class="keywordflow">if</span> (!contDesc.isEmpty()) <a name="l03250"></a>03250 headers.ContentDescription().FromString(contDesc); <a name="l03251"></a>03251 <a name="l03252"></a>03252 <span class="keywordflow">if</span> (!contDisp.isEmpty()) <a name="l03253"></a>03253 headers.ContentDisposition().FromString(contDisp); <a name="l03254"></a>03254 <a name="l03255"></a>03255 <span class="keyword">const</span> DwString bodyStr = aPart->dwBody(); <a name="l03256"></a>03256 <span class="keywordflow">if</span> (!bodyStr.empty()) <a name="l03257"></a>03257 part->Body().FromString(bodyStr); <a name="l03258"></a>03258 <span class="keywordflow">else</span> <a name="l03259"></a>03259 part->Body().FromString(<span class="stringliteral">""</span>); <a name="l03260"></a>03260 <a name="l03261"></a>03261 <span class="keywordflow">if</span> (!aPart->partSpecifier().isNull()) <a name="l03262"></a>03262 part->SetPartId( aPart->partSpecifier().latin1() ); <a name="l03263"></a>03263 <a name="l03264"></a>03264 <span class="keywordflow">if</span> (aPart->decodedSize() > 0) <a name="l03265"></a>03265 part->SetBodySize( aPart->decodedSize() ); <a name="l03266"></a>03266 <a name="l03267"></a>03267 <span class="keywordflow">return</span> part; <a name="l03268"></a>03268 } <a name="l03269"></a>03269 <a name="l03270"></a>03270 <a name="l03271"></a>03271 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03272"></a><a class="code" href="classKMMessage.html#74c1405916368420c33e1542107b6f82">03272</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#74c1405916368420c33e1542107b6f82" title="Append a DwBodyPart to the message.">KMMessage::addDwBodyPart</a>(DwBodyPart * aDwPart) <a name="l03273"></a>03273 { <a name="l03274"></a>03274 mMsg->Body().AddBodyPart( aDwPart ); <a name="l03275"></a>03275 mNeedsAssembly = <span class="keyword">true</span>; <a name="l03276"></a>03276 } <a name="l03277"></a>03277 <a name="l03278"></a>03278 <a name="l03279"></a>03279 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03280"></a><a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217">03280</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">KMMessage::addBodyPart</a>(<span class="keyword">const</span> KMMessagePart* aPart) <a name="l03281"></a>03281 { <a name="l03282"></a>03282 DwBodyPart* part = <a class="code" href="classKMMessage.html#fd780c436fe7879034871767c6dc1f18" title="Compose a DwBodyPart (needed for adding a part to the message).">createDWBodyPart</a>( aPart ); <a name="l03283"></a>03283 <a class="code" href="classKMMessage.html#74c1405916368420c33e1542107b6f82" title="Append a DwBodyPart to the message.">addDwBodyPart</a>( part ); <a name="l03284"></a>03284 } <a name="l03285"></a>03285 <a name="l03286"></a>03286 <a name="l03287"></a>03287 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03288"></a><a class="code" href="classKMMessage.html#66d82f92b132f0d6b2fc619befd5986f">03288</a> QString <a class="code" href="classKMMessage.html#66d82f92b132f0d6b2fc619befd5986f" title="Generates the Message-Id.">KMMessage::generateMessageId</a>( <span class="keyword">const</span> QString& addr ) <a name="l03289"></a>03289 { <a name="l03290"></a>03290 QDateTime datetime = QDateTime::currentDateTime(); <a name="l03291"></a>03291 QString msgIdStr; <a name="l03292"></a>03292 <a name="l03293"></a>03293 msgIdStr = <span class="charliteral">'<'</span> + datetime.toString( <span class="stringliteral">"yyyyMMddhhmm.sszzz"</span> ); <a name="l03294"></a>03294 <a name="l03295"></a>03295 QString msgIdSuffix; <a name="l03296"></a>03296 KConfigGroup general( KMKernel::config(), <span class="stringliteral">"General"</span> ); <a name="l03297"></a>03297 <a name="l03298"></a>03298 <span class="keywordflow">if</span>( general.readBoolEntry( <span class="stringliteral">"useCustomMessageIdSuffix"</span>, <span class="keyword">false</span> ) ) <a name="l03299"></a>03299 msgIdSuffix = general.readEntry( <span class="stringliteral">"myMessageIdSuffix"</span> ); <a name="l03300"></a>03300 <a name="l03301"></a>03301 <span class="keywordflow">if</span>( !msgIdSuffix.isEmpty() ) <a name="l03302"></a>03302 msgIdStr += <span class="charliteral">'@'</span> + msgIdSuffix; <a name="l03303"></a>03303 <span class="keywordflow">else</span> <a name="l03304"></a>03304 msgIdStr += <span class="charliteral">'.'</span> + KPIM::encodeIDN( addr ); <a name="l03305"></a>03305 <a name="l03306"></a>03306 msgIdStr += <span class="charliteral">'>'</span>; <a name="l03307"></a>03307 <a name="l03308"></a>03308 <span class="keywordflow">return</span> msgIdStr; <a name="l03309"></a>03309 } <a name="l03310"></a>03310 <a name="l03311"></a>03311 <a name="l03312"></a>03312 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03313"></a><a class="code" href="classKMMessage.html#a508a4076d4b63a5c4b2c48906b354bb">03313</a> QCString <a class="code" href="classKMMessage.html#a508a4076d4b63a5c4b2c48906b354bb" title="Convert &#39;&lt;&#39; into &quot;&amp;lt;&quot; resp.">KMMessage::html2source</a>( <span class="keyword">const</span> QCString & src ) <a name="l03314"></a>03314 { <a name="l03315"></a>03315 QCString result( 1 + 6*(src.size()-1) ); <span class="comment">// maximal possible length</span> <a name="l03316"></a>03316 <a name="l03317"></a>03317 QCString::ConstIterator s = src.begin(); <a name="l03318"></a>03318 QCString::Iterator d = result.begin(); <a name="l03319"></a>03319 <span class="keywordflow">while</span> ( *s ) { <a name="l03320"></a>03320 <span class="keywordflow">switch</span> ( *s ) { <a name="l03321"></a>03321 <span class="keywordflow">case</span> <span class="charliteral">'<'</span>: { <a name="l03322"></a>03322 *d++ = <span class="charliteral">'&'</span>; <a name="l03323"></a>03323 *d++ = <span class="charliteral">'l'</span>; <a name="l03324"></a>03324 *d++ = <span class="charliteral">'t'</span>; <a name="l03325"></a>03325 *d++ = <span class="charliteral">';'</span>; <a name="l03326"></a>03326 ++s; <a name="l03327"></a>03327 } <a name="l03328"></a>03328 <span class="keywordflow">break</span>; <a name="l03329"></a>03329 <span class="keywordflow">case</span> <span class="charliteral">'\r'</span>: { <a name="l03330"></a>03330 ++s; <a name="l03331"></a>03331 } <a name="l03332"></a>03332 <span class="keywordflow">break</span>; <a name="l03333"></a>03333 <span class="keywordflow">case</span> <span class="charliteral">'\n'</span>: { <a name="l03334"></a>03334 *d++ = <span class="charliteral">'<'</span>; <a name="l03335"></a>03335 *d++ = <span class="charliteral">'b'</span>; <a name="l03336"></a>03336 *d++ = <span class="charliteral">'r'</span>; <a name="l03337"></a>03337 *d++ = <span class="charliteral">'>'</span>; <a name="l03338"></a>03338 ++s; <a name="l03339"></a>03339 } <a name="l03340"></a>03340 <span class="keywordflow">break</span>; <a name="l03341"></a>03341 <span class="keywordflow">case</span> <span class="charliteral">'>'</span>: { <a name="l03342"></a>03342 *d++ = <span class="charliteral">'&'</span>; <a name="l03343"></a>03343 *d++ = <span class="charliteral">'g'</span>; <a name="l03344"></a>03344 *d++ = <span class="charliteral">'t'</span>; <a name="l03345"></a>03345 *d++ = <span class="charliteral">';'</span>; <a name="l03346"></a>03346 ++s; <a name="l03347"></a>03347 } <a name="l03348"></a>03348 <span class="keywordflow">break</span>; <a name="l03349"></a>03349 <span class="keywordflow">case</span> <span class="charliteral">'&'</span>: { <a name="l03350"></a>03350 *d++ = <span class="charliteral">'&'</span>; <a name="l03351"></a>03351 *d++ = <span class="charliteral">'a'</span>; <a name="l03352"></a>03352 *d++ = <span class="charliteral">'m'</span>; <a name="l03353"></a>03353 *d++ = <span class="charliteral">'p'</span>; <a name="l03354"></a>03354 *d++ = <span class="charliteral">';'</span>; <a name="l03355"></a>03355 ++s; <a name="l03356"></a>03356 } <a name="l03357"></a>03357 <span class="keywordflow">break</span>; <a name="l03358"></a>03358 <span class="keywordflow">case</span> <span class="charliteral">'"'</span>: { <a name="l03359"></a>03359 *d++ = <span class="charliteral">'&'</span>; <a name="l03360"></a>03360 *d++ = <span class="charliteral">'q'</span>; <a name="l03361"></a>03361 *d++ = <span class="charliteral">'u'</span>; <a name="l03362"></a>03362 *d++ = <span class="charliteral">'o'</span>; <a name="l03363"></a>03363 *d++ = <span class="charliteral">'t'</span>; <a name="l03364"></a>03364 *d++ = <span class="charliteral">';'</span>; <a name="l03365"></a>03365 ++s; <a name="l03366"></a>03366 } <a name="l03367"></a>03367 <span class="keywordflow">break</span>; <a name="l03368"></a>03368 <span class="keywordflow">case</span> <span class="charliteral">'\''</span>: { <a name="l03369"></a>03369 *d++ = <span class="charliteral">'&'</span>; <a name="l03370"></a>03370 *d++ = <span class="charliteral">'a'</span>; <a name="l03371"></a>03371 *d++ = <span class="charliteral">'p'</span>; <a name="l03372"></a>03372 *d++ = <span class="charliteral">'s'</span>; <a name="l03373"></a>03373 *d++ = <span class="charliteral">';'</span>; <a name="l03374"></a>03374 ++s; <a name="l03375"></a>03375 } <a name="l03376"></a>03376 <span class="keywordflow">break</span>; <a name="l03377"></a>03377 <span class="keywordflow">default</span>: <a name="l03378"></a>03378 *d++ = *s++; <a name="l03379"></a>03379 } <a name="l03380"></a>03380 } <a name="l03381"></a>03381 result.truncate( d - result.begin() ); <span class="comment">// adds trailing NUL</span> <a name="l03382"></a>03382 <span class="keywordflow">return</span> result; <a name="l03383"></a>03383 } <a name="l03384"></a>03384 <a name="l03385"></a>03385 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03386"></a><a class="code" href="classKMMessage.html#ba85fd5c4264aeec336a5992e20e4568">03386</a> QString <a class="code" href="classKMMessage.html#ba85fd5c4264aeec336a5992e20e4568" title="Encodes an email address as mailto URL.">KMMessage::encodeMailtoUrl</a>( <span class="keyword">const</span> QString& str ) <a name="l03387"></a>03387 { <a name="l03388"></a>03388 QString result; <a name="l03389"></a>03389 result = QString::fromLatin1( KMMsgBase::encodeRFC2047String( str, <a name="l03390"></a>03390 <span class="stringliteral">"utf-8"</span> ) ); <a name="l03391"></a>03391 result = KURL::encode_string( result ); <a name="l03392"></a>03392 <span class="keywordflow">return</span> result; <a name="l03393"></a>03393 } <a name="l03394"></a>03394 <a name="l03395"></a>03395 <a name="l03396"></a>03396 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03397"></a><a class="code" href="classKMMessage.html#e8dca5f50d21a63908d4026e2683ac60">03397</a> QString <a class="code" href="classKMMessage.html#e8dca5f50d21a63908d4026e2683ac60" title="Decodes a mailto URL.">KMMessage::decodeMailtoUrl</a>( <span class="keyword">const</span> QString& url ) <a name="l03398"></a>03398 { <a name="l03399"></a>03399 QString result; <a name="l03400"></a>03400 result = KURL::decode_string( url ); <a name="l03401"></a>03401 result = KMMsgBase::decodeRFC2047String( result.latin1() ); <a name="l03402"></a>03402 <span class="keywordflow">return</span> result; <a name="l03403"></a>03403 } <a name="l03404"></a>03404 <a name="l03405"></a>03405 <a name="l03406"></a>03406 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03407"></a><a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616">03407</a> QCString <a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616" title="This function generates a displayable string from a list of email addresses.">KMMessage::stripEmailAddr</a>( <span class="keyword">const</span> QCString& aStr ) <a name="l03408"></a>03408 { <a name="l03409"></a>03409 <span class="comment">//kdDebug(5006) << "KMMessage::stripEmailAddr( " << aStr << " )" << endl;</span> <a name="l03410"></a>03410 <a name="l03411"></a>03411 <span class="keywordflow">if</span> ( aStr.isEmpty() ) <a name="l03412"></a>03412 <span class="keywordflow">return</span> QCString(); <a name="l03413"></a>03413 <a name="l03414"></a>03414 QCString result; <a name="l03415"></a>03415 <a name="l03416"></a>03416 <span class="comment">// The following is a primitive parser for a mailbox-list (cf. RFC 2822).</span> <a name="l03417"></a>03417 <span class="comment">// The purpose is to extract a displayable string from the mailboxes.</span> <a name="l03418"></a>03418 <span class="comment">// Comments in the addr-spec are not handled. No error checking is done.</span> <a name="l03419"></a>03419 <a name="l03420"></a>03420 QCString name; <a name="l03421"></a>03421 QCString comment; <a name="l03422"></a>03422 QCString angleAddress; <a name="l03423"></a>03423 <span class="keyword">enum</span> { TopLevel, InComment, InAngleAddress } context = TopLevel; <a name="l03424"></a>03424 <span class="keywordtype">bool</span> inQuotedString = <span class="keyword">false</span>; <a name="l03425"></a>03425 <span class="keywordtype">int</span> commentLevel = 0; <a name="l03426"></a>03426 <a name="l03427"></a>03427 <span class="keywordflow">for</span> ( <span class="keywordtype">char</span>* p = aStr.data(); *p; ++p ) { <a name="l03428"></a>03428 <span class="keywordflow">switch</span> ( context ) { <a name="l03429"></a>03429 <span class="keywordflow">case</span> TopLevel : { <a name="l03430"></a>03430 <span class="keywordflow">switch</span> ( *p ) { <a name="l03431"></a>03431 <span class="keywordflow">case</span> <span class="charliteral">'"'</span> : inQuotedString = !inQuotedString; <a name="l03432"></a>03432 <span class="keywordflow">break</span>; <a name="l03433"></a>03433 <span class="keywordflow">case</span> <span class="charliteral">'('</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03434"></a>03434 context = InComment; <a name="l03435"></a>03435 commentLevel = 1; <a name="l03436"></a>03436 } <a name="l03437"></a>03437 <span class="keywordflow">else</span> <a name="l03438"></a>03438 name += *p; <a name="l03439"></a>03439 <span class="keywordflow">break</span>; <a name="l03440"></a>03440 <span class="keywordflow">case</span> <span class="charliteral">'<'</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03441"></a>03441 context = InAngleAddress; <a name="l03442"></a>03442 } <a name="l03443"></a>03443 <span class="keywordflow">else</span> <a name="l03444"></a>03444 name += *p; <a name="l03445"></a>03445 <span class="keywordflow">break</span>; <a name="l03446"></a>03446 <span class="keywordflow">case</span> <span class="charliteral">'\\'</span> : <span class="comment">// quoted character</span> <a name="l03447"></a>03447 ++p; <span class="comment">// skip the '\'</span> <a name="l03448"></a>03448 <span class="keywordflow">if</span> ( *p ) <a name="l03449"></a>03449 name += *p; <a name="l03450"></a>03450 <span class="keywordflow">break</span>; <a name="l03451"></a>03451 <span class="keywordflow">case</span> <span class="charliteral">','</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03452"></a>03452 <span class="comment">// next email address</span> <a name="l03453"></a>03453 <span class="keywordflow">if</span> ( !result.isEmpty() ) <a name="l03454"></a>03454 result += <span class="stringliteral">", "</span>; <a name="l03455"></a>03455 name = name.stripWhiteSpace(); <a name="l03456"></a>03456 comment = comment.stripWhiteSpace(); <a name="l03457"></a>03457 angleAddress = angleAddress.stripWhiteSpace(); <a name="l03458"></a>03458 <span class="comment">/*</span> <a name="l03459"></a>03459 <span class="comment"> kdDebug(5006) << "Name : \"" << name</span> <a name="l03460"></a>03460 <span class="comment"> << "\"" << endl;</span> <a name="l03461"></a>03461 <span class="comment"> kdDebug(5006) << "Comment : \"" << comment</span> <a name="l03462"></a>03462 <span class="comment"> << "\"" << endl;</span> <a name="l03463"></a>03463 <span class="comment"> kdDebug(5006) << "Address : \"" << angleAddress</span> <a name="l03464"></a>03464 <span class="comment"> << "\"" << endl;</span> <a name="l03465"></a>03465 <span class="comment"> */</span> <a name="l03466"></a>03466 <span class="keywordflow">if</span> ( angleAddress.isEmpty() && !comment.isEmpty() ) { <a name="l03467"></a>03467 <span class="comment">// handle Outlook-style addresses like</span> <a name="l03468"></a>03468 <span class="comment">// john.doe@invalid (John Doe)</span> <a name="l03469"></a>03469 result += comment; <a name="l03470"></a>03470 } <a name="l03471"></a>03471 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !name.isEmpty() ) { <a name="l03472"></a>03472 result += name; <a name="l03473"></a>03473 } <a name="l03474"></a>03474 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !comment.isEmpty() ) { <a name="l03475"></a>03475 result += comment; <a name="l03476"></a>03476 } <a name="l03477"></a>03477 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !angleAddress.isEmpty() ) { <a name="l03478"></a>03478 result += angleAddress; <a name="l03479"></a>03479 } <a name="l03480"></a>03480 name = QCString(); <a name="l03481"></a>03481 comment = QCString(); <a name="l03482"></a>03482 angleAddress = QCString(); <a name="l03483"></a>03483 } <a name="l03484"></a>03484 <span class="keywordflow">else</span> <a name="l03485"></a>03485 name += *p; <a name="l03486"></a>03486 <span class="keywordflow">break</span>; <a name="l03487"></a>03487 <span class="keywordflow">default</span> : name += *p; <a name="l03488"></a>03488 } <a name="l03489"></a>03489 <span class="keywordflow">break</span>; <a name="l03490"></a>03490 } <a name="l03491"></a>03491 <span class="keywordflow">case</span> InComment : { <a name="l03492"></a>03492 <span class="keywordflow">switch</span> ( *p ) { <a name="l03493"></a>03493 <span class="keywordflow">case</span> <span class="charliteral">'('</span> : ++commentLevel; <a name="l03494"></a>03494 comment += *p; <a name="l03495"></a>03495 <span class="keywordflow">break</span>; <a name="l03496"></a>03496 <span class="keywordflow">case</span> <span class="charliteral">')'</span> : --commentLevel; <a name="l03497"></a>03497 <span class="keywordflow">if</span> ( commentLevel == 0 ) { <a name="l03498"></a>03498 context = TopLevel; <a name="l03499"></a>03499 comment += <span class="charliteral">' '</span>; <span class="comment">// separate the text of several comments</span> <a name="l03500"></a>03500 } <a name="l03501"></a>03501 <span class="keywordflow">else</span> <a name="l03502"></a>03502 comment += *p; <a name="l03503"></a>03503 <span class="keywordflow">break</span>; <a name="l03504"></a>03504 <span class="keywordflow">case</span> <span class="charliteral">'\\'</span> : <span class="comment">// quoted character</span> <a name="l03505"></a>03505 ++p; <span class="comment">// skip the '\'</span> <a name="l03506"></a>03506 <span class="keywordflow">if</span> ( *p ) <a name="l03507"></a>03507 comment += *p; <a name="l03508"></a>03508 <span class="keywordflow">break</span>; <a name="l03509"></a>03509 <span class="keywordflow">default</span> : comment += *p; <a name="l03510"></a>03510 } <a name="l03511"></a>03511 <span class="keywordflow">break</span>; <a name="l03512"></a>03512 } <a name="l03513"></a>03513 <span class="keywordflow">case</span> InAngleAddress : { <a name="l03514"></a>03514 <span class="keywordflow">switch</span> ( *p ) { <a name="l03515"></a>03515 <span class="keywordflow">case</span> <span class="charliteral">'"'</span> : inQuotedString = !inQuotedString; <a name="l03516"></a>03516 angleAddress += *p; <a name="l03517"></a>03517 <span class="keywordflow">break</span>; <a name="l03518"></a>03518 <span class="keywordflow">case</span> <span class="charliteral">'>'</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03519"></a>03519 context = TopLevel; <a name="l03520"></a>03520 } <a name="l03521"></a>03521 <span class="keywordflow">else</span> <a name="l03522"></a>03522 angleAddress += *p; <a name="l03523"></a>03523 <span class="keywordflow">break</span>; <a name="l03524"></a>03524 <span class="keywordflow">case</span> <span class="charliteral">'\\'</span> : <span class="comment">// quoted character</span> <a name="l03525"></a>03525 ++p; <span class="comment">// skip the '\'</span> <a name="l03526"></a>03526 <span class="keywordflow">if</span> ( *p ) <a name="l03527"></a>03527 angleAddress += *p; <a name="l03528"></a>03528 <span class="keywordflow">break</span>; <a name="l03529"></a>03529 <span class="keywordflow">default</span> : angleAddress += *p; <a name="l03530"></a>03530 } <a name="l03531"></a>03531 <span class="keywordflow">break</span>; <a name="l03532"></a>03532 } <a name="l03533"></a>03533 } <span class="comment">// switch ( context )</span> <a name="l03534"></a>03534 } <a name="l03535"></a>03535 <span class="keywordflow">if</span> ( !result.isEmpty() ) <a name="l03536"></a>03536 result += <span class="stringliteral">", "</span>; <a name="l03537"></a>03537 name = name.stripWhiteSpace(); <a name="l03538"></a>03538 comment = comment.stripWhiteSpace(); <a name="l03539"></a>03539 angleAddress = angleAddress.stripWhiteSpace(); <a name="l03540"></a>03540 <span class="comment">/*</span> <a name="l03541"></a>03541 <span class="comment"> kdDebug(5006) << "Name : \"" << name << "\"" << endl;</span> <a name="l03542"></a>03542 <span class="comment"> kdDebug(5006) << "Comment : \"" << comment << "\"" << endl;</span> <a name="l03543"></a>03543 <span class="comment"> kdDebug(5006) << "Address : \"" << angleAddress << "\"" << endl;</span> <a name="l03544"></a>03544 <span class="comment"> */</span> <a name="l03545"></a>03545 <span class="keywordflow">if</span> ( angleAddress.isEmpty() && !comment.isEmpty() ) { <a name="l03546"></a>03546 <span class="comment">// handle Outlook-style addresses like</span> <a name="l03547"></a>03547 <span class="comment">// john.doe@invalid (John Doe)</span> <a name="l03548"></a>03548 result += comment; <a name="l03549"></a>03549 } <a name="l03550"></a>03550 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !name.isEmpty() ) { <a name="l03551"></a>03551 result += name; <a name="l03552"></a>03552 } <a name="l03553"></a>03553 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !comment.isEmpty() ) { <a name="l03554"></a>03554 result += comment; <a name="l03555"></a>03555 } <a name="l03556"></a>03556 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !angleAddress.isEmpty() ) { <a name="l03557"></a>03557 result += angleAddress; <a name="l03558"></a>03558 } <a name="l03559"></a>03559 <a name="l03560"></a>03560 <span class="comment">//kdDebug(5006) << "KMMessage::stripEmailAddr(...) returns \"" << result</span> <a name="l03561"></a>03561 <span class="comment">// << "\"" << endl;</span> <a name="l03562"></a>03562 <span class="keywordflow">return</span> result; <a name="l03563"></a>03563 } <a name="l03564"></a>03564 <a name="l03565"></a>03565 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03566"></a><a class="code" href="classKMMessage.html#cfaf62fecb2952b9061bed0c04e232c0">03566</a> QString <a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616" title="This function generates a displayable string from a list of email addresses.">KMMessage::stripEmailAddr</a>( <span class="keyword">const</span> QString& aStr ) <a name="l03567"></a>03567 { <a name="l03568"></a>03568 <span class="comment">//kdDebug(5006) << "KMMessage::stripEmailAddr( " << aStr << " )" << endl;</span> <a name="l03569"></a>03569 <a name="l03570"></a>03570 <span class="keywordflow">if</span> ( aStr.isEmpty() ) <a name="l03571"></a>03571 <span class="keywordflow">return</span> QString::null; <a name="l03572"></a>03572 <a name="l03573"></a>03573 QString result; <a name="l03574"></a>03574 <a name="l03575"></a>03575 <span class="comment">// The following is a primitive parser for a mailbox-list (cf. RFC 2822).</span> <a name="l03576"></a>03576 <span class="comment">// The purpose is to extract a displayable string from the mailboxes.</span> <a name="l03577"></a>03577 <span class="comment">// Comments in the addr-spec are not handled. No error checking is done.</span> <a name="l03578"></a>03578 <a name="l03579"></a>03579 QString name; <a name="l03580"></a>03580 QString comment; <a name="l03581"></a>03581 QString angleAddress; <a name="l03582"></a>03582 <span class="keyword">enum</span> { TopLevel, InComment, InAngleAddress } context = TopLevel; <a name="l03583"></a>03583 <span class="keywordtype">bool</span> inQuotedString = <span class="keyword">false</span>; <a name="l03584"></a>03584 <span class="keywordtype">int</span> commentLevel = 0; <a name="l03585"></a>03585 <a name="l03586"></a>03586 QChar ch; <a name="l03587"></a>03587 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLength(aStr.length()); <a name="l03588"></a>03588 <span class="keywordflow">for</span> ( uint index = 0; index < strLength; ++index ) { <a name="l03589"></a>03589 ch = aStr[index]; <a name="l03590"></a>03590 <span class="keywordflow">switch</span> ( context ) { <a name="l03591"></a>03591 <span class="keywordflow">case</span> TopLevel : { <a name="l03592"></a>03592 <span class="keywordflow">switch</span> ( ch.latin1() ) { <a name="l03593"></a>03593 <span class="keywordflow">case</span> <span class="charliteral">'"'</span> : inQuotedString = !inQuotedString; <a name="l03594"></a>03594 <span class="keywordflow">break</span>; <a name="l03595"></a>03595 <span class="keywordflow">case</span> <span class="charliteral">'('</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03596"></a>03596 context = InComment; <a name="l03597"></a>03597 commentLevel = 1; <a name="l03598"></a>03598 } <a name="l03599"></a>03599 <span class="keywordflow">else</span> <a name="l03600"></a>03600 name += ch; <a name="l03601"></a>03601 <span class="keywordflow">break</span>; <a name="l03602"></a>03602 <span class="keywordflow">case</span> <span class="charliteral">'<'</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03603"></a>03603 context = InAngleAddress; <a name="l03604"></a>03604 } <a name="l03605"></a>03605 <span class="keywordflow">else</span> <a name="l03606"></a>03606 name += ch; <a name="l03607"></a>03607 <span class="keywordflow">break</span>; <a name="l03608"></a>03608 <span class="keywordflow">case</span> <span class="charliteral">'\\'</span> : <span class="comment">// quoted character</span> <a name="l03609"></a>03609 ++index; <span class="comment">// skip the '\'</span> <a name="l03610"></a>03610 <span class="keywordflow">if</span> ( index < aStr.length() ) <a name="l03611"></a>03611 name += aStr[index]; <a name="l03612"></a>03612 <span class="keywordflow">break</span>; <a name="l03613"></a>03613 <span class="keywordflow">case</span> <span class="charliteral">','</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03614"></a>03614 <span class="comment">// next email address</span> <a name="l03615"></a>03615 <span class="keywordflow">if</span> ( !result.isEmpty() ) <a name="l03616"></a>03616 result += <span class="stringliteral">", "</span>; <a name="l03617"></a>03617 name = name.stripWhiteSpace(); <a name="l03618"></a>03618 comment = comment.stripWhiteSpace(); <a name="l03619"></a>03619 angleAddress = angleAddress.stripWhiteSpace(); <a name="l03620"></a>03620 <span class="comment">/*</span> <a name="l03621"></a>03621 <span class="comment"> kdDebug(5006) << "Name : \"" << name</span> <a name="l03622"></a>03622 <span class="comment"> << "\"" << endl;</span> <a name="l03623"></a>03623 <span class="comment"> kdDebug(5006) << "Comment : \"" << comment</span> <a name="l03624"></a>03624 <span class="comment"> << "\"" << endl;</span> <a name="l03625"></a>03625 <span class="comment"> kdDebug(5006) << "Address : \"" << angleAddress</span> <a name="l03626"></a>03626 <span class="comment"> << "\"" << endl;</span> <a name="l03627"></a>03627 <span class="comment"> */</span> <a name="l03628"></a>03628 <span class="keywordflow">if</span> ( angleAddress.isEmpty() && !comment.isEmpty() ) { <a name="l03629"></a>03629 <span class="comment">// handle Outlook-style addresses like</span> <a name="l03630"></a>03630 <span class="comment">// john.doe@invalid (John Doe)</span> <a name="l03631"></a>03631 result += comment; <a name="l03632"></a>03632 } <a name="l03633"></a>03633 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !name.isEmpty() ) { <a name="l03634"></a>03634 result += name; <a name="l03635"></a>03635 } <a name="l03636"></a>03636 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !comment.isEmpty() ) { <a name="l03637"></a>03637 result += comment; <a name="l03638"></a>03638 } <a name="l03639"></a>03639 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !angleAddress.isEmpty() ) { <a name="l03640"></a>03640 result += angleAddress; <a name="l03641"></a>03641 } <a name="l03642"></a>03642 name = QString::null; <a name="l03643"></a>03643 comment = QString::null; <a name="l03644"></a>03644 angleAddress = QString::null; <a name="l03645"></a>03645 } <a name="l03646"></a>03646 <span class="keywordflow">else</span> <a name="l03647"></a>03647 name += ch; <a name="l03648"></a>03648 <span class="keywordflow">break</span>; <a name="l03649"></a>03649 <span class="keywordflow">default</span> : name += ch; <a name="l03650"></a>03650 } <a name="l03651"></a>03651 <span class="keywordflow">break</span>; <a name="l03652"></a>03652 } <a name="l03653"></a>03653 <span class="keywordflow">case</span> InComment : { <a name="l03654"></a>03654 <span class="keywordflow">switch</span> ( ch.latin1() ) { <a name="l03655"></a>03655 <span class="keywordflow">case</span> <span class="charliteral">'('</span> : ++commentLevel; <a name="l03656"></a>03656 comment += ch; <a name="l03657"></a>03657 <span class="keywordflow">break</span>; <a name="l03658"></a>03658 <span class="keywordflow">case</span> <span class="charliteral">')'</span> : --commentLevel; <a name="l03659"></a>03659 <span class="keywordflow">if</span> ( commentLevel == 0 ) { <a name="l03660"></a>03660 context = TopLevel; <a name="l03661"></a>03661 comment += <span class="charliteral">' '</span>; <span class="comment">// separate the text of several comments</span> <a name="l03662"></a>03662 } <a name="l03663"></a>03663 <span class="keywordflow">else</span> <a name="l03664"></a>03664 comment += ch; <a name="l03665"></a>03665 <span class="keywordflow">break</span>; <a name="l03666"></a>03666 <span class="keywordflow">case</span> <span class="charliteral">'\\'</span> : <span class="comment">// quoted character</span> <a name="l03667"></a>03667 ++index; <span class="comment">// skip the '\'</span> <a name="l03668"></a>03668 <span class="keywordflow">if</span> ( index < aStr.length() ) <a name="l03669"></a>03669 comment += aStr[index]; <a name="l03670"></a>03670 <span class="keywordflow">break</span>; <a name="l03671"></a>03671 <span class="keywordflow">default</span> : comment += ch; <a name="l03672"></a>03672 } <a name="l03673"></a>03673 <span class="keywordflow">break</span>; <a name="l03674"></a>03674 } <a name="l03675"></a>03675 <span class="keywordflow">case</span> InAngleAddress : { <a name="l03676"></a>03676 <span class="keywordflow">switch</span> ( ch.latin1() ) { <a name="l03677"></a>03677 <span class="keywordflow">case</span> <span class="charliteral">'"'</span> : inQuotedString = !inQuotedString; <a name="l03678"></a>03678 angleAddress += ch; <a name="l03679"></a>03679 <span class="keywordflow">break</span>; <a name="l03680"></a>03680 <span class="keywordflow">case</span> <span class="charliteral">'>'</span> : <span class="keywordflow">if</span> ( !inQuotedString ) { <a name="l03681"></a>03681 context = TopLevel; <a name="l03682"></a>03682 } <a name="l03683"></a>03683 <span class="keywordflow">else</span> <a name="l03684"></a>03684 angleAddress += ch; <a name="l03685"></a>03685 <span class="keywordflow">break</span>; <a name="l03686"></a>03686 <span class="keywordflow">case</span> <span class="charliteral">'\\'</span> : <span class="comment">// quoted character</span> <a name="l03687"></a>03687 ++index; <span class="comment">// skip the '\'</span> <a name="l03688"></a>03688 <span class="keywordflow">if</span> ( index < aStr.length() ) <a name="l03689"></a>03689 angleAddress += aStr[index]; <a name="l03690"></a>03690 <span class="keywordflow">break</span>; <a name="l03691"></a>03691 <span class="keywordflow">default</span> : angleAddress += ch; <a name="l03692"></a>03692 } <a name="l03693"></a>03693 <span class="keywordflow">break</span>; <a name="l03694"></a>03694 } <a name="l03695"></a>03695 } <span class="comment">// switch ( context )</span> <a name="l03696"></a>03696 } <a name="l03697"></a>03697 <span class="keywordflow">if</span> ( !result.isEmpty() ) <a name="l03698"></a>03698 result += <span class="stringliteral">", "</span>; <a name="l03699"></a>03699 name = name.stripWhiteSpace(); <a name="l03700"></a>03700 comment = comment.stripWhiteSpace(); <a name="l03701"></a>03701 angleAddress = angleAddress.stripWhiteSpace(); <a name="l03702"></a>03702 <span class="comment">/*</span> <a name="l03703"></a>03703 <span class="comment"> kdDebug(5006) << "Name : \"" << name << "\"" << endl;</span> <a name="l03704"></a>03704 <span class="comment"> kdDebug(5006) << "Comment : \"" << comment << "\"" << endl;</span> <a name="l03705"></a>03705 <span class="comment"> kdDebug(5006) << "Address : \"" << angleAddress << "\"" << endl;</span> <a name="l03706"></a>03706 <span class="comment"> */</span> <a name="l03707"></a>03707 <span class="keywordflow">if</span> ( angleAddress.isEmpty() && !comment.isEmpty() ) { <a name="l03708"></a>03708 <span class="comment">// handle Outlook-style addresses like</span> <a name="l03709"></a>03709 <span class="comment">// john.doe@invalid (John Doe)</span> <a name="l03710"></a>03710 result += comment; <a name="l03711"></a>03711 } <a name="l03712"></a>03712 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !name.isEmpty() ) { <a name="l03713"></a>03713 result += name; <a name="l03714"></a>03714 } <a name="l03715"></a>03715 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !comment.isEmpty() ) { <a name="l03716"></a>03716 result += comment; <a name="l03717"></a>03717 } <a name="l03718"></a>03718 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( !angleAddress.isEmpty() ) { <a name="l03719"></a>03719 result += angleAddress; <a name="l03720"></a>03720 } <a name="l03721"></a>03721 <a name="l03722"></a>03722 <span class="comment">//kdDebug(5006) << "KMMessage::stripEmailAddr(...) returns \"" << result</span> <a name="l03723"></a>03723 <span class="comment">// << "\"" << endl;</span> <a name="l03724"></a>03724 <span class="keywordflow">return</span> result; <a name="l03725"></a>03725 } <a name="l03726"></a>03726 <a name="l03727"></a>03727 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03728"></a><a class="code" href="classKMMessage.html#204f475a310143d5d6cf0aa8a7df55a5">03728</a> QString <a class="code" href="classKMMessage.html#204f475a310143d5d6cf0aa8a7df55a5" title="Quotes the following characters which have a special meaning in HTML: &#39;&lt;&#39;...">KMMessage::quoteHtmlChars</a>( <span class="keyword">const</span> QString& str, <span class="keywordtype">bool</span> removeLineBreaks ) <a name="l03729"></a>03729 { <a name="l03730"></a>03730 QString result; <a name="l03731"></a>03731 <a name="l03732"></a>03732 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> strLength(str.length()); <a name="l03733"></a>03733 result.reserve( 6*strLength ); <span class="comment">// maximal possible length</span> <a name="l03734"></a>03734 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i < strLength; ++i ) <a name="l03735"></a>03735 <span class="keywordflow">switch</span> ( str[i].latin1() ) { <a name="l03736"></a>03736 <span class="keywordflow">case</span> <span class="charliteral">'<'</span>: <a name="l03737"></a>03737 result += <span class="stringliteral">"&lt;"</span>; <a name="l03738"></a>03738 <span class="keywordflow">break</span>; <a name="l03739"></a>03739 <span class="keywordflow">case</span> <span class="charliteral">'>'</span>: <a name="l03740"></a>03740 result += <span class="stringliteral">"&gt;"</span>; <a name="l03741"></a>03741 <span class="keywordflow">break</span>; <a name="l03742"></a>03742 <span class="keywordflow">case</span> <span class="charliteral">'&'</span>: <a name="l03743"></a>03743 result += <span class="stringliteral">"&amp;"</span>; <a name="l03744"></a>03744 <span class="keywordflow">break</span>; <a name="l03745"></a>03745 <span class="keywordflow">case</span> <span class="charliteral">'"'</span>: <a name="l03746"></a>03746 result += <span class="stringliteral">"&quot;"</span>; <a name="l03747"></a>03747 <span class="keywordflow">break</span>; <a name="l03748"></a>03748 <span class="keywordflow">case</span> <span class="charliteral">'\n'</span>: <a name="l03749"></a>03749 <span class="keywordflow">if</span> ( !removeLineBreaks ) <a name="l03750"></a>03750 result += <span class="stringliteral">"<br>"</span>; <a name="l03751"></a>03751 <span class="keywordflow">break</span>; <a name="l03752"></a>03752 <span class="keywordflow">case</span> <span class="charliteral">'\r'</span>: <a name="l03753"></a>03753 <span class="comment">// ignore CR</span> <a name="l03754"></a>03754 <span class="keywordflow">break</span>; <a name="l03755"></a>03755 <span class="keywordflow">default</span>: <a name="l03756"></a>03756 result += str[i]; <a name="l03757"></a>03757 } <a name="l03758"></a>03758 <a name="l03759"></a>03759 result.squeeze(); <a name="l03760"></a>03760 <span class="keywordflow">return</span> result; <a name="l03761"></a>03761 } <a name="l03762"></a>03762 <a name="l03763"></a>03763 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03764"></a><a class="code" href="classKMMessage.html#2ee04049f02681c0c2ae393d87e2367c">03764</a> QString <a class="code" href="classKMMessage.html#2ee04049f02681c0c2ae393d87e2367c" title="Converts the email address(es) to (a) nice HTML mailto: anchor(s).">KMMessage::emailAddrAsAnchor</a>(<span class="keyword">const</span> QString& aEmail, <span class="keywordtype">bool</span> stripped, <span class="keyword">const</span> QString& cssStyle, <span class="keywordtype">bool</span> aLink) <a name="l03765"></a>03765 { <a name="l03766"></a>03766 <span class="keywordflow">if</span>( aEmail.isEmpty() ) <a name="l03767"></a>03767 <span class="keywordflow">return</span> aEmail; <a name="l03768"></a>03768 <a name="l03769"></a>03769 QStringList addressList = KPIM::splitEmailAddrList( aEmail ); <a name="l03770"></a>03770 <a name="l03771"></a>03771 QString result; <a name="l03772"></a>03772 <a name="l03773"></a>03773 <span class="keywordflow">for</span>( QStringList::ConstIterator it = addressList.begin(); <a name="l03774"></a>03774 ( it != addressList.end() ); <a name="l03775"></a>03775 ++it ) { <a name="l03776"></a>03776 <span class="keywordflow">if</span>( !(*it).isEmpty() ) { <a name="l03777"></a>03777 QString address = *it; <a name="l03778"></a>03778 <span class="keywordflow">if</span>(aLink) { <a name="l03779"></a>03779 result += <span class="stringliteral">"<a href=\"mailto:"</span> <a name="l03780"></a>03780 + <a class="code" href="classKMMessage.html#ba85fd5c4264aeec336a5992e20e4568" title="Encodes an email address as mailto URL.">KMMessage::encodeMailtoUrl</a>( address ) <a name="l03781"></a>03781 + <span class="stringliteral">"\" "</span>+cssStyle+<span class="stringliteral">">"</span>; <a name="l03782"></a>03782 } <a name="l03783"></a>03783 <span class="keywordflow">if</span>( stripped ) <a name="l03784"></a>03784 address = <a class="code" href="classKMMessage.html#72d3f7adf212e7eee71213796a13d616" title="This function generates a displayable string from a list of email addresses.">KMMessage::stripEmailAddr</a>( address ); <a name="l03785"></a>03785 result += <a class="code" href="classKMMessage.html#204f475a310143d5d6cf0aa8a7df55a5" title="Quotes the following characters which have a special meaning in HTML: &#39;&lt;&#39;...">KMMessage::quoteHtmlChars</a>( address, <span class="keyword">true</span> ); <a name="l03786"></a>03786 <span class="keywordflow">if</span>(aLink) <a name="l03787"></a>03787 result += <span class="stringliteral">"</a>, "</span>; <a name="l03788"></a>03788 } <a name="l03789"></a>03789 } <a name="l03790"></a>03790 <span class="comment">// cut of the trailing ", "</span> <a name="l03791"></a>03791 <span class="keywordflow">if</span>(aLink) <a name="l03792"></a>03792 result.truncate( result.length() - 2 ); <a name="l03793"></a>03793 <a name="l03794"></a>03794 <span class="comment">//kdDebug(5006) << "KMMessage::emailAddrAsAnchor('" << aEmail</span> <a name="l03795"></a>03795 <span class="comment">// << "') returns:\n-->" << result << "<--" << endl;</span> <a name="l03796"></a>03796 <span class="keywordflow">return</span> result; <a name="l03797"></a>03797 } <a name="l03798"></a>03798 <a name="l03799"></a>03799 <a name="l03800"></a>03800 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03801"></a>03801 <span class="comment">//static</span> <a name="l03802"></a><a class="code" href="classKMMessage.html#9f7653629787483e4e812562381b07d2">03802</a> QStringList <a class="code" href="classKMMessage.html#9f7653629787483e4e812562381b07d2" title="Strips an address from an address list.">KMMessage::stripAddressFromAddressList</a>( <span class="keyword">const</span> QString& address, <a name="l03803"></a>03803 <span class="keyword">const</span> QStringList& list ) <a name="l03804"></a>03804 { <a name="l03805"></a>03805 QStringList addresses( list ); <a name="l03806"></a>03806 QString addrSpec( KPIM::getEmailAddress( address ) ); <a name="l03807"></a>03807 <span class="keywordflow">for</span> ( QStringList::Iterator it = addresses.begin(); <a name="l03808"></a>03808 it != addresses.end(); ) { <a name="l03809"></a>03809 <span class="keywordflow">if</span> ( kasciistricmp( addrSpec.utf8().data(), <a name="l03810"></a>03810 KPIM::getEmailAddress( *it ).utf8().data() ) == 0 ) { <a name="l03811"></a>03811 kdDebug(5006) << <span class="stringliteral">"Removing "</span> << *it << <span class="stringliteral">" from the address list"</span> <a name="l03812"></a>03812 << endl; <a name="l03813"></a>03813 it = addresses.remove( it ); <a name="l03814"></a>03814 } <a name="l03815"></a>03815 <span class="keywordflow">else</span> <a name="l03816"></a>03816 ++it; <a name="l03817"></a>03817 } <a name="l03818"></a>03818 <span class="keywordflow">return</span> addresses; <a name="l03819"></a>03819 } <a name="l03820"></a>03820 <a name="l03821"></a>03821 <a name="l03822"></a>03822 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03823"></a>03823 <span class="comment">//static</span> <a name="l03824"></a><a class="code" href="classKMMessage.html#e4f03358c3283c037353a3683876f781">03824</a> QStringList <a class="code" href="classKMMessage.html#e4f03358c3283c037353a3683876f781" title="Strips all the user&#39;s addresses from an address list.">KMMessage::stripMyAddressesFromAddressList</a>( <span class="keyword">const</span> QStringList& list ) <a name="l03825"></a>03825 { <a name="l03826"></a>03826 QStringList addresses = list; <a name="l03827"></a>03827 <span class="keywordflow">for</span>( QStringList::Iterator it = addresses.begin(); <a name="l03828"></a>03828 it != addresses.end(); ) { <a name="l03829"></a>03829 kdDebug(5006) << <span class="stringliteral">"Check whether "</span> << *it << <span class="stringliteral">" is one of my addresses"</span> <a name="l03830"></a>03830 << endl; <a name="l03831"></a>03831 <span class="keywordflow">if</span>( kmkernel->identityManager()->thatIsMe( KPIM::getEmailAddress( *it ) ) ) { <a name="l03832"></a>03832 kdDebug(5006) << <span class="stringliteral">"Removing "</span> << *it << <span class="stringliteral">" from the address list"</span> <a name="l03833"></a>03833 << endl; <a name="l03834"></a>03834 it = addresses.remove( it ); <a name="l03835"></a>03835 } <a name="l03836"></a>03836 <span class="keywordflow">else</span> <a name="l03837"></a>03837 ++it; <a name="l03838"></a>03838 } <a name="l03839"></a>03839 <span class="keywordflow">return</span> addresses; <a name="l03840"></a>03840 } <a name="l03841"></a>03841 <a name="l03842"></a>03842 <a name="l03843"></a>03843 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03844"></a>03844 <span class="comment">//static</span> <a name="l03845"></a><a class="code" href="classKMMessage.html#c334bfce5b6d1dafe916a42e2cf8a2e2">03845</a> <span class="keywordtype">bool</span> <a class="code" href="classKMMessage.html#c334bfce5b6d1dafe916a42e2cf8a2e2" title="Returns true if the given address is contained in the given address list.">KMMessage::addressIsInAddressList</a>( <span class="keyword">const</span> QString& address, <a name="l03846"></a>03846 <span class="keyword">const</span> QStringList& addresses ) <a name="l03847"></a>03847 { <a name="l03848"></a>03848 QString addrSpec = KPIM::getEmailAddress( address ); <a name="l03849"></a>03849 <span class="keywordflow">for</span>( QStringList::ConstIterator it = addresses.begin(); <a name="l03850"></a>03850 it != addresses.end(); ++it ) { <a name="l03851"></a>03851 <span class="keywordflow">if</span> ( kasciistricmp( addrSpec.utf8().data(), <a name="l03852"></a>03852 KPIM::getEmailAddress( *it ).utf8().data() ) == 0 ) <a name="l03853"></a>03853 <span class="keywordflow">return</span> <span class="keyword">true</span>; <a name="l03854"></a>03854 } <a name="l03855"></a>03855 <span class="keywordflow">return</span> <span class="keyword">false</span>; <a name="l03856"></a>03856 } <a name="l03857"></a>03857 <a name="l03858"></a>03858 <a name="l03859"></a>03859 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03860"></a>03860 <span class="comment">//static</span> <a name="l03861"></a><a class="code" href="classKMMessage.html#638e3713e6bb080480270c2d48f01da9">03861</a> QString <a class="code" href="classKMMessage.html#638e3713e6bb080480270c2d48f01da9" title="Expands aliases (distribution lists and nick names) and appends a domain part to...">KMMessage::expandAliases</a>( <span class="keyword">const</span> QString& recipients ) <a name="l03862"></a>03862 { <a name="l03863"></a>03863 <span class="keywordflow">if</span> ( recipients.isEmpty() ) <a name="l03864"></a>03864 <span class="keywordflow">return</span> QString(); <a name="l03865"></a>03865 <a name="l03866"></a>03866 QStringList recipientList = KPIM::splitEmailAddrList( recipients ); <a name="l03867"></a>03867 <a name="l03868"></a>03868 QString expandedRecipients; <a name="l03869"></a>03869 <span class="keywordflow">for</span> ( QStringList::Iterator it = recipientList.begin(); <a name="l03870"></a>03870 it != recipientList.end(); ++it ) { <a name="l03871"></a>03871 <span class="keywordflow">if</span> ( !expandedRecipients.isEmpty() ) <a name="l03872"></a>03872 expandedRecipients += <span class="stringliteral">", "</span>; <a name="l03873"></a>03873 QString receiver = (*it).stripWhiteSpace(); <a name="l03874"></a>03874 <a name="l03875"></a>03875 <span class="comment">// try to expand distribution list</span> <a name="l03876"></a>03876 QString expandedList = KAddrBookExternal::expandDistributionList( receiver ); <a name="l03877"></a>03877 <span class="keywordflow">if</span> ( !expandedList.isEmpty() ) { <a name="l03878"></a>03878 expandedRecipients += expandedList; <a name="l03879"></a>03879 <span class="keywordflow">continue</span>; <a name="l03880"></a>03880 } <a name="l03881"></a>03881 <a name="l03882"></a>03882 <span class="comment">// try to expand nick name</span> <a name="l03883"></a>03883 QString expandedNickName = KabcBridge::expandNickName( receiver ); <a name="l03884"></a>03884 <span class="keywordflow">if</span> ( !expandedNickName.isEmpty() ) { <a name="l03885"></a>03885 expandedRecipients += expandedNickName; <a name="l03886"></a>03886 <span class="keywordflow">continue</span>; <a name="l03887"></a>03887 } <a name="l03888"></a>03888 <a name="l03889"></a>03889 <span class="comment">// check whether the address is missing the domain part</span> <a name="l03890"></a>03890 <span class="comment">// FIXME: looking for '@' might be wrong</span> <a name="l03891"></a>03891 <span class="keywordflow">if</span> ( receiver.find(<span class="charliteral">'@'</span>) == -1 ) { <a name="l03892"></a>03892 KConfigGroup general( KMKernel::config(), <span class="stringliteral">"General"</span> ); <a name="l03893"></a>03893 QString defaultdomain = general.readEntry( <span class="stringliteral">"Default domain"</span> ); <a name="l03894"></a>03894 <span class="keywordflow">if</span>( !defaultdomain.isEmpty() ) { <a name="l03895"></a>03895 expandedRecipients += receiver + <span class="stringliteral">"@"</span> + defaultdomain; <a name="l03896"></a>03896 } <a name="l03897"></a>03897 <span class="keywordflow">else</span> { <a name="l03898"></a>03898 expandedRecipients += <a class="code" href="classKMMessage.html#c2127e3f52950962ab6fd4436927456e" title="Uses the hostname as domain part and tries to determine the real name from the entries...">guessEmailAddressFromLoginName</a>( receiver ); <a name="l03899"></a>03899 } <a name="l03900"></a>03900 } <a name="l03901"></a>03901 <span class="keywordflow">else</span> <a name="l03902"></a>03902 expandedRecipients += receiver; <a name="l03903"></a>03903 } <a name="l03904"></a>03904 <a name="l03905"></a>03905 <span class="keywordflow">return</span> expandedRecipients; <a name="l03906"></a>03906 } <a name="l03907"></a>03907 <a name="l03908"></a>03908 <a name="l03909"></a>03909 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03910"></a>03910 <span class="comment">//static</span> <a name="l03911"></a><a class="code" href="classKMMessage.html#c2127e3f52950962ab6fd4436927456e">03911</a> QString <a class="code" href="classKMMessage.html#c2127e3f52950962ab6fd4436927456e" title="Uses the hostname as domain part and tries to determine the real name from the entries...">KMMessage::guessEmailAddressFromLoginName</a>( <span class="keyword">const</span> QString& loginName ) <a name="l03912"></a>03912 { <a name="l03913"></a>03913 <span class="keywordflow">if</span> ( loginName.isEmpty() ) <a name="l03914"></a>03914 <span class="keywordflow">return</span> QString(); <a name="l03915"></a>03915 <a name="l03916"></a>03916 <span class="keywordtype">char</span> hostnameC[256]; <a name="l03917"></a>03917 <span class="comment">// null terminate this C string</span> <a name="l03918"></a>03918 hostnameC[255] = <span class="charliteral">'\0'</span>; <a name="l03919"></a>03919 <span class="comment">// set the string to 0 length if gethostname fails</span> <a name="l03920"></a>03920 <span class="keywordflow">if</span> ( gethostname( hostnameC, 255 ) ) <a name="l03921"></a>03921 hostnameC[0] = <span class="charliteral">'\0'</span>; <a name="l03922"></a>03922 QString address = loginName; <a name="l03923"></a>03923 address += <span class="charliteral">'@'</span>; <a name="l03924"></a>03924 address += QString::fromLocal8Bit( hostnameC ); <a name="l03925"></a>03925 <a name="l03926"></a>03926 <span class="comment">// try to determine the real name</span> <a name="l03927"></a>03927 <span class="keyword">const</span> KUser user( loginName ); <a name="l03928"></a>03928 <span class="keywordflow">if</span> ( user.isValid() ) { <a name="l03929"></a>03929 QString fullName = user.fullName(); <a name="l03930"></a>03930 <span class="keywordflow">if</span> ( fullName.find( QRegExp( <span class="stringliteral">"[^ 0-9A-Za-z\\x0080-\\xFFFF]"</span> ) ) != -1 ) <a name="l03931"></a>03931 address = <span class="charliteral">'"'</span> + fullName.replace( <span class="charliteral">'\\'</span>, <span class="stringliteral">"\\"</span> ).replace( <span class="charliteral">'"'</span>, <span class="stringliteral">"\\"</span> ) <a name="l03932"></a>03932 + <span class="stringliteral">"\" <"</span> + address + <span class="charliteral">'>'</span>; <a name="l03933"></a>03933 <span class="keywordflow">else</span> <a name="l03934"></a>03934 address = fullName + <span class="stringliteral">" <"</span> + address + <span class="charliteral">'>'</span>; <a name="l03935"></a>03935 } <a name="l03936"></a>03936 <a name="l03937"></a>03937 <span class="keywordflow">return</span> address; <a name="l03938"></a>03938 } <a name="l03939"></a>03939 <a name="l03940"></a>03940 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l03941"></a><a class="code" href="classKMMessage.html#4a6963f180c82bf446483d9ad5247e56">03941</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#4a6963f180c82bf446483d9ad5247e56" title="Reads config settings from group &quot;KMMessage&quot; and sets all internal variables...">KMMessage::readConfig</a>() <a name="l03942"></a>03942 { <a name="l03943"></a>03943 KMMsgBase::readConfig(); <a name="l03944"></a>03944 <a name="l03945"></a>03945 KConfig *config=KMKernel::config(); <a name="l03946"></a>03946 KConfigGroupSaver saver(config, <span class="stringliteral">"General"</span>); <a name="l03947"></a>03947 <a name="l03948"></a>03948 config->setGroup(<span class="stringliteral">"General"</span>); <a name="l03949"></a>03949 <a name="l03950"></a>03950 <span class="keywordtype">int</span> languageNr = config->readNumEntry(<span class="stringliteral">"reply-current-language"</span>,0); <a name="l03951"></a>03951 <a name="l03952"></a>03952 { <span class="comment">// area for config group "KMMessage #n"</span> <a name="l03953"></a>03953 KConfigGroupSaver saver(config, QString(<span class="stringliteral">"KMMessage #%1"</span>).arg(languageNr)); <a name="l03954"></a>03954 sReplyLanguage = config->readEntry(<span class="stringliteral">"language"</span>,KGlobal::locale()->language()); <a name="l03955"></a>03955 sReplyStr = config->readEntry(<span class="stringliteral">"phrase-reply"</span>, <a name="l03956"></a>03956 i18n(<span class="stringliteral">"On %D, you wrote:"</span>)); <a name="l03957"></a>03957 sReplyAllStr = config->readEntry(<span class="stringliteral">"phrase-reply-all"</span>, <a name="l03958"></a>03958 i18n(<span class="stringliteral">"On %D, %F wrote:"</span>)); <a name="l03959"></a>03959 sForwardStr = config->readEntry(<span class="stringliteral">"phrase-forward"</span>, <a name="l03960"></a>03960 i18n(<span class="stringliteral">"Forwarded Message"</span>)); <a name="l03961"></a>03961 sIndentPrefixStr = config->readEntry(<span class="stringliteral">"indent-prefix"</span>,<span class="stringliteral">">%_"</span>); <a name="l03962"></a>03962 } <a name="l03963"></a>03963 <a name="l03964"></a>03964 { <span class="comment">// area for config group "Composer"</span> <a name="l03965"></a>03965 KConfigGroupSaver saver(config, <span class="stringliteral">"Composer"</span>); <a name="l03966"></a>03966 sSmartQuote = GlobalSettings::self()->smartQuote(); <a name="l03967"></a>03967 sWordWrap = GlobalSettings::self()->wordWrap(); <a name="l03968"></a>03968 sWrapCol = GlobalSettings::self()->lineWrapWidth(); <a name="l03969"></a>03969 <span class="keywordflow">if</span> ((sWrapCol == 0) || (sWrapCol > 78)) <a name="l03970"></a>03970 sWrapCol = 78; <a name="l03971"></a>03971 <span class="keywordflow">if</span> (sWrapCol < 30) <a name="l03972"></a>03972 sWrapCol = 30; <a name="l03973"></a>03973 <a name="l03974"></a>03974 sPrefCharsets = config->readListEntry(<span class="stringliteral">"pref-charsets"</span>); <a name="l03975"></a>03975 } <a name="l03976"></a>03976 <a name="l03977"></a>03977 { <span class="comment">// area for config group "Reader"</span> <a name="l03978"></a>03978 KConfigGroupSaver saver(config, <span class="stringliteral">"Reader"</span>); <a name="l03979"></a>03979 sHeaderStrategy = HeaderStrategy::create( config->readEntry( <span class="stringliteral">"header-set-displayed"</span>, <span class="stringliteral">"rich"</span> ) ); <a name="l03980"></a>03980 } <a name="l03981"></a>03981 } <a name="l03982"></a>03982 <a name="l03983"></a><a class="code" href="classKMMessage.html#436a2495f670d732413d0f857e04c982">03983</a> QCString <a class="code" href="classKMMessage.html#436a2495f670d732413d0f857e04c982" title="Get the default message charset.">KMMessage::defaultCharset</a>() <a name="l03984"></a>03984 { <a name="l03985"></a>03985 QCString retval; <a name="l03986"></a>03986 <a name="l03987"></a>03987 <span class="keywordflow">if</span> (!sPrefCharsets.isEmpty()) <a name="l03988"></a>03988 retval = sPrefCharsets[0].latin1(); <a name="l03989"></a>03989 <a name="l03990"></a>03990 <span class="keywordflow">if</span> (retval.isEmpty() || (retval == <span class="stringliteral">"locale"</span>)) { <a name="l03991"></a>03991 retval = QCString(kmkernel->networkCodec()->mimeName()); <a name="l03992"></a>03992 KPIM::kAsciiToLower( retval.data() ); <a name="l03993"></a>03993 } <a name="l03994"></a>03994 <a name="l03995"></a>03995 <span class="keywordflow">if</span> (retval == <span class="stringliteral">"jisx0208.1983-0"</span>) retval = <span class="stringliteral">"iso-2022-jp"</span>; <a name="l03996"></a>03996 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (retval == <span class="stringliteral">"ksc5601.1987-0"</span>) retval = <span class="stringliteral">"euc-kr"</span>; <a name="l03997"></a>03997 <span class="keywordflow">return</span> retval; <a name="l03998"></a>03998 } <a name="l03999"></a>03999 <a name="l04000"></a><a class="code" href="classKMMessage.html#41e2c0836f490db2edf4983899a07591">04000</a> <span class="keyword">const</span> QStringList &<a class="code" href="classKMMessage.html#41e2c0836f490db2edf4983899a07591" title="Get a list of preferred message charsets.">KMMessage::preferredCharsets</a>() <a name="l04001"></a>04001 { <a name="l04002"></a>04002 <span class="keywordflow">return</span> sPrefCharsets; <a name="l04003"></a>04003 } <a name="l04004"></a>04004 <a name="l04005"></a>04005 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04006"></a><a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57">04006</a> QCString <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">KMMessage::charset</a>()<span class="keyword"> const</span> <a name="l04007"></a>04007 <span class="keyword"></span>{ <a name="l04008"></a>04008 <span class="keywordflow">if</span> ( mMsg->Headers().HasContentType() ) { <a name="l04009"></a>04009 DwMediaType &mType=mMsg->Headers().ContentType(); <a name="l04010"></a>04010 mType.Parse(); <a name="l04011"></a>04011 DwParameter *param=mType.FirstParameter(); <a name="l04012"></a>04012 <span class="keywordflow">while</span>(param){ <a name="l04013"></a>04013 <span class="keywordflow">if</span> (!kasciistricmp(param->Attribute().c_str(), <span class="stringliteral">"charset"</span>)) <a name="l04014"></a>04014 <span class="keywordflow">return</span> param->Value().c_str(); <a name="l04015"></a>04015 <span class="keywordflow">else</span> param=param->Next(); <a name="l04016"></a>04016 } <a name="l04017"></a>04017 } <a name="l04018"></a>04018 <span class="keywordflow">return</span> <span class="stringliteral">""</span>; <span class="comment">// us-ascii, but we don't have to specify it</span> <a name="l04019"></a>04019 } <a name="l04020"></a>04020 <a name="l04021"></a>04021 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04022"></a><a class="code" href="classKMMessage.html#6c6413b3690538964ac810f4c6755a5b">04022</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#6c6413b3690538964ac810f4c6755a5b" title="Set the message charset.">KMMessage::setCharset</a>(<span class="keyword">const</span> QCString& bStr) <a name="l04023"></a>04023 { <a name="l04024"></a>04024 kdWarning( type() != DwMime::kTypeText ) <a name="l04025"></a>04025 << <span class="stringliteral">"KMMessage::setCharset(): trying to set a charset for a non-textual mimetype."</span> << endl <a name="l04026"></a>04026 << <span class="stringliteral">"Fix this caller:"</span> << endl <a name="l04027"></a>04027 << <span class="stringliteral">"===================================================================="</span> << endl <a name="l04028"></a>04028 << kdBacktrace( 5 ) << endl <a name="l04029"></a>04029 << <span class="stringliteral">"===================================================================="</span> << endl; <a name="l04030"></a>04030 QCString aStr = bStr; <a name="l04031"></a>04031 KPIM::kAsciiToLower( aStr.data() ); <a name="l04032"></a>04032 DwMediaType &mType = <a class="code" href="classKMMessage.html#576912fbe8869fa5c67c508b16c1a35c" title="Return reference to Content-Type header for direct manipulation.">dwContentType</a>(); <a name="l04033"></a>04033 mType.Parse(); <a name="l04034"></a>04034 DwParameter *param=mType.FirstParameter(); <a name="l04035"></a>04035 <span class="keywordflow">while</span>(param) <a name="l04036"></a>04036 <span class="comment">// FIXME use the mimelib functions here for comparison.</span> <a name="l04037"></a>04037 <span class="keywordflow">if</span> (!kasciistricmp(param->Attribute().c_str(), <span class="stringliteral">"charset"</span>)) <span class="keywordflow">break</span>; <a name="l04038"></a>04038 <span class="keywordflow">else</span> param=param->Next(); <a name="l04039"></a>04039 <span class="keywordflow">if</span> (!param){ <a name="l04040"></a>04040 param=<span class="keyword">new</span> DwParameter; <a name="l04041"></a>04041 param->SetAttribute(<span class="stringliteral">"charset"</span>); <a name="l04042"></a>04042 mType.AddParameter(param); <a name="l04043"></a>04043 } <a name="l04044"></a>04044 <span class="keywordflow">else</span> <a name="l04045"></a>04045 mType.SetModified(); <a name="l04046"></a>04046 param->SetValue(DwString(aStr)); <a name="l04047"></a>04047 mType.Assemble(); <a name="l04048"></a>04048 } <a name="l04049"></a>04049 <a name="l04050"></a>04050 <a name="l04051"></a>04051 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04052"></a><a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d">04052</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d" title="Set status and mark dirty.">KMMessage::setStatus</a>(<span class="keyword">const</span> KMMsgStatus aStatus, <span class="keywordtype">int</span> idx) <a name="l04053"></a>04053 { <a name="l04054"></a>04054 <span class="keywordflow">if</span> (mStatus == aStatus) <a name="l04055"></a>04055 <span class="keywordflow">return</span>; <a name="l04056"></a>04056 KMMsgBase::setStatus(aStatus, idx); <a name="l04057"></a>04057 } <a name="l04058"></a>04058 <a name="l04059"></a><a class="code" href="classKMMessage.html#deaf253ad2f0d86779d5991f13731d08">04059</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#deaf253ad2f0d86779d5991f13731d08" title="Set encryption status of the message.">KMMessage::setEncryptionState</a>(<span class="keyword">const</span> KMMsgEncryptionState s, <span class="keywordtype">int</span> idx) <a name="l04060"></a>04060 { <a name="l04061"></a>04061 <span class="keywordflow">if</span>( mEncryptionState == s ) <a name="l04062"></a>04062 <span class="keywordflow">return</span>; <a name="l04063"></a>04063 mEncryptionState = s; <a name="l04064"></a>04064 mDirty = <span class="keyword">true</span>; <a name="l04065"></a>04065 KMMsgBase::setEncryptionState(s, idx); <a name="l04066"></a>04066 } <a name="l04067"></a>04067 <a name="l04068"></a><a class="code" href="classKMMessage.html#916feb2c4a8aa3be0edc11424ba32227">04068</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#916feb2c4a8aa3be0edc11424ba32227" title="Set signature status of the message.">KMMessage::setSignatureState</a>(KMMsgSignatureState s, <span class="keywordtype">int</span> idx) <a name="l04069"></a>04069 { <a name="l04070"></a>04070 <span class="keywordflow">if</span>( mSignatureState == s ) <a name="l04071"></a>04071 <span class="keywordflow">return</span>; <a name="l04072"></a>04072 mSignatureState = s; <a name="l04073"></a>04073 mDirty = <span class="keyword">true</span>; <a name="l04074"></a>04074 KMMsgBase::setSignatureState(s, idx); <a name="l04075"></a>04075 } <a name="l04076"></a>04076 <a name="l04077"></a>04077 <span class="keywordtype">void</span> KMMessage::setMDNSentState( KMMsgMDNSentState <a class="code" href="classKMMessage.html#c54ef69572e620a3dcc0301aefca913e" title="Status of the message.">status</a>, <span class="keywordtype">int</span> idx ) { <a name="l04078"></a>04078 <span class="keywordflow">if</span> ( mMDNSentState == status ) <a name="l04079"></a>04079 <span class="keywordflow">return</span>; <a name="l04080"></a>04080 <span class="keywordflow">if</span> ( status == 0 ) <a name="l04081"></a>04081 status = KMMsgMDNStateUnknown; <a name="l04082"></a>04082 mMDNSentState = status; <a name="l04083"></a>04083 mDirty = <span class="keyword">true</span>; <a name="l04084"></a>04084 KMMsgBase::setMDNSentState( status, idx ); <a name="l04085"></a>04085 } <a name="l04086"></a>04086 <a name="l04087"></a>04087 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04088"></a><a class="code" href="classKMMessage.html#03dc17ebd4de0cad4977d28040ed16fd">04088</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#03dc17ebd4de0cad4977d28040ed16fd" title="Links this message to aMsg, setting link type to aStatus.">KMMessage::link</a>( <span class="keyword">const</span> <a class="code" href="classKMMessage.html" title="This is a Mime Message.">KMMessage</a> *aMsg, KMMsgStatus aStatus ) <a name="l04089"></a>04089 { <a name="l04090"></a>04090 Q_ASSERT( aStatus == KMMsgStatusReplied <a name="l04091"></a>04091 || aStatus == KMMsgStatusForwarded <a name="l04092"></a>04092 || aStatus == KMMsgStatusDeleted ); <a name="l04093"></a>04093 <a name="l04094"></a>04094 QString message = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-KMail-Link-Message"</span> ); <a name="l04095"></a>04095 <span class="keywordflow">if</span> ( !message.isEmpty() ) <a name="l04096"></a>04096 message += <span class="charliteral">','</span>; <a name="l04097"></a>04097 QString type = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>( <span class="stringliteral">"X-KMail-Link-Type"</span> ); <a name="l04098"></a>04098 <span class="keywordflow">if</span> ( !type.isEmpty() ) <a name="l04099"></a>04099 type += <span class="charliteral">','</span>; <a name="l04100"></a>04100 <a name="l04101"></a>04101 message += QString::number( aMsg->getMsgSerNum() ); <a name="l04102"></a>04102 <span class="keywordflow">if</span> ( aStatus == KMMsgStatusReplied ) <a name="l04103"></a>04103 type += <span class="stringliteral">"reply"</span>; <a name="l04104"></a>04104 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( aStatus == KMMsgStatusForwarded ) <a name="l04105"></a>04105 type += <span class="stringliteral">"forward"</span>; <a name="l04106"></a>04106 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( aStatus == KMMsgStatusDeleted ) <a name="l04107"></a>04107 type += <span class="stringliteral">"deleted"</span>; <a name="l04108"></a>04108 <a name="l04109"></a>04109 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"X-KMail-Link-Message"</span>, message ); <a name="l04110"></a>04110 <a class="code" href="classKMMessage.html#de227ca74ea9bca2412ddfc63b4025c6" title="Set the header field with the given name to the given value.">setHeaderField</a>( <span class="stringliteral">"X-KMail-Link-Type"</span>, type ); <a name="l04111"></a>04111 } <a name="l04112"></a>04112 <a name="l04113"></a>04113 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04114"></a><a class="code" href="classKMMessage.html#5380fb35e0c3fcf2af8d7d79e1ca713b">04114</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#5380fb35e0c3fcf2af8d7d79e1ca713b" title="Returns the information for the Nth link into retMsg and retStatus.">KMMessage::getLink</a>(<span class="keywordtype">int</span> n, ulong *retMsgSerNum, KMMsgStatus *retStatus)<span class="keyword"> const</span> <a name="l04115"></a>04115 <span class="keyword"></span>{ <a name="l04116"></a>04116 *retMsgSerNum = 0; <a name="l04117"></a>04117 *retStatus = KMMsgStatusUnknown; <a name="l04118"></a>04118 <a name="l04119"></a>04119 QString message = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-Link-Message"</span>); <a name="l04120"></a>04120 QString type = <a class="code" href="classKMMessage.html#082d31ece170fb19cd5402a34a3f6727" title="Returns the value of a header field with the given name.">headerField</a>(<span class="stringliteral">"X-KMail-Link-Type"</span>); <a name="l04121"></a>04121 message = message.section(<span class="charliteral">','</span>, n, n); <a name="l04122"></a>04122 type = type.section(<span class="charliteral">','</span>, n, n); <a name="l04123"></a>04123 <a name="l04124"></a>04124 <span class="keywordflow">if</span> ( !message.isEmpty() && !type.isEmpty() ) { <a name="l04125"></a>04125 *retMsgSerNum = message.toULong(); <a name="l04126"></a>04126 <span class="keywordflow">if</span> ( type == <span class="stringliteral">"reply"</span> ) <a name="l04127"></a>04127 *retStatus = KMMsgStatusReplied; <a name="l04128"></a>04128 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( type == <span class="stringliteral">"forward"</span> ) <a name="l04129"></a>04129 *retStatus = KMMsgStatusForwarded; <a name="l04130"></a>04130 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( type == <span class="stringliteral">"deleted"</span> ) <a name="l04131"></a>04131 *retStatus = KMMsgStatusDeleted; <a name="l04132"></a>04132 } <a name="l04133"></a>04133 } <a name="l04134"></a>04134 <a name="l04135"></a>04135 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04136"></a><a class="code" href="classKMMessage.html#fb36e68fc7bf669f8e97636674510cea">04136</a> DwBodyPart* <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">KMMessage::findDwBodyPart</a>( DwBodyPart* part, <span class="keyword">const</span> QString & partSpecifier ) <a name="l04137"></a>04137 { <a name="l04138"></a>04138 <span class="keywordflow">if</span> ( !part ) <span class="keywordflow">return</span> 0; <a name="l04139"></a>04139 DwBodyPart* current; <a name="l04140"></a>04140 <a name="l04141"></a>04141 <span class="keywordflow">if</span> ( part->partId() == partSpecifier ) <a name="l04142"></a>04142 <span class="keywordflow">return</span> part; <a name="l04143"></a>04143 <a name="l04144"></a>04144 <span class="comment">// multipart</span> <a name="l04145"></a>04145 <span class="keywordflow">if</span> ( part->hasHeaders() && <a name="l04146"></a>04146 part->Headers().HasContentType() && <a name="l04147"></a>04147 part->Body().FirstBodyPart() && <a name="l04148"></a>04148 (DwMime::kTypeMultipart == part->Headers().ContentType().Type() ) && <a name="l04149"></a>04149 (current = <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( part->Body().FirstBodyPart(), partSpecifier )) ) <a name="l04150"></a>04150 { <a name="l04151"></a>04151 <span class="keywordflow">return</span> current; <a name="l04152"></a>04152 } <a name="l04153"></a>04153 <a name="l04154"></a>04154 <span class="comment">// encapsulated message</span> <a name="l04155"></a>04155 <span class="keywordflow">if</span> ( part->Body().Message() && <a name="l04156"></a>04156 part->Body().Message()->Body().FirstBodyPart() && <a name="l04157"></a>04157 (current = <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( part->Body().Message()->Body().FirstBodyPart(), <a name="l04158"></a>04158 partSpecifier )) ) <a name="l04159"></a>04159 { <a name="l04160"></a>04160 <span class="keywordflow">return</span> current; <a name="l04161"></a>04161 } <a name="l04162"></a>04162 <a name="l04163"></a>04163 <span class="comment">// next part</span> <a name="l04164"></a>04164 <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( part->Next(), partSpecifier ); <a name="l04165"></a>04165 } <a name="l04166"></a>04166 <a name="l04167"></a>04167 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04168"></a><a class="code" href="classKMMessage.html#dc868a1959d86232d695991a4b5f2393">04168</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#dc868a1959d86232d695991a4b5f2393" title="Sets the body of the specified part.">KMMessage::updateBodyPart</a>(<span class="keyword">const</span> QString partSpecifier, <span class="keyword">const</span> QByteArray & data) <a name="l04169"></a>04169 { <a name="l04170"></a>04170 <span class="keywordflow">if</span> ( !data.data() || !data.size() ) <a name="l04171"></a>04171 <span class="keywordflow">return</span>; <a name="l04172"></a>04172 <a name="l04173"></a>04173 DwString content( data.data(), data.size() ); <a name="l04174"></a>04174 <span class="keywordflow">if</span> ( <a class="code" href="classKMMessage.html#bf2ef4edbfad52a94367b31e248345e8" title="Number of body parts the message has.">numBodyParts</a>() > 0 && <a name="l04175"></a>04175 partSpecifier != <span class="stringliteral">"0"</span> && <a name="l04176"></a>04176 partSpecifier != <span class="stringliteral">"TEXT"</span> ) <a name="l04177"></a>04177 { <a name="l04178"></a>04178 QString specifier = partSpecifier; <a name="l04179"></a>04179 <span class="keywordflow">if</span> ( partSpecifier.endsWith(<span class="stringliteral">".HEADER"</span>) || <a name="l04180"></a>04180 partSpecifier.endsWith(<span class="stringliteral">".MIME"</span>) ) { <a name="l04181"></a>04181 <span class="comment">// get the parent bodypart</span> <a name="l04182"></a>04182 specifier = partSpecifier.section( <span class="charliteral">'.'</span>, 0, -2 ); <a name="l04183"></a>04183 } <a name="l04184"></a>04184 <a name="l04185"></a>04185 <span class="comment">// search for the bodypart</span> <a name="l04186"></a>04186 mLastUpdated = <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(), specifier ); <a name="l04187"></a>04187 kdDebug(5006) << <span class="stringliteral">"KMMessage::updateBodyPart "</span> << specifier << endl; <a name="l04188"></a>04188 <span class="keywordflow">if</span> (!mLastUpdated) <a name="l04189"></a>04189 { <a name="l04190"></a>04190 kdWarning(5006) << <span class="stringliteral">"KMMessage::updateBodyPart - can not find part "</span> <a name="l04191"></a>04191 << specifier << endl; <a name="l04192"></a>04192 <span class="keywordflow">return</span>; <a name="l04193"></a>04193 } <a name="l04194"></a>04194 <span class="keywordflow">if</span> ( partSpecifier.endsWith(<span class="stringliteral">".MIME"</span>) ) <a name="l04195"></a>04195 { <a name="l04196"></a>04196 <span class="comment">// update headers</span> <a name="l04197"></a>04197 <span class="comment">// get rid of EOL</span> <a name="l04198"></a>04198 content.resize( QMAX( content.length(), 2 ) - 2 ); <a name="l04199"></a>04199 <span class="comment">// we have to delete the fields first as they might have been created by</span> <a name="l04200"></a>04200 <span class="comment">// an earlier call to DwHeaders::FieldBody</span> <a name="l04201"></a>04201 mLastUpdated->Headers().DeleteAllFields(); <a name="l04202"></a>04202 mLastUpdated->Headers().FromString( content ); <a name="l04203"></a>04203 mLastUpdated->Headers().Parse(); <a name="l04204"></a>04204 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( partSpecifier.endsWith(<span class="stringliteral">".HEADER"</span>) ) <a name="l04205"></a>04205 { <a name="l04206"></a>04206 <span class="comment">// update header of embedded message</span> <a name="l04207"></a>04207 mLastUpdated->Body().Message()->Headers().FromString( content ); <a name="l04208"></a>04208 mLastUpdated->Body().Message()->Headers().Parse(); <a name="l04209"></a>04209 } <span class="keywordflow">else</span> { <a name="l04210"></a>04210 <span class="comment">// update body</span> <a name="l04211"></a>04211 mLastUpdated->Body().FromString( content ); <a name="l04212"></a>04212 QString parentSpec = partSpecifier.section( <span class="charliteral">'.'</span>, 0, -2 ); <a name="l04213"></a>04213 <span class="keywordflow">if</span> ( !parentSpec.isEmpty() ) <a name="l04214"></a>04214 { <a name="l04215"></a>04215 DwBodyPart* parent = <a class="code" href="classKMMessage.html#115edb44d72866530342c81142e419da" title="Return the first DwBodyPart matching a given Content-Type or zero, if no found.">findDwBodyPart</a>( <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(), parentSpec ); <a name="l04216"></a>04216 <span class="keywordflow">if</span> ( parent && parent->hasHeaders() && parent->Headers().HasContentType() ) <a name="l04217"></a>04217 { <a name="l04218"></a>04218 <span class="keyword">const</span> DwMediaType& contentType = parent->Headers().ContentType(); <a name="l04219"></a>04219 <span class="keywordflow">if</span> ( contentType.Type() == DwMime::kTypeMessage && <a name="l04220"></a>04220 contentType.Subtype() == DwMime::kSubtypeRfc822 ) <a name="l04221"></a>04221 { <a name="l04222"></a>04222 <span class="comment">// an embedded message that is not multipart</span> <a name="l04223"></a>04223 <span class="comment">// update this directly</span> <a name="l04224"></a>04224 parent->Body().Message()->Body().FromString( content ); <a name="l04225"></a>04225 } <a name="l04226"></a>04226 } <a name="l04227"></a>04227 } <a name="l04228"></a>04228 } <a name="l04229"></a>04229 <a name="l04230"></a>04230 } <span class="keywordflow">else</span> <a name="l04231"></a>04231 { <a name="l04232"></a>04232 <span class="comment">// update text-only messages</span> <a name="l04233"></a>04233 <span class="keywordflow">if</span> ( partSpecifier == <span class="stringliteral">"TEXT"</span> ) <a name="l04234"></a>04234 <a class="code" href="classKMMessage.html#fc64c26a395d55c6ca96c00051f72c63" title="Delete all body parts.">deleteBodyParts</a>(); <span class="comment">// delete empty parts first</span> <a name="l04235"></a>04235 mMsg->Body().FromString( content ); <a name="l04236"></a>04236 mMsg->Body().Parse(); <a name="l04237"></a>04237 } <a name="l04238"></a>04238 mNeedsAssembly = <span class="keyword">true</span>; <a name="l04239"></a>04239 <span class="keywordflow">if</span> (! partSpecifier.endsWith(<span class="stringliteral">".HEADER"</span>) ) <a name="l04240"></a>04240 { <a name="l04241"></a>04241 <span class="comment">// notify observers</span> <a name="l04242"></a>04242 notify(); <a name="l04243"></a>04243 } <a name="l04244"></a>04244 } <a name="l04245"></a>04245 <a name="l04246"></a>04246 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04247"></a>04247 <span class="keywordtype">void</span> KMMessage::updateAttachmentState( DwBodyPart* part ) <a name="l04248"></a>04248 { <a name="l04249"></a>04249 <span class="keywordflow">if</span> ( !part ) <a name="l04250"></a>04250 part = <a class="code" href="classKMMessage.html#f7412a18d6089e1055bfe50283671714" title="Get the 1st DwBodyPart.">getFirstDwBodyPart</a>(); <a name="l04251"></a>04251 <a name="l04252"></a>04252 <span class="keywordflow">if</span> ( !part ) <a name="l04253"></a>04253 { <a name="l04254"></a>04254 <span class="comment">// kdDebug(5006) << "updateAttachmentState - no part!" << endl;</span> <a name="l04255"></a>04255 <a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d" title="Set status and mark dirty.">setStatus</a>( KMMsgStatusHasNoAttach ); <a name="l04256"></a>04256 <span class="keywordflow">return</span>; <a name="l04257"></a>04257 } <a name="l04258"></a>04258 <a name="l04259"></a>04259 <span class="keywordtype">bool</span> filenameEmpty = <span class="keyword">true</span>; <a name="l04260"></a>04260 <span class="keywordflow">if</span> ( part->hasHeaders() ) { <a name="l04261"></a>04261 <span class="keywordflow">if</span> ( part->Headers().HasContentDisposition() ) { <a name="l04262"></a>04262 DwDispositionType cd = part->Headers().ContentDisposition(); <a name="l04263"></a>04263 filenameEmpty = cd.Filename().empty(); <a name="l04264"></a>04264 <span class="keywordflow">if</span> ( filenameEmpty ) { <a name="l04265"></a>04265 <span class="comment">// let's try if it is rfc 2231 encoded which mimelib can't handle</span> <a name="l04266"></a>04266 filenameEmpty = KMMsgBase::decodeRFC2231String( KMMsgBase::extractRFC2231HeaderField( cd.AsString().c_str(), <span class="stringliteral">"filename"</span> ) ).isEmpty(); <a name="l04267"></a>04267 } <a name="l04268"></a>04268 } <a name="l04269"></a>04269 } <a name="l04270"></a>04270 <a name="l04271"></a>04271 <span class="keywordflow">if</span> ( part->hasHeaders() && <a name="l04272"></a>04272 ( ( part->Headers().HasContentDisposition() && <a name="l04273"></a>04273 !part->Headers().ContentDisposition().Filename().empty() ) || <a name="l04274"></a>04274 ( part->Headers().HasContentType() && <a name="l04275"></a>04275 !filenameEmpty ) ) ) <a name="l04276"></a>04276 { <a name="l04277"></a>04277 <span class="comment">// now blacklist certain ContentTypes</span> <a name="l04278"></a>04278 <span class="keywordflow">if</span> ( !part->Headers().HasContentType() || <a name="l04279"></a>04279 ( part->Headers().HasContentType() && <a name="l04280"></a>04280 part->Headers().ContentType().Subtype() != DwMime::kSubtypePgpSignature && <a name="l04281"></a>04281 part->Headers().ContentType().Subtype() != DwMime::kSubtypePkcs7Signature ) ) <a name="l04282"></a>04282 { <a name="l04283"></a>04283 <a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d" title="Set status and mark dirty.">setStatus</a>( KMMsgStatusHasAttach ); <a name="l04284"></a>04284 } <a name="l04285"></a>04285 <span class="keywordflow">return</span>; <a name="l04286"></a>04286 } <a name="l04287"></a>04287 <a name="l04288"></a>04288 <span class="comment">// multipart</span> <a name="l04289"></a>04289 <span class="keywordflow">if</span> ( part->hasHeaders() && <a name="l04290"></a>04290 part->Headers().HasContentType() && <a name="l04291"></a>04291 part->Body().FirstBodyPart() && <a name="l04292"></a>04292 (DwMime::kTypeMultipart == part->Headers().ContentType().Type() ) ) <a name="l04293"></a>04293 { <a name="l04294"></a>04294 updateAttachmentState( part->Body().FirstBodyPart() ); <a name="l04295"></a>04295 } <a name="l04296"></a>04296 <a name="l04297"></a>04297 <span class="comment">// encapsulated message</span> <a name="l04298"></a>04298 <span class="keywordflow">if</span> ( part->Body().Message() && <a name="l04299"></a>04299 part->Body().Message()->Body().FirstBodyPart() ) <a name="l04300"></a>04300 { <a name="l04301"></a>04301 updateAttachmentState( part->Body().Message()->Body().FirstBodyPart() ); <a name="l04302"></a>04302 } <a name="l04303"></a>04303 <a name="l04304"></a>04304 <span class="comment">// next part</span> <a name="l04305"></a>04305 <span class="keywordflow">if</span> ( part->Next() ) <a name="l04306"></a>04306 updateAttachmentState( part->Next() ); <a name="l04307"></a>04307 <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( attachmentState() == KMMsgAttachmentUnknown ) <a name="l04308"></a>04308 <a class="code" href="classKMMessage.html#508dba38dc91893691edddaab30e274d" title="Set status and mark dirty.">setStatus</a>( KMMsgStatusHasNoAttach ); <a name="l04309"></a>04309 } <a name="l04310"></a>04310 <a name="l04311"></a><a class="code" href="classKMMessage.html#c8f76f105744b6ab2eeca2e551606716">04311</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#c8f76f105744b6ab2eeca2e551606716" title="Sets this body part&#39;s content to str.">KMMessage::setBodyFromUnicode</a>( <span class="keyword">const</span> QString & str ) { <a name="l04312"></a>04312 QCString encoding = KMMsgBase::autoDetectCharset( <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">charset</a>(), <a class="code" href="classKMMessage.html#41e2c0836f490db2edf4983899a07591" title="Get a list of preferred message charsets.">KMMessage::preferredCharsets</a>(), str ); <a name="l04313"></a>04313 <span class="keywordflow">if</span> ( encoding.isEmpty() ) <a name="l04314"></a>04314 encoding = <span class="stringliteral">"utf-8"</span>; <a name="l04315"></a>04315 <span class="keyword">const</span> QTextCodec * <a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">codec</a> = KMMsgBase::codecForName( encoding ); <a name="l04316"></a>04316 assert( codec ); <a name="l04317"></a>04317 QValueList<int> dummy; <a name="l04318"></a>04318 <a class="code" href="classKMMessage.html#6c6413b3690538964ac810f4c6755a5b" title="Set the message charset.">setCharset</a>( encoding ); <a name="l04319"></a>04319 <a class="code" href="classKMMessage.html#ef11573b865ace4d6886b9f8a48e6303" title="Sets body, encoded in the best fitting content-transfer-encoding, which is determined...">setBodyAndGuessCte</a>( codec->fromUnicode( str ), dummy, <span class="keyword">false</span> <span class="comment">/* no 8bit */</span> ); <a name="l04320"></a>04320 } <a name="l04321"></a>04321 <a name="l04322"></a><a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac">04322</a> <span class="keyword">const</span> QTextCodec * <a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">KMMessage::codec</a>()<span class="keyword"> const </span>{ <a name="l04323"></a>04323 <span class="keyword">const</span> QTextCodec * c = mOverrideCodec; <a name="l04324"></a>04324 <span class="keywordflow">if</span> ( !c ) <a name="l04325"></a>04325 <span class="comment">// no override-codec set for this message, try the CT charset parameter:</span> <a name="l04326"></a>04326 c = KMMsgBase::codecForName( <a class="code" href="classKMMessage.html#5bfe73d1c397910fedfa770f6d869a57" title="Get the message charset.">charset</a>() ); <a name="l04327"></a>04327 <span class="keywordflow">if</span> ( !c ) { <a name="l04328"></a>04328 <span class="comment">// Ok, no override and nothing in the message, let's use the fallback</span> <a name="l04329"></a>04329 <span class="comment">// the user configured</span> <a name="l04330"></a>04330 c = KMMsgBase::codecForName( GlobalSettings::self()->fallbackCharacterEncoding().latin1() ); <a name="l04331"></a>04331 } <a name="l04332"></a>04332 <span class="keywordflow">if</span> ( !c ) <a name="l04333"></a>04333 <span class="comment">// no charset means us-ascii (RFC 2045), so using local encoding should</span> <a name="l04334"></a>04334 <span class="comment">// be okay</span> <a name="l04335"></a>04335 c = kmkernel->networkCodec(); <a name="l04336"></a>04336 assert( c ); <a name="l04337"></a>04337 <span class="keywordflow">return</span> c; <a name="l04338"></a>04338 } <a name="l04339"></a>04339 <a name="l04340"></a><a class="code" href="classKMMessage.html#178d0a93482282bad41cfa9031c93e5a">04340</a> QString <a class="code" href="classKMMessage.html#178d0a93482282bad41cfa9031c93e5a" title="Returns the body part decoded to unicode.">KMMessage::bodyToUnicode</a>(<span class="keyword">const</span> QTextCodec* <a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">codec</a>)<span class="keyword"> const </span>{ <a name="l04341"></a>04341 <span class="keywordflow">if</span> ( !codec ) <a name="l04342"></a>04342 <span class="comment">// No codec was given, so try the charset in the mail</span> <a name="l04343"></a>04343 codec = this-><a class="code" href="classKMMessage.html#91762b3880f42da72185c59c40b28cac" title="Get a QTextCodec suitable for this message part.">codec</a>(); <a name="l04344"></a>04344 assert( codec ); <a name="l04345"></a>04345 <a name="l04346"></a>04346 <span class="keywordflow">return</span> codec->toUnicode( <a class="code" href="classKMMessage.html#e4e5fdc4bbafb1397801381b91313e91" title="Returns a decoded version of the body from the current content transfer encoding...">bodyDecoded</a>() ); <a name="l04347"></a>04347 } <a name="l04348"></a>04348 <a name="l04349"></a>04349 <span class="comment">//-----------------------------------------------------------------------------</span> <a name="l04350"></a><a class="code" href="classKMMessage.html#fa8e5a3da9c8c364ccbf80773b01c424">04350</a> QCString <a class="code" href="classKMMessage.html#fa8e5a3da9c8c364ccbf80773b01c424" title="Returns an mbox message separator line for this message, i.e.">KMMessage::mboxMessageSeparator</a>() <a name="l04351"></a>04351 { <a name="l04352"></a>04352 QCString str( KPIM::getFirstEmailAddress( <a class="code" href="classKMMessage.html#7fdcc69aab16473b8031e02e0505763d" title="Returns the raw value of a header field with the given name.">rawHeaderField</a>(<span class="stringliteral">"From"</span>) ) ); <a name="l04353"></a>04353 <span class="keywordflow">if</span> ( str.isEmpty() ) <a name="l04354"></a>04354 str = <span class="stringliteral">"unknown@unknown.invalid"</span>; <a name="l04355"></a>04355 QCString <a class="code" href="classKMMessage.html#dc0c5523e610a960a4d913d7e27ff04a" title="Get or set the &#39;Date&#39; header field.">dateStr</a>( <a class="code" href="classKMMessage.html#571d8a05d72eac05cc0bacffa0fae4c5" title="Returns the message date in asctime format or an empty string if the message lacks...">dateShortStr</a>() ); <a name="l04356"></a>04356 <span class="keywordflow">if</span> ( dateStr.isEmpty() ) { <a name="l04357"></a>04357 time_t t = ::time( 0 ); <a name="l04358"></a>04358 dateStr = ctime( &t ); <a name="l04359"></a>04359 <span class="keyword">const</span> <span class="keywordtype">int</span> len = dateStr.length(); <a name="l04360"></a>04360 <span class="keywordflow">if</span> ( dateStr[len-1] == <span class="charliteral">'\n'</span> ) <a name="l04361"></a>04361 dateStr.truncate( len - 1 ); <a name="l04362"></a>04362 } <a name="l04363"></a>04363 <span class="keywordflow">return</span> <span class="stringliteral">"From "</span> + str + <span class="stringliteral">" "</span> + dateStr + <span class="stringliteral">"\n"</span>; <a name="l04364"></a>04364 } <a name="l04365"></a>04365 <a name="l04366"></a><a class="code" href="classKMMessage.html#af3691036914696923482190c3fcba11">04366</a> <span class="keywordtype">void</span> <a class="code" href="classKMMessage.html#af3691036914696923482190c3fcba11" title="Delete this message as soon as it no longer in use.">KMMessage::deleteWhenUnused</a>() <a name="l04367"></a>04367 { <a name="l04368"></a>04368 sPendingDeletes << <span class="keyword">this</span>; <a name="l04369"></a>04369 } </pre></div></div> </div></div> </td> </tr> <tr> <td valign="top" id="leftmenu" width="25%"> <a name="navigation"></a> <div class="menu_box"><h2>kmail</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><li><a href="pages.html">Related Pages</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="classAccountUpdater.html">accountupdater</option>, <option value="classAttachmentModifyCommand.html">attachmentmodifycommand</option>, <option value="classFolderStorage.html">folderstorage</option>, <option value="classKCursorSaver.html">kcursorsaver</option>, <option value="classKleo_1_1KeyResolver.html">kleo::keyresolver</option>, <option value="classKListViewIndexedSearchLine.html">klistviewindexedsearchline</option>, <option value="classKMAcctFolder.html">kmacctfolder</option>, <option value="classKMAcctSelDlg.html">kmacctseldlg</option>, <option value="classKMail_1_1AccountComboBox.html">kmail::accountcombobox</option>, <option value="classKMail_1_1AccountManager.html">kmail::accountmanager</option>, <option value="classKMail_1_1ACLEntryDialog.html">kmail::aclentrydialog</option>, <option value="classKMail_1_1ACLJobs_1_1DeleteACLJob.html">kmail::acljobs::deleteacljob</option>, <option value="classKMail_1_1ACLJobs_1_1GetACLJob.html">kmail::acljobs::getacljob</option>, <option value="classKMail_1_1ACLJobs_1_1GetUserRightsJob.html">kmail::acljobs::getuserrightsjob</option>, <option value="classKMail_1_1ACLJobs_1_1MultiSetACLJob.html">kmail::acljobs::multisetacljob</option>, <option value="classKMail_1_1AnnotationJobs_1_1GetAnnotationJob.html">kmail::annotationjobs::getannotationjob</option>, <option value="classKMail_1_1AnnotationJobs_1_1MultiGetAnnotationJob.html">kmail::annotationjobs::multigetannotationjob</option>, <option value="classKMail_1_1AnnotationJobs_1_1MultiSetAnnotationJob.html">kmail::annotationjobs::multisetannotationjob</option>, <option value="classKMail_1_1AnnotationJobs_1_1MultiUrlGetAnnotationJob.html">kmail::annotationjobs::multiurlgetannotationjob</option>, <option value="classKMail_1_1AntiSpamConfig.html">kmail::antispamconfig</option>, <option value="classKMail_1_1AntiSpamWizard.html">kmail::antispamwizard</option>, <option value="classKMail_1_1AntiSpamWizard_1_1ConfigReader.html">kmail::antispamwizard::configreader</option>, <option value="classKMail_1_1AntiSpamWizard_1_1SpamToolConfig.html">kmail::antispamwizard::spamtoolconfig</option>, <option value="classKMail_1_1Callback.html">kmail::callback</option>, <option value="classKMail_1_1CopyFolderJob.html">kmail::copyfolderjob</option>, <option value="classKMail_1_1DictionaryComboBox.html">kmail::dictionarycombobox</option>, <option value="classKMail_1_1EditorWatcher.html">kmail::editorwatcher</option>, <option value="classKMail_1_1FilterImporterExporter.html">kmail::filterimporterexporter</option>, <option value="classKMail_1_1FilterLog.html">kmail::filterlog</option>, <option value="classKMail_1_1FilterLogDialog.html">kmail::filterlogdialog</option>, <option value="classKMail_1_1FolderDiaACLTab.html">kmail::folderdiaacltab</option>, <option value="classKMail_1_1FolderDiaGeneralTab.html">kmail::folderdiageneraltab</option>, <option value="classKMail_1_1FolderDiaQuotaTab.html">kmail::folderdiaquotatab</option>, <option value="classKMail_1_1FolderDiaTab.html">kmail::folderdiatab</option>, <option value="classKMail_1_1FolderDiaTemplatesTab.html">kmail::folderdiatemplatestab</option>, <option value="classKMail_1_1FolderRequester.html">kmail::folderrequester</option>, <option value="classKMail_1_1HeaderItem.html">kmail::headeritem</option>, <option value="classKMail_1_1HeaderStyle.html">kmail::headerstyle</option>, <option value="classKMail_1_1HtmlStatusBar.html">kmail::htmlstatusbar</option>, <option value="classKMail_1_1HtmlWriter.html">kmail::htmlwriter</option>, <option value="classKMail_1_1IdentityDrag.html">kmail::identitydrag</option>, <option value="classKMail_1_1IdentityListView.html">kmail::identitylistview</option>, <option value="classKMail_1_1IdentityListViewItem.html">kmail::identitylistviewitem</option>, <option value="classKMail_1_1Interface_1_1BodyPart.html">kmail::interface::bodypart</option>, <option value="classKMail_1_1Interface_1_1BodyPartFormatterPlugin.html">kmail::interface::bodypartformatterplugin</option>, <option value="classKMail_1_1Interface_1_1BodyPartMemento.html">kmail::interface::bodypartmemento</option>, <option value="classKMail_1_1Interface_1_1BodyPartURLHandler.html">kmail::interface::bodyparturlhandler</option>, <option value="classKMail_1_1Interface_1_1Observable.html">kmail::interface::observable</option>, <option value="classKMail_1_1Interface_1_1Observer.html">kmail::interface::observer</option>, <option value="classKMail_1_1JobScheduler.html">kmail::jobscheduler</option>, <option value="classKMail_1_1ListJob.html">kmail::listjob</option>, <option value="classKMail_1_1MaildirCompactionJob.html">kmail::maildircompactionjob</option>, <option value="classKMail_1_1MailingList.html">kmail::mailinglist</option>, <option value="classKMail_1_1MboxCompactionJob.html">kmail::mboxcompactionjob</option>, <option value="classKMail_1_1MessageActions.html">kmail::messageactions</option>, <option value="classKMail_1_1MessageCopyHelper.html">kmail::messagecopyhelper</option>, <option value="classKMail_1_1PartNodeBodyPart.html">kmail::partnodebodypart</option>, <option value="classKMail_1_1PopAccount.html">kmail::popaccount</option>, <option value="classKMail_1_1QuotaJobs_1_1GetQuotarootJob.html">kmail::quotajobs::getquotarootjob</option>, <option value="classKMail_1_1QuotaJobs_1_1GetStorageQuotaJob.html">kmail::quotajobs::getstoragequotajob</option>, <option value="classKMail_1_1RedirectDialog.html">kmail::redirectdialog</option>, <option value="classKMail_1_1RenameJob.html">kmail::renamejob</option>, <option value="classKMail_1_1RuleWidgetHandler.html">kmail::rulewidgethandler</option>, <option value="classKMail_1_1RuleWidgetHandlerManager.html">kmail::rulewidgethandlermanager</option>, <option value="classKMail_1_1ScheduledCompactionTask.html">kmail::scheduledcompactiontask</option>, <option value="classKMail_1_1ScheduledExpireTask.html">kmail::scheduledexpiretask</option>, <option value="classKMail_1_1ScheduledJob.html">kmail::scheduledjob</option>, <option value="classKMail_1_1ScheduledTask.html">kmail::scheduledtask</option>, <option value="classKMail_1_1SearchJob.html">kmail::searchjob</option>, <option value="classKMail_1_1SearchWindow.html">kmail::searchwindow</option>, <option value="classKMail_1_1SecondaryWindow.html">kmail::secondarywindow</option>, <option value="classKMail_1_1SieveDebugDialog.html">kmail::sievedebugdialog</option>, <option value="classKMail_1_1SortCacheItem.html">kmail::sortcacheitem</option>, <option value="classKMail_1_1SpamHeaderAnalyzer.html">kmail::spamheaderanalyzer</option>, <option value="classKMail_1_1SpamScore.html">kmail::spamscore</option>, <option value="classKMail_1_1TeeHtmlWriter.html">kmail::teehtmlwriter</option>, <option value="classKMail_1_1TransportManager.html">kmail::transportmanager</option>, <option value="classKMail_1_1UndoInfo.html">kmail::undoinfo</option>, <option value="classKMail_1_1URLHandler.html">kmail::urlhandler</option>, <option value="classKMail_1_1URLHandlerManager.html">kmail::urlhandlermanager</option>, <option value="classKMail_1_1Util_1_1LaterDeleter.html">kmail::util::laterdeleter</option>, <option value="classKMailICalIfaceImpl.html">kmailicalifaceimpl</option>, <option value="classKMailIface.html">kmailiface</option>, <option value="classKMDict.html">kmdict</option>, <option value="classKMDictItem.html">kmdictitem</option>, <option value="classKMFilterAction.html">kmfilteraction</option>, <option value="classKMFilterActionDict.html">kmfilteractiondict</option>, <option value="classKMFilterActionWidget.html">kmfilteractionwidget</option>, <option value="classKMFilterActionWithAddress.html">kmfilteractionwithaddress</option>, <option value="classKMFilterActionWithFolder.html">kmfilteractionwithfolder</option>, <option value="classKMFilterActionWithNone.html">kmfilteractionwithnone</option>, <option value="classKMFilterActionWithString.html">kmfilteractionwithstring</option>, <option value="classKMFilterActionWithStringList.html">kmfilteractionwithstringlist</option>, <option value="classKMFilterActionWithUOID.html">kmfilteractionwithuoid</option>, <option value="classKMFilterActionWithUrl.html">kmfilteractionwithurl</option>, <option value="classKMFilterDlg.html">kmfilterdlg</option>, <option value="classKMFilterListBox.html">kmfilterlistbox</option>, <option value="classKMFolder.html">kmfolder</option>, <option value="classKMFolderDialog.html">kmfolderdialog</option>, <option value="classKMFolderDir.html">kmfolderdir</option>, <option value="classKMFolderIndex.html">kmfolderindex</option>, <option value="classKMFolderOpener.html">kmfolderopener</option>, <option value="classKMHeaders.html">kmheaders</option>, <option value="classKMKernel.html">kmkernel</option>, <option value="classKMMenuCommand.html">kmmenucommand</option>, <option value="classKMMessage.html">kmmessage</option>, <option value="classKMMsgDict.html">kmmsgdict</option>, <option value="classKMMsgList.html">kmmsglist</option>, <option value="classKMMsgPartDialog.html">kmmsgpartdialog</option>, <option value="classKMMsgPartDialogCompat.html">kmmsgpartdialogcompat</option>, <option value="classKMPopHeadersView.html">kmpopheadersview</option>, <option value="classKMReaderWin.html">kmreaderwin</option>, <option value="classKMSearchPattern.html">kmsearchpattern</option>, <option value="classKMSearchPatternEdit.html">kmsearchpatternedit</option>, <option value="classKMSearchRule.html">kmsearchrule</option>, <option value="classKMSearchRuleNumerical.html">kmsearchrulenumerical</option>, <option value="classKMSearchRuleStatus.html">kmsearchrulestatus</option>, <option value="classKMSearchRuleString.html">kmsearchrulestring</option>, <option value="classKMSearchRuleWidget.html">kmsearchrulewidget</option>, <option value="classKMSystemTray.html">kmsystemtray</option>, <option value="classMailComposerIface.html">mailcomposeriface</option>, <option value="classScalix_1_1FolderAttributeParser.html">scalix::folderattributeparser</option>, <option value="classSnippetConfig.html">snippetconfig</option>, <option value="classSnippetGroup.html">snippetgroup</option>, <option value="classSnippetItem.html">snippetitem</option>, <option value="classSnippetSettings.html">snippetsettings</option>, <option value="classSnippetWidget.html">snippetwidget</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>