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 };
00182
00187 class YATE_API MimeAuthLine : public MimeHeaderLine
00188 {
00189 public:
00197 MimeAuthLine(const char* name, const String& value);
00198
00205 MimeAuthLine(const MimeAuthLine& original, const char* newName = 0);
00206
00212 virtual void* getObject(const String& name) const;
00213
00219 virtual MimeHeaderLine* clone(const char* newName = 0) const;
00220
00225 virtual void buildLine(String& line) const;
00226 };
00227
00235 class YATE_API MimeBody : public GenObject
00236 {
00237 public:
00241 virtual ~MimeBody();
00242
00248 virtual void* getObject(const String& name) const;
00249
00254 inline const MimeHeaderLine& getType() const
00255 { return m_type; }
00256
00262 MimeBody* getFirst(const String& type) const;
00263
00268 inline const ObjList& headers() const
00269 { return m_headers; }
00270
00275 inline void appendHdr(MimeHeaderLine* hdr)
00276 { if (hdr) m_headers.append(hdr); }
00277
00283 inline void removeHdr(MimeHeaderLine* hdr, bool delobj = true)
00284 { if (hdr) m_headers.remove(hdr,delobj); }
00285
00292 MimeHeaderLine* findHdr(const String& name, const MimeHeaderLine* start = 0) const;
00293
00298 inline void buildHeaders(String& buf) {
00299 m_type.buildLine(buf);
00300 buf << "\r\n";
00301 MimeHeaderLine::buildHeaders(buf,m_headers);
00302 }
00303
00312 bool setParam(const char* name, const char* value = 0, const char* header = 0);
00313
00321 bool delParam(const char* name, const char* header = 0);
00322
00330 const NamedString* getParam(const char* name, const char* header = 0) const;
00331
00337 const DataBlock& getBody() const;
00338
00343 inline const DataBlock& body() const
00344 { return m_body; }
00345
00350 virtual bool isSDP() const
00351 { return false; }
00352
00357 virtual bool isMultipart() const
00358 { return false; }
00359
00364 virtual MimeBody* clone() const = 0;
00365
00376 static MimeBody* build(const char* buf, int len, const MimeHeaderLine& type);
00377
00384 static String* getUnfoldedLine(const char*& buf, int& len);
00385
00386 protected:
00392 MimeBody(const String& type);
00393
00400 MimeBody(const MimeHeaderLine& type);
00401
00405 virtual void buildBody() const = 0;
00406
00410 mutable DataBlock m_body;
00411
00415 ObjList m_headers;
00416
00417 private:
00418 MimeHeaderLine m_type;
00419 };
00420
00425 class YATE_API MimeMultipartBody : public MimeBody
00426 {
00427 public:
00435 MimeMultipartBody(const char* subtype = "mixed", const char* boundary = 0);
00436
00443 MimeMultipartBody(const String& type, const char* buf, int len);
00444
00451 MimeMultipartBody(const MimeHeaderLine& type, const char* buf, int len);
00452
00456 virtual ~MimeMultipartBody();
00457
00462 inline const ObjList& bodies() const
00463 { return m_bodies; }
00464
00469 inline void appendBody(MimeBody* body)
00470 { if (body) m_bodies.append(body); }
00471
00477 inline void removeBody(MimeBody* body, bool delobj = true)
00478 { if (body) m_bodies.remove(body,delobj); }
00479
00488 MimeBody* findBody(const String& content, MimeBody** start = 0) const;
00489
00495 virtual void* getObject(const String& name) const;
00496
00501 virtual bool isMultipart() const
00502 { return true; }
00503
00508 virtual MimeBody* clone() const;
00509
00510 protected:
00514 MimeMultipartBody(const MimeMultipartBody& original);
00515
00519 virtual void buildBody() const;
00520
00527 void parse(const char* buf, int len);
00528
00529 private:
00530
00531
00532
00533
00534 int findBoundary(const char*& buf, int& len,
00535 const char* boundary, unsigned int bLen, bool& endBody);
00536
00537
00538
00539
00540
00541 bool getBoundary(String& boundary) const;
00542
00543
00544 ObjList m_bodies;
00545 };
00546
00551 class YATE_API MimeSdpBody : public MimeBody
00552 {
00553 public:
00557 MimeSdpBody();
00558
00565 MimeSdpBody(const String& type, const char* buf, int len);
00566
00573 MimeSdpBody(const MimeHeaderLine& type, const char* buf, int len);
00574
00578 virtual ~MimeSdpBody();
00579
00585 virtual void* getObject(const String& name) const;
00586
00591 virtual bool isSDP() const
00592 { return true; }
00593
00598 virtual MimeBody* clone() const;
00599
00604 inline const ObjList& lines() const
00605 { return m_lines; }
00606
00612 inline void addLine(const char* name, const char* value = 0)
00613 { m_lines.append(new NamedString(name,value)); }
00614
00620 const NamedString* getLine(const char* name) const;
00621
00627 const NamedString* getNextLine(const NamedString* line) const;
00628
00629 protected:
00633 MimeSdpBody(const MimeSdpBody& original);
00634
00638 virtual void buildBody() const;
00639
00640 private:
00641
00642 void buildLines(const char* buf, int len);
00643
00644 ObjList m_lines;
00645 };
00646
00651 class YATE_API MimeBinaryBody : public MimeBody
00652 {
00653 public:
00660 MimeBinaryBody(const String& type, const char* buf, int len);
00661
00668 MimeBinaryBody(const MimeHeaderLine& type, const char* buf, int len);
00669
00673 virtual ~MimeBinaryBody();
00674
00680 virtual void* getObject(const String& name) const;
00681
00686 virtual MimeBody* clone() const;
00687
00688 protected:
00692 MimeBinaryBody(const MimeBinaryBody& original);
00693
00697 virtual void buildBody() const;
00698 };
00699
00704 class YATE_API MimeStringBody : public MimeBody
00705 {
00706 public:
00713 MimeStringBody(const String& type, const char* buf, int len = -1);
00714
00721 MimeStringBody(const MimeHeaderLine& type, const char* buf, int len = -1);
00722
00726 virtual ~MimeStringBody();
00727
00733 virtual void* getObject(const String& name) const;
00734
00739 virtual MimeBody* clone() const;
00740
00745 inline const String& text() const
00746 { return m_text; }
00747
00748 protected:
00752 MimeStringBody(const MimeStringBody& original);
00753
00757 virtual void buildBody() const;
00758
00759 private:
00760 String m_text;
00761 };
00762
00767 class YATE_API MimeLinesBody : public MimeBody
00768 {
00769 public:
00776 MimeLinesBody(const String& type, const char* buf, int len);
00777
00784 MimeLinesBody(const MimeHeaderLine& type, const char* buf, int len);
00785
00789 virtual ~MimeLinesBody();
00790
00796 virtual void* getObject(const String& name) const;
00797
00802 virtual MimeBody* clone() const;
00803
00808 inline const ObjList& lines() const
00809 { return m_lines; }
00810
00815 inline void addLine(const char* line)
00816 { m_lines.append(new String(line)); }
00817
00818 protected:
00822 MimeLinesBody(const MimeLinesBody& original);
00823
00827 virtual void buildBody() const;
00828
00829 private:
00830 ObjList m_lines;
00831 };
00832
00833 };
00834
00835 #endif
00836
00837