00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __YATEMIME_H
00026 #define __YATEMIME_H
00027
00028 #ifndef __cplusplus
00029 #error C++ is required
00030 #endif
00031
00032 #include <yateclass.h>
00033
00037 namespace TelEngine {
00038
00044 class YATE_API MimeHeaderLine : public NamedString
00045 {
00046 public:
00055 MimeHeaderLine(const char* name, const String& value, char sep = 0);
00056
00063 MimeHeaderLine(const MimeHeaderLine& original, const char* newName = 0);
00064
00068 virtual ~MimeHeaderLine();
00069
00075 virtual void* getObject(const String& name) const;
00076
00082 virtual MimeHeaderLine* clone(const char* newName = 0) const;
00083
00088 virtual void buildLine(String& line) const;
00089
00094 inline MimeHeaderLine& operator=(const char* value)
00095 { NamedString::operator=(value); return *this; }
00096
00101 inline const ObjList& params() const
00102 { return m_params; }
00103
00108 inline char separator() const
00109 { return m_separator; }
00110
00116 void setParam(const char* name, const char* value = 0);
00117
00122 void delParam(const char* name);
00123
00129 const NamedString* getParam(const char* name) const;
00130
00136 static void addQuotes(String& str, bool force = false);
00137
00143 static void delQuotes(String& str, bool force = false);
00144
00151 static String quote(const String& str, bool force = false);
00152
00159 static String unquote(const String& str, bool force = false);
00160
00168 static int findSep(const char* str, char sep, int offs = 0);
00169
00176 static void buildHeaders(String& buf, const ObjList& headers);
00177
00178 protected:
00179 ObjList m_params;
00180 char m_separator;
00181 private:
00182 void operator=(const MimeHeaderLine&);
00183 };
00184
00189 class YATE_API MimeAuthLine : public MimeHeaderLine
00190 {
00191 public:
00199 MimeAuthLine(const char* name, const String& value);
00200
00207 MimeAuthLine(const MimeAuthLine& original, const char* newName = 0);
00208
00214 virtual void* getObject(const String& name) const;
00215
00221 virtual MimeHeaderLine* clone(const char* newName = 0) const;
00222
00227 virtual void buildLine(String& line) const;
00228 private:
00229 void operator=(const MimeAuthLine&);
00230 };
00231
00239 class YATE_API MimeBody : public GenObject
00240 {
00241 YNOCOPY(MimeBody);
00242 public:
00246 virtual ~MimeBody();
00247
00253 virtual void* getObject(const String& name) const;
00254
00259 inline const MimeHeaderLine& getType() const
00260 { return m_type; }
00261
00267 MimeBody* getFirst(const String& type) const;
00268
00273 inline const ObjList& headers() const
00274 { return m_headers; }
00275
00280 inline void appendHdr(MimeHeaderLine* hdr)
00281 { if (hdr) m_headers.append(hdr); }
00282
00288 inline void removeHdr(MimeHeaderLine* hdr, bool delobj = true)
00289 { if (hdr) m_headers.remove(hdr,delobj); }
00290
00297 MimeHeaderLine* findHdr(const String& name, const MimeHeaderLine* start = 0) const;
00298
00303 inline void buildHeaders(String& buf) {
00304 m_type.buildLine(buf);
00305 buf << "\r\n";
00306 MimeHeaderLine::buildHeaders(buf,m_headers);
00307 }
00308
00317 bool setParam(const char* name, const char* value = 0, const char* header = 0);
00318
00326 bool delParam(const char* name, const char* header = 0);
00327
00335 const NamedString* getParam(const char* name, const char* header = 0) const;
00336
00342 const DataBlock& getBody() const;
00343
00348 inline const DataBlock& body() const
00349 { return m_body; }
00350
00355 virtual bool isSDP() const
00356 { return false; }
00357
00362 virtual bool isMultipart() const
00363 { return false; }
00364
00369 virtual MimeBody* clone() const = 0;
00370
00381 static MimeBody* build(const char* buf, int len, const MimeHeaderLine& type);
00382
00389 static String* getUnfoldedLine(const char*& buf, int& len);
00390
00391 protected:
00397 MimeBody(const String& type);
00398
00405 MimeBody(const MimeHeaderLine& type);
00406
00410 virtual void buildBody() const = 0;
00411
00415 mutable DataBlock m_body;
00416
00420 ObjList m_headers;
00421
00422 private:
00423 MimeHeaderLine m_type;
00424 };
00425
00430 class YATE_API MimeMultipartBody : public MimeBody
00431 {
00432 public:
00440 explicit MimeMultipartBody(const char* subtype = "mixed", const char* boundary = 0);
00441
00448 MimeMultipartBody(const String& type, const char* buf, int len);
00449
00456 MimeMultipartBody(const MimeHeaderLine& type, const char* buf, int len);
00457
00461 virtual ~MimeMultipartBody();
00462
00467 inline const ObjList& bodies() const
00468 { return m_bodies; }
00469
00474 inline void appendBody(MimeBody* body)
00475 { if (body) m_bodies.append(body); }
00476
00482 inline void removeBody(MimeBody* body, bool delobj = true)
00483 { if (body) m_bodies.remove(body,delobj); }
00484
00493 MimeBody* findBody(const String& content, MimeBody** start = 0) const;
00494
00500 virtual void* getObject(const String& name) const;
00501
00506 virtual bool isMultipart() const
00507 { return true; }
00508
00513 virtual MimeBody* clone() const;
00514
00515 protected:
00519 MimeMultipartBody(const MimeMultipartBody& original);
00520
00524 virtual void buildBody() const;
00525
00532 void parse(const char* buf, int len);
00533
00534 private:
00535
00536
00537
00538
00539 int findBoundary(const char*& buf, int& len,
00540 const char* boundary, unsigned int bLen, bool& endBody);
00541
00542
00543
00544
00545
00546 bool getBoundary(String& boundary) const;
00547
00548
00549 ObjList m_bodies;
00550 };
00551
00556 class YATE_API MimeSdpBody : public MimeBody
00557 {
00558 public:
00562 MimeSdpBody();
00563
00570 MimeSdpBody(const String& type, const char* buf, int len);
00571
00578 MimeSdpBody(const MimeHeaderLine& type, const char* buf, int len);
00579
00583 virtual ~MimeSdpBody();
00584
00590 virtual void* getObject(const String& name) const;
00591
00596 virtual bool isSDP() const
00597 { return true; }
00598
00603 virtual MimeBody* clone() const;
00604
00609 inline const ObjList& lines() const
00610 { return m_lines; }
00611
00617 inline void addLine(const char* name, const char* value = 0)
00618 { m_lines.append(new NamedString(name,value)); }
00619
00625 const NamedString* getLine(const char* name) const;
00626
00632 const NamedString* getNextLine(const NamedString* line) const;
00633
00634 protected:
00638 MimeSdpBody(const MimeSdpBody& original);
00639
00643 virtual void buildBody() const;
00644
00645 private:
00646
00647 void buildLines(const char* buf, int len);
00648
00649 ObjList m_lines;
00650 };
00651
00656 class YATE_API MimeBinaryBody : public MimeBody
00657 {
00658 public:
00665 MimeBinaryBody(const String& type, const char* buf, int len);
00666
00673 MimeBinaryBody(const MimeHeaderLine& type, const char* buf, int len);
00674
00678 virtual ~MimeBinaryBody();
00679
00685 virtual void* getObject(const String& name) const;
00686
00691 virtual MimeBody* clone() const;
00692
00693 protected:
00697 MimeBinaryBody(const MimeBinaryBody& original);
00698
00702 virtual void buildBody() const;
00703 };
00704
00709 class YATE_API MimeStringBody : public MimeBody
00710 {
00711 public:
00718 MimeStringBody(const String& type, const char* buf, int len = -1);
00719
00726 MimeStringBody(const MimeHeaderLine& type, const char* buf, int len = -1);
00727
00731 virtual ~MimeStringBody();
00732
00738 virtual void* getObject(const String& name) const;
00739
00744 virtual MimeBody* clone() const;
00745
00750 inline const String& text() const
00751 { return m_text; }
00752
00753 protected:
00757 MimeStringBody(const MimeStringBody& original);
00758
00762 virtual void buildBody() const;
00763
00764 private:
00765 String m_text;
00766 };
00767
00772 class YATE_API MimeLinesBody : public MimeBody
00773 {
00774 public:
00781 MimeLinesBody(const String& type, const char* buf, int len);
00782
00789 MimeLinesBody(const MimeHeaderLine& type, const char* buf, int len);
00790
00794 virtual ~MimeLinesBody();
00795
00801 virtual void* getObject(const String& name) const;
00802
00807 virtual MimeBody* clone() const;
00808
00813 inline const ObjList& lines() const
00814 { return m_lines; }
00815
00820 inline void addLine(const char* line)
00821 { m_lines.append(new String(line)); }
00822
00823 protected:
00827 MimeLinesBody(const MimeLinesBody& original);
00828
00832 virtual void buildBody() const;
00833
00834 private:
00835 ObjList m_lines;
00836 };
00837
00838 };
00839
00840 #endif
00841
00842