• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

kioslave/imap4

mimehdrline.cpp

00001 /***************************************************************************
00002                           mimehdrline.cc  -  description
00003                              -------------------
00004     begin                : Wed Oct 11 2000
00005     copyright            : (C) 2000 by Sven Carstens
00006     email                : s.carstens@gmx.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017 
00018 #include "mimehdrline.h"
00019 #include <iostream>
00020 #include <ctype.h>
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 
00024 using namespace std;
00025 
00026 mimeHdrLine::mimeHdrLine ():
00027 mimeValue (), mimeLabel ()
00028 {
00029 }
00030 
00031 mimeHdrLine::mimeHdrLine (const QByteArray & aLabel, const QByteArray & aValue):
00032 mimeValue (aValue),
00033 mimeLabel (aLabel)
00034 {
00035 }
00036 
00037 mimeHdrLine::mimeHdrLine (mimeHdrLine * aHdrLine):
00038 mimeValue (aHdrLine->mimeValue), mimeLabel (aHdrLine->mimeLabel)
00039 {
00040 }
00041 
00042 mimeHdrLine::~mimeHdrLine ()
00043 {
00044 }
00045 
00046 int mimeHdrLine::appendStr (const char *aCStr)
00047 {
00048   int retVal = 0;
00049   int skip;
00050 
00051   if (aCStr)
00052   {
00053     skip = skipWS (aCStr);
00054     if (skip && !mimeLabel.isEmpty ())
00055     {
00056       if (skip > 0)
00057       {
00058         mimeValue += QByteArray (aCStr, skip);
00059         aCStr += skip;
00060         retVal += skip;
00061         skip = parseFullLine (aCStr);
00062         mimeValue += QByteArray (aCStr, skip);
00063         retVal += skip;
00064         aCStr += skip;
00065       }
00066     }
00067     else
00068     {
00069       if (mimeLabel.isEmpty ())
00070         return setStr (aCStr);
00071     }
00072   }
00073   return retVal;
00074 }
00075 
00079 int
00080 mimeHdrLine::setStr (const char *aCStr)
00081 {
00082   int retVal = 0;
00083 //  char *begin = aCStr;
00084   mimeLabel = QByteArray ();
00085   mimeValue = QByteArray ();
00086 
00087   if (aCStr)
00088   {
00089     // can't have spaces on normal lines
00090     if (!skipWS (aCStr))
00091     {
00092       int label = 0, advance;
00093       while ((advance = parseWord (&aCStr[label])))
00094       {
00095         label += advance;
00096       }
00097       if (label && aCStr[label - 1] != ':')
00098         retVal = 0;
00099       else
00100       {
00101         mimeLabel = QByteArray (aCStr, label-1);
00102         retVal += label;
00103         aCStr += label;
00104       }
00105     }
00106     if (retVal)
00107     {
00108       int skip;
00109       skip = skipWS (aCStr);
00110       if (skip < 0)
00111         skip *= -1;
00112       aCStr += skip;
00113       retVal += skip;
00114       skip = parseFullLine (aCStr);
00115       mimeValue = QByteArray (aCStr, skip);
00116       retVal += skip;
00117       aCStr += skip;
00118     }
00119     else
00120     {
00121       //Skip malformed line
00122       while (*aCStr && *aCStr != '\r' && *aCStr != '\n')
00123       {
00124         retVal--;
00125         aCStr++;
00126       }
00127       if (*aCStr == '\r')
00128       {
00129         retVal--;
00130         aCStr++;
00131       }
00132       if (*aCStr == '\n')
00133       {
00134         retVal--;
00135         aCStr++;
00136       }
00137     }
00138   }
00139   else
00140   {
00141     //debug
00142   }
00143   return retVal;
00144 }
00145 
00147 int mimeHdrLine::parseWord (const char *aCStr)
00148 {
00149   int retVal = 0;
00150 
00151   if (aCStr && *aCStr)
00152   {
00153     if (*aCStr == '"')
00154       return mimeHdrLine::parseQuoted ('"', '"', aCStr);
00155     else
00156       return mimeHdrLine::parseHalfWord (aCStr);
00157   }
00158   else
00159   {
00160     //debug();
00161   }
00162   return retVal;
00163 }
00164 
00166 int mimeHdrLine::parseQuoted (char startQuote, char endQuote, const char *aCStr)
00167 {
00168   int retVal = 0;
00169 
00170   if (aCStr && *aCStr)
00171   {
00172     if (*aCStr == startQuote)
00173     {
00174       aCStr++;
00175       retVal++;
00176     }
00177     else
00178       return 0;
00179     while (*aCStr && *aCStr != endQuote)
00180     {
00181       //skip over backticks
00182       if (*aCStr == '\\')
00183       {
00184         aCStr++;
00185         retVal++;
00186       }
00187       //eat this
00188       aCStr++;
00189       retVal++;
00190     }
00191     if (*aCStr == endQuote)
00192     {
00193       aCStr++;
00194       retVal++;
00195     }
00196   }
00197   else
00198   {
00199     //debug();
00200   }
00201   return retVal;
00202 }
00203 
00205 int mimeHdrLine::parseAlphaNum (const char *aCStr)
00206 {
00207   int retVal = 0;
00208 
00209   if (aCStr)
00210   {
00211     while (*aCStr && isalnum (*aCStr))
00212     {
00213       //skip over backticks
00214       if (*aCStr == '\\')
00215       {
00216         aCStr++;
00217         retVal++;
00218       }
00219       //eat this
00220       aCStr++;
00221       retVal++;
00222     }
00223   }
00224   else
00225   {
00226     //debug();
00227   }
00228   return retVal;
00229 }
00230 
00231 int mimeHdrLine::parseHalfWord (const char *aCStr)
00232 {
00233   int retVal = 0;
00234 
00235   if (aCStr && *aCStr)
00236   {
00237     if (isalnum (*aCStr))
00238       return mimeHdrLine::parseAlphaNum (aCStr);
00239     //skip over backticks
00240     if (*aCStr == '\\')
00241     {
00242       aCStr++;
00243       retVal++;
00244     }
00245     else if (!isspace (*aCStr))
00246     {
00247       //eat this
00248       aCStr++;
00249       retVal++;
00250     }
00251   }
00252   else
00253   {
00254     //debug();
00255   }
00256   return retVal;
00257 }
00258 
00260 int mimeHdrLine::parseHalfLine (const char *aCStr)
00261 {
00262   int retVal = 0;
00263 
00264   if (aCStr)
00265   {
00266     while (*aCStr && *aCStr != '\n')
00267     {
00268       //skip over backticks
00269       if (*aCStr == '\\')
00270       {
00271         aCStr++;
00272         retVal++;
00273       }
00274       //eat this
00275       aCStr++;
00276       retVal++;
00277     }
00278     if (*aCStr == '\n')
00279     {
00280       aCStr++;
00281       retVal++;
00282     }
00283   }
00284   else
00285   {
00286     //debug();
00287   }
00288   return retVal;
00289 }
00290 
00292 int mimeHdrLine::skipWS (const char *aCStr)
00293 {
00294   int retVal = 0;
00295 
00296   if (aCStr && *aCStr)
00297   {
00298     while (*aCStr == ' ' || *aCStr == '\t')
00299     {
00300       aCStr++;
00301       retVal++;
00302     }
00303     //check out for continuation lines
00304     if (*aCStr == '\r')
00305     {
00306       aCStr++;
00307       retVal++;
00308     }
00309     if (*aCStr++ == '\n')
00310     {
00311       if (*aCStr == '\t' || *aCStr == ' ')
00312       {
00313         int skip = mimeHdrLine::skipWS (aCStr);
00314         if (skip < 0)
00315           skip *= -1;
00316         retVal += 1 + skip;
00317       }
00318       else
00319       {
00320         retVal = -retVal - 1;
00321       }
00322     }
00323   }
00324   else
00325   {
00326     //debug();
00327   }
00328   return retVal;
00329 }
00330 
00332 int mimeHdrLine::parseFullLine (const char *aCStr)
00333 {
00334   int retVal = 0;
00335   int skip;
00336 
00337   if (aCStr)
00338   {
00339     //skip leading white space
00340     skip = skipWS (aCStr);
00341     if (skip > 0)
00342     {
00343       aCStr += skip;
00344       retVal += skip;
00345     }
00346     while (*aCStr)
00347     {
00348       int advance;
00349 
00350       if ((advance = parseHalfLine (aCStr)))
00351       {
00352         retVal += advance;
00353         aCStr += advance;
00354       }
00355       else if ((advance = skipWS (aCStr)))
00356       {
00357         if (advance > 0)
00358         {
00359           retVal += advance;
00360           aCStr += advance;
00361         }
00362         else
00363         {
00364           retVal -= advance;
00365           break;
00366         }
00367       }
00368       else
00369         break;
00370     }
00371   }
00372   else
00373   {
00374     //debug();
00375   }
00376   return retVal;
00377 }
00378 
00380 int mimeHdrLine::parseSeparator (char separator, const char *aCStr)
00381 {
00382   int retVal = 0;
00383   int skip;
00384 
00385   if (aCStr)
00386   {
00387     //skip leading white space
00388     skip = skipWS (aCStr);
00389     if (skip > 0)
00390     {
00391       aCStr += skip;
00392       retVal += skip;
00393     }
00394     while (*aCStr)
00395     {
00396       int advance;
00397 
00398       if (*aCStr != separator)
00399       {
00400         if ((advance = mimeHdrLine::parseWord (aCStr)))
00401         {
00402           retVal += advance;
00403           aCStr += advance;
00404         }
00405         else if ((advance = mimeHdrLine::skipWS (aCStr)))
00406         {
00407           if (advance > 0)
00408           {
00409             retVal += advance;
00410             aCStr += advance;
00411           }
00412           else
00413           {
00414             retVal -= advance;
00415             break;
00416           }
00417         }
00418         else
00419           break;
00420       }
00421       else
00422       {
00423         //include separator in result
00424         retVal++;
00425         aCStr++;
00426         break;
00427       }
00428     }
00429   }
00430   else
00431   {
00432     //debug();
00433   }
00434   return retVal;
00435 }
00436 
00439 const QByteArray& mimeHdrLine::getLabel ()
00440 {
00441   return mimeLabel;
00442 }
00443 
00445 const QByteArray& mimeHdrLine::getValue ()
00446 {
00447   return mimeValue;
00448 }
00449 
00450 
00451 // FIXME: very inefficient still
00452 QByteArray mimeHdrLine::truncateLine(QByteArray aLine, unsigned int truncate)
00453 {
00454   int cutHere;
00455   QByteArray retVal;
00456   uint len = aLine.length();
00457 
00458   // see if we have a line of the form "key: value" (like "Subject: bla")
00459   // then we do not want to truncate between key and value
00460   int validStart = aLine.indexOf(": ");
00461   if (validStart > -1) {
00462     validStart += 2;
00463   }
00464   while (len > truncate) {
00465     cutHere = aLine.lastIndexOf(' ', truncate);
00466     if (cutHere < 1 || cutHere < validStart) {
00467       cutHere = aLine.lastIndexOf('\t', truncate);
00468       if (cutHere < 1) {
00469         cutHere = aLine.indexOf(' ', 1);
00470         if (cutHere < 1) {
00471           cutHere = aLine.indexOf('\t', 1);
00472           if (cutHere < 1) {
00473             // simply truncate
00474             return aLine.left(truncate);
00475           }
00476         }
00477       }
00478     }
00479 
00480     retVal += aLine.left(cutHere) + '\n';
00481     int chop = len - cutHere;
00482     aLine = aLine.right(chop);
00483     len -= chop;
00484   }
00485   retVal += aLine;
00486 
00487   return retVal;
00488 }
00489 

kioslave/imap4

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

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  • kabc
  • kblog
  • kcal
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.5.8
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal