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
This file is part of the KDE documentation.
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon May 14 2012 04:40:33 by doxygen 1.7.5 written by Dimitri van Heesch, © 1997-2006
Documentation copyright © 1996-2012 The KDE developers.
Generated on Mon May 14 2012 04:40:33 by doxygen 1.7.5 written by Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.