summaryrefslogtreecommitdiff
path: root/boost/archive/impl/xml_woarchive_impl.ipp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/archive/impl/xml_woarchive_impl.ipp')
-rw-r--r--boost/archive/impl/xml_woarchive_impl.ipp44
1 files changed, 31 insertions, 13 deletions
diff --git a/boost/archive/impl/xml_woarchive_impl.ipp b/boost/archive/impl/xml_woarchive_impl.ipp
index d5586d51ae..58f92c9d92 100644
--- a/boost/archive/impl/xml_woarchive_impl.ipp
+++ b/boost/archive/impl/xml_woarchive_impl.ipp
@@ -13,6 +13,7 @@
#include <string>
#include <algorithm> // std::copy
#include <locale>
+#include <exception>
#include <cstring> // strlen
#include <cstdlib> // mbtowc
@@ -30,6 +31,8 @@ namespace std{
#endif
#include <boost/archive/xml_woarchive.hpp>
+#include <boost/archive/detail/utf8_codecvt_facet.hpp>
+
#include <boost/serialization/throw_exception.hpp>
#include <boost/archive/iterators/xml_escape.hpp>
@@ -37,8 +40,6 @@ namespace std{
#include <boost/archive/iterators/ostream_iterator.hpp>
#include <boost/archive/iterators/dataflow_exception.hpp>
-#include <boost/archive/add_facet.hpp>
-
namespace boost {
namespace archive {
@@ -122,19 +123,13 @@ xml_woarchive_impl<Archive>::xml_woarchive_impl(
),
basic_xml_oarchive<Archive>(flags)
{
- // Standard behavior is that imbue can be called
- // a) before output is invoked or
- // b) after flush has been called. This prevents one-to-many
- // transforms (such as one to many transforms from getting
- // mixed up.
if(0 == (flags & no_codecvt)){
- archive_locale.reset(
- add_facet(
- os_.getloc(),
- new boost::archive::detail::utf8_codecvt_facet
- )
+ std::locale l = std::locale(
+ os_.getloc(),
+ new boost::archive::detail::utf8_codecvt_facet
);
- //os.imbue(* archive_locale);
+ os_.flush();
+ os_.imbue(l);
}
if(0 == (flags & no_header))
this->init();
@@ -143,6 +138,29 @@ xml_woarchive_impl<Archive>::xml_woarchive_impl(
template<class Archive>
BOOST_WARCHIVE_DECL
xml_woarchive_impl<Archive>::~xml_woarchive_impl(){
+ if(std::uncaught_exception())
+ return;
+ if(0 == (this->get_flags() & no_header)){
+ save(L"</boost_serialization>\n");
+ }
+}
+
+template<class Archive>
+BOOST_WARCHIVE_DECL void
+xml_woarchive_impl<Archive>::save_binary(
+ const void *address,
+ std::size_t count
+){
+ this->end_preamble();
+ #if ! defined(__MWERKS__)
+ this->basic_text_oprimitive<std::wostream>::save_binary(
+ #else
+ this->basic_text_oprimitive::save_binary(
+ #endif
+ address,
+ count
+ );
+ this->indent_next = true;
}
} // namespace archive