kioslave/imap4
mimehdrline.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
00084 mimeLabel = QByteArray ();
00085 mimeValue = QByteArray ();
00086
00087 if (aCStr)
00088 {
00089
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
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
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
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
00182 if (*aCStr == '\\')
00183 {
00184 aCStr++;
00185 retVal++;
00186 }
00187
00188 aCStr++;
00189 retVal++;
00190 }
00191 if (*aCStr == endQuote)
00192 {
00193 aCStr++;
00194 retVal++;
00195 }
00196 }
00197 else
00198 {
00199
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
00214 if (*aCStr == '\\')
00215 {
00216 aCStr++;
00217 retVal++;
00218 }
00219
00220 aCStr++;
00221 retVal++;
00222 }
00223 }
00224 else
00225 {
00226
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
00240 if (*aCStr == '\\')
00241 {
00242 aCStr++;
00243 retVal++;
00244 }
00245 else if (!isspace (*aCStr))
00246 {
00247
00248 aCStr++;
00249 retVal++;
00250 }
00251 }
00252 else
00253 {
00254
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
00269 if (*aCStr == '\\')
00270 {
00271 aCStr++;
00272 retVal++;
00273 }
00274
00275 aCStr++;
00276 retVal++;
00277 }
00278 if (*aCStr == '\n')
00279 {
00280 aCStr++;
00281 retVal++;
00282 }
00283 }
00284 else
00285 {
00286
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
00304 if (*aCStr == '\r')
00305 {
00306 aCStr++;
00307 retVal++;
00308 }
00309 if (*aCStr++ == '\n')
00310 if (*aCStr == '\t' || *aCStr == ' ')
00311 {
00312 int skip = mimeHdrLine::skipWS (aCStr);
00313 if (skip < 0)
00314 skip *= -1;
00315 retVal += 1 + skip;
00316 }
00317 else
00318 {
00319 retVal = -retVal - 1;
00320 }
00321 }
00322 else
00323 {
00324
00325 }
00326 return retVal;
00327 }
00328
00330 int mimeHdrLine::parseFullLine (const char *aCStr)
00331 {
00332 int retVal = 0;
00333 int skip;
00334
00335 if (aCStr)
00336 {
00337
00338 skip = skipWS (aCStr);
00339 if (skip > 0)
00340 {
00341 aCStr += skip;
00342 retVal += skip;
00343 }
00344 while (*aCStr)
00345 {
00346 int advance;
00347
00348 if ((advance = parseHalfLine (aCStr)))
00349 {
00350 retVal += advance;
00351 aCStr += advance;
00352 }
00353 else if ((advance = skipWS (aCStr)))
00354 {
00355 if (advance > 0)
00356 {
00357 retVal += advance;
00358 aCStr += advance;
00359 }
00360 else
00361 {
00362 retVal -= advance;
00363 break;
00364 }
00365 }
00366 else
00367 break;
00368 }
00369 }
00370 else
00371 {
00372
00373 }
00374 return retVal;
00375 }
00376
00378 int mimeHdrLine::parseSeparator (char separator, const char *aCStr)
00379 {
00380 int retVal = 0;
00381 int skip;
00382
00383 if (aCStr)
00384 {
00385
00386 skip = skipWS (aCStr);
00387 if (skip > 0)
00388 {
00389 aCStr += skip;
00390 retVal += skip;
00391 }
00392 while (*aCStr)
00393 {
00394 int advance;
00395
00396 if (*aCStr != separator)
00397 {
00398 if ((advance = mimeHdrLine::parseWord (aCStr)))
00399 {
00400 retVal += advance;
00401 aCStr += advance;
00402 }
00403 else if ((advance = mimeHdrLine::skipWS (aCStr)))
00404 {
00405 if (advance > 0)
00406 {
00407 retVal += advance;
00408 aCStr += advance;
00409 }
00410 else
00411 {
00412 retVal -= advance;
00413 break;
00414 }
00415 }
00416 else
00417 break;
00418 }
00419 else
00420 {
00421
00422 retVal++;
00423 aCStr++;
00424 break;
00425 }
00426 }
00427 }
00428 else
00429 {
00430
00431 }
00432 return retVal;
00433 }
00434
00437 const QByteArray& mimeHdrLine::getLabel ()
00438 {
00439 return mimeLabel;
00440 }
00441
00443 const QByteArray& mimeHdrLine::getValue ()
00444 {
00445 return mimeValue;
00446 }
00447
00448
00449
00450 QByteArray mimeHdrLine::truncateLine(QByteArray aLine, unsigned int truncate)
00451 {
00452 int cutHere;
00453 QByteArray retVal;
00454 uint len = aLine.length();
00455
00456
00457
00458 int validStart = aLine.indexOf(": ");
00459 if (validStart > -1) {
00460 validStart += 2;
00461 }
00462 while (len > truncate) {
00463 cutHere = aLine.lastIndexOf(' ', truncate);
00464 if (cutHere < 1 || cutHere < validStart) {
00465 cutHere = aLine.lastIndexOf('\t', truncate);
00466 if (cutHere < 1) {
00467 cutHere = aLine.indexOf(' ', 1);
00468 if (cutHere < 1) {
00469 cutHere = aLine.indexOf('\t', 1);
00470 if (cutHere < 1) {
00471
00472 return aLine.left(truncate);
00473 }
00474 }
00475 }
00476 }
00477
00478 retVal += aLine.left(cutHere) + '\n';
00479 int chop = len - cutHere;
00480 aLine = aLine.right(chop);
00481 len -= chop;
00482 }
00483 retVal += aLine;
00484
00485 return retVal;
00486 }
00487