Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > by-pkgid > 98d6b53e11e983e268c3e19f14e091a0 > files > 2451

kdepim-devel-doc-3.5.9-9mdv2008.1.x86_64.rpm

<?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 &lt;config.h&gt;</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 &lt;libkpimidentities/identity.h&gt;</span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &lt;libkpimidentities/identitymanager.h&gt;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;libemailfunctions/email.h&gt;</span>
<a name="l00031"></a>00031 
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;kasciistringtools.h&gt;</span>
<a name="l00033"></a>00033 
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;kpgpblock.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;kaddrbook.h&gt;</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="preprocessor">#include &lt;kapplication.h&gt;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &lt;kglobalsettings.h&gt;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &lt;kdebug.h&gt;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &lt;kconfig.h&gt;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &lt;khtml_part.h&gt;</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include &lt;kuser.h&gt;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &lt;kidna.h&gt;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &lt;kasciistricmp.h&gt;</span>
<a name="l00045"></a>00045 
<a name="l00046"></a>00046 <span class="preprocessor">#include &lt;qcursor.h&gt;</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include &lt;qtextcodec.h&gt;</span>
<a name="l00048"></a>00048 <span class="preprocessor">#include &lt;qmessagebox.h&gt;</span>
<a name="l00049"></a>00049 <span class="preprocessor">#include &lt;kmime_util.h&gt;</span>
<a name="l00050"></a>00050 <span class="preprocessor">#include &lt;kmime_charfreq.h&gt;</span>
<a name="l00051"></a>00051 
<a name="l00052"></a>00052 <span class="preprocessor">#include &lt;kmime_header_parsing.h&gt;</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 &lt;mimelib/body.h&gt;</span>
<a name="l00057"></a>00057 <span class="preprocessor">#include &lt;mimelib/field.h&gt;</span>
<a name="l00058"></a>00058 <span class="preprocessor">#include &lt;mimelib/mimepp.h&gt;</span>
<a name="l00059"></a>00059 <span class="preprocessor">#include &lt;mimelib/string.h&gt;</span>
<a name="l00060"></a>00060 <span class="preprocessor">#include &lt;assert.h&gt;</span>
<a name="l00061"></a>00061 <span class="preprocessor">#include &lt;sys/time.h&gt;</span>
<a name="l00062"></a>00062 <span class="preprocessor">#include &lt;time.h&gt;</span>
<a name="l00063"></a>00063 <span class="preprocessor">#include &lt;klocale.h&gt;</span>
<a name="l00064"></a>00064 <span class="preprocessor">#include &lt;stdlib.h&gt;</span>
<a name="l00065"></a>00065 <span class="preprocessor">#include &lt;unistd.h&gt;</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 &lt;kmessagebox.h&gt;</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&amp; headers, KMMessagePart* aPart );
<a name="l00087"></a>00087 
<a name="l00088"></a>00088 QValueList&lt;KMMessage*&gt; 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&amp; <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(&amp;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>&amp; 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>&amp; 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 &amp;#39;Drafts&amp;#39; folder.">drafts</a>() );
<a name="l00187"></a>00187   setTemplates( other.<a class="code" href="classKMMessage.html#544e24e65dae9fcf8a6008791327ecb2" title="Get or set the &amp;#39;Templates&amp;#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( &amp;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-&gt;undoStack()-&gt;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&amp; 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-&gt;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&amp; header = mMsg-&gt;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>() &amp;&amp; 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()-&gt;find( <span class="keyword">this</span> );
<a name="l00253"></a>00253       <span class="keywordflow">if</span> ( idx &gt; 0 ) {
<a name="l00254"></a>00254         parent()-&gt;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&amp; aStr,
<a name="l00277"></a>00277                                                            QString&amp; 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&amp; <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-&gt;Assemble();
<a name="l00301"></a>00301   }
<a name="l00302"></a>00302   <span class="keywordflow">return</span> mMsg-&gt;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-&gt;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-&gt;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-&gt;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 &amp;quot;Status&amp;quot; and &amp;quot;X-Status&amp;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>() &amp; 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) &lt;&lt; "Setting SignatureState header field to " &lt;&lt; str[0] &lt;&lt; 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&lt;</span><span class="keywordtype">char</span><span class="keyword">&gt;</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-&gt;Headers().Assemble();
<a name="l00375"></a>00375   mMsg-&gt;Assemble( mMsg-&gt;Headers(),
<a name="l00376"></a>00376                   mMsg-&gt;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&amp; header = mMsg-&gt;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&amp; <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-&gt;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 &amp; 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 &amp; 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&amp; 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-&gt;FromString( str );
<a name="l00410"></a>00410   mMsg-&gt;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&lt;KMMsgMDNSentState&gt;( <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 &amp;&amp; <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&amp; 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&lt;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 &amp;#39;From&amp;#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]&gt;<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 &lt; strLength &amp;&amp; str[j] &lt;= <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]&gt;<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]&gt;<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 &amp;#39;To&amp;#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 &amp;#39;Cc&amp;#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 &amp;#39;Subject&amp;#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 &amp;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 &gt;= 0) &amp;&amp; ((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 &amp;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 &lt; 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">'&gt;'</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>) &amp;&amp; (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 &lt;= 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 &amp;text, <span class="keyword">const</span> QString&amp; 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">"&lt;NULL&gt;\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() &gt; maxLength)
<a name="l00563"></a>00563       {
<a name="l00564"></a>00564          i = maxLength;
<a name="l00565"></a>00565          <span class="keywordflow">while</span>( (i &gt;= 0) &amp;&amp; (text[i] != <span class="charliteral">' '</span>))
<a name="l00566"></a>00566             i--;
<a name="l00567"></a>00567          <span class="keywordflow">if</span> (i &lt;= 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 &lt; (int) text.length()) &amp;&amp; (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 &lt; (<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 &amp;msg, QStringList &amp;part,
<a name="l00594"></a>00594                       <span class="keyword">const</span> QString &amp;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 &lt; 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()) &amp;&amp; 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() &lt; maxLength) || ((<span class="keywordtype">int</span>) line.length() &lt; (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 &amp; 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 &amp; 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() &amp;&amp; (oldIndent.length() &lt; 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()) &amp;&amp; (*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()) &amp;&amp; ((*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() &gt; 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&amp; parsedString,
<a name="l00717"></a>00717                                            <span class="keyword">const</span> QTextCodec*&amp; <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>&amp; 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-&gt;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) &lt;&lt; <span class="stringliteral">"\n\n======= KMMessage::parseTextStringFromDwPart()   -    "</span>
<a name="l00733"></a>00733                 &lt;&lt; ( curNode ? <span class="stringliteral">"text part found!\n"</span> : <span class="stringliteral">"sorry, no text node!\n"</span> ) &lt;&lt; endl;
<a name="l00734"></a>00734   <span class="keywordflow">if</span>( curNode ) {
<a name="l00735"></a>00735     isHTML = DwMime::kSubtypeHtml == curNode-&gt;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-&gt;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-&gt;<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&lt;Kpgp::Block&gt; 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-&gt;type() == Kpgp::PgpMessageBlock ||
<a name="l00777"></a>00777          block-&gt;type() == Kpgp::ClearsignedBlock ) {
<a name="l00778"></a>00778       <span class="keywordflow">if</span> ( block-&gt;type() == Kpgp::PgpMessageBlock ) {
<a name="l00779"></a>00779         <span class="comment">// try to decrypt this OpenPGP block</span>
<a name="l00780"></a>00780         block-&gt;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-&gt;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-&gt;toUnicode( nonPgpBlocks.first() )
<a name="l00788"></a>00788              + codec-&gt;toUnicode( block-&gt;text() )
<a name="l00789"></a>00789              + codec-&gt;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-&gt;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 -&gt; plaintext conversion, if necessary:</span>
<a name="l00802"></a>00802   <span class="keywordflow">if</span> ( isHTML &amp;&amp; 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&amp; aHeaderStr,
<a name="l00824"></a>00824                    <span class="keyword">const</span> QString&amp; aIndentStr,
<a name="l00825"></a>00825                    <span class="keyword">const</span> QString&amp; 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 &gt;= 0 )
<a name="l00836"></a>00836     content.remove( 0, static_cast&lt;unsigned int&gt;( 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 &amp;&amp; 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 &amp;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-&gt;<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 &amp;#39;ReplyTo&amp;#39; header field.">replyTo</a>();
<a name="l00868"></a>00868 
<a name="l00869"></a>00869   msg-&gt;<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() &amp;&amp; parent()-&gt;isMailingListEnabled() &amp;&amp;
<a name="l00873"></a>00873        !parent()-&gt;mailingListPostAddress().isEmpty() ) {
<a name="l00874"></a>00874     mailingListAddresses &lt;&lt; parent()-&gt;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">"&lt;mailto:([^@&gt;]+)@([^&gt;]+)&gt;"</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 &lt;&lt; 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 &amp;#39;From&amp;#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&amp;#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() &amp;&amp; !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&amp;#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() &amp;&amp; !<a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#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 &amp;#39;From&amp;#39; header field.">from</a>();
<a name="l00952"></a>00952         kdDebug(5006) &lt;&lt; <span class="stringliteral">"Added "</span> &lt;&lt; <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#39; header field.">from</a>() &lt;&lt; <span class="stringliteral">" to the list of CC recipients"</span>
<a name="l00953"></a>00953                       &lt;&lt; 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() &amp;&amp; !<a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#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 &amp;#39;From&amp;#39; header field.">from</a>();
<a name="l00964"></a>00964         kdDebug(5006) &lt;&lt; <span class="stringliteral">"Added "</span> &lt;&lt; <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#39; header field.">from</a>() &lt;&lt; <span class="stringliteral">" to the list of recipients"</span>
<a name="l00965"></a>00965                       &lt;&lt; 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&amp;#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 &amp;#39;Cc&amp;#39; header field.">cc</a>().isEmpty() || !<a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &amp;#39;To&amp;#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 &amp;#39;To&amp;#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 &amp;#39;To&amp;#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 &amp;#39;Cc&amp;#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 &amp;#39;Cc&amp;#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             &amp;&amp; !<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) &lt;&lt; <span class="stringliteral">"Added "</span> &lt;&lt; *it &lt;&lt; <span class="stringliteral">" to the list of CC recipients"</span>
<a name="l00984"></a>00984                         &lt;&lt; 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&amp;#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() &amp;&amp; !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-&gt;<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() &amp;&amp; !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 &amp;#39;From&amp;#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 &amp;#39;From&amp;#39; header field.">from</a>().isEmpty() ) {
<a name="l01029"></a>01029       toStr = <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#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-&gt;<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-&gt;<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-&gt;<a class="code" href="classKMMessage.html#f1b40aad4353b8e2199701c4650456b8">setReplyToId</a>(<a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &amp;#39;Message-Id&amp;#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-&gt;setBody( cStr );</span>
<a name="l01052"></a>01052 <span class="comment">//     }else{</span>
<a name="l01053"></a>01053 <span class="comment">//       msg-&gt;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-&gt;<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-&gt;<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() &amp;&amp; parent()-&gt;putRepliesInSameFolder() )
<a name="l01072"></a>01072     msg-&gt;<a class="code" href="classKMMessage.html#ab7979cc09a6cd989751264051d2012e">setFcc</a>( parent()-&gt;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-&gt;<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">'&lt;'</span>);
<a name="l01096"></a>01096   j = refStr.find(<span class="charliteral">'&gt;'</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">'&lt;'</span>);
<a name="l01102"></a>01102   j = refStr.findRev(<span class="charliteral">'&gt;'</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() &amp;&amp; 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 &amp;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-&gt;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-&gt;<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 &amp; ident =
<a name="l01124"></a>01124     kmkernel-&gt;identityManager()-&gt;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 &lt;%3&gt;)"</span>)
<a name="l01128"></a>01128     .arg( <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#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 &lt;%2&gt;"</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-&gt;<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-&gt;<a class="code" href="classKMMessage.html#2c0f165afcca50d3b7f5a03bc29d42b6" title="Set the &amp;#39;Date&amp;#39; header field to the current date.">setDateToday</a>();
<a name="l01140"></a>01140   QString newDate = msg-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &amp;#39;Subject&amp;#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 &amp;#39;From&amp;#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 &amp;#39;To&amp;#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 &amp;#39;Cc&amp;#39; header field.">cc</a>().isEmpty()) s += <span class="stringliteral">"Cc: "</span> + <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &amp;#39;Cc&amp;#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&amp; 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&amp; header = mMsg-&gt;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-&gt;Next();
<a name="l01202"></a>01202      <span class="keywordflow">if</span> ( field-&gt;FieldNameStr().find( <span class="stringliteral">"ontent"</span> ) == DwString::npos
<a name="l01203"></a>01203              &amp;&amp; !whiteList.contains( QString::fromLatin1( field-&gt;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-&gt;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 &amp;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 &amp;&amp; subtype() == DwMime::kSubtypePlain ) ) {
<a name="l01221"></a>01221     <span class="comment">// ## slow, we could probably use: delete msg-&gt;mMsg; msg-&gt;mMsg = new DwMessage( this-&gt;mMsg );</span>
<a name="l01222"></a>01222     msg-&gt;<a class="code" href="classKMMessage.html#765ec32909b2bfde6a205c1b76431381" title="Parse the string and create this message from it.">fromDwString</a>( this-&gt;<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-&gt;<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-&gt;<a class="code" href="classKMMessage.html#30782f41ed9b25f9e61e138c7e549cea">subtype</a>();
<a name="l01227"></a>01227 
<a name="l01228"></a>01228     msg-&gt;<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()-&gt;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 ) &lt;&lt; <span class="stringliteral">"Looking for blacklisted type: "</span> &lt;&lt; type &lt;&lt; <span class="stringliteral">"/"</span> &lt;&lt; subtype &lt;&lt; endl;
<a name="l01238"></a>01238       <span class="keywordflow">while</span> ( DwBodyPart * part = msg-&gt;<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-&gt;<a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>-&gt;Body().RemoveBodyPart( part );
<a name="l01240"></a>01240       }
<a name="l01241"></a>01241     }
<a name="l01242"></a>01242     msg-&gt;<a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>-&gt;Assemble();
<a name="l01243"></a>01243 
<a name="l01244"></a>01244     msg-&gt;<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-&gt;<a class="code" href="classKMMessage.html#e8dcba97a80b0db0c33df23d08b62f55">setType</a>( type );
<a name="l01247"></a>01247     msg-&gt;<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 &amp;&amp; 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-&gt;<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-&gt;<a class="code" href="classKMMessage.html#e8dcba97a80b0db0c33df23d08b62f55">setType</a>( DwMime::kTypeText );
<a name="l01253"></a>01253     msg-&gt;<a class="code" href="classKMMessage.html#2f6fd47b46942b7ad77596514a98ec04">setSubtype</a>( DwMime::kSubtypeHtml );
<a name="l01254"></a>01254     msg-&gt;<a class="code" href="classKMMessage.html#32e5730c58e6434c27cda32566cc99b3">mNeedsAssembly</a> = <span class="keyword">true</span>;
<a name="l01255"></a>01255     msg-&gt;<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-&gt;<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-&gt;<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-&gt;<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 &amp; header = msg-&gt;<a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>-&gt;Headers();
<a name="l01264"></a>01264     header.MimeVersion().FromString(<span class="stringliteral">"1.0"</span>);
<a name="l01265"></a>01265     DwMediaType &amp; contentType = msg-&gt;<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, &amp;msgPart );
<a name="l01274"></a>01274     msg-&gt;<a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>(&amp;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-&gt;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-&gt;Headers(), &amp;secondPart );
<a name="l01282"></a>01282     msg-&gt;<a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>(&amp;secondPart);
<a name="l01283"></a>01283     msg-&gt;<a class="code" href="classKMMessage.html#32e5730c58e6434c27cda32566cc99b3">mNeedsAssembly</a> = <span class="keyword">true</span>;
<a name="l01284"></a>01284     msg-&gt;<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-&gt;<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-&gt;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-&gt;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-&gt;setCharset( "utf-8" );</span>
<a name="l01305"></a>01305 
<a name="l01306"></a>01306   msg-&gt;<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 &lt; 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&amp;#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">"&amp;Ignore"</span>), i18n(<span class="stringliteral">"Send \"&amp;denied\""</span>), i18n(<span class="stringliteral">"&amp;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&amp;#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">"&amp;Ignore"</span>), i18n(<span class="stringliteral">"&amp;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) &lt;&lt; <span class="stringliteral">"didn't find data for message box \""</span>
<a name="l01372"></a>01372           &lt;&lt; what &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; 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&lt;MDN::DispositionModifier&gt; 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 &amp;&amp;
<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) &lt;&lt; <span class="stringliteral">"mdnSentState() == '"</span> &lt;&lt; st &lt;&lt; <span class="stringliteral">"'"</span> &lt;&lt; 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 &lt; 0 || mode &gt; 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) &lt;&lt; <span class="stringliteral">"KPIM::splitEmailAddrList(receiptTo): "</span>
<a name="l01446"></a>01446         &lt;&lt; KPIM::splitEmailAddrList(receiptTo).join(<span class="stringliteral">"\n"</span>) &lt;&lt; endl;
<a name="l01447"></a>01447   <span class="keywordflow">if</span> ( KPIM::splitEmailAddrList(receiptTo).count() &gt; 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) &lt;&lt; <span class="stringliteral">"clean return path: "</span> &lt;&lt; returnPath &lt;&lt; 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) &lt;&lt; <span class="stringliteral">"KMMessage::createMDN(): The \"ask\" mode should "</span>
<a name="l01485"></a>01485                                                   &lt;&lt; <span class="stringliteral">"never appear here!"</span> &lt;&lt; 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-&gt;identityManager()
<a name="l01499"></a>01499     -&gt;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-&gt;<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-&gt;<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-&gt;<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 &amp; header = receipt-&gt;<a class="code" href="classKMMessage.html#b0fca7fbd1cd9f106f8b3cf6106bbf5c">mMsg</a>-&gt;Headers();
<a name="l01511"></a>01511   header.MimeVersion().FromString(<span class="stringliteral">"1.0"</span>);
<a name="l01512"></a>01512   DwMediaType &amp; contentType = receipt-&gt;<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-&gt;<a class="code" href="classKMMessage.html#32e5730c58e6434c27cda32566cc99b3">mNeedsAssembly</a> = <span class="keyword">true</span>;
<a name="l01517"></a>01517   receipt-&gt;<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 &amp;quot;${foo}&amp;quot; in s with headerField(&amp;quot;foo&amp;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-&gt;<a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &amp;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-&gt;<a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &amp;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 &lt; 0 || num &gt; 2 ) num = 0;
<a name="l01544"></a>01544   MDN::ReturnContent returnContent = <span class="keyword">static_cast&lt;</span>MDN::ReturnContent<span class="keyword">&gt;</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-&gt;<a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &amp;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-&gt;<a class="code" href="classKMMessage.html#98f53dd0092cd4b6a8a07efef0526217" title="Append a body part to the message.">addBodyPart</a>( &amp;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-&gt;<a class="code" href="classKMMessage.html#5bb40f8b006d66c80cff9a43fa3018d6">setTo</a>( receiptTo );
<a name="l01566"></a>01566   receipt-&gt;<a class="code" href="classKMMessage.html#dc02d16017d248f9f7c9dc980aee25b4">setSubject</a>( <span class="stringliteral">"Message Disposition Notification"</span> );
<a name="l01567"></a>01567   receipt-&gt;<a class="code" href="classKMMessage.html#f1b40aad4353b8e2199701c4650456b8">setReplyToId</a>( <a class="code" href="classKMMessage.html#ec7262aeb49504396dfaa65fa4be94a1" title="Get or set the &amp;#39;Message-Id&amp;#39; header field.">msgId</a>() );
<a name="l01568"></a>01568   receipt-&gt;<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-&gt;<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) &lt;&lt; <span class="stringliteral">"final message:\n"</span> + receipt-&gt;<a class="code" href="classKMMessage.html#b9b4e74c3446bce61e34201fd1e793d8" title="Return the entire message contents as a string.">asString</a>() &lt;&lt; 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 &amp;quot;${foo}&amp;quot; in s with headerField(&amp;quot;foo&amp;quot;)...">KMMessage::replaceHeadersInString</a>( <span class="keyword">const</span> QString &amp; 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-&gt;<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-&gt;<a class="code" href="classKMMessage.html#5bb40f8b006d66c80cff9a43fa3018d6">setTo</a>(receiptTo);
<a name="l01628"></a>01628   receipt-&gt;<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 &amp;#39;Subject&amp;#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-&gt;<a class="code" href="classKMMessage.html#1b9c4db08086c94986f00d0c708a01e7" title="Set the message body.">setBody</a>(str.latin1());
<a name="l01637"></a>01637   receipt-&gt;<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 &amp; ident =
<a name="l01646"></a>01646     kmkernel-&gt;identityManager()-&gt;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 &amp;#39;Date&amp;#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( &amp;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-&gt;identityManager()-&gt;identityForAddress( <a class="code" href="classKMMessage.html#87af921446ba2e30316d6207d9394a2b" title="Get or set the &amp;#39;To&amp;#39; header field.">to</a>() + <span class="stringliteral">", "</span> + <a class="code" href="classKMMessage.html#fd933b2841e1dc6d60432278d4450a2a" title="Get or set the &amp;#39;Cc&amp;#39; header field.">cc</a>() ).uoid();
<a name="l01715"></a>01715   <span class="keywordflow">if</span> ( <span class="keywordtype">id</span> == 0 &amp;&amp; parent() )
<a name="l01716"></a>01716     <span class="keywordtype">id</span> = parent()-&gt;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-&gt;<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-&gt;<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-&gt;<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&amp; header = mMsg-&gt;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-&gt;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-&gt;Next();
<a name="l01747"></a>01747     <span class="keywordflow">if</span> (field-&gt;FieldBody()-&gt;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&amp; header = mMsg-&gt;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>() &gt; 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&amp; 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 &amp;#39;Date&amp;#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&amp; header = mMsg-&gt;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)&lt;&lt;"####  Date = "&lt;&lt;header.Date().AsString().c_str()&lt;&lt;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&lt;KMime::DateFormatter::FormatType&gt;(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&amp; header = mMsg-&gt;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(&amp;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&amp; header = mMsg-&gt;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(&amp;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&amp; header = mMsg-&gt;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 &amp;#39;Date&amp;#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(&amp;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-&gt;Headers().Date().FromCalendarTime(aDate);
<a name="l01853"></a>01853   mMsg-&gt;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&amp; aStr)
<a name="l01861"></a>01861 {
<a name="l01862"></a>01862   DwHeaders&amp; header = mMsg-&gt;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 &amp;#39;To&amp;#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&amp; 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 &amp;#39;To&amp;#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 &amp;#39;ReplyTo&amp;#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&amp; 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-&gt;<a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#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 &amp;#39;Cc&amp;#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&amp; 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 &amp;#39;Cc&amp;#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 &amp;#39;Bcc&amp;#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&amp; 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 &amp;#39;Fcc&amp;#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 &amp;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 &amp;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 &amp;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 &amp;#39;Who&amp;#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-&gt;whoField().utf8()) );
<a name="l01981"></a>01981   <span class="keywordflow">return</span> <a class="code" href="classKMMessage.html#8c90e62a192cb4a42b53458d82697cbe" title="Get or set the &amp;#39;From&amp;#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 &amp;#39;From&amp;#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&amp; 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 &amp;#39;From&amp;#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 &amp;#39;Subject&amp;#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&amp; 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 &amp;#39;X-Mark&amp;#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&amp; 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 &amp;#39;In-Reply-To&amp;#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 &amp;#39;ReplyTo&amp;#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">'&gt;'</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">'&lt;'</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 &lt;"from foo"@bar.baz&gt;, 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() &amp;&amp; (replyTo[0] == <span class="charliteral">'&lt;'</span>) &amp;&amp;
<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">'&lt;'</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">'&gt;'</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() &amp;&amp; references[0] == <span class="charliteral">'&lt;'</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 &amp;#39;In-Reply-To&amp;#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">'&lt;'</span> );
<a name="l02103"></a>02103   leftAngle = references.findRev( <span class="charliteral">'&lt;'</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">'&gt;'</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() &amp;&amp; references[0] == <span class="charliteral">'&lt;'</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">'&gt;'</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 &amp;#39;Subject&amp;#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 &amp;#39;Subject&amp;#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&amp; 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 &amp;#39;Message-Id&amp;#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 &amp;#39;Message-Id&amp;#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">'&gt;'</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">'&lt;'</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 &amp;#39;Message-Id&amp;#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&amp; 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 &amp; 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) &lt;&lt; <span class="stringliteral">"Error in address splitting: parseAddressList returned false!"</span>
<a name="l02218"></a>02218                   &lt;&lt; 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 &amp; 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 &amp; 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 &amp; 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 &amp; header = mMsg-&gt;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&lt;QCString&gt; <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&amp; 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-&gt;Headers().FindField( field ) )
<a name="l02249"></a>02249     <span class="keywordflow">return</span> QValueList&lt;QCString&gt;();
<a name="l02250"></a>02250 
<a name="l02251"></a>02251   std::vector&lt;DwFieldBody*&gt; v = mMsg-&gt;Headers().AllFieldBodies( field.data() );
<a name="l02252"></a>02252   QValueList&lt;QCString&gt; <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 &lt; v.size(); ++i ) {
<a name="l02254"></a>02254     headerFields.append( v[i]-&gt;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&amp; 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-&gt;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-&gt;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&amp; 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-&gt;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&lt;DwFieldBody*&gt; v = mMsg-&gt;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 &lt; v.size(); ++i ) {
<a name="l02281"></a>02281     headerFields.append( decodeRFC2047String( v[i]-&gt;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&amp; aName)
<a name="l02289"></a>02289 {
<a name="l02290"></a>02290   DwHeaders &amp; header = mMsg-&gt;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&amp; aName)
<a name="l02300"></a>02300 {
<a name="l02301"></a>02301   DwHeaders &amp; header = mMsg-&gt;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&amp; aName, <span class="keyword">const</span> QString&amp; 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) &lt;&lt; <span class="stringliteral">"KMMessage::setHeaderField( \""</span> &lt;&lt; aName &lt;&lt; <span class="stringliteral">"\", \""</span>
<a name="l02316"></a>02316                 &lt;&lt; bValue &lt;&lt; <span class="stringliteral">"\", "</span> &lt;&lt; type &lt;&lt; <span class="stringliteral">" )"</span> &lt;&lt; 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&amp; header = mMsg-&gt;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) &lt;&lt; <span class="stringliteral">"value: \""</span> &lt;&lt; value &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; 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) &lt;&lt; <span class="stringliteral">"aValue: \""</span> &lt;&lt; aValue &lt;&lt; <span class="stringliteral">"\""</span> &lt;&lt; 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-&gt;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 &amp;#39;Content-Type&amp;#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&amp; header = mMsg-&gt;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&amp; header = mMsg-&gt;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&amp; 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&amp; header = mMsg-&gt;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&amp; header = mMsg-&gt;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&amp; 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 &amp;mType,
<a name="l02436"></a>02436                                      <span class="keyword">const</span> QCString&amp; attr,
<a name="l02437"></a>02437                                      <span class="keyword">const</span> QCString&amp; 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-&gt;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-&gt;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-&gt;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-&gt;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&amp; attr, <span class="keyword">const</span> QCString&amp; val)
<a name="l02461"></a>02461 {
<a name="l02462"></a>02462   <span class="keywordflow">if</span> (mNeedsAssembly) mMsg-&gt;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 &amp;#39;Content-Transfer-Encoding&amp;#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&amp; header = mMsg-&gt;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&amp; header = mMsg-&gt;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&amp; aStr)
<a name="l02491"></a>02491 {
<a name="l02492"></a>02492   mMsg-&gt;Headers().ContentTransferEncoding().FromString(aStr);
<a name="l02493"></a>02493   mMsg-&gt;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-&gt;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&amp; <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-&gt;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&amp; <a class="code" href="classKMMessage.html#00680f46ef6e512a0febc53fa671c6a9" title="Get the message body.">body</a> = mMsg-&gt;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() -&gt; 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">//  &lt;&lt; "KMMessage::body(): body is binary but used as text!" &lt;&lt; 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&amp; dwsrc = mMsg-&gt;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-&gt;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">//  &lt;&lt; "KMMessage::bodyDecoded(): body is binary but used as text!" &lt;&lt; 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&lt;int&gt; <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&amp; 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&lt;int&gt; 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 &lt;&lt; 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 &lt;&lt; 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() &gt; 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">// =&gt; qp &lt; base64 iff p &gt; 5n/6.</span>
<a name="l02605"></a>02605       allowedCtes &lt;&lt; DwMime::kCteQp;
<a name="l02606"></a>02606       allowedCtes &lt;&lt; DwMime::kCteBase64;
<a name="l02607"></a>02607     } <span class="keywordflow">else</span> {
<a name="l02608"></a>02608       allowedCtes &lt;&lt; DwMime::kCteBase64;
<a name="l02609"></a>02609       allowedCtes &lt;&lt; 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 &lt;&lt; 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 &amp;&amp; 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&amp; aBuf,
<a name="l02637"></a>02637                                     QValueList&lt;int&gt; &amp; 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) &lt;&lt; <span class="stringliteral">"CharFreq returned "</span> &lt;&lt; cf.type() &lt;&lt; <span class="stringliteral">"/"</span>
<a name="l02649"></a>02649                 &lt;&lt; cf.printableRatio() &lt;&lt; <span class="stringliteral">" and I chose "</span>
<a name="l02650"></a>02650                 &lt;&lt; dwCte.c_str() &lt;&lt; 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&amp; aBuf,
<a name="l02660"></a>02660                                     QValueList&lt;int&gt; &amp; 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) &lt;&lt; <span class="stringliteral">"CharFreq returned "</span> &lt;&lt; cf.type() &lt;&lt; <span class="stringliteral">"/"</span>
<a name="l02672"></a>02672                 &lt;&lt; cf.printableRatio() &lt;&lt; <span class="stringliteral">" and I chose "</span>
<a name="l02673"></a>02673                 &lt;&lt; dwCte.c_str() &lt;&lt; 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&amp; 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-&gt;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&amp; 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-&gt;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&amp; aStr)
<a name="l02730"></a>02730 {
<a name="l02731"></a>02731   mMsg-&gt;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&amp; aStr)
<a name="l02735"></a>02735 {
<a name="l02736"></a>02736   mMsg-&gt;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-&gt;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 &amp; 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-&gt;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 &lt;dmoisset@grulic.org.ar&gt;</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&lt; DwBodyPart &gt; 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             &amp;&amp; part-&gt;hasHeaders()
<a name="l02771"></a>02771             &amp;&amp; part-&gt;Headers().HasContentType()
<a name="l02772"></a>02772             &amp;&amp; part-&gt;Body().FirstBodyPart()
<a name="l02773"></a>02773             &amp;&amp; (DwMime::kTypeMultipart == part-&gt;Headers().ContentType().Type()) )
<a name="l02774"></a>02774     {
<a name="l02775"></a>02775       parts.append( part );
<a name="l02776"></a>02776       part = part-&gt;Body().FirstBodyPart();
<a name="l02777"></a>02777     }
<a name="l02778"></a>02778     <span class="comment">// this is where currPart-&gt;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 &amp;&amp; !(part-&gt;Next()) &amp;&amp; !(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 &amp;&amp; part-&gt;Body().Message() &amp;&amp;
<a name="l02789"></a>02789         part-&gt;Body().Message()-&gt;Body().FirstBodyPart())
<a name="l02790"></a>02790     {
<a name="l02791"></a>02791       part = part-&gt;Body().Message()-&gt;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-&gt;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-&gt;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&lt; DwBodyPart &gt; 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 &amp;&amp; !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            &amp;&amp; curpart-&gt;hasHeaders()
<a name="l02823"></a>02823            &amp;&amp; curpart-&gt;Headers().HasContentType()
<a name="l02824"></a>02824            &amp;&amp; curpart-&gt;Body().FirstBodyPart()
<a name="l02825"></a>02825            &amp;&amp; (DwMime::kTypeMultipart == curpart-&gt;Headers().ContentType().Type()) )
<a name="l02826"></a>02826     {
<a name="l02827"></a>02827       parts.append( curpart );
<a name="l02828"></a>02828       curpart = curpart-&gt;Body().FirstBodyPart();
<a name="l02829"></a>02829     }
<a name="l02830"></a>02830     <span class="comment">// this is where currPart-&gt;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 &amp;&amp; !(curpart-&gt;Next()) &amp;&amp; !(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-&gt;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&lt; DwBodyPart &gt; 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 &amp;&amp; !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            &amp;&amp; curpart-&gt;hasHeaders()
<a name="l02863"></a>02863            &amp;&amp; curpart-&gt;Headers().HasContentType()
<a name="l02864"></a>02864            &amp;&amp; curpart-&gt;Body().FirstBodyPart()
<a name="l02865"></a>02865            &amp;&amp; (DwMime::kTypeMultipart == curpart-&gt;Headers().ContentType().Type()) )
<a name="l02866"></a>02866     {
<a name="l02867"></a>02867       parts.append( curpart );
<a name="l02868"></a>02868       curpart = curpart-&gt;Body().FirstBodyPart();
<a name="l02869"></a>02869     }
<a name="l02870"></a>02870     <span class="comment">// this is where currPart-&gt;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 &amp;&amp; !(curpart-&gt;Next()) &amp;&amp; !(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-&gt;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&lt; DwBodyPart &gt; 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 &amp;&amp; !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       &amp;&amp; curpart-&gt;hasHeaders()
<a name="l02902"></a>02902       &amp;&amp; curpart-&gt;Headers().HasContentType()
<a name="l02903"></a>02903       &amp;&amp; curpart-&gt;Body().FirstBodyPart()
<a name="l02904"></a>02904       &amp;&amp; (DwMime::kTypeMultipart == curpart-&gt;Headers().ContentType().Type()) ) {
<a name="l02905"></a>02905     parts.append( curpart );
<a name="l02906"></a>02906     curpart = curpart-&gt;Body().FirstBodyPart();
<a name="l02907"></a>02907     }
<a name="l02908"></a>02908     <span class="comment">// this is where curPart-&gt;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 &amp;&amp; curpart-&gt;hasHeaders() &amp;&amp; curpart-&gt;Headers().HasContentType() ) {
<a name="l02913"></a>02913       kdDebug(5006) &lt;&lt; curpart-&gt;Headers().ContentType().TypeStr().c_str()
<a name="l02914"></a>02914         &lt;&lt; <span class="stringliteral">"  "</span> &lt;&lt; curpart-&gt;Headers().ContentType().SubtypeStr().c_str() &lt;&lt; endl;
<a name="l02915"></a>02915     }
<a name="l02916"></a>02916 
<a name="l02917"></a>02917     <span class="keywordflow">if</span> (curpart &amp;&amp;
<a name="l02918"></a>02918     curpart-&gt;hasHeaders() &amp;&amp;
<a name="l02919"></a>02919         curpart-&gt;Headers().HasContentType() &amp;&amp;
<a name="l02920"></a>02920     curpart-&gt;Headers().ContentType().Type() == type &amp;&amp;
<a name="l02921"></a>02921     curpart-&gt;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 &amp;&amp; !(curpart-&gt;Next()) &amp;&amp; !(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-&gt;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&amp; type, <span class="keyword">const</span> QCString&amp;  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&lt; DwBodyPart &gt; 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 &amp;&amp; !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       &amp;&amp; curpart-&gt;hasHeaders()
<a name="l02951"></a>02951       &amp;&amp; curpart-&gt;Headers().HasContentType()
<a name="l02952"></a>02952       &amp;&amp; curpart-&gt;Body().FirstBodyPart()
<a name="l02953"></a>02953       &amp;&amp; (DwMime::kTypeMultipart == curpart-&gt;Headers().ContentType().Type()) ) {
<a name="l02954"></a>02954     parts.append( curpart );
<a name="l02955"></a>02955     curpart = curpart-&gt;Body().FirstBodyPart();
<a name="l02956"></a>02956     }
<a name="l02957"></a>02957     <span class="comment">// this is where curPart-&gt;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 &amp;&amp; curpart-&gt;hasHeaders() &amp;&amp; curpart-&gt;Headers().HasContentType() ) {
<a name="l02962"></a>02962       kdDebug(5006) &lt;&lt; curpart-&gt;Headers().ContentType().TypeStr().c_str()
<a name="l02963"></a>02963             &lt;&lt; <span class="stringliteral">"  "</span> &lt;&lt; curpart-&gt;Headers().ContentType().SubtypeStr().c_str() &lt;&lt; endl;
<a name="l02964"></a>02964     }
<a name="l02965"></a>02965 
<a name="l02966"></a>02966     <span class="keywordflow">if</span> (curpart &amp;&amp;
<a name="l02967"></a>02967     curpart-&gt;hasHeaders() &amp;&amp;
<a name="l02968"></a>02968         curpart-&gt;Headers().HasContentType() &amp;&amp;
<a name="l02969"></a>02969     curpart-&gt;Headers().ContentType().TypeStr().c_str() == type &amp;&amp;
<a name="l02970"></a>02970     curpart-&gt;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 &amp;&amp; !(curpart-&gt;Next()) &amp;&amp; !(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-&gt;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&amp; <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&amp; ct = headers.ContentType();
<a name="l03003"></a>03003     aPart-&gt;setOriginalContentTypeStr( ct.AsString().c_str() );
<a name="l03004"></a>03004     aPart-&gt;setTypeStr(ct.TypeStr().c_str());
<a name="l03005"></a>03005     aPart-&gt;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-&gt;Attribute().c_str(), <span class="stringliteral">"charset"</span>))
<a name="l03010"></a>03010         aPart-&gt;setCharset(QCString(param-&gt;Value().c_str()).lower());
<a name="l03011"></a>03011       <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!qstrnicmp(param-&gt;Attribute().c_str(), <span class="stringliteral">"name*"</span>, 5))
<a name="l03012"></a>03012         aPart-&gt;setName(KMMsgBase::decodeRFC2231String(KMMsgBase::extractRFC2231HeaderField( param-&gt;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-&gt;AsString().c_str();
<a name="l03016"></a>03016       }
<a name="l03017"></a>03017       param=param-&gt;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-&gt;setTypeStr(<span class="stringliteral">"text"</span>);      <span class="comment">// Set to defaults</span>
<a name="l03023"></a>03023     aPart-&gt;setSubtypeStr(<span class="stringliteral">"plain"</span>);
<a name="l03024"></a>03024   }
<a name="l03025"></a>03025   aPart-&gt;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-&gt;name().isEmpty())
<a name="l03028"></a>03028   {
<a name="l03029"></a>03029     <span class="keywordflow">if</span> (headers.HasContentType() &amp;&amp; !headers.ContentType().Name().empty()) {
<a name="l03030"></a>03030       aPart-&gt;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() &amp;&amp; !headers.Subject().AsString().empty()) {
<a name="l03033"></a>03033       aPart-&gt;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-&gt;setCteStr(headers.ContentTransferEncoding().AsString().c_str());
<a name="l03041"></a>03041   <span class="keywordflow">else</span>
<a name="l03042"></a>03042     aPart-&gt;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-&gt;setContentDescription(headers.ContentDescription().AsString().c_str());
<a name="l03047"></a>03047   <span class="keywordflow">else</span>
<a name="l03048"></a>03048     aPart-&gt;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-&gt;setContentDisposition(headers.ContentDisposition().AsString().c_str());
<a name="l03053"></a>03053   <span class="keywordflow">else</span>
<a name="l03054"></a>03054     aPart-&gt;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-&gt;clear();
<a name="l03065"></a>03065 
<a name="l03066"></a>03066   <span class="keywordflow">if</span>( aDwBodyPart &amp;&amp; aDwBodyPart-&gt;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-&gt;setName(" ");</span>
<a name="l03070"></a>03070     <span class="comment">// partSpecifier</span>
<a name="l03071"></a>03071     QString partId( aDwBodyPart-&gt;partId() );
<a name="l03072"></a>03072     aPart-&gt;setPartSpecifier( partId );
<a name="l03073"></a>03073 
<a name="l03074"></a>03074     DwHeaders&amp; headers = aDwBodyPart-&gt;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-&gt;setBody( aDwBodyPart-&gt;Body().AsString() );
<a name="l03080"></a>03080     <span class="keywordflow">else</span>
<a name="l03081"></a>03081       aPart-&gt;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 '&lt;' and trailing '&gt;'</span>
<a name="l03087"></a>03087       aPart-&gt;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-&gt;setTypeStr(<span class="stringliteral">""</span>);
<a name="l03095"></a>03095     aPart-&gt;setSubtypeStr(<span class="stringliteral">""</span>);
<a name="l03096"></a>03096     aPart-&gt;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-&gt;setName(" ");</span>
<a name="l03100"></a>03100     aPart-&gt;setContentDescription(<span class="stringliteral">""</span>);
<a name="l03101"></a>03101     aPart-&gt;setContentDisposition(<span class="stringliteral">""</span>);
<a name="l03102"></a>03102     aPart-&gt;setBody(QCString(<span class="stringliteral">""</span>));
<a name="l03103"></a>03103     aPart-&gt;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-&gt;name().isEmpty() )
<a name="l03118"></a>03118       aPart-&gt;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-&gt;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-&gt;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-&gt;charset();
<a name="l03144"></a>03144   QCString type     = aPart-&gt;typeStr();
<a name="l03145"></a>03145   QCString subtype  = aPart-&gt;subtypeStr();
<a name="l03146"></a>03146   QCString cte      = aPart-&gt;cteStr();
<a name="l03147"></a>03147   QCString contDesc = aPart-&gt;contentDescriptionEncoded();
<a name="l03148"></a>03148   QCString contDisp = aPart-&gt;contentDisposition();
<a name="l03149"></a>03149   QCString encoding = autoDetectCharset(charset, sPrefCharsets, aPart-&gt;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-&gt;name(), encoding);
<a name="l03152"></a>03152   <span class="keywordtype">bool</span> RFC2231encoded = aPart-&gt;name() != QString(name);
<a name="l03153"></a>03153   QCString paramAttr  = aPart-&gt;parameterAttribute();
<a name="l03154"></a>03154 
<a name="l03155"></a>03155   DwHeaders&amp; headers = part-&gt;Headers();
<a name="l03156"></a>03156 
<a name="l03157"></a>03157   DwMediaType&amp; ct = headers.ContentType();
<a name="l03158"></a>03158   <span class="keywordflow">if</span> (!type.isEmpty() &amp;&amp; !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-&gt;SetAttribute(<span class="stringliteral">"charset"</span>);
<a name="l03166"></a>03166       param-&gt;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-&gt;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 &lt; 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 &lt; 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 &lt; 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)) &amp;&amp; (<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-&gt;SetAttribute( parA );
<a name="l03205"></a>03205     param-&gt;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-&gt;SetAttribute(<span class="stringliteral">"name*"</span>);
<a name="l03219"></a>03219       nameParam-&gt;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-&gt;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-&gt;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-&gt;parameterValue() != QString(paramValue))
<a name="l03236"></a>03236     {
<a name="l03237"></a>03237       param-&gt;SetAttribute((paramAttr + <span class="charliteral">'*'</span>).data());
<a name="l03238"></a>03238       param-&gt;SetValue(paramValue.data(),<span class="keyword">true</span>);
<a name="l03239"></a>03239     } <span class="keywordflow">else</span> {
<a name="l03240"></a>03240       param-&gt;SetAttribute(paramAttr.data());
<a name="l03241"></a>03241       param-&gt;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-&gt;dwBody();
<a name="l03256"></a>03256   <span class="keywordflow">if</span> (!bodyStr.empty())
<a name="l03257"></a>03257     part-&gt;Body().FromString(bodyStr);
<a name="l03258"></a>03258   <span class="keywordflow">else</span>
<a name="l03259"></a>03259     part-&gt;Body().FromString(<span class="stringliteral">""</span>);
<a name="l03260"></a>03260 
<a name="l03261"></a>03261   <span class="keywordflow">if</span> (!aPart-&gt;partSpecifier().isNull())
<a name="l03262"></a>03262     part-&gt;SetPartId( aPart-&gt;partSpecifier().latin1() );
<a name="l03263"></a>03263 
<a name="l03264"></a>03264   <span class="keywordflow">if</span> (aPart-&gt;decodedSize() &gt; 0)
<a name="l03265"></a>03265     part-&gt;SetBodySize( aPart-&gt;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-&gt;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&amp; 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">'&lt;'</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">'&gt;'</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 &amp;#39;&amp;lt;&amp;#39; into &amp;quot;&amp;amp;lt;&amp;quot; resp.">KMMessage::html2source</a>( <span class="keyword">const</span> QCString &amp; 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">'&lt;'</span>: {
<a name="l03322"></a>03322         *d++ = <span class="charliteral">'&amp;'</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">'&lt;'</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">'&gt;'</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">'&gt;'</span>: {
<a name="l03342"></a>03342         *d++ = <span class="charliteral">'&amp;'</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">'&amp;'</span>: {
<a name="l03350"></a>03350         *d++ = <span class="charliteral">'&amp;'</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">'&amp;'</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">'&amp;'</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&amp; 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&amp; 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&amp; aStr )
<a name="l03408"></a>03408 {
<a name="l03409"></a>03409   <span class="comment">//kdDebug(5006) &lt;&lt; "KMMessage::stripEmailAddr( " &lt;&lt; aStr &lt;&lt; " )" &lt;&lt; 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">'&lt;'</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) &lt;&lt; "Name    : \"" &lt;&lt; name</span>
<a name="l03460"></a>03460 <span class="comment">                                 &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03461"></a>03461 <span class="comment">                   kdDebug(5006) &lt;&lt; "Comment : \"" &lt;&lt; comment</span>
<a name="l03462"></a>03462 <span class="comment">                                 &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03463"></a>03463 <span class="comment">                   kdDebug(5006) &lt;&lt; "Address : \"" &lt;&lt; angleAddress</span>
<a name="l03464"></a>03464 <span class="comment">                                 &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03465"></a>03465 <span class="comment">                   */</span>
<a name="l03466"></a>03466                    <span class="keywordflow">if</span> ( angleAddress.isEmpty() &amp;&amp; !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">'&gt;'</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) &lt;&lt; "Name    : \"" &lt;&lt; name &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03542"></a>03542 <span class="comment">  kdDebug(5006) &lt;&lt; "Comment : \"" &lt;&lt; comment &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03543"></a>03543 <span class="comment">  kdDebug(5006) &lt;&lt; "Address : \"" &lt;&lt; angleAddress &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03544"></a>03544 <span class="comment">  */</span>
<a name="l03545"></a>03545   <span class="keywordflow">if</span> ( angleAddress.isEmpty() &amp;&amp; !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) &lt;&lt; "KMMessage::stripEmailAddr(...) returns \"" &lt;&lt; result</span>
<a name="l03561"></a>03561   <span class="comment">//              &lt;&lt; "\"" &lt;&lt; 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&amp; aStr )
<a name="l03567"></a>03567 {
<a name="l03568"></a>03568   <span class="comment">//kdDebug(5006) &lt;&lt; "KMMessage::stripEmailAddr( " &lt;&lt; aStr &lt;&lt; " )" &lt;&lt; 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 &lt; 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">'&lt;'</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 &lt; 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) &lt;&lt; "Name    : \"" &lt;&lt; name</span>
<a name="l03622"></a>03622 <span class="comment">                                 &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03623"></a>03623 <span class="comment">                   kdDebug(5006) &lt;&lt; "Comment : \"" &lt;&lt; comment</span>
<a name="l03624"></a>03624 <span class="comment">                                 &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03625"></a>03625 <span class="comment">                   kdDebug(5006) &lt;&lt; "Address : \"" &lt;&lt; angleAddress</span>
<a name="l03626"></a>03626 <span class="comment">                                 &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03627"></a>03627 <span class="comment">                   */</span>
<a name="l03628"></a>03628                    <span class="keywordflow">if</span> ( angleAddress.isEmpty() &amp;&amp; !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 &lt; 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">'&gt;'</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 &lt; 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) &lt;&lt; "Name    : \"" &lt;&lt; name &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03704"></a>03704 <span class="comment">  kdDebug(5006) &lt;&lt; "Comment : \"" &lt;&lt; comment &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03705"></a>03705 <span class="comment">  kdDebug(5006) &lt;&lt; "Address : \"" &lt;&lt; angleAddress &lt;&lt; "\"" &lt;&lt; endl;</span>
<a name="l03706"></a>03706 <span class="comment">  */</span>
<a name="l03707"></a>03707   <span class="keywordflow">if</span> ( angleAddress.isEmpty() &amp;&amp; !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) &lt;&lt; "KMMessage::stripEmailAddr(...) returns \"" &lt;&lt; result</span>
<a name="l03723"></a>03723   <span class="comment">//              &lt;&lt; "\"" &lt;&lt; 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: &amp;#39;&amp;lt;&amp;#39;...">KMMessage::quoteHtmlChars</a>( <span class="keyword">const</span> QString&amp; 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 &lt; 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">'&lt;'</span>:
<a name="l03737"></a>03737       result += <span class="stringliteral">"&amp;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">'&gt;'</span>:
<a name="l03740"></a>03740       result += <span class="stringliteral">"&amp;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">'&amp;'</span>:
<a name="l03743"></a>03743       result += <span class="stringliteral">"&amp;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">"&amp;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">"&lt;br&gt;"</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&amp; aEmail, <span class="keywordtype">bool</span> stripped, <span class="keyword">const</span> QString&amp; 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">"&lt;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">"&gt;"</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: &amp;#39;&amp;lt;&amp;#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">"&lt;/a&gt;, "</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) &lt;&lt; "KMMessage::emailAddrAsAnchor('" &lt;&lt; aEmail</span>
<a name="l03795"></a>03795   <span class="comment">//              &lt;&lt; "') returns:\n--&gt;" &lt;&lt; result &lt;&lt; "&lt;--" &lt;&lt; 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&amp; address,
<a name="l03803"></a>03803                                                     <span class="keyword">const</span> QStringList&amp; 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) &lt;&lt; <span class="stringliteral">"Removing "</span> &lt;&lt; *it &lt;&lt; <span class="stringliteral">" from the address list"</span>
<a name="l03812"></a>03812                     &lt;&lt; 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&amp;#39;s addresses from an address list.">KMMessage::stripMyAddressesFromAddressList</a>( <span class="keyword">const</span> QStringList&amp; 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) &lt;&lt; <span class="stringliteral">"Check whether "</span> &lt;&lt; *it &lt;&lt; <span class="stringliteral">" is one of my addresses"</span>
<a name="l03830"></a>03830                   &lt;&lt; endl;
<a name="l03831"></a>03831     <span class="keywordflow">if</span>( kmkernel-&gt;identityManager()-&gt;thatIsMe( KPIM::getEmailAddress( *it ) ) ) {
<a name="l03832"></a>03832       kdDebug(5006) &lt;&lt; <span class="stringliteral">"Removing "</span> &lt;&lt; *it &lt;&lt; <span class="stringliteral">" from the address list"</span>
<a name="l03833"></a>03833                     &lt;&lt; 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&amp; address,
<a name="l03846"></a>03846                                         <span class="keyword">const</span> QStringList&amp; 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&amp; 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&amp; 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">"\" &lt;"</span> + address + <span class="charliteral">'&gt;'</span>;
<a name="l03933"></a>03933     <span class="keywordflow">else</span>
<a name="l03934"></a>03934       address = fullName + <span class="stringliteral">" &lt;"</span> + address + <span class="charliteral">'&gt;'</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 &amp;quot;KMMessage&amp;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-&gt;setGroup(<span class="stringliteral">"General"</span>);
<a name="l03949"></a>03949 
<a name="l03950"></a>03950   <span class="keywordtype">int</span> languageNr = config-&gt;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-&gt;readEntry(<span class="stringliteral">"language"</span>,KGlobal::locale()-&gt;language());
<a name="l03955"></a>03955     sReplyStr = config-&gt;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-&gt;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-&gt;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-&gt;readEntry(<span class="stringliteral">"indent-prefix"</span>,<span class="stringliteral">"&gt;%_"</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()-&gt;smartQuote();
<a name="l03967"></a>03967     sWordWrap = GlobalSettings::self()-&gt;wordWrap();
<a name="l03968"></a>03968     sWrapCol = GlobalSettings::self()-&gt;lineWrapWidth();
<a name="l03969"></a>03969     <span class="keywordflow">if</span> ((sWrapCol == 0) || (sWrapCol &gt; 78))
<a name="l03970"></a>03970       sWrapCol = 78;
<a name="l03971"></a>03971     <span class="keywordflow">if</span> (sWrapCol &lt; 30)
<a name="l03972"></a>03972       sWrapCol = 30;
<a name="l03973"></a>03973 
<a name="l03974"></a>03974     sPrefCharsets = config-&gt;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-&gt;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-&gt;networkCodec()-&gt;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 &amp;<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-&gt;Headers().HasContentType() ) {
<a name="l04009"></a>04009     DwMediaType &amp;mType=mMsg-&gt;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-&gt;Attribute().c_str(), <span class="stringliteral">"charset"</span>))
<a name="l04014"></a>04014         <span class="keywordflow">return</span> param-&gt;Value().c_str();
<a name="l04015"></a>04015       <span class="keywordflow">else</span> param=param-&gt;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&amp; bStr)
<a name="l04023"></a>04023 {
<a name="l04024"></a>04024   kdWarning( type() != DwMime::kTypeText )
<a name="l04025"></a>04025     &lt;&lt; <span class="stringliteral">"KMMessage::setCharset(): trying to set a charset for a non-textual mimetype."</span> &lt;&lt; endl
<a name="l04026"></a>04026     &lt;&lt; <span class="stringliteral">"Fix this caller:"</span> &lt;&lt; endl
<a name="l04027"></a>04027     &lt;&lt; <span class="stringliteral">"===================================================================="</span> &lt;&lt; endl
<a name="l04028"></a>04028     &lt;&lt; kdBacktrace( 5 ) &lt;&lt; endl
<a name="l04029"></a>04029     &lt;&lt; <span class="stringliteral">"===================================================================="</span> &lt;&lt; endl;
<a name="l04030"></a>04030   QCString aStr = bStr;
<a name="l04031"></a>04031   KPIM::kAsciiToLower( aStr.data() );
<a name="l04032"></a>04032   DwMediaType &amp;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-&gt;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-&gt;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-&gt;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-&gt;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-&gt;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() &amp;&amp; !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 &amp; 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-&gt;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-&gt;hasHeaders() &amp;&amp;
<a name="l04146"></a>04146        part-&gt;Headers().HasContentType() &amp;&amp;
<a name="l04147"></a>04147        part-&gt;Body().FirstBodyPart() &amp;&amp;
<a name="l04148"></a>04148        (DwMime::kTypeMultipart == part-&gt;Headers().ContentType().Type() ) &amp;&amp;
<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-&gt;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-&gt;Body().Message() &amp;&amp;
<a name="l04156"></a>04156        part-&gt;Body().Message()-&gt;Body().FirstBodyPart() &amp;&amp;
<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-&gt;Body().Message()-&gt;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-&gt;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 &amp; 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>() &gt; 0 &amp;&amp;
<a name="l04175"></a>04175        partSpecifier != <span class="stringliteral">"0"</span> &amp;&amp;
<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) &lt;&lt; <span class="stringliteral">"KMMessage::updateBodyPart "</span> &lt;&lt; specifier &lt;&lt; endl;
<a name="l04188"></a>04188     <span class="keywordflow">if</span> (!mLastUpdated)
<a name="l04189"></a>04189     {
<a name="l04190"></a>04190       kdWarning(5006) &lt;&lt; <span class="stringliteral">"KMMessage::updateBodyPart - can not find part "</span>
<a name="l04191"></a>04191         &lt;&lt; specifier &lt;&lt; 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-&gt;Headers().DeleteAllFields();
<a name="l04202"></a>04202       mLastUpdated-&gt;Headers().FromString( content );
<a name="l04203"></a>04203       mLastUpdated-&gt;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-&gt;Body().Message()-&gt;Headers().FromString( content );
<a name="l04208"></a>04208       mLastUpdated-&gt;Body().Message()-&gt;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-&gt;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 &amp;&amp; parent-&gt;hasHeaders() &amp;&amp; parent-&gt;Headers().HasContentType() )
<a name="l04217"></a>04217         {
<a name="l04218"></a>04218           <span class="keyword">const</span> DwMediaType&amp; contentType = parent-&gt;Headers().ContentType();
<a name="l04219"></a>04219           <span class="keywordflow">if</span> ( contentType.Type() == DwMime::kTypeMessage &amp;&amp;
<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-&gt;Body().Message()-&gt;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-&gt;Body().FromString( content );
<a name="l04236"></a>04236     mMsg-&gt;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) &lt;&lt; "updateAttachmentState - no part!" &lt;&lt; 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-&gt;hasHeaders() ) {
<a name="l04261"></a>04261     <span class="keywordflow">if</span> ( part-&gt;Headers().HasContentDisposition() ) {
<a name="l04262"></a>04262       DwDispositionType cd = part-&gt;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-&gt;hasHeaders() &amp;&amp;
<a name="l04272"></a>04272        ( ( part-&gt;Headers().HasContentDisposition() &amp;&amp;
<a name="l04273"></a>04273            !part-&gt;Headers().ContentDisposition().Filename().empty() ) ||
<a name="l04274"></a>04274          ( part-&gt;Headers().HasContentType() &amp;&amp;
<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-&gt;Headers().HasContentType() ||
<a name="l04279"></a>04279          ( part-&gt;Headers().HasContentType() &amp;&amp;
<a name="l04280"></a>04280            part-&gt;Headers().ContentType().Subtype() != DwMime::kSubtypePgpSignature &amp;&amp;
<a name="l04281"></a>04281            part-&gt;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-&gt;hasHeaders() &amp;&amp;
<a name="l04290"></a>04290        part-&gt;Headers().HasContentType() &amp;&amp;
<a name="l04291"></a>04291        part-&gt;Body().FirstBodyPart() &amp;&amp;
<a name="l04292"></a>04292        (DwMime::kTypeMultipart == part-&gt;Headers().ContentType().Type() ) )
<a name="l04293"></a>04293   {
<a name="l04294"></a>04294     updateAttachmentState( part-&gt;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-&gt;Body().Message() &amp;&amp;
<a name="l04299"></a>04299        part-&gt;Body().Message()-&gt;Body().FirstBodyPart() )
<a name="l04300"></a>04300   {
<a name="l04301"></a>04301     updateAttachmentState( part-&gt;Body().Message()-&gt;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-&gt;Next() )
<a name="l04306"></a>04306     updateAttachmentState( part-&gt;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&amp;#39;s content to str.">KMMessage::setBodyFromUnicode</a>( <span class="keyword">const</span> QString &amp; 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&lt;int&gt; 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-&gt;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()-&gt;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-&gt;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-&gt;<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-&gt;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 &amp;#39;Date&amp;#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( &amp;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 &lt;&lt; <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>&nbsp;&nbsp;<a href="../../akregator/src/html/index.html">src</a></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<a href="../../akregator/src/librss/html/index.html">librss</a></li><li><a href="../../certmanager/html/index.html">certmanager</a></li><li>&nbsp;&nbsp;<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>&nbsp;&nbsp;<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>&nbsp;&nbsp;<a href="../../kioslaves/imap4/html/index.html">imap4</a></li><li>&nbsp;&nbsp;<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>&nbsp;&nbsp;<a href="../../kpilot/kpilot/html/index.html">kpilot</a></li><li>&nbsp;&nbsp;<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="&#109;&#97;&#105;&#108;&#116;&#111;&#58;groo&#116;&#64;kde&#46;or&#x67;">Adriaan de Groot</a>
and
<a href="&#109;a&#105;&#108;&#116;&#111;&#58;w&#105;nter&#64;kde&#46;or&#x67">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>