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 newHead += h->as7BitString() + '\n';
00067 KMime::removeHeader( d->head, h->type() );
00068
00069
00070 h = subject();
00071 newHead += h->as7BitString() + '\n';
00072 KMime::removeHeader( d->head, h->type() );
00073
00074
00075 if ( ( h = to( false )) != 0 && !h->isEmpty() ) {
00076 newHead += h->as7BitString() + '\n';
00077 KMime::removeHeader( d->head, h->type() );
00078 }
00079
00080
00081 if ( ( h = cc( false )) != 0 && !h->isEmpty() ) {
00082 newHead += h->as7BitString() + '\n';
00083 KMime::removeHeader( d->head, h->type() );
00084 }
00085
00086
00087 if ( ( h = replyTo( false )) != 0 && !h->isEmpty() ) {
00088 newHead += h->as7BitString() + '\n';
00089 KMime::removeHeader( d->head, h->type() );
00090 }
00091
00092
00093 h = date();
00094 newHead += h->as7BitString() + '\n';
00095 KMime::removeHeader( d->head, h->type() );
00096
00097
00098 if ( ( h = references( false )) != 0 && !h->isEmpty() ) {
00099 newHead += h->as7BitString() + '\n';
00100 KMime::removeHeader( d->head, h->type() );
00101 }
00102
00103
00104 if ( ( h = organization( false )) != 0 && !h->isEmpty() ) {
00105 newHead += h->as7BitString() + '\n';
00106 KMime::removeHeader( d->head, h->type() );
00107 }
00108
00109
00110 if ( ( h = userAgent( false )) != 0 && !h->isEmpty() ) {
00111 newHead += h->as7BitString() + '\n';
00112 KMime::removeHeader( d->head, h->type() );
00113 }
00114
00115
00116 if ( ( h = inReplyTo( false ) ) != 0 && !h->isEmpty() ) {
00117 newHead += h->as7BitString() + '\n';
00118 KMime::removeHeader( d->head, h->type() );
00119 }
00120
00121
00122 newHead += "MIME-Version: 1.0\n";
00123 KMime::removeHeader( d->head, "MIME-Version" );
00124
00125 return newHead + Content::assembleHeaders();
00126 }
00127
00128 void Message::clear()
00129 {
00130 Q_D(Message);
00131 d->subject.clear();
00132 d->date.clear();
00133 Content::clear();
00134 }
00135
00136 Headers::Base *Message::getHeaderByType( const char *type )
00137 {
00138 Q_D(Message);
00139 if ( strcasecmp( "Subject", type ) == 0 ) {
00140 if ( d->subject.isEmpty() ) {
00141 return 0;
00142 } else {
00143 return &d->subject;
00144 }
00145 }
00146 else if ( strcasecmp("Date", type ) == 0 ){
00147 if ( d->date.isEmpty() ) {
00148 return 0;
00149 } else {
00150 return &d->date;
00151 }
00152 } else {
00153 return Content::getHeaderByType( type );
00154 }
00155 }
00156
00157 void Message::setHeader( Headers::Base *h )
00158 {
00159 Q_D(Message);
00160 bool del = true;
00161 if ( h->is( "Subject" ) ) {
00162 d->subject.fromUnicodeString( h->asUnicodeString(), h->rfc2047Charset() );
00163 } else if ( h->is( "Date" ) ) {
00164 d->date.setDateTime( (static_cast<Headers::Date*>( h))->dateTime() );
00165 } else {
00166 del = false;
00167 Content::setHeader( h );
00168 }
00169
00170 if ( del ) delete h;
00171 }
00172
00173 bool Message::removeHeader( const char *type )
00174 {
00175 Q_D(Message);
00176 if ( strcasecmp( "Subject", type ) == 0 ) {
00177 d->subject.clear();
00178 } else if ( strcasecmp( "Date", type ) == 0 ) {
00179 d->date.clear();
00180 } else {
00181 return Content::removeHeader( type );
00182 }
00183
00184 return true;
00185 }
00186
00187 Headers::Subject *Message::subject( bool create )
00188 {
00189 Q_D( Message );
00190 if ( !create && d->subject.isEmpty() ) {
00191 return 0;
00192 }
00193 return &d->subject;
00194 }
00195
00196 Headers::Date *Message::date( bool create )
00197 {
00198 Q_D( Message );
00199 if ( !create && d->date.isEmpty() ) {
00200 return 0;
00201 }
00202 return &d->date;
00203 }
00204
00205 bool Message::isTopLevel() const
00206 {
00207 return true;
00208 }
00209
00210 Content *Message::mainBodyPart( const QByteArray &type )
00211 {
00212 KMime::Content *c = this;
00213 while ( c ) {
00214
00215 if ( !c->contentType()->isMultipart() ) {
00216 if ( c->contentType()->mimeType() == type || type.isEmpty() ) {
00217 return c;
00218 }
00219 return 0;
00220 }
00221
00222
00223 if ( c->contents().count() == 0 ) {
00224 return 0;
00225 }
00226
00227
00228 if ( c->contentType()->subType() == "alternative" ) {
00229 if ( type.isEmpty() ) {
00230 return c->contents().first();
00231 }
00232 foreach ( Content *c1, c->contents() ) {
00233 if ( c1->contentType()->mimeType() == type ) {
00234 return c1;
00235 }
00236 }
00237 return 0;
00238 }
00239
00240 c = c->contents().first();
00241 }
00242
00243 return 0;
00244 }
00245
00246
00247 #define kmime_mk_header_accessor( header, method ) \
00248 Headers::header *Message::method( bool create ) { \
00249 Headers::header *p = 0; \
00250 return getHeaderInstance( p, create ); \
00251 }
00252
00253 kmime_mk_header_accessor( MessageID, messageID )
00254 kmime_mk_header_accessor( Organization, organization )
00255 kmime_mk_header_accessor( From, from )
00256 kmime_mk_header_accessor( ReplyTo, replyTo )
00257 kmime_mk_header_accessor( To, to )
00258 kmime_mk_header_accessor( Cc, cc )
00259 kmime_mk_header_accessor( Bcc, bcc )
00260 kmime_mk_header_accessor( References, references )
00261 kmime_mk_header_accessor( UserAgent, userAgent )
00262 kmime_mk_header_accessor( InReplyTo, inReplyTo )
00263 kmime_mk_header_accessor( Sender, sender )
00264
00265 #undef kmime_mk_header_accessor
00266
00267
00268 }
00269