Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@101: // xml_wiarchive_impl.ipp: Chris@16: Chris@16: // (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org for updates, documentation, and revision history. Chris@16: Chris@16: #include Chris@16: #if defined(BOOST_NO_STDC_NAMESPACE) Chris@16: namespace std{ Chris@16: using ::memcpy; Chris@16: } //std Chris@16: #endif Chris@16: Chris@16: #include // msvc 6.0 needs this to suppress warnings Chris@16: #ifndef BOOST_NO_STD_WSTREAMBUF Chris@16: Chris@16: #include Chris@101: #include // std::copy Chris@16: Chris@16: #include // Dinkumware and RogueWave Chris@16: #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) Chris@16: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@101: #include Chris@101: Chris@101: #include Chris@101: #include Chris@101: Chris@16: #include "basic_xml_grammar.hpp" Chris@16: Chris@16: namespace boost { Chris@16: namespace archive { Chris@16: Chris@16: /////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8 Chris@16: // implemenations of functions specific to wide char archives Chris@16: Chris@16: namespace { // anonymous Chris@16: Chris@16: void copy_to_ptr(char * s, const std::wstring & ws){ Chris@16: std::copy( Chris@16: iterators::mb_from_wchar( Chris@16: BOOST_MAKE_PFTO_WRAPPER(ws.begin()) Chris@16: ), Chris@16: iterators::mb_from_wchar( Chris@16: BOOST_MAKE_PFTO_WRAPPER(ws.end()) Chris@16: ), Chris@16: s Chris@16: ); Chris@16: s[ws.size()] = 0; Chris@16: } Chris@16: Chris@16: } // anonymous Chris@16: Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(void) Chris@16: xml_wiarchive_impl::load(std::string & s){ Chris@16: std::wstring ws; Chris@16: bool result = gimpl->parse_string(is, ws); Chris@16: if(! result) Chris@16: boost::serialization::throw_exception( Chris@16: xml_archive_exception(xml_archive_exception::xml_archive_parsing_error) Chris@16: ); Chris@16: #if BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(20101)) Chris@16: if(NULL != s.data()) Chris@16: #endif Chris@16: s.resize(0); Chris@16: s.reserve(ws.size()); Chris@16: std::copy( Chris@16: iterators::mb_from_wchar( Chris@16: BOOST_MAKE_PFTO_WRAPPER(ws.begin()) Chris@16: ), Chris@16: iterators::mb_from_wchar( Chris@16: BOOST_MAKE_PFTO_WRAPPER(ws.end()) Chris@16: ), Chris@16: std::back_inserter(s) Chris@16: ); Chris@16: } Chris@16: Chris@16: #ifndef BOOST_NO_STD_WSTRING Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(void) Chris@16: xml_wiarchive_impl::load(std::wstring & ws){ Chris@16: bool result = gimpl->parse_string(is, ws); Chris@16: if(! result) Chris@16: boost::serialization::throw_exception( Chris@16: xml_archive_exception(xml_archive_exception::xml_archive_parsing_error) Chris@16: ); Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(void) Chris@16: xml_wiarchive_impl::load(char * s){ Chris@16: std::wstring ws; Chris@16: bool result = gimpl->parse_string(is, ws); Chris@16: if(! result) Chris@16: boost::serialization::throw_exception( Chris@16: xml_archive_exception(xml_archive_exception::xml_archive_parsing_error) Chris@16: ); Chris@16: copy_to_ptr(s, ws); Chris@16: } Chris@16: Chris@16: #ifndef BOOST_NO_INTRINSIC_WCHAR_T Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(void) Chris@16: xml_wiarchive_impl::load(wchar_t * ws){ Chris@16: std::wstring twstring; Chris@16: bool result = gimpl->parse_string(is, twstring); Chris@16: if(! result) Chris@16: boost::serialization::throw_exception( Chris@16: xml_archive_exception(xml_archive_exception::xml_archive_parsing_error) Chris@16: ); Chris@16: std::memcpy(ws, twstring.c_str(), twstring.size()); Chris@16: ws[twstring.size()] = L'\0'; Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(void) Chris@16: xml_wiarchive_impl::load_override(class_name_type & t, int){ Chris@16: const std::wstring & ws = gimpl->rv.class_name; Chris@16: if(ws.size() > BOOST_SERIALIZATION_MAX_KEY_SIZE - 1) Chris@16: boost::serialization::throw_exception( Chris@16: archive_exception(archive_exception::invalid_class_name) Chris@16: ); Chris@16: copy_to_ptr(t, ws); Chris@16: } Chris@16: Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(void) Chris@16: xml_wiarchive_impl::init(){ Chris@16: gimpl->init(is); Chris@16: this->set_library_version( Chris@16: library_version_type(gimpl->rv.version) Chris@16: ); Chris@16: } Chris@16: Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) Chris@16: xml_wiarchive_impl::xml_wiarchive_impl( Chris@16: std::wistream &is_, Chris@16: unsigned int flags Chris@16: ) : Chris@16: basic_text_iprimitive( Chris@16: is_, Chris@16: true // don't change the codecvt - use the one below Chris@16: ), Chris@16: basic_xml_iarchive(flags), Chris@16: gimpl(new xml_wgrammar()) Chris@16: { Chris@16: if(0 == (flags & no_codecvt)){ Chris@101: // note usage of argument "1" so that the locale isn't Chris@101: // automatically delete the facet Chris@16: archive_locale.reset( Chris@16: add_facet( Chris@101: is_.getloc(), Chris@16: new boost::archive::detail::utf8_codecvt_facet Chris@16: ) Chris@16: ); Chris@101: //is.imbue(* archive_locale); Chris@16: } Chris@101: if(0 == (flags & no_header)) Chris@101: init(); Chris@16: } Chris@16: Chris@16: template Chris@16: BOOST_WARCHIVE_DECL(BOOST_PP_EMPTY()) Chris@16: xml_wiarchive_impl::~xml_wiarchive_impl(){ Chris@16: if(0 == (this->get_flags() & no_header)){ Chris@16: BOOST_TRY{ Chris@16: gimpl->windup(is); Chris@16: } Chris@16: BOOST_CATCH(...){} Chris@16: BOOST_CATCH_END Chris@16: } Chris@16: } Chris@16: Chris@16: } // namespace archive Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_NO_STD_WSTREAMBUF