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
00135 static void addQuotes(String& str);
00136
00141 static void delQuotes(String& str);
00142
00148 static String quote(const String& str);
00149
00157 static int findSep(const char* str, char sep, int offs = 0);
00158
00165 static void buildHeaders(String& buf, const ObjList& headers);
00166
00167 protected:
00168 ObjList m_params;
00169 char m_separator;
00170 };
00171
00176 class YATE_API MimeAuthLine : public MimeHeaderLine
00177 {
00178 public:
00186 MimeAuthLine(const char* name, const String& value);
00187
00194 MimeAuthLine(const MimeAuthLine& original, const char* newName = 0);
00195
00201 virtual void* getObject(const String& name) const;
00202
00208 virtual MimeHeaderLine* clone(const char* newName = 0) const;
00209
00214 virtual void buildLine(String& line) const;
00215 };
00216
00224 class YATE_API MimeBody : public GenObject
00225 {
00226 public:
00230 virtual ~MimeBody();
00231
00237 virtual void* getObject(const String& name) const;
00238
00243 inline const MimeHeaderLine& getType() const
00244 { return m_type; }
00245
00250 inline const ObjList& headers() const
00251 { return m_headers; }
00252
00257 inline void appendHdr(MimeHeaderLine* hdr)
00258 { if (hdr) m_headers.append(hdr); }
00259
00265 inline void removeHdr(MimeHeaderLine* hdr, bool delobj = true)
00266 { if (hdr) m_headers.remove(hdr,delobj); }
00267
00274 MimeHeaderLine* findHdr(const String& name, const MimeHeaderLine* start = 0) const;
00275
00280 inline void buildHeaders(String& buf) {
00281 m_type.buildLine(buf);
00282 buf << "\r\n";
00283 MimeHeaderLine::buildHeaders(buf,m_headers);
00284 }
00285
00294 bool setParam(const char* name, const char* value = 0, const char* header = 0);
00295
00303 bool delParam(const char* name, const char* header = 0);
00304
00312 const NamedString* getParam(const char* name, const char* header = 0) const;
00313
00319 const DataBlock& getBody() const;
00320
00325 inline const DataBlock& body() const
00326 { return m_body; }
00327
00332 virtual bool isSDP() const
00333 { return false; }
00334
00339 virtual bool isMultipart() const
00340 { return false; }
00341
00346 virtual MimeBody* clone() const = 0;
00347
00358 static MimeBody* build(const char* buf, int len, const MimeHeaderLine& type);
00359
00366 static String* getUnfoldedLine(const char*& buf, int& len);
00367
00368 protected:
00374 MimeBody(const String& type);
00375
00382 MimeBody(const MimeHeaderLine& type);
00383
00387 virtual void buildBody() const = 0;
00388
00392 mutable DataBlock m_body;
00393
00397 ObjList m_headers;
00398
00399 private:
00400 MimeHeaderLine m_type;
00401 };
00402
00407 class YATE_API MimeMultipartBody : public MimeBody
00408 {
00409 public:
00417 MimeMultipartBody(const char* subtype = "mixed", const char* boundary = 0);
00418
00425 MimeMultipartBody(const String& type, const char* buf, int len);
00426
00433 MimeMultipartBody(const MimeHeaderLine& type, const char* buf, int len);
00434
00438 virtual ~MimeMultipartBody();
00439
00444 inline const ObjList& bodies() const
00445 { return m_bodies; }
00446
00451 inline void appendBody(MimeBody* body)
00452 { if (body) m_bodies.append(body); }
00453
00459 inline void removeBody(MimeBody* body, bool delobj = true)
00460 { if (body) m_bodies.remove(body,delobj); }
00461
00470 MimeBody* findBody(const String& content, MimeBody** start = 0) const;
00471
00477 virtual void* getObject(const String& name) const;
00478
00483 virtual bool isMultipart() const
00484 { return true; }
00485
00490 virtual MimeBody* clone() const;
00491
00492 protected:
00496 MimeMultipartBody(const MimeMultipartBody& original);
00497
00501 virtual void buildBody() const;
00502
00509 void parse(const char* buf, int len);
00510
00511 private:
00512
00513
00514
00515
00516 int findBoundary(const char*& buf, int& len,
00517 const char* boundary, unsigned int bLen, bool& endBody);
00518
00519
00520
00521
00522
00523 bool getBoundary(String& boundary) const;
00524
00525
00526 ObjList m_bodies;
00527 };
00528
00533 class YATE_API MimeSdpBody : public MimeBody
00534 {
00535 public:
00539 MimeSdpBody();
00540
00547 MimeSdpBody(const String& type, const char* buf, int len);
00548
00555 MimeSdpBody(const MimeHeaderLine& type, const char* buf, int len);
00556
00560 virtual ~MimeSdpBody();
00561
00567 virtual void* getObject(const String& name) const;
00568
00573 virtual bool isSDP() const
00574 { return true; }
00575
00580 virtual MimeBody* clone() const;
00581
00586 inline const ObjList& lines() const
00587 { return m_lines; }
00588
00594 inline void addLine(const char* name, const char* value = 0)
00595 { m_lines.append(new NamedString(name,value)); }
00596
00602 const NamedString* getLine(const char* name) const;
00603
00609 const NamedString* getNextLine(const NamedString* line) const;
00610
00611 protected:
00615 MimeSdpBody(const MimeSdpBody& original);
00616
00620 virtual void buildBody() const;
00621
00622 private:
00623
00624 void buildLines(const char* buf, int len);
00625
00626 ObjList m_lines;
00627 };
00628
00633 class YATE_API MimeBinaryBody : public MimeBody
00634 {
00635 public:
00642 MimeBinaryBody(const String& type, const char* buf, int len);
00643
00650 MimeBinaryBody(const MimeHeaderLine& type, const char* buf, int len);
00651
00655 virtual ~MimeBinaryBody();
00656
00662 virtual void* getObject(const String& name) const;
00663
00668 virtual MimeBody* clone() const;
00669
00670 protected:
00674 MimeBinaryBody(const MimeBinaryBody& original);
00675
00679 virtual void buildBody() const;
00680 };
00681
00686 class YATE_API MimeStringBody : public MimeBody
00687 {
00688 public:
00695 MimeStringBody(const String& type, const char* buf, int len = -1);
00696
00703 MimeStringBody(const MimeHeaderLine& type, const char* buf, int len = -1);
00704
00708 virtual ~MimeStringBody();
00709
00715 virtual void* getObject(const String& name) const;
00716
00721 virtual MimeBody* clone() const;
00722
00727 inline const String& text() const
00728 { return m_text; }
00729
00730 protected:
00734 MimeStringBody(const MimeStringBody& original);
00735
00739 virtual void buildBody() const;
00740
00741 private:
00742 String m_text;
00743 };
00744
00749 class YATE_API MimeLinesBody : public MimeBody
00750 {
00751 public:
00758 MimeLinesBody(const String& type, const char* buf, int len);
00759
00766 MimeLinesBody(const MimeHeaderLine& type, const char* buf, int len);
00767
00771 virtual ~MimeLinesBody();
00772
00778 virtual void* getObject(const String& name) const;
00779
00784 virtual MimeBody* clone() const;
00785
00790 inline const ObjList& lines() const
00791 { return m_lines; }
00792
00797 inline void addLine(const char* line)
00798 { m_lines.append(new String(line)); }
00799
00800 protected:
00804 MimeLinesBody(const MimeLinesBody& original);
00805
00809 virtual void buildBody() const;
00810
00811 private:
00812 ObjList m_lines;
00813 };
00814
00815 };
00816
00817 #endif
00818
00819