9594fb6fee
git-svn-id: http://voip.null.ro/svn/yate@1410 acf43c95-373e-0410-b603-e72c3f656dc1
385 lines
9.9 KiB
C++
385 lines
9.9 KiB
C++
/*
|
|
* yatemime.h
|
|
* This file is part of the YATE Project http://YATE.null.ro
|
|
*
|
|
* MIME types, body codecs and related functions
|
|
*
|
|
* Yet Another Telephony Engine - a fully featured software PBX and IVR
|
|
* Copyright (C) 2004-2006 Null Team
|
|
*
|
|
* 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.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* 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 St, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef __YATEMIME_H
|
|
#define __YATEMIME_H
|
|
|
|
#ifndef __cplusplus
|
|
#error C++ is required
|
|
#endif
|
|
|
|
#include <yateclass.h>
|
|
|
|
/**
|
|
* Holds all Telephony Engine related classes.
|
|
*/
|
|
namespace TelEngine {
|
|
|
|
/**
|
|
* Abstract base class for holding Multipurpose Internet Mail Extensions data
|
|
* @short Abstract MIME data holder
|
|
*/
|
|
class YATE_API MimeBody : public GenObject
|
|
{
|
|
public:
|
|
/**
|
|
* Destructor
|
|
*/
|
|
virtual ~MimeBody();
|
|
|
|
/**
|
|
* RTTI method, get a pointer to a derived class given that class name
|
|
* @param name Name of the class we are asking for
|
|
* @return Pointer to the requested class or NULL if this object doesn't implement it
|
|
*/
|
|
virtual void* getObject(const String& name) const;
|
|
|
|
/**
|
|
* Retrive the MIME type of this body
|
|
* @return Name of the MIME type/subtype
|
|
*/
|
|
inline const String& getType() const
|
|
{ return m_type; }
|
|
|
|
/**
|
|
* Retrive the binary encoding of this MIME body
|
|
* @return Block of binary data
|
|
*/
|
|
const DataBlock& getBody() const;
|
|
|
|
/**
|
|
* Check if this body is an Session Description Protocol
|
|
* @return True if this body holds a SDP
|
|
*/
|
|
virtual bool isSDP() const
|
|
{ return false; }
|
|
|
|
/**
|
|
* Check if this body is multipart (can hold other MIME bodies)
|
|
* @return True if this body is multipart
|
|
*/
|
|
virtual bool isMultipart() const
|
|
{ return false; }
|
|
|
|
/**
|
|
* Duplicate this MIME body
|
|
* @return Copy of this MIME body
|
|
*/
|
|
virtual MimeBody* clone() const = 0;
|
|
|
|
/**
|
|
* Method to build a MIME body from a type and data buffer
|
|
* @param buf Pointer to buffer of data
|
|
* @param len Length of data in buffer
|
|
* @param type Name of the MIME type/subtype, must be lower case
|
|
* @return Newly allocated MIME body or NULL if type is unknown
|
|
*/
|
|
static MimeBody* build(const char* buf, int len, const String& type);
|
|
|
|
/**
|
|
* Utility method, returns an unfolded line and advances the pointer
|
|
* @param buf Reference to pointer to start of buffer data
|
|
* @param len Reference to variable holding buffer length
|
|
* @return Newly allocated String holding the line of text
|
|
*/
|
|
static String* getUnfoldedLine(const char*& buf, int& len);
|
|
|
|
protected:
|
|
/**
|
|
* Constructor to be used only by derived classes
|
|
* @param type Name of the MIME type/subtype, must be lower case
|
|
*/
|
|
MimeBody(const String& type);
|
|
|
|
/**
|
|
* Method that is called internally to build the binary encoded body
|
|
*/
|
|
virtual void buildBody() const = 0;
|
|
|
|
/**
|
|
* Block of binary data that @ref buildBody() must fill
|
|
*/
|
|
mutable DataBlock m_body;
|
|
|
|
private:
|
|
String m_type;
|
|
};
|
|
|
|
/**
|
|
* An object holding the lines of an application/sdp MIME type
|
|
* @short MIME for application/sdp
|
|
*/
|
|
class YATE_API MimeSdpBody : public MimeBody
|
|
{
|
|
public:
|
|
/**
|
|
* Default constructor, builds an empty application/sdp
|
|
*/
|
|
MimeSdpBody();
|
|
|
|
/**
|
|
* Constructor from block of data
|
|
* @param buf Pointer to buffer of data
|
|
* @param len Length of data in buffer
|
|
* @param type Name of the MIME type/subtype, should be "application/sdp"
|
|
*/
|
|
MimeSdpBody(const String& type, const char* buf, int len);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
virtual ~MimeSdpBody();
|
|
|
|
/**
|
|
* RTTI method, get a pointer to a derived class given that class name
|
|
* @param name Name of the class we are asking for
|
|
* @return Pointer to the requested class or NULL if this object doesn't implement it
|
|
*/
|
|
virtual void* getObject(const String& name) const;
|
|
|
|
/**
|
|
* Override that checks if this body is an Session Description Protocol
|
|
* @return True, since this body holds a SDP
|
|
*/
|
|
virtual bool isSDP() const
|
|
{ return true; }
|
|
|
|
/**
|
|
* Duplicate this MIME body
|
|
* @return Copy of this MIME body - a new MimeSdpBody
|
|
*/
|
|
virtual MimeBody* clone() const;
|
|
|
|
/**
|
|
* Retrive the lines hold in data
|
|
* @return List of NamedStrings
|
|
*/
|
|
inline const ObjList& lines() const
|
|
{ return m_lines; }
|
|
|
|
/**
|
|
* Append a new name=value line of SDP data
|
|
* @param name Name of the line, should be one character
|
|
* @param value Text of the line
|
|
*/
|
|
inline void addLine(const char* name, const char* value = 0)
|
|
{ m_lines.append(new NamedString(name,value)); }
|
|
|
|
/**
|
|
* Retrive the first line matching a name
|
|
* @param name Name of the line to search
|
|
* @return First instance of the searched name or NULL if none present
|
|
*/
|
|
const NamedString* getLine(const char* name) const;
|
|
|
|
/**
|
|
* Retrive the next line of the same type as the current
|
|
* @param line Current line
|
|
* @return Next instance of same name or NULL if no more
|
|
*/
|
|
const NamedString* getNextLine(const NamedString* line) const;
|
|
|
|
protected:
|
|
/**
|
|
* Copy constructor
|
|
*/
|
|
MimeSdpBody(const MimeSdpBody& original);
|
|
|
|
/**
|
|
* Override that is called internally to build the binary encoded body
|
|
*/
|
|
virtual void buildBody() const;
|
|
|
|
private:
|
|
ObjList m_lines;
|
|
};
|
|
|
|
/**
|
|
* An object holding a binary block of MIME data
|
|
* @short MIME for obscure binary data
|
|
*/
|
|
class YATE_API MimeBinaryBody : public MimeBody
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor from block of data
|
|
* @param buf Pointer to buffer of data
|
|
* @param len Length of data in buffer
|
|
* @param type Name of the specific MIME type/subtype
|
|
*/
|
|
MimeBinaryBody(const String& type, const char* buf, int len);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
virtual ~MimeBinaryBody();
|
|
|
|
/**
|
|
* RTTI method, get a pointer to a derived class given that class name
|
|
* @param name Name of the class we are asking for
|
|
* @return Pointer to the requested class or NULL if this object doesn't implement it
|
|
*/
|
|
virtual void* getObject(const String& name) const;
|
|
|
|
/**
|
|
* Duplicate this MIME body
|
|
* @return Copy of this MIME body - a new MimeBinaryBody
|
|
*/
|
|
virtual MimeBody* clone() const;
|
|
|
|
protected:
|
|
/**
|
|
* Copy constructor
|
|
*/
|
|
MimeBinaryBody(const MimeBinaryBody& original);
|
|
|
|
/**
|
|
* Override that is called internally to build the binary encoded body
|
|
*/
|
|
virtual void buildBody() const;
|
|
};
|
|
|
|
/**
|
|
* An object holding MIME data as just one text string
|
|
* @short MIME for one text string
|
|
*/
|
|
class YATE_API MimeStringBody : public MimeBody
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor from block of data
|
|
* @param buf Pointer to buffer of data
|
|
* @param len Length of data in buffer
|
|
* @param type Name of the specific MIME type/subtype
|
|
*/
|
|
MimeStringBody(const String& type, const char* buf, int len = -1);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
virtual ~MimeStringBody();
|
|
|
|
/**
|
|
* RTTI method, get a pointer to a derived class given that class name
|
|
* @param name Name of the class we are asking for
|
|
* @return Pointer to the requested class or NULL if this object doesn't implement it
|
|
*/
|
|
virtual void* getObject(const String& name) const;
|
|
|
|
/**
|
|
* Duplicate this MIME body
|
|
* @return Copy of this MIME body - a new MimeStringBody
|
|
*/
|
|
virtual MimeBody* clone() const;
|
|
|
|
/**
|
|
* Retrive the stored data
|
|
* @return String holding the data text
|
|
*/
|
|
inline const String& text() const
|
|
{ return m_text; }
|
|
|
|
protected:
|
|
/**
|
|
* Copy constructor
|
|
*/
|
|
MimeStringBody(const MimeStringBody& original);
|
|
|
|
/**
|
|
* Override that is called internally to build the binary encoded body
|
|
*/
|
|
virtual void buildBody() const;
|
|
|
|
private:
|
|
String m_text;
|
|
};
|
|
|
|
/**
|
|
* An object holding MIME data as separate text lines
|
|
* @short MIME for multiple text lines
|
|
*/
|
|
class YATE_API MimeLinesBody : public MimeBody
|
|
{
|
|
public:
|
|
/**
|
|
* Constructor from block of data
|
|
* @param buf Pointer to buffer of data
|
|
* @param len Length of data in buffer
|
|
* @param type Name of the specific MIME type/subtype
|
|
*/
|
|
MimeLinesBody(const String& type, const char* buf, int len);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
virtual ~MimeLinesBody();
|
|
|
|
/**
|
|
* RTTI method, get a pointer to a derived class given that class name
|
|
* @param name Name of the class we are asking for
|
|
* @return Pointer to the requested class or NULL if this object doesn't implement it
|
|
*/
|
|
virtual void* getObject(const String& name) const;
|
|
|
|
/**
|
|
* Duplicate this MIME body
|
|
* @return Copy of this MIME body - a new MimeLinesBody
|
|
*/
|
|
virtual MimeBody* clone() const;
|
|
|
|
/**
|
|
* Retrive the stored lines of text
|
|
* @return List of Strings
|
|
*/
|
|
inline const ObjList& lines() const
|
|
{ return m_lines; }
|
|
|
|
/**
|
|
* Append a line of text to the data
|
|
* @param line Text to append
|
|
*/
|
|
inline void addLine(const char* line)
|
|
{ m_lines.append(new String(line)); }
|
|
|
|
protected:
|
|
/**
|
|
* Copy constructor
|
|
*/
|
|
MimeLinesBody(const MimeLinesBody& original);
|
|
|
|
/**
|
|
* Override that is called internally to build the binary encoded body
|
|
*/
|
|
virtual void buildBody() const;
|
|
|
|
private:
|
|
ObjList m_lines;
|
|
};
|
|
|
|
}; // namespace TelEngine
|
|
|
|
#endif /* __YATEMIME_H */
|
|
|
|
/* vi: set ts=8 sw=4 sts=4 noet: */
|