tdeioslave/imap4

mailaddress.cc
1 /**********************************************************************
2  *
3  * mailaddress.cc - mail address parser
4  * Copyright (C) 2000 Sven Carstens
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * Send comments and bug fixes to
21  *
22  *********************************************************************/
23 
24 
25 #include "mailaddress.h"
26 #include "rfcdecoder.h"
27 #include "mimehdrline.h"
28 #include <kmime_util.h>
29 
30 mailAddress::mailAddress ()
31 {
32 }
33 
34 mailAddress::mailAddress (const mailAddress & lr):
35 user (lr.user),
36 host (lr.host),
37 rawFullName (lr.rawFullName),
38 rawComment (lr.rawComment)
39 {
40 // kdDebug(7116) << "mailAddress::mailAddress - " << getStr() << endl;
41 }
42 
43 mailAddress & mailAddress::operator = (const mailAddress & lr)
44 {
45  // Avoid a = a.
46  if (this == &lr)
47  return *this;
48 
49  user = lr.user;
50  host = lr.host;
51  rawFullName = lr.rawFullName;
52  rawComment = lr.rawComment;
53 
54 // kdDebug(7116) << "mailAddress::operator= - " << getStr() << endl;
55 
56  return *this;
57 }
58 
59 
60 
61 
62 mailAddress::~mailAddress ()
63 {
64 }
65 
66 mailAddress::mailAddress (char *aCStr)
67 {
68  parseAddress (aCStr);
69 }
70 
71 int
72 mailAddress::parseAddress (char *aCStr)
73 {
74  int retVal = 0;
75  int skip;
76  uint len;
77  int pt;
78 
79  if (aCStr)
80  {
81  //skip leading white space
82  skip = mimeHdrLine::skipWS ((const char *) aCStr);
83  if (skip > 0)
84  {
85  aCStr += skip;
86  retVal += skip;
87  }
88  while (*aCStr)
89  {
90  int advance;
91 
92  switch (*aCStr)
93  {
94  case '"':
95  advance = mimeHdrLine::parseQuoted ('"', '"', aCStr);
96  rawFullName += TQCString (aCStr, advance + 1);
97  break;
98  case '(':
99  advance = mimeHdrLine::parseQuoted ('(', ')', aCStr);
100  rawComment += TQCString (aCStr, advance + 1);
101  break;
102  case '<':
103  advance = mimeHdrLine::parseQuoted ('<', '>', aCStr);
104  user = TQCString (aCStr, advance + 1); // copy it
105  len = advance;
106  user = user.mid (1, len - 2); // strip <>
107  len -= 2;
108  pt = user.find('@');
109  host = user.right (len - pt - 1); // split it into host
110  user.truncate(pt); // and user
111  break;
112  default:
113  advance = mimeHdrLine::parseWord ((const char *) aCStr);
114  //if we've seen a FQ mailname the rest must be quoted or is just junk
115  if (user.isEmpty ())
116  {
117  if (*aCStr != ',')
118  {
119  rawFullName += TQCString (aCStr, advance + 1);
120  if (mimeHdrLine::skipWS ((const char *) &aCStr[advance]) > 0)
121  {
122  rawFullName += ' ';
123  }
124  }
125  }
126  break;
127  }
128  if (advance)
129  {
130  retVal += advance;
131  aCStr += advance;
132  }
133  else
134  break;
135  advance = mimeHdrLine::skipWS ((const char *) aCStr);
136  if (advance > 0)
137  {
138  retVal += advance;
139  aCStr += advance;
140  }
141  //reached end of current address
142  if (*aCStr == ',')
143  {
144  advance++;
145  break;
146  }
147  }
148  //let's see what we've got
149  if (rawFullName.isEmpty ())
150  {
151  if (user.isEmpty ())
152  retVal = 0;
153  else
154  {
155  if (host.isEmpty ())
156  {
157  rawFullName = user;
158  user.truncate(0);
159  }
160  }
161  }
162  else if (user.isEmpty ())
163  {
164  pt = rawFullName.find ('@');
165  if (pt >= 0)
166  {
167  user = rawFullName;
168  host = user.right (user.length () - pt - 1);
169  user.truncate(pt);
170  rawFullName.truncate(0);
171  }
172  }
173 
174 #if 0
175 // dead
176  if (!rawFullName.isEmpty ())
177  {
178 // if(fullName[0] == '"')
179 // fullName = fullName.mid(1,fullName.length()-2);
180 // fullName = fullName.simplifyWhiteSpace().stripWhiteSpace();
181 // fullName = rfcDecoder::decodeRFC2047String(fullName.ascii());
182  }
183 #endif
184  if (!rawComment.isEmpty ())
185  {
186  if (rawComment[0] == '(')
187  rawComment = rawComment.mid (1, rawComment.length () - 2);
188  rawComment = rawComment.stripWhiteSpace ();
189 // comment = rfcDecoder::decodeRFC2047String(comment.ascii());
190  }
191  }
192  else
193  {
194  //debug();
195  }
196  return retVal;
197 }
198 
199 const TQCString
200 mailAddress::getStr ()
201 {
202  TQCString retVal(128); // Should be generally big enough
203 
204  if (!rawFullName.isEmpty ())
205  {
206  KMime::addQuotes( rawFullName, false );
207  retVal = rawFullName + " ";
208  }
209  if (!user.isEmpty ())
210  {
211  retVal += '<';
212  retVal += user;
213  if (!host.isEmpty ()) {
214  retVal += '@';
215  retVal += host;
216  }
217  retVal += '>';
218  }
219  if (!rawComment.isEmpty ())
220  {
221  retVal = '(' + rawComment + ')';
222  }
223 // kdDebug(7116) << "mailAddress::getStr - '" << retVal << "'" << endl;
224  return retVal;
225 }
226 
227 bool
228 mailAddress::isEmpty () const
229 {
230  return user.isEmpty ();
231 }
232 
233 void
234 mailAddress::setFullName (const TQString & _str)
235 {
236  rawFullName = rfcDecoder::encodeRFC2047String (_str).latin1 ();
237 }
238 const TQString
239 mailAddress::getFullName () const
240 {
241  return rfcDecoder::decodeRFC2047String (rawFullName);
242 }
243 
244 void
245 mailAddress::setCommentRaw (const TQCString & _str)
246 {
247  rawComment = _str;
248 }
249 
250 void
251 mailAddress::setComment (const TQString & _str)
252 {
253  rawComment = rfcDecoder::encodeRFC2047String (_str).latin1 ();
254 }
255 const TQString
256 mailAddress::getComment () const
257 {
258  return rfcDecoder::decodeRFC2047String (rawComment);
259 }
260 
261 const TQCString &
262 mailAddress::getCommentRaw () const
263 {
264  return rawComment;
265 }
266 
267 TQString
268 mailAddress::emailAddrAsAnchor (const mailAddress & adr, bool shortAdr)
269 {
270  TQString retVal;
271  if (!adr.getFullName ().isEmpty ())
272  {
273  // should do some umlaut escaping
274  retVal += adr.getFullName () + " ";
275  }
276  if (!adr.getUser ().isEmpty () && !shortAdr)
277  {
278  retVal += "&lt;" + adr.getUser ();
279  if (!adr.getHost ().isEmpty ())
280  retVal += "@" + adr.getHost ();
281  retVal += "&gt; ";
282  }
283  if (!adr.getComment ().isEmpty ())
284  {
285  // should do some umlaut escaping
286  retVal = '(' + adr.getComment () + ')';
287  }
288 
289  if (!adr.getUser ().isEmpty ())
290  {
291  TQString mail;
292  mail = adr.getUser ();
293  if (!mail.isEmpty () && !adr.getHost ().isEmpty ())
294  mail += "@" + adr.getHost ();
295  if (!mail.isEmpty ())
296  retVal = "<A HREF=\"mailto:" + mail + "\">" + retVal + "</A>";
297  }
298  return retVal;
299 }
300 
301 TQString
302 mailAddress::emailAddrAsAnchor (const TQPtrList < mailAddress > &list, bool value)
303 {
304  TQString retVal;
305  TQPtrListIterator < mailAddress > it (list);
306 
307  while (it.current ())
308  {
309  retVal += emailAddrAsAnchor ((*it.current ()), value) + "<BR></BR>\n";
310  ++it;
311  }
312 
313  return retVal;
314 }
315 
316 
317 void mailAddress::clear() {
318  user.truncate(0);
319  host.truncate(0);
320  rawFullName.truncate(0);
321  rawComment.truncate(0);
322 }
323 
static int parseWord(const char *)
slurp one word
Definition: mimehdrline.cc:163
static int parseQuoted(char, char, const char *)
slurp one word
Definition: mimehdrline.cc:184
static const TQString decodeRFC2047String(const TQString &_str, TQString &charset, TQString &language)
decode a RFC2047 String
Definition: rfcdecoder.cc:337
static const TQString encodeRFC2047String(const TQString &_str, TQString &charset, TQString &language)
encode a RFC2047 String
static int skipWS(const char *)
skip all white space characters
Definition: mimehdrline.cc:318