• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.9.3 API Reference
  • KDE Home
  • Contact Us
 

kioslave/imap4

  • kioslave
  • imap4
mimehdrline.cpp
1 /***************************************************************************
2  mimehdrline.cc - description
3  -------------------
4  begin : Wed Oct 11 2000
5  copyright : (C) 2000 by Sven Carstens
6  email : s.carstens@gmx.de
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "mimehdrline.h"
19 #include <iostream>
20 #include <ctype.h>
21 #include <stdlib.h>
22 #include <stdio.h>
23 
24 using namespace std;
25 
26 mimeHdrLine::mimeHdrLine ():
27 mimeValue (), mimeLabel ()
28 {
29 }
30 
31 mimeHdrLine::mimeHdrLine (const QByteArray & aLabel, const QByteArray & aValue):
32 mimeValue (aValue),
33 mimeLabel (aLabel)
34 {
35 }
36 
37 mimeHdrLine::mimeHdrLine (mimeHdrLine * aHdrLine):
38 mimeValue (aHdrLine->mimeValue), mimeLabel (aHdrLine->mimeLabel)
39 {
40 }
41 
42 mimeHdrLine::~mimeHdrLine ()
43 {
44 }
45 
46 int mimeHdrLine::appendStr (const char *aCStr)
47 {
48  int retVal = 0;
49  int skip;
50 
51  if (aCStr)
52  {
53  skip = skipWS (aCStr);
54  if (skip && !mimeLabel.isEmpty ())
55  {
56  if (skip > 0)
57  {
58  mimeValue += QByteArray (aCStr, skip);
59  aCStr += skip;
60  retVal += skip;
61  skip = parseFullLine (aCStr);
62  mimeValue += QByteArray (aCStr, skip);
63  retVal += skip;
64  aCStr += skip;
65  }
66  }
67  else
68  {
69  if (mimeLabel.isEmpty ())
70  return setStr (aCStr);
71  }
72  }
73  return retVal;
74 }
75 
79 int
80 mimeHdrLine::setStr (const char *aCStr)
81 {
82  int retVal = 0;
83 // char *begin = aCStr;
84  mimeLabel = QByteArray ();
85  mimeValue = QByteArray ();
86 
87  if (aCStr)
88  {
89  // can't have spaces on normal lines
90  if (!skipWS (aCStr))
91  {
92  int label = 0, advance;
93  while ((advance = parseWord (&aCStr[label])))
94  {
95  label += advance;
96  }
97  if (label && aCStr[label - 1] != ':')
98  retVal = 0;
99  else
100  {
101  mimeLabel = QByteArray (aCStr, label-1);
102  retVal += label;
103  aCStr += label;
104  }
105  }
106  if (retVal)
107  {
108  int skip;
109  skip = skipWS (aCStr);
110  if (skip < 0)
111  skip *= -1;
112  aCStr += skip;
113  retVal += skip;
114  skip = parseFullLine (aCStr);
115  mimeValue = QByteArray (aCStr, skip);
116  retVal += skip;
117  aCStr += skip;
118  }
119  else
120  {
121  //Skip malformed line
122  while (*aCStr && *aCStr != '\r' && *aCStr != '\n')
123  {
124  retVal--;
125  aCStr++;
126  }
127  if (*aCStr == '\r')
128  {
129  retVal--;
130  aCStr++;
131  }
132  if (*aCStr == '\n')
133  {
134  retVal--;
135  aCStr++;
136  }
137  }
138  }
139  else
140  {
141  //debug
142  }
143  return retVal;
144 }
145 
147 int mimeHdrLine::parseWord (const char *aCStr)
148 {
149  int retVal = 0;
150 
151  if (aCStr && *aCStr)
152  {
153  if (*aCStr == '"')
154  return mimeHdrLine::parseQuoted ('"', '"', aCStr);
155  else
156  return mimeHdrLine::parseHalfWord (aCStr);
157  }
158  else
159  {
160  //debug();
161  }
162  return retVal;
163 }
164 
166 int mimeHdrLine::parseQuoted (char startQuote, char endQuote, const char *aCStr)
167 {
168  int retVal = 0;
169 
170  if (aCStr && *aCStr)
171  {
172  if (*aCStr == startQuote)
173  {
174  aCStr++;
175  retVal++;
176  }
177  else
178  return 0;
179  while (*aCStr && *aCStr != endQuote)
180  {
181  //skip over backticks
182  if (*aCStr == '\\')
183  {
184  aCStr++;
185  retVal++;
186  }
187  //eat this
188  aCStr++;
189  retVal++;
190  }
191  if (*aCStr == endQuote)
192  {
193  aCStr++;
194  retVal++;
195  }
196  }
197  else
198  {
199  //debug();
200  }
201  return retVal;
202 }
203 
205 int mimeHdrLine::parseAlphaNum (const char *aCStr)
206 {
207  int retVal = 0;
208 
209  if (aCStr)
210  {
211  while (*aCStr && isalnum (*aCStr))
212  {
213  //skip over backticks
214  if (*aCStr == '\\')
215  {
216  aCStr++;
217  retVal++;
218  }
219  //eat this
220  aCStr++;
221  retVal++;
222  }
223  }
224  else
225  {
226  //debug();
227  }
228  return retVal;
229 }
230 
231 int mimeHdrLine::parseHalfWord (const char *aCStr)
232 {
233  int retVal = 0;
234 
235  if (aCStr && *aCStr)
236  {
237  if (isalnum (*aCStr))
238  return mimeHdrLine::parseAlphaNum (aCStr);
239  //skip over backticks
240  if (*aCStr == '\\')
241  {
242  aCStr++;
243  retVal++;
244  }
245  else if (!isspace (*aCStr))
246  {
247  //eat this
248  aCStr++;
249  retVal++;
250  }
251  }
252  else
253  {
254  //debug();
255  }
256  return retVal;
257 }
258 
260 int mimeHdrLine::parseHalfLine (const char *aCStr)
261 {
262  int retVal = 0;
263 
264  if (aCStr)
265  {
266  while (*aCStr && *aCStr != '\n')
267  {
268  //skip over backticks
269  if (*aCStr == '\\')
270  {
271  aCStr++;
272  retVal++;
273  }
274  //eat this
275  aCStr++;
276  retVal++;
277  }
278  if (*aCStr == '\n')
279  {
280  aCStr++;
281  retVal++;
282  }
283  }
284  else
285  {
286  //debug();
287  }
288  return retVal;
289 }
290 
292 int mimeHdrLine::skipWS (const char *aCStr)
293 {
294  int retVal = 0;
295 
296  if (aCStr && *aCStr)
297  {
298  while (*aCStr == ' ' || *aCStr == '\t')
299  {
300  aCStr++;
301  retVal++;
302  }
303  //check out for continuation lines
304  if (*aCStr == '\r')
305  {
306  aCStr++;
307  retVal++;
308  }
309  if (*aCStr++ == '\n')
310  {
311  if (*aCStr == '\t' || *aCStr == ' ')
312  {
313  int skip = mimeHdrLine::skipWS (aCStr);
314  if (skip < 0)
315  skip *= -1;
316  retVal += 1 + skip;
317  }
318  else
319  {
320  retVal = -retVal - 1;
321  }
322  }
323  }
324  else
325  {
326  //debug();
327  }
328  return retVal;
329 }
330 
332 int mimeHdrLine::parseFullLine (const char *aCStr)
333 {
334  int retVal = 0;
335  int skip;
336 
337  if (aCStr)
338  {
339  //skip leading white space
340  skip = skipWS (aCStr);
341  if (skip > 0)
342  {
343  aCStr += skip;
344  retVal += skip;
345  }
346  while (*aCStr)
347  {
348  int advance;
349 
350  if ((advance = parseHalfLine (aCStr)))
351  {
352  retVal += advance;
353  aCStr += advance;
354  }
355  else if ((advance = skipWS (aCStr)))
356  {
357  if (advance > 0)
358  {
359  retVal += advance;
360  aCStr += advance;
361  }
362  else
363  {
364  retVal -= advance;
365  break;
366  }
367  }
368  else
369  break;
370  }
371  }
372  else
373  {
374  //debug();
375  }
376  return retVal;
377 }
378 
380 int mimeHdrLine::parseSeparator (char separator, const char *aCStr)
381 {
382  int retVal = 0;
383  int skip;
384 
385  if (aCStr)
386  {
387  //skip leading white space
388  skip = skipWS (aCStr);
389  if (skip > 0)
390  {
391  aCStr += skip;
392  retVal += skip;
393  }
394  while (*aCStr)
395  {
396  int advance;
397 
398  if (*aCStr != separator)
399  {
400  if ((advance = mimeHdrLine::parseWord (aCStr)))
401  {
402  retVal += advance;
403  aCStr += advance;
404  }
405  else if ((advance = mimeHdrLine::skipWS (aCStr)))
406  {
407  if (advance > 0)
408  {
409  retVal += advance;
410  aCStr += advance;
411  }
412  else
413  {
414  retVal -= advance;
415  break;
416  }
417  }
418  else
419  break;
420  }
421  else
422  {
423  //include separator in result
424  retVal++;
425  aCStr++;
426  break;
427  }
428  }
429  }
430  else
431  {
432  //debug();
433  }
434  return retVal;
435 }
436 
439 const QByteArray& mimeHdrLine::getLabel ()
440 {
441  return mimeLabel;
442 }
443 
445 const QByteArray& mimeHdrLine::getValue ()
446 {
447  return mimeValue;
448 }
449 
450 
451 // FIXME: very inefficient still
452 QByteArray mimeHdrLine::truncateLine(QByteArray aLine, unsigned int truncate)
453 {
454  int cutHere;
455  QByteArray retVal;
456  uint len = aLine.length();
457 
458  // see if we have a line of the form "key: value" (like "Subject: bla")
459  // then we do not want to truncate between key and value
460  int validStart = aLine.indexOf(": ");
461  if (validStart > -1) {
462  validStart += 2;
463  }
464  while (len > truncate) {
465  cutHere = aLine.lastIndexOf(' ', truncate);
466  if (cutHere < 1 || cutHere < validStart) {
467  cutHere = aLine.lastIndexOf('\t', truncate);
468  if (cutHere < 1) {
469  cutHere = aLine.indexOf(' ', 1);
470  if (cutHere < 1) {
471  cutHere = aLine.indexOf('\t', 1);
472  if (cutHere < 1) {
473  // simply truncate
474  return aLine.left(truncate);
475  }
476  }
477  }
478  }
479 
480  retVal += aLine.left(cutHere) + '\n';
481  int chop = len - cutHere;
482  aLine = aLine.right(chop);
483  len -= chop;
484  }
485  retVal += aLine;
486 
487  return retVal;
488 }
489 
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon Nov 26 2012 16:46:54 by doxygen 1.8.1.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kioslave/imap4

Skip menu "kioslave/imap4"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Related Pages

kdepimlibs-4.9.3 API Reference

Skip menu "kdepimlibs-4.9.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal