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

Reply via email to