00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef MIMEHEADER_H
00019 #define MIMEHEADER_H
00020
00021 #include <QList>
00022 #include <QHash>
00023 #include <QByteArray>
00024
00025 #include "mimehdrline.h"
00026 #include "mimeio.h"
00027
00028 #include <kimap/rfccodecs.h>
00029 using namespace KIMAP;
00030
00035 class mimeHeader
00036 {
00037 public:
00038 mimeHeader ();
00039 virtual ~ mimeHeader ();
00040
00041 virtual void addHdrLine (mimeHdrLine *);
00042 virtual void outputHeader (mimeIO &);
00043 virtual void outputPart (mimeIO &);
00044
00045
00046 QByteArray outputParameter (QHash < QString, QString > &);
00047
00048
00049
00050
00051
00052 bool parseHeader (mimeIO &);
00053
00054 QString getDispositionParm (const QByteArray&);
00055 void setDispositionParm (const QByteArray&, const QString&);
00056 QHashIterator < QString, QString > getDispositionIterator ();
00057
00058 QString getTypeParm (const QByteArray&);
00059 void setTypeParm (const QByteArray&, const QString&);
00060 QHashIterator < QString, QString > getTypeIterator ();
00061
00062
00063 void serialize(QDataStream& stream);
00064
00065 const QByteArray& getType ()
00066 {
00067 return _contentType;
00068 }
00069 void setType (const QByteArray& _str)
00070 {
00071 _contentType = _str;
00072 }
00073
00074 const QByteArray& getDescription ()
00075 {
00076 return _contentDescription;
00077 }
00078 void setDescription( const QByteArray& _str )
00079 {
00080 _contentDescription = _str;
00081 }
00082
00083 const QByteArray& getDisposition ()
00084 {
00085 return _contentDisposition;
00086 }
00087 void setDisposition( const QByteArray& _str )
00088 {
00089 _contentDisposition = _str;
00090 }
00091
00092 const QByteArray& getEncoding ()
00093 {
00094 return _contentEncoding;
00095 }
00096 void setEncoding (const QByteArray &_str )
00097 {
00098 _contentEncoding = _str;
00099 }
00100
00101 const QByteArray& getMD5 ()
00102 {
00103 return _contentMD5;
00104 }
00105 void setMD5 (const QByteArray & _str)
00106 {
00107 _contentMD5 = _str;
00108 }
00109
00110 const QByteArray& getID ()
00111 {
00112 return _contentID;
00113 }
00114 void setID (const QByteArray & _str)
00115 {
00116 _contentID = _str;
00117 }
00118
00119 unsigned long getLength ()
00120 {
00121 return contentLength;
00122 }
00123 void setLength (unsigned long _len)
00124 {
00125 contentLength = _len;
00126 }
00127
00128 const QString & getPartSpecifier ()
00129 {
00130 return partSpecifier;
00131 }
00132 void setPartSpecifier (const QString & _str)
00133 {
00134 partSpecifier = _str;
00135 }
00136
00137 QListIterator < mimeHdrLine *> getOriginalIterator ();
00138 QListIterator < mimeHdrLine *> getAdditionalIterator ();
00139 void setContent (const QByteArray &aContent)
00140 {
00141 mimeContent = aContent;
00142 }
00143 QByteArray getContent ()
00144 {
00145 return mimeContent;
00146 }
00147
00148 QByteArray getBody ()
00149 {
00150 return preMultipartBody + postMultipartBody;
00151 }
00152 QByteArray getPreBody ()
00153 {
00154 return preMultipartBody;
00155 }
00156 void setPreBody (QByteArray & inBody)
00157 {
00158 preMultipartBody = inBody;
00159 }
00160
00161 QByteArray getPostBody ()
00162 {
00163 return postMultipartBody;
00164 }
00165 void setPostBody (QByteArray & inBody)
00166 {
00167 postMultipartBody = inBody;
00168 contentLength = inBody.length ();
00169 }
00170
00171 mimeHeader *getNestedMessage ()
00172 {
00173 return nestedMessage;
00174 }
00175 void setNestedMessage (mimeHeader * inPart, bool destroy = true)
00176 {
00177 if (nestedMessage && destroy)
00178 delete nestedMessage;
00179 nestedMessage = inPart;
00180 }
00181
00182
00183 void addNestedPart (mimeHeader * inPart)
00184 {
00185 nestedParts.append (inPart);
00186 }
00187 QListIterator < mimeHeader *> getNestedIterator ()
00188 {
00189 return QListIterator < mimeHeader *> (nestedParts);
00190 }
00191
00192
00193 void clearNestedParts ()
00194 {
00195 nestedParts.clear ();
00196 }
00197
00198
00199 void clearTypeParameters ()
00200 {
00201 typeList.clear ();
00202 }
00203
00204
00205 void clearDispositionParameters ()
00206 {
00207 dispositionList.clear ();
00208 }
00209
00210
00211 mimeHeader *bodyPart (const QString &);
00212
00213 #ifdef KMAIL_COMPATIBLE
00214 ulong msgSize ()
00215 {
00216 return contentLength;
00217 }
00218 uint numBodyParts ()
00219 {
00220 return nestedParts.count ();
00221 }
00222 mimeHeader *bodyPart (int which, mimeHeader ** ret = NULL)
00223 {
00224 if (ret)
00225 (*ret) = nestedParts.at (which);
00226 return nestedParts.at (which);
00227 }
00228 void write (const QString &)
00229 {
00230 }
00231 QString typeStr ()
00232 {
00233 return QString (contentType.left (contentType.find ('/')));
00234 }
00235 void setTypeStr (const QString & _str)
00236 {
00237 contentType = QByteArray (_str.toLatin1 ()) + "/" + subtypeStr ().toLatin1 ();
00238 }
00239 QString subtypeStr ()
00240 {
00241 return QString (contentType.
00242 right (contentType.length () - contentType.find ('/') -
00243 1));
00244 }
00245 void setSubtypeStr (const QString & _str)
00246 {
00247 contentType = QByteArray (typeStr ().toLatin1 ()) + "/" + _str.toLatin1 ();
00248 }
00249 QString cteStr ()
00250 {
00251 return QString (getEncoding ());
00252 }
00253 void setCteStr (const QString & _str)
00254 {
00255 setEncoding (_str.toLatin1 ());
00256 }
00257 QString contentDisposition ()
00258 {
00259 return QString (_contentDisposition);
00260 }
00261 QString body ()
00262 {
00263 return QString (postMultipartBody);
00264 }
00265 QString charset ()
00266 {
00267 return getTypeParm ("charset");
00268 }
00269 QString bodyDecoded ();
00270 void setBodyEncoded (const QByteArray &);
00271 void setBodyEncodedBinary (const QByteArray &);
00272 QByteArray bodyDecodedBinary ();
00273 QString name ()
00274 {
00275 return QString (getTypeParm ("name"));
00276 }
00277 void setName (const QString & _str)
00278 {
00279 setTypeParm ("name", _str);
00280 }
00281 QString fileName ()
00282 {
00283 return QString (getDispositionParm ("filename"));
00284 }
00285 QString contentDescription ()
00286 {
00287 return QString (RfcCodecs::decodeRFC2047String (_contentDescription));
00288 }
00289 void setContentDescription (const QString & _str)
00290 {
00291 _contentDescription = RfcCodecs::encodeRFC2047String (_str).toLatin1 ();
00292 }
00293 QString msgIdMD5 ()
00294 {
00295 return QString (contentMD5);
00296 }
00297 QString iconName ();
00298 QString magicSetType (bool aAutoDecode = true);
00299 QString headerAsString ();
00300 ulong size ()
00301 {
00302 return 0;
00303 }
00304 void fromString (const QByteArray &)
00305 {;
00306 }
00307 void setContentDisposition (const QString & _str)
00308 {
00309 setDisposition (_str.toLatin1 ());
00310 }
00311 #endif
00312
00313 protected:
00314 static void addParameter (const QByteArray&, QHash < QString, QString > &);
00315 static QString getParameter (const QByteArray&, QHash < QString, QString > &);
00316 static void setParameter (const QByteArray&, const QString&, QHash < QString, QString > &);
00317
00318 QList < mimeHdrLine *> originalHdrLines;
00319
00320 private:
00321 QList < mimeHdrLine *> additionalHdrLines;
00322 QHash < QString, QString > typeList;
00323 QHash < QString, QString > dispositionList;
00324 QByteArray _contentType;
00325 QByteArray _contentDisposition;
00326 QByteArray _contentEncoding;
00327 QByteArray _contentDescription;
00328 QByteArray _contentID;
00329 QByteArray _contentMD5;
00330 unsigned int contentLength;
00331 QByteArray mimeContent;
00332 QByteArray preMultipartBody;
00333 QByteArray postMultipartBody;
00334 mimeHeader *nestedMessage;
00335 QList < mimeHeader *> nestedParts;
00336 QString partSpecifier;
00337
00338 };
00339
00340 #endif