123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- // file : xml/serializer -*- C++ -*-
- // copyright : Copyright (c) 2013-2014 Code Synthesis Tools CC
- // license : MIT; see accompanying LICENSE file
- #ifndef XML_SERIALIZER
- #define XML_SERIALIZER
- #include <xml/details/pre.hxx>
- #include <string>
- #include <ostream>
- #include <cstddef> // std::size_t
- #include <xml/details/genx/genx.h>
- #include <xml/forward>
- #include <xml/qname>
- #include <xml/exception>
- #include <xml/details/export.hxx>
- namespace xml
- {
- class serializer;
- struct LIBSTUDXML_EXPORT serialization: exception
- {
- virtual
- ~serialization () throw ();
- serialization (const std::string& name,
- const std::string& description);
- serialization (const serializer&, const std::string& description);
- const std::string&
- name () const {return name_;}
- const std::string&
- description () const {return description_;}
- virtual const char*
- what () const throw ();
- private:
- void
- init ();
- private:
- std::string name_;
- std::string description_;
- std::string what_;
- };
- class LIBSTUDXML_EXPORT serializer
- {
- public:
- typedef xml::qname qname_type;
- // Serialize to std::ostream. Output name is used in diagnostics to
- // identify the document being serialized. The indentation argument
- // specifies the number of indentation spaces that should be used for
- // pretty-printing. If 0 is passed, no pretty-printing is performed.
- //
- // If stream exceptions are enabled then std::ios_base::failure
- // exception is used to report io errors (badbit and failbit).
- // Otherwise, those are reported as the serialization exception.
- //
- serializer (std::ostream&,
- const std::string& output_name,
- unsigned short indentation = 2);
- const std::string&
- output_name () const {return oname_;}
- ~serializer ();
- private:
- serializer (const serializer&);
- serializer& operator= (const serializer&);
- // Serialization functions.
- //
- public:
- // Elements.
- //
- void
- start_element (const qname_type& qname);
- void
- start_element (const std::string& name);
- void
- start_element (const std::string& ns, const std::string& name);
- void
- end_element ();
- // Helpers for serializing elements with simple content. The first two
- // functions assume that start_element() has already been called. The
- // other two serialize the complete element, from start to end.
- //
- void
- element (const std::string& value);
- template <typename T>
- void
- element (const T& value);
- void
- element (const std::string& name, const std::string& value);
- template <typename T>
- void
- element (const std::string& name, const T& value);
- void
- element (const qname_type& qname, const std::string& value);
- template <typename T>
- void
- element (const qname_type& qname, const T& value);
- void
- element (const std::string& namespace_,
- const std::string& name,
- const std::string& value);
- template <typename T>
- void
- element (const std::string& namespace_,
- const std::string& name,
- const T& value);
- // Attributes.
- //
- void
- start_attribute (const qname_type& qname);
- void
- start_attribute (const std::string& name);
- void
- start_attribute (const std::string& ns, const std::string& name);
- void
- end_attribute ();
- void
- attribute (const qname_type& qname, const std::string& value);
- template <typename T>
- void
- attribute (const qname_type& qname, const T& value);
- void
- attribute (const std::string& name, const std::string& value);
- template <typename T>
- void
- attribute (const std::string& name, const T& value);
- void
- attribute (const std::string& ns,
- const std::string& name,
- const std::string& value);
- template <typename T>
- void
- attribute (const std::string& ns,
- const std::string& name,
- const T& value);
- // Characters.
- //
- void
- characters (const std::string& value);
- template <typename T>
- void
- characters (const T& value);
- // Namespaces declaration. If prefix is empty, then the default
- // namespace is declared. If both prefix and namespace are empty,
- // then the default namespace declaration is cleared (xmlns="").
- //
- void
- namespace_decl (const std::string& ns, const std::string& prefix);
- // XML declaration. If encoding or standalone are not specified,
- // then these attributes are omitted from the output.
- //
- void
- xml_decl (const std::string& version = "1.0",
- const std::string& encoding = "UTF-8",
- const std::string& standalone = "");
- // Utility functions.
- //
- public:
- // Return true if there is a mapping. In this case, prefix contains
- // the mapped prefix.
- //
- bool
- lookup_namespace_prefix (const std::string& ns, std::string& prefix);
- private:
- void
- handle_error (genxStatus);
- private:
- std::ostream& os_;
- std::ostream::iostate os_state_; // Original exception state.
- const std::string oname_;
- genxWriter s_;
- genxSender sender_;
- std::size_t depth_;
- };
- }
- #include <xml/serializer.ixx>
- #include <xml/details/post.hxx>
- #endif // XML_SERIALIZER
|