diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2009-11-26 08:38:15 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2009-11-26 08:38:15 +0200 |
commit | 9e77d565b3b817ceb427d7ffc2c71fd7ffe5d169 (patch) | |
tree | 22955abb6ca88d6af3d3d76739150574a3f0aa56 | |
parent | 25d81b7e38055035cd1357493f336c60b97e290c (diff) |
Implement buffering of small write requests in ostream_format_target
-rw-r--r-- | libxsd/xsd/cxx/xml/dom/serialization-source.hxx | 47 |
1 files changed, 38 insertions, 9 deletions
diff --git a/libxsd/xsd/cxx/xml/dom/serialization-source.hxx b/libxsd/xsd/cxx/xml/dom/serialization-source.hxx index 4593f9c..08cbcd5 100644 --- a/libxsd/xsd/cxx/xml/dom/serialization-source.hxx +++ b/libxsd/xsd/cxx/xml/dom/serialization-source.hxx @@ -91,17 +91,17 @@ namespace xsd xercesc::DOMErrorHandler& eh, unsigned long flags); - // - // + class ostream_format_target: public xercesc::XMLFormatTarget { + static const std::size_t buf_max = 1024; + public: ostream_format_target (std::ostream& os) - : os_ (os) + : n_ (0), os_ (os) { } - public: // I know, some of those consts are stupid. But that's what // Xerces folks put into their interfaces and VC-7.1 thinks @@ -116,14 +116,32 @@ namespace xsd #endif xercesc::XMLFormatter* const) { - // Ignore the data if there was a stream failure and - // the stream is not using exceptions. + // Ignore the write request if there was a stream failure and the + // stream is not using exceptions. + // + if (os_.fail ()) + return; + + // Flush the buffer if the block is too large or if we don't have + // any space left. // - if (!(os_.bad () || os_.fail ())) + if ((size >= buf_max / 8 || n_ + size > buf_max) && n_ != 0) { + os_.write (buf_, static_cast<std::streamsize> (n_)); + n_ = 0; + + if (os_.fail ()) + return; + } + + if (size < buf_max / 8) + { + memcpy (buf_ + n_, reinterpret_cast<const char*> (buf), size); + n_ += size; + } + else os_.write (reinterpret_cast<const char*> (buf), static_cast<std::streamsize> (size)); - } } @@ -133,13 +151,24 @@ namespace xsd // Ignore the flush request if there was a stream failure // and the stream is not using exceptions. // - if (!(os_.bad () || os_.fail ())) + if (!os_.fail ()) { + if (n_ != 0) + { + os_.write (buf_, static_cast<std::streamsize> (n_)); + n_ = 0; + + if (os_.fail ()) + return; + } + os_.flush (); } } private: + char buf_[buf_max]; + size_t n_; std::ostream& os_; }; } |