KMIME Library
kmime_newsarticle.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_newsarticle.h"
00025 #include "kmime_message_p.h"
00026 #include "kmime_util_p.h"
00027
00028 using namespace KMime;
00029
00030 namespace KMime {
00031
00032 class NewsArticlePrivate : public MessagePrivate
00033 {
00034 public:
00035 NewsArticlePrivate( NewsArticle *q ) : MessagePrivate( q )
00036 {
00037 lines.setParent( q );
00038 }
00039
00040 KMime::Headers::Lines lines;
00041
00042 Q_DECLARE_PUBLIC(NewsArticle)
00043 };
00044
00045 NewsArticle::NewsArticle() : Message( new NewsArticlePrivate( this ) ) {}
00046
00047 NewsArticle::~NewsArticle() {}
00048
00049 void NewsArticle::parse()
00050 {
00051 Q_D(NewsArticle);
00052 Message::parse();
00053
00054 QByteArray raw;
00055
00056 if ( !( raw = rawHeader( d->lines.type() ) ).isEmpty() )
00057 d->lines.from7BitString( raw );
00058 }
00059
00060 QByteArray NewsArticle::assembleHeaders()
00061 {
00062 Q_D(NewsArticle);
00063 Headers::Base *h;
00064 QByteArray newHead;
00065
00066
00067 if ( ( h = control( false ) ) != 0 && !h->isEmpty() ) {
00068 newHead += h->as7BitString() + '\n';
00069 KMime::removeHeader( d->head, h->type() );
00070 }
00071
00072
00073 if ( ( h = supersedes( false ) ) != 0 && !h->isEmpty() ) {
00074 newHead += h->as7BitString() + '\n';
00075 KMime::removeHeader( d->head, h->type() );
00076 }
00077
00078
00079 if ( ( h = newsgroups( false ) ) != 0 && !h->isEmpty() ) {
00080 newHead += h->as7BitString() + '\n';
00081 KMime::removeHeader( d->head, h->type() );
00082 }
00083
00084
00085 if ( ( h = followUpTo( false ) ) != 0 && !h->isEmpty() ) {
00086 newHead+=h->as7BitString() + '\n';
00087 KMime::removeHeader( d->head, h->type() );
00088 }
00089
00090
00091 if ( ( h = mailCopiesTo( false ) ) != 0 && !h->isEmpty() ) {
00092 newHead += h->as7BitString() + '\n';
00093 KMime::removeHeader( d->head, h->type() );
00094 }
00095
00096
00097 h = lines();
00098 newHead += h->as7BitString() + '\n';
00099 KMime::removeHeader( d->head, h->type() );
00100
00101 newHead += Message::assembleHeaders();
00102 return newHead;
00103 }
00104
00105 void NewsArticle::clear()
00106 {
00107 Q_D(NewsArticle);
00108 d->lines.clear();
00109 Message::clear();
00110 }
00111
00112 Headers::Base * NewsArticle::getHeaderByType( const char *type )
00113 {
00114 Q_D(NewsArticle);
00115 if ( strcasecmp( "Lines", type ) == 0 ) {
00116 if ( d->lines.isEmpty() ) {
00117 return 0;
00118 } else {
00119 return &d->lines;
00120 }
00121 } else {
00122 return Message::getHeaderByType( type );
00123 }
00124 }
00125
00126 void NewsArticle::setHeader( Headers::Base *h )
00127 {
00128 Q_D(NewsArticle);
00129 bool del = true;
00130 if ( h->is( "Lines" ) ) {
00131 d->lines.setNumberOfLines( (static_cast<Headers::Lines*>(h))->numberOfLines() );
00132 } else {
00133 del = false;
00134 Message::setHeader( h );
00135 }
00136
00137 if ( del ) delete h;
00138 }
00139
00140 bool NewsArticle::removeHeader( const char *type )
00141 {
00142 Q_D(NewsArticle);
00143 if ( strcasecmp( "Lines", type ) == 0 ) {
00144 d->lines.clear();
00145 } else {
00146 return Message::removeHeader( type );
00147 }
00148
00149 return true;
00150 }
00151
00152 Headers::Lines* NewsArticle::lines(bool create)
00153 {
00154 Q_D(NewsArticle);
00155 if ( !create && d->lines.isEmpty() )
00156 return 0;
00157 return &d->lines;
00158 }
00159
00160
00161 #define kmime_mk_header_accessor( header, method ) \
00162 Headers::header* NewsArticle::method( bool create ) { \
00163 Headers::header *p = 0; \
00164 return getHeaderInstance( p, create ); \
00165 }
00166
00167 kmime_mk_header_accessor( Control, control )
00168 kmime_mk_header_accessor( Supersedes, supersedes )
00169 kmime_mk_header_accessor( MailCopiesTo, mailCopiesTo )
00170 kmime_mk_header_accessor( Newsgroups, newsgroups )
00171 kmime_mk_header_accessor( FollowUpTo, followUpTo )
00172
00173 #undef kmime_mk_header_accessor
00174
00175
00176 }