• Skip to content
  • Skip to link menu
KDE 4.3 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

KMIME Library

kmime_message.cpp

00001 /*
00002     kmime_message.cpp
00003 
00004     KMime, the KDE internet mail/usenet news message library.
00005     Copyright (c) 2001 the KMime authors.
00006     See file AUTHORS for details
00007 
00008     This library is free software; you can redistribute it and/or
00009     modify it under the terms of the GNU Library General Public
00010     License as published by the Free Software Foundation; either
00011     version 2 of the License, or (at your option) any later version.
00012 
00013     This library is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016     Library General Public License for more details.
00017 
00018     You should have received a copy of the GNU Library General Public License
00019     along with this library; see the file COPYING.LIB.  If not, write to
00020     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00021     Boston, MA 02110-1301, USA.
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   //Message-ID
00059   if ( ( h = messageID( false ) ) != 0 && !h->isEmpty() ) {
00060     newHead += h->as7BitString() + '\n';
00061     KMime::removeHeader( d->head, h->type() );
00062   }
00063 
00064   //From
00065   h = from(); // "From" is mandatory
00066   if ( !h->isEmpty() ) {
00067     newHead += h->as7BitString() + '\n';
00068     KMime::removeHeader( d->head, h->type() );
00069   }
00070 
00071   //Subject
00072   h = subject(); // "Subject" is mandatory
00073   if ( !h->isEmpty() ) {
00074     newHead += h->as7BitString() + '\n';
00075     KMime::removeHeader( d->head, h->type() );
00076   }
00077 
00078   //To
00079   if ( ( h = to( false )) != 0 && !h->isEmpty() ) {
00080     newHead += h->as7BitString() + '\n';
00081     KMime::removeHeader( d->head, h->type() );
00082   }
00083 
00084   //Cc
00085   if ( ( h = cc( false )) != 0 && !h->isEmpty() ) {
00086     newHead += h->as7BitString() + '\n';
00087     KMime::removeHeader( d->head, h->type() );
00088   }
00089 
00090   //Reply-To
00091   if ( ( h = replyTo( false )) != 0 && !h->isEmpty() ) {
00092     newHead += h->as7BitString() + '\n';
00093     KMime::removeHeader( d->head, h->type() );
00094   }
00095 
00096   //Date
00097   h = date(); // "Date" is mandatory
00098   if ( !h->isEmpty() ) {
00099     newHead += h->as7BitString() + '\n';
00100     KMime::removeHeader( d->head, h->type() );
00101   }
00102 
00103   //References
00104   if ( ( h = references( false )) != 0 && !h->isEmpty() ) {
00105     newHead += h->as7BitString() + '\n';
00106     KMime::removeHeader( d->head, h->type() );
00107   }
00108 
00109   //Organization
00110   if ( ( h = organization( false )) != 0 && !h->isEmpty() ) {
00111     newHead += h->as7BitString() + '\n';
00112     KMime::removeHeader( d->head, h->type() );
00113   }
00114 
00115   //UserAgent
00116   if ( ( h = userAgent( false )) != 0 && !h->isEmpty() ) {
00117     newHead += h->as7BitString() + '\n';
00118     KMime::removeHeader( d->head, h->type() );
00119   }
00120 
00121   // In-Reply-To
00122   if ( ( h = inReplyTo( false ) ) != 0 && !h->isEmpty() ) {
00123     newHead += h->as7BitString() + '\n';
00124     KMime::removeHeader( d->head, h->type() );
00125   }
00126 
00127   //Mime-Version
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     // not a multipart message
00226     if ( !c->contentType()->isMultipart() ) {
00227       if ( c->contentType()->mimeType() == type || type.isEmpty() ) {
00228         return c;
00229       }
00230       return 0;
00231     }
00232 
00233     // empty multipart
00234     if ( c->contents().count() == 0 ) {
00235       return 0;
00236     }
00237 
00238     // multipart/alternative
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 // @cond PRIVATE
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 // @endcond
00278 
00279 }
00280 

KMIME Library

Skip menu "KMIME Library"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members
  • Related Pages

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  • kabc
  • kblog
  • kcal
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  • kldap
  • kmime
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.6.1
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal