summaryrefslogtreecommitdiffstats
path: root/doc/html/decodeRFC2047_8cpp-source.html
blob: 50d2f7b747196355af687eeafe82f74cb4adb0f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>kshowmail: kshowmail/decodeRFC2047.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.0 -->
<div class="tabs">
  <ul>
    <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
    <li><a href="namespaces.html"><span>Namespaces</span></a></li>
    <li><a href="classes.html"><span>Classes</span></a></li>
    <li id="current"><a href="files.html"><span>Files</span></a></li>
    <li><a href="dirs.html"><span>Directories</span></a></li>
  </ul></div>
<div class="nav">
<a class="el" href="dir_656923b733374505e0e2f68ecb68d952.html">kshowmail</a></div>
<h1>decodeRFC2047.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/***************************************************************************</span>
<a name="l00002"></a>00002 <span class="comment">                          decodeRFC2047.cpp  -  description</span>
<a name="l00003"></a>00003 <span class="comment">                             -------------------</span>
<a name="l00004"></a>00004 <span class="comment">    begin                : Mon Jan 28 2002</span>
<a name="l00005"></a>00005 <span class="comment">    copyright            : (C) 2002 by Eggert Ehmke</span>
<a name="l00006"></a>00006 <span class="comment">    email                : eggert.ehmke@berlin.de</span>
<a name="l00007"></a>00007 <span class="comment"> ***************************************************************************/</span>
<a name="l00008"></a>00008 
<a name="l00009"></a>00009 <span class="comment">/***************************************************************************</span>
<a name="l00010"></a>00010 <span class="comment"> *                                                                         *</span>
<a name="l00011"></a>00011 <span class="comment"> *   This program is free software; you can redistribute it and/or modify  *</span>
<a name="l00012"></a>00012 <span class="comment"> *   it under the terms of the GNU General Public License as published by  *</span>
<a name="l00013"></a>00013 <span class="comment"> *   the Free Software Foundation; either version 2 of the License, or     *</span>
<a name="l00014"></a>00014 <span class="comment"> *   (at your option) any later version.                                   *</span>
<a name="l00015"></a>00015 <span class="comment"> *                                                                         *</span>
<a name="l00016"></a>00016 <span class="comment"> ***************************************************************************/</span>
<a name="l00017"></a>00017 
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 <span class="preprocessor">#include "decodeRFC2047.h"</span>
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 <span class="comment">/*</span>
<a name="l00022"></a>00022 <span class="comment"> * These functions have been adapted from the KMail program</span>
<a name="l00023"></a>00023 <span class="comment"> */</span>
<a name="l00024"></a>00024 
<a name="l00025"></a>00025 QCString decodeQuotedPrintable(<span class="keyword">const</span> QCString&amp; aStr)
<a name="l00026"></a>00026 {
<a name="l00027"></a>00027   QCString bStr = aStr;
<a name="l00028"></a>00028   <span class="keywordflow">if</span> (aStr.isNull())
<a name="l00029"></a>00029     bStr = <span class="stringliteral">""</span>;
<a name="l00030"></a>00030 
<a name="l00031"></a>00031   DwString dwsrc(bStr.data());
<a name="l00032"></a>00032   DwString dwdest;
<a name="l00033"></a>00033 
<a name="l00034"></a>00034   DwDecodeQuotedPrintable(dwsrc, dwdest);
<a name="l00035"></a>00035   <span class="keywordflow">return</span> dwdest.c_str();
<a name="l00036"></a>00036 }
<a name="l00037"></a>00037 
<a name="l00038"></a>00038 QCString decodeBase64(<span class="keyword">const</span> QCString&amp; aStr)
<a name="l00039"></a>00039 {
<a name="l00040"></a>00040   QCString bStr = aStr;
<a name="l00041"></a>00041   <span class="keywordflow">if</span> (aStr.isNull())
<a name="l00042"></a>00042     bStr = <span class="stringliteral">""</span>;
<a name="l00043"></a>00043   <span class="keywordflow">while</span> (bStr.length() &lt; 16) bStr += <span class="stringliteral">"="</span>;
<a name="l00044"></a>00044 
<a name="l00045"></a>00045   DwString dwsrc(bStr.data(), bStr.length());
<a name="l00046"></a>00046   DwString dwdest;
<a name="l00047"></a>00047   QCString result;
<a name="l00048"></a>00048 
<a name="l00049"></a>00049   DwDecodeBase64(dwsrc, dwdest);
<a name="l00050"></a>00050   result = dwdest.c_str();
<a name="l00051"></a>00051   <span class="keywordflow">return</span> result;
<a name="l00052"></a>00052 }
<a name="l00053"></a>00053 
<a name="l00054"></a>00054 QTextCodec* codecForName(<span class="keyword">const</span> QCString&amp; _str)
<a name="l00055"></a>00055 {
<a name="l00056"></a>00056   <span class="keywordflow">if</span> (_str.isEmpty()) <span class="keywordflow">return</span> NULL;
<a name="l00057"></a>00057   <span class="keywordflow">if</span> (_str.lower() == <span class="stringliteral">"shift_jis"</span> || _str.lower() == <span class="stringliteral">"shift-jis"</span>)
<a name="l00058"></a>00058     <span class="keywordflow">return</span> QTextCodec::codecForName(<span class="stringliteral">"sjis"</span>);
<a name="l00059"></a>00059   <span class="keywordflow">return</span> QTextCodec::codecForName(_str.lower().replace(
<a name="l00060"></a>00060     QRegExp(<span class="stringliteral">"windows"</span>), <span class="stringliteral">"cp"</span>) );
<a name="l00061"></a>00061 }
<a name="l00062"></a>00062 
<a name="l00063"></a><a class="code" href="namespaceCodecs.html#a0ef7c083708a464b1f1357ba5470cde">00063</a> QString <a class="code" href="namespaceCodecs.html#a0ef7c083708a464b1f1357ba5470cde">Codecs::decodeRFC2047</a>(<span class="keyword">const</span> QCString&amp; aStr)
<a name="l00064"></a>00064 {
<a name="l00065"></a>00065   QString result;
<a name="l00066"></a>00066   QCString charset;
<a name="l00067"></a>00067   <span class="keywordtype">char</span> *pos, *beg, *end, *mid;
<a name="l00068"></a>00068   QCString str, cstr, LWSP_buffer;
<a name="l00069"></a>00069   <span class="keywordtype">char</span> encoding, ch;
<a name="l00070"></a>00070   <span class="keywordtype">bool</span> valid, lastWasEncodedWord=FALSE;
<a name="l00071"></a>00071   <span class="keyword">const</span> <span class="keywordtype">int</span> maxLen=200;
<a name="l00072"></a>00072   <span class="keywordtype">int</span> i;
<a name="l00073"></a>00073 
<a name="l00074"></a>00074   <span class="keywordflow">if</span> (aStr.find(<span class="stringliteral">"=?"</span>) &lt; 0)
<a name="l00075"></a>00075     <span class="keywordflow">return</span> QString::fromLocal8Bit(aStr).replace(QRegExp(<span class="stringliteral">"\n[\t ]"</span>),<span class="stringliteral">" "</span>);
<a name="l00076"></a>00076 
<a name="l00077"></a>00077   <span class="keywordflow">for</span> (pos=aStr.data(); *pos; pos++)
<a name="l00078"></a>00078   {
<a name="l00079"></a>00079     <span class="comment">// line unfolding</span>
<a name="l00080"></a>00080     <span class="keywordflow">if</span> ( pos[0] == <span class="charliteral">'\r'</span> &amp;&amp; pos[1] == <span class="charliteral">'\n'</span> ) {
<a name="l00081"></a>00081       pos++;
<a name="l00082"></a>00082       <span class="keywordflow">continue</span>;
<a name="l00083"></a>00083     }
<a name="l00084"></a>00084     <span class="keywordflow">if</span> ( pos[0] == <span class="charliteral">'\n'</span> )
<a name="l00085"></a>00085       <span class="keywordflow">continue</span>;
<a name="l00086"></a>00086     <span class="comment">// collect LWSP after encoded-words,</span>
<a name="l00087"></a>00087     <span class="comment">// because we might need to throw it out</span>
<a name="l00088"></a>00088     <span class="comment">// (when the next word is an encoded-word)</span>
<a name="l00089"></a>00089     <span class="keywordflow">if</span> ( lastWasEncodedWord &amp;&amp; ( pos[0] == <span class="charliteral">' '</span> || pos[0] == <span class="charliteral">'\t'</span> ) )
<a name="l00090"></a>00090     {
<a name="l00091"></a>00091       LWSP_buffer += pos[0];
<a name="l00092"></a>00092       <span class="keywordflow">continue</span>;
<a name="l00093"></a>00093     }
<a name="l00094"></a>00094     <span class="comment">// verbatimly copy normal text</span>
<a name="l00095"></a>00095     <span class="keywordflow">if</span> (pos[0]!=<span class="charliteral">'='</span> || pos[1]!=<span class="charliteral">'?'</span>)
<a name="l00096"></a>00096     {
<a name="l00097"></a>00097       result += LWSP_buffer + pos[0];
<a name="l00098"></a>00098       LWSP_buffer = 0;
<a name="l00099"></a>00099       lastWasEncodedWord = FALSE;
<a name="l00100"></a>00100       <span class="keywordflow">continue</span>;
<a name="l00101"></a>00101     }
<a name="l00102"></a>00102     <span class="comment">// found possible encoded-word</span>
<a name="l00103"></a>00103     beg = pos+2;
<a name="l00104"></a>00104     end = beg;
<a name="l00105"></a>00105     valid = TRUE;
<a name="l00106"></a>00106     <span class="comment">// parse charset name</span>
<a name="l00107"></a>00107     charset = <span class="stringliteral">""</span>;
<a name="l00108"></a>00108     <span class="keywordflow">for</span> (i=2,pos+=2; i&lt;maxLen &amp;&amp; (*pos!=<span class="charliteral">'?'</span>&amp;&amp;(*pos==<span class="charliteral">' '</span>||ispunct(*pos)||isalnum(*pos))); i++)
<a name="l00109"></a>00109     {
<a name="l00110"></a>00110       charset += *pos;
<a name="l00111"></a>00111       pos++;
<a name="l00112"></a>00112     }
<a name="l00113"></a>00113     <span class="keywordflow">if</span> (*pos!=<span class="charliteral">'?'</span> || i&lt;4 || i&gt;=maxLen) valid = FALSE;
<a name="l00114"></a>00114     <span class="keywordflow">else</span>
<a name="l00115"></a>00115     {
<a name="l00116"></a>00116       <span class="comment">// get encoding and check delimiting question marks</span>
<a name="l00117"></a>00117       encoding = toupper(pos[1]);
<a name="l00118"></a>00118       <span class="keywordflow">if</span> (pos[2]!=<span class="charliteral">'?'</span> || (encoding!=<span class="charliteral">'Q'</span> &amp;&amp; encoding!=<span class="charliteral">'B'</span>))
<a name="l00119"></a>00119                             valid = FALSE;
<a name="l00120"></a>00120       pos+=3;
<a name="l00121"></a>00121       i+=3;
<a name="l00122"></a>00122     }
<a name="l00123"></a>00123     <span class="keywordflow">if</span> (valid)
<a name="l00124"></a>00124     {
<a name="l00125"></a>00125       mid = pos;
<a name="l00126"></a>00126       <span class="comment">// search for end of encoded part</span>
<a name="l00127"></a>00127       <span class="keywordflow">while</span> (i&lt;maxLen &amp;&amp; *pos &amp;&amp; !(*pos==<span class="charliteral">'?'</span> &amp;&amp; *(pos+1)==<span class="charliteral">'='</span>))
<a name="l00128"></a>00128       {
<a name="l00129"></a>00129                             i++;
<a name="l00130"></a>00130                             pos++;
<a name="l00131"></a>00131       }
<a name="l00132"></a>00132       end = pos+2;<span class="comment">//end now points to the first char after the encoded string</span>
<a name="l00133"></a>00133       <span class="keywordflow">if</span> (i&gt;=maxLen || !*pos)
<a name="l00134"></a>00134        valid = FALSE;
<a name="l00135"></a>00135     }
<a name="l00136"></a>00136     <span class="keywordflow">if</span> (valid)
<a name="l00137"></a>00137     {
<a name="l00138"></a>00138       <span class="comment">// valid encoding: decode and throw away separating LWSP</span>
<a name="l00139"></a>00139       ch = *pos;
<a name="l00140"></a>00140       *pos = <span class="charliteral">'\0'</span>;
<a name="l00141"></a>00141       str = QCString(mid).left((<span class="keywordtype">int</span>)(mid - pos - 1));
<a name="l00142"></a>00142       <span class="keywordflow">if</span> (encoding == <span class="charliteral">'Q'</span>)
<a name="l00143"></a>00143       {
<a name="l00144"></a>00144                             <span class="comment">// decode quoted printable text</span>
<a name="l00145"></a>00145                             <span class="keywordflow">for</span> (i=str.length()-1; i&gt;=0; i--)
<a name="l00146"></a>00146                      <span class="keywordflow">if</span> (str[i]==<span class="charliteral">'_'</span>)
<a name="l00147"></a>00147                             str[i]=<span class="charliteral">' '</span>;
<a name="l00148"></a>00148                             cstr = decodeQuotedPrintable(str);
<a name="l00149"></a>00149       }
<a name="l00150"></a>00150       <span class="keywordflow">else</span>
<a name="l00151"></a>00151       {
<a name="l00152"></a>00152                             <span class="comment">// decode base64 text</span>
<a name="l00153"></a>00153                             cstr = decodeBase64(str);
<a name="l00154"></a>00154       }
<a name="l00155"></a>00155       QTextCodec *codec = codecForName(charset);
<a name="l00156"></a>00156       <span class="keywordflow">if</span> (!codec)
<a name="l00157"></a>00157        codec = codecForName(KGlobal::locale()-&gt;encoding());
<a name="l00158"></a>00158       <span class="keywordflow">if</span> (codec)
<a name="l00159"></a>00159        result += codec-&gt;toUnicode(cstr);
<a name="l00160"></a>00160       <span class="keywordflow">else</span>
<a name="l00161"></a>00161        result += QString::fromLocal8Bit(cstr);
<a name="l00162"></a>00162       lastWasEncodedWord = TRUE;
<a name="l00163"></a>00163 
<a name="l00164"></a>00164       *pos = ch;
<a name="l00165"></a>00165       pos = end -1;
<a name="l00166"></a>00166     }
<a name="l00167"></a>00167     <span class="keywordflow">else</span>
<a name="l00168"></a>00168     {
<a name="l00169"></a>00169       <span class="comment">// invalid encoding, keep separating LWSP.</span>
<a name="l00170"></a>00170       <span class="comment">//result += "=?";</span>
<a name="l00171"></a>00171       <span class="comment">//pos = beg -1; // because pos gets increased shortly afterwards</span>
<a name="l00172"></a>00172       pos = beg - 2;
<a name="l00173"></a>00173       result += LWSP_buffer;
<a name="l00174"></a>00174       result += *pos++;
<a name="l00175"></a>00175       result += *pos;
<a name="l00176"></a>00176       lastWasEncodedWord = FALSE;
<a name="l00177"></a>00177     }
<a name="l00178"></a>00178     LWSP_buffer = 0;
<a name="l00179"></a>00179   }
<a name="l00180"></a>00180   <span class="keywordflow">return</span> result;
<a name="l00181"></a>00181 }
<a name="l00182"></a>00182 
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Thu Jul 5 19:36:06 2007 for kshowmail by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.0 </small></address>
</body>
</html>