contenttype.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2003-2005 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 
30 #ifndef TNT_CONTENTTYPE_H
31 #define TNT_CONTENTTYPE_H
32 
33 #include <tnt/messageattribute.h>
34 #include <map>
35 
36 namespace tnt
37 {
40  {
41  public:
42  typedef std::multimap<std::string, std::string> parameter_type;
43  typedef parameter_type::const_iterator parameter_iterator;
44 
45  private:
46  virtual return_type onType(const std::string& type, const std::string& subtype);
47  virtual return_type onParameter(const std::string& attribute, const std::string& value);
48 
49  std::string _type;
50  std::string _subtype;
51  parameter_type _parameter;
52  std::string _boundary;
53 
54  public:
57 
58  explicit Contenttype(const std::string& ct);
59 
61  Contenttype(const std::string& type, const std::string& subtype)
62  : _type(type),
63  _subtype(subtype)
64  { }
65 
66  const std::string& getType() const { return _type; }
67  const std::string& getSubtype() const { return _subtype; }
68  const std::string& getBoundary() const { return _boundary; }
69  bool isMultipart() const
70  { return _type == "multipart" && !_boundary.empty(); }
71 
73  { return _parameter.begin(); }
75  { return _parameter.end(); }
76  parameter_iterator parameter_find(parameter_type::key_type key) const
77  { return _parameter.find(key); }
78  parameter_iterator parameter_upper_bound(parameter_type::key_type key) const
79  { return _parameter.upper_bound(key); }
80 
81  bool operator== (const Contenttype& ct) const
82  {
83  return _type == ct._type
84  && _subtype == ct._subtype
85  && _parameter == ct._parameter
86  && _boundary == ct._boundary;
87  }
88  };
89 
90  inline std::istream& operator>> (std::istream& in, Contenttype& ct)
91  {
92  ct.parse(in);
93  return in;
94  }
95 }
96 
97 #endif // TNT_CONTENTTYPE_H
98