00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef PTLIB_PMIME_H
00032 #define PTLIB_PMIME_H
00033
00034 #ifdef P_USE_PRAGMA
00035 #pragma interface
00036 #endif
00037
00038 #include <ptclib/inetprot.h>
00039 #include <ptclib/cypher.h>
00040
00041
00042 class PMultiPartList;
00043
00044
00046
00047
00052 class PMIMEInfo : public PStringOptions
00053 {
00054 public:
00055 PMIMEInfo() { }
00056
00058 PMIMEInfo(
00059 istream &strm
00060 );
00061 PMIMEInfo(
00062 PInternetProtocol & socket
00063 );
00064 PMIMEInfo(
00065 const PStringToString & dict
00066 );
00067 PMIMEInfo(
00068 const PString & str
00069 );
00070
00071
00072
00076 virtual void PrintOn(
00077 ostream &strm
00078 ) const;
00079
00083 virtual void ReadFrom(
00084 istream &strm
00085 );
00086
00087
00088
00094 PBoolean Read(
00095 PInternetProtocol & socket
00096 );
00097
00103 PBoolean Write(
00104 PInternetProtocol & socket
00105 ) const;
00106
00109 PString AsString() const;
00110
00119 bool AddMIME(
00120 const PString & line
00121 );
00122 bool AddMIME(
00123 const PString & fieldName,
00124 const PString & fieldValue
00125 ) { return InternalAddMIME(fieldName, fieldValue); }
00126 bool AddMIME(
00127 const PMIMEInfo & mime
00128 );
00129
00130 virtual bool InternalAddMIME(
00131 const PString & fieldName,
00132 const PString & fieldValue
00133 );
00134
00164 bool GetComplex(
00165 const char * key,
00166 PStringToString & info
00167 ) const { return ParseComplex(GetString(key), info); }
00168 bool GetComplex(
00169 const PString & key,
00170 PStringToString & info
00171 ) const { return ParseComplex(GetString(key), info); }
00172 bool GetComplex(
00173 const PCaselessString & key,
00174 PStringToString & info
00175 ) const { return ParseComplex(GetString(key), info); }
00176 bool GetComplex(
00177 const PCaselessString & (*key)(),
00178 PStringToString & info
00179 ) const { return ParseComplex(GetString(key), info); }
00180
00182 static bool ParseComplex(
00183 const PString & str,
00184 PStringToString & info
00185 );
00186
00189 bool DecodeMultiPartList(
00190 PMultiPartList & parts,
00191 const PString & body,
00192 const PCaselessString & key
00193 ) const;
00194
00197 bool DecodeMultiPartList(
00198 PMultiPartList & parts,
00199 const PString & body,
00200 const PCaselessString & (*key)() = ContentTypeTag
00201 ) const { return DecodeMultiPartList(parts, body, key()); }
00202
00203
00204 static const PCaselessString & ContentTypeTag();
00205 static const PCaselessString & ContentDispositionTag();
00206 static const PCaselessString & ContentTransferEncodingTag();
00207 static const PCaselessString & ContentDescriptionTag();
00208 static const PCaselessString & ContentIdTag();
00209
00210 static const PCaselessString & TextPlain();
00211
00212
00250 static void SetAssociation(
00251 const PStringToString & allTypes,
00252 PBoolean merge = true
00253 );
00254 static void SetAssociation(
00255 const PString & fileType,
00256 const PString & contentType
00257 ) { GetContentTypes().SetAt(fileType, contentType); }
00258
00266 static PString GetContentType(
00267 const PString & fileType
00268 );
00269
00272 virtual ostream & PrintContents(
00273 ostream & strm
00274 ) const;
00275
00276 private:
00277 static PStringToString & GetContentTypes();
00278 };
00279
00280
00282
00283
00286 class PMultiPartInfo : public PObject
00287 {
00288 PCLASSINFO(PMultiPartInfo, PObject);
00289 public:
00290 PMIMEInfo m_mime;
00291 PString m_textBody;
00292 PBYTEArray m_binaryBody;
00293 };
00294
00295 class PMultiPartList : public PList<PMultiPartInfo>
00296 {
00297 PCLASSINFO(PMultiPartList, PList<PMultiPartInfo>);
00298 public:
00299 PMultiPartList() { }
00300
00301 bool Decode(
00302 const PString & body,
00303 const PStringToString & contentInfo
00304 );
00305 };
00306
00307
00308 #endif // PTLIB_PMIME_H
00309
00310
00311