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:
56  { }
57 
58  explicit Contenttype(const std::string& ct);
59  Contenttype(const std::string& type_, const std::string& subtype_)
60  : type(type_),
61  subtype(subtype_)
62  { }
63 
64  const std::string& getType() const { return type; }
65  const std::string& getSubtype() const { return subtype; }
66  const std::string& getBoundary() const { return boundary; }
67  bool isMultipart() const
68  { return type == "multipart" && !boundary.empty(); }
69 
71  { return parameter.begin(); }
73  { return parameter.end(); }
74  parameter_iterator parameter_find(parameter_type::key_type key) const
75  { return parameter.find(key); }
76  parameter_iterator parameter_upper_bound(parameter_type::key_type key) const
77  { return parameter.upper_bound(key); }
78 
79  bool operator== (const Contenttype& ct) const
80  { return type == ct.type
81  && subtype == ct.subtype
82  && parameter == ct.parameter
83  && boundary == ct.boundary; }
84  };
85 
86  inline std::istream& operator>> (std::istream& in, Contenttype& ct)
87  {
88  ct.parse(in);
89  return in;
90  }
91 }
92 
93 #endif // TNT_CONTENTTYPE_H
94