You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
5.5 KiB
171 lines
5.5 KiB
/*
|
|
kmime_content.h
|
|
|
|
KMime, the KDE internet mail/usenet news message library.
|
|
Copyright (c) 2001 the KMime authors.
|
|
See file AUTHORS for details
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software Foundation,
|
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
|
|
*/
|
|
#ifndef __KMIME_CONTENT_H__
|
|
#define __KMIME_CONTENT_H__
|
|
|
|
//forward declarations
|
|
#if 0
|
|
class KMime::Headers::Base;
|
|
class KMime::Headers::Generic;
|
|
class KMime::Headers::ContentType;
|
|
class KMime::Headers::CTEncoding;
|
|
class KMime::Headers::CDisposition;
|
|
class KMime::Headers::List;
|
|
#endif
|
|
|
|
#include "kmime_util.h"
|
|
#include "kmime_headers.h"
|
|
|
|
#include <qtextstream.h>
|
|
|
|
namespace KMime {
|
|
|
|
|
|
/** Base class for messages in mime format
|
|
It contains all the enums, static functions
|
|
and parser-classes, that are needed for
|
|
mime handling */
|
|
|
|
class Base {
|
|
|
|
public:
|
|
|
|
//enums
|
|
enum articleType { ATmimeContent,
|
|
ATremote,
|
|
ATlocal };
|
|
|
|
};
|
|
|
|
|
|
/** This class encapsulates a mime-encoded content.
|
|
It parses the given data and creates a tree-like
|
|
structure, that represents the structure of the
|
|
message */
|
|
|
|
class KDE_EXPORT Content : public Base {
|
|
|
|
public:
|
|
typedef QPtrList<KMime::Content> List;
|
|
|
|
Content();
|
|
Content(const QCString &h, const QCString &b);
|
|
virtual ~Content();
|
|
|
|
//type
|
|
virtual articleType type() { return ATmimeContent; }
|
|
|
|
//content handling
|
|
bool hasContent() { return ( !h_ead.isEmpty() && (!b_ody.isEmpty() || (c_ontents && !c_ontents->isEmpty())) ); }
|
|
void setContent(QStrList *l);
|
|
void setContent(const QCString &s);
|
|
virtual void parse();
|
|
virtual void assemble();
|
|
virtual void clear();
|
|
|
|
//header access
|
|
QCString head() { return h_ead; }
|
|
// extracts and removes the next header from head. The caller has to delete the returned header;
|
|
Headers::Generic* getNextHeader(QCString &head);
|
|
virtual Headers::Base* getHeaderByType(const char *type);
|
|
virtual void setHeader(Headers::Base *h);
|
|
virtual bool removeHeader(const char *type);
|
|
bool hasHeader(const char *type) { return (getHeaderByType(type)!=0); }
|
|
Headers::ContentType* contentType(bool create=true) { Headers::ContentType *p=0; return getHeaderInstance(p, create); }
|
|
Headers::CTEncoding* contentTransferEncoding(bool create=true) { Headers::CTEncoding *p=0; return getHeaderInstance(p, create); }
|
|
Headers::CDisposition* contentDisposition(bool create=true) { Headers::CDisposition *p=0; return getHeaderInstance(p, create); }
|
|
Headers::CDescription* contentDescription(bool create=true) { Headers::CDescription *p=0; return getHeaderInstance(p, create); }
|
|
|
|
//content access
|
|
int size();
|
|
int storageSize();
|
|
int lineCount();
|
|
QCString body() { return b_ody; }
|
|
void setBody( const QCString & str ) { b_ody = str; }
|
|
QCString encodedContent(bool useCrLf=false);
|
|
QByteArray decodedContent();
|
|
void decodedText(QString &s, bool trimText=false,
|
|
bool removeTrailingNewlines=false);
|
|
void decodedText(QStringList &s, bool trimText=false,
|
|
bool removeTrailingNewlines=false);
|
|
void fromUnicodeString(const QString &s);
|
|
|
|
Content* textContent();
|
|
void attachments(List *dst, bool incAlternatives=false);
|
|
void addContent(Content *c, bool prepend=false);
|
|
void removeContent(Content *c, bool del=false);
|
|
void changeEncoding(Headers::contentEncoding e);
|
|
|
|
//saves the encoded content to the given textstream
|
|
// scrambleFromLines: replace "\nFrom " with "\n>From ", this is
|
|
// needed to avoid problem with mbox-files
|
|
void toStream(QTextStream &ts, bool scrambleFromLines=false);
|
|
|
|
// this charset is used for all headers and the body
|
|
// if the charset is not declared explictly
|
|
QCString defaultCharset() { return QCString(d_efaultCS); }
|
|
void setDefaultCharset(const QCString &cs);
|
|
|
|
// use the default charset even if a different charset is
|
|
// declared in the article
|
|
bool forceDefaultCS() { return f_orceDefaultCS; }
|
|
|
|
// enables/disables the force mode, housekeeping.
|
|
// works correctly only when the article is completely empty or
|
|
// completely loaded
|
|
virtual void setForceDefaultCS(bool b);
|
|
|
|
|
|
protected:
|
|
QCString rawHeader(const char *name);
|
|
bool decodeText();
|
|
template <class T> T* getHeaderInstance(T *ptr, bool create);
|
|
|
|
QCString h_ead,
|
|
b_ody;
|
|
List *c_ontents;
|
|
Headers::Base::List *h_eaders;
|
|
const char *d_efaultCS;
|
|
bool f_orceDefaultCS;
|
|
|
|
};
|
|
|
|
// some compilers (for instance Compaq C++) need template inline functions
|
|
// here rather than in the *.cpp file
|
|
|
|
template <class T> T* Content::getHeaderInstance(T *ptr, bool create)
|
|
{
|
|
T dummy; //needed to access virtual member T::type()
|
|
|
|
ptr=static_cast <T*> (getHeaderByType(dummy.type()));
|
|
if(!ptr && create) { //no such header found, but we need one => create it
|
|
ptr=new T(this);
|
|
if(!(h_eaders)) {
|
|
h_eaders=new Headers::Base::List();
|
|
h_eaders->setAutoDelete(true);
|
|
}
|
|
h_eaders->append(ptr);
|
|
}
|
|
|
|
return ptr;
|
|
}
|
|
|
|
|
|
|
|
} // namespace KMime
|
|
|
|
#endif // __KMIME_CONTENT_H__
|