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 {
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
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
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
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
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
00424 retVal++;
00425 aCStr++;
00426 break;
00427 }
00428 }
00429 }
00430 else
00431 {
00432
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
00452 QByteArray mimeHdrLine::truncateLine(QByteArray aLine, unsigned int truncate)
00453 {
00454 int cutHere;
00455 QByteArray retVal;
00456 uint len = aLine.length();
00457
00458
00459
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
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