KMIME Library
kmime_message.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "kmime_message.h"
00025 #include "kmime_message_p.h"
00026 #include "kmime_util_p.h"
00027
00028 using namespace KMime;
00029
00030 namespace KMime {
00031
00032 Message::Message() : Content( new MessagePrivate( this ) ) {}
00033
00034 Message::Message(MessagePrivate * d) : Content( d ) {}
00035
00036 Message::~Message()
00037 {}
00038
00039 void Message::parse()
00040 {
00041 Q_D(Message);
00042 Content::parse();
00043
00044 QByteArray raw;
00045 if ( !( raw = rawHeader( d->subject.type() ) ).isEmpty() )
00046 d->subject.from7BitString( raw );
00047
00048 if ( !( raw = rawHeader( d->date.type() ) ).isEmpty() )
00049 d->date.from7BitString( raw );
00050 }
00051
00052 QByteArray Message::assembleHeaders()
00053 {
00054 Q_D(Message);
00055 Headers::Base *h;
00056 QByteArray newHead;
00057
00058
00059 if ( ( h = messageID( false ) ) != 0 && !h->isEmpty() ) {
00060 newHead += h->as7BitString() + '\n';
00061 KMime::removeHeader( d->head, h->type() );
00062 }
00063
00064
00065 h = from();
00066 if ( !h->isEmpty() ) {
00067 newHead += h->as7BitString() + '\n';
00068 KMime::removeHeader( d->head, h->type() );
00069 }
00070
00071
00072 h = subject();
00073 if ( !h->isEmpty() ) {
00074 newHead += h->as7BitString() + '\n';
00075 KMime::removeHeader( d->head, h->type() );
00076 }
00077
00078
00079 if ( ( h = to( false )) != 0 && !h->isEmpty() ) {
00080 newHead += h->as7BitString() + '\n';
00081 KMime::removeHeader( d->head, h->type() );
00082 }
00083
00084
00085 if ( ( h = cc( false )) != 0 && !h->isEmpty() ) {
00086 newHead += h->as7BitString() + '\n';
00087 KMime::removeHeader( d->head, h->type() );
00088 }
00089
00090
00091 if ( ( h = replyTo( false )) != 0 && !h->isEmpty() ) {
00092 newHead += h->as7BitString() + '\n';
00093 KMime::removeHeader( d->head, h->type() );
00094 }
00095
00096
00097 h = date();
00098 if ( !h->isEmpty() ) {
00099 newHead += h->as7BitString() + '\n';
00100 KMime::removeHeader( d->head, h->type() );
00101 }
00102
00103
00104 if ( ( h = references( false )) != 0 && !h->isEmpty() ) {
00105 newHead += h->as7BitString() + '\n';
00106 KMime::removeHeader( d->head, h->type() );
00107 }
00108
00109
00110 if ( ( h = organization( false )) != 0 && !h->isEmpty() ) {
00111 newHead += h->as7BitString() + '\n';
00112 KMime::removeHeader( d->head, h->type() );
00113 }
00114
00115
00116 if ( ( h = userAgent( false )) != 0 && !h->isEmpty() ) {
00117 newHead += h->as7BitString() + '\n';
00118 KMime::removeHeader( d->head, h->type() );
00119 }
00120
00121
00122 if ( ( h = inReplyTo( false ) ) != 0 && !h->isEmpty() ) {
00123 newHead += h->as7BitString() + '\n';
00124 KMime::removeHeader( d->head, h->type() );
00125 }
00126
00127
00128 newHead += "MIME-Version: 1.0\n";
00129 KMime::removeHeader( d->head, "MIME-Version" );
00130
00131 return newHead + Content::assembleHeaders();
00132 }
00133
00134 void Message::clear()
00135 {
00136 Q_D(Message);
00137 d->subject.clear();
00138 d->date.clear();
00139 Content::clear();
00140 }
00141
00142 Headers::Base *Message::getHeaderByType( const char *type )
00143 {
00144 return headerByType( type );
00145 }
00146
00147 Headers::Base *Message::headerByType( const char *type )
00148 {
00149 Q_D(Message);
00150 if ( strcasecmp( "Subject", type ) == 0 ) {
00151 if ( d->subject.isEmpty() ) {
00152 return 0;
00153 } else {
00154 return &d->subject;
00155 }
00156 }
00157 else if ( strcasecmp("Date", type ) == 0 ){
00158 if ( d->date.isEmpty() ) {
00159 return 0;
00160 } else {
00161 return &d->date;
00162 }
00163 } else {
00164 return Content::headerByType( type );
00165 }
00166 }
00167
00168 void Message::setHeader( Headers::Base *h )
00169 {
00170 Q_D(Message);
00171 bool del = true;
00172 if ( h->is( "Subject" ) ) {
00173 d->subject.fromUnicodeString( h->asUnicodeString(), h->rfc2047Charset() );
00174 } else if ( h->is( "Date" ) ) {
00175 d->date.setDateTime( ( static_cast<Headers::Date*>( h ) )->dateTime() );
00176 } else {
00177 del = false;
00178 Content::setHeader( h );
00179 }
00180
00181 if ( del ) delete h;
00182 }
00183
00184 bool Message::removeHeader( const char *type )
00185 {
00186 Q_D(Message);
00187 if ( strcasecmp( "Subject", type ) == 0 ) {
00188 d->subject.clear();
00189 } else if ( strcasecmp( "Date", type ) == 0 ) {
00190 d->date.clear();
00191 } else {
00192 return Content::removeHeader( type );
00193 }
00194
00195 return true;
00196 }
00197
00198 Headers::Subject *Message::subject( bool create )
00199 {
00200 Q_D( Message );
00201 if ( !create && d->subject.isEmpty() ) {
00202 return 0;
00203 }
00204 return &d->subject;
00205 }
00206
00207 Headers::Date *Message::date( bool create )
00208 {
00209 Q_D( Message );
00210 if ( !create && d->date.isEmpty() ) {
00211 return 0;
00212 }
00213 return &d->date;
00214 }
00215
00216 bool Message::isTopLevel() const
00217 {
00218 return true;
00219 }
00220
00221 Content *Message::mainBodyPart( const QByteArray &type )
00222 {
00223 KMime::Content *c = this;
00224 while ( c ) {
00225
00226 if ( !c->contentType()->isMultipart() ) {
00227 if ( c->contentType()->mimeType() == type || type.isEmpty() ) {
00228 return c;
00229 }
00230 return 0;
00231 }
00232
00233
00234 if ( c->contents().count() == 0 ) {
00235 return 0;
00236 }
00237
00238
00239 if ( c->contentType()->subType() == "alternative" ) {
00240 if ( type.isEmpty() ) {
00241 return c->contents().first();
00242 }
00243 foreach ( Content *c1, c->contents() ) {
00244 if ( c1->contentType()->mimeType() == type ) {
00245 return c1;
00246 }
00247 }
00248 return 0;
00249 }
00250
00251 c = c->contents().first();
00252 }
00253
00254 return 0;
00255 }
00256
00257
00258 #define kmime_mk_header_accessor( header, method ) \
00259 Headers::header *Message::method( bool create ) { \
00260 Headers::header *p = 0; \
00261 return headerInstance( p, create ); \
00262 }
00263
00264 kmime_mk_header_accessor( MessageID, messageID )
00265 kmime_mk_header_accessor( Organization, organization )
00266 kmime_mk_header_accessor( From, from )
00267 kmime_mk_header_accessor( ReplyTo, replyTo )
00268 kmime_mk_header_accessor( To, to )
00269 kmime_mk_header_accessor( Cc, cc )
00270 kmime_mk_header_accessor( Bcc, bcc )
00271 kmime_mk_header_accessor( References, references )
00272 kmime_mk_header_accessor( UserAgent, userAgent )
00273 kmime_mk_header_accessor( InReplyTo, inReplyTo )
00274 kmime_mk_header_accessor( Sender, sender )
00275
00276 #undef kmime_mk_header_accessor
00277
00278
00279 }
00280