Maybe I am missing your point, but instead of returning 0 which throws
an exception, why not return a small XML comment? As long as the
boundary of your interception occurs where XML comments are legal, it
should be ok to replace your text with something which is XML
neutral. This way you can avoid sending zero bytes to the sax reader.
B
On 17 Jun 2009, at 21:09, Vincent Jacques <newsgr...@vincent-
jacques.net> wrote:
Hello,
I'm trying to use the SAX2 API to implement a match function for
boost::asio::async_read_until. Please don't stop reading if you
don't know this library, I'll try to explain :-)
This boost::asio::async_read_until function reads some bytes on a
tcp/ip socket, then calls the user-provided match function to check
if it has read enough data. If yes, it triggers a user-provided
callback function. If no, it performs a new read on the socket, and
tries again.
What I want is that the callback is called when I receive each
complete element which is a direct son of the root element:
<?xml version="1.0">
<root>
<element><foo><bar/></foo></element> <!-- CALLBACK HERE -->
<bee><gee/></bee> <!-- CALLBACK HERE -->
</root>
So, I've designed a SAX2 content handler which tells me if the
parsing is at such a place, and I loop on SAX2XMLReader::parseNext,
asking my handler if it's ok to call the callback, each time it
returns.
I've also designed a BinInputStream and a InputSource that transfers
the data given by Boost.Asio to Xerces.
My problem is that my match function is called in a context where
I'm not sure I'll be able to give anything to Xerces if it calls
readBytes. It's possible for example, that I've already given
"<?xml version="1.0"><root><element><foo><bar/></foo></elem"
to Xerces, because I've received only this. In this case, I must
reply 'false' to Boost, to wait for some more bytes.
But at this point, Xerces calls readBytes, and I don't know what to
do: -if I give it 0 bytes, it throws an exception telling it has
reached the end of file, and I cannot resume the parse when I've
received more data.
-if I throw an exception from readBytes, It's no better.
*To make it short*: I need to cleanly exit parseNext when it calls
readBytes and I cannot give anything, while keeping the possibility
to call parseNext later.
Any idea ?
Many thanks,
--
Vincent Jacques
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème"
Devise Shadock