// 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 #include #include #include // std::size_t #include #include #include #include #include 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 void element (const T& value); void element (const std::string& name, const std::string& value); template void element (const std::string& name, const T& value); void element (const qname_type& qname, const std::string& value); template void element (const qname_type& qname, const T& value); void element (const std::string& namespace_, const std::string& name, const std::string& value); template 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 void attribute (const qname_type& qname, const T& value); void attribute (const std::string& name, const std::string& value); template void attribute (const std::string& name, const T& value); void attribute (const std::string& ns, const std::string& name, const std::string& value); template void attribute (const std::string& ns, const std::string& name, const T& value); // Characters. // void characters (const std::string& value); template 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 #include #endif // XML_SERIALIZER