Robert William Vesterman wrote:
I've been using SAX2XMLReader for quite some time to read an XML file. I just pass the name of the file to the parse() function. Now, I have a new requirement: I have to optionally be able to read a file which is encrypted, the underlying contents of which are XML.

My first thought was perhaps there is a way to pass memory, instead of a filename, to parse(), and I could just decrypt the contents and pass them to parse() as I do so. In fact, there is a version of parse() that takes an "InputSource", and there's a class derived from InputSource called "MemBufInputSource". So this looked promising.

But then I realized that the files I'm decoding are potentially huge. MemBufInputSource seems to require that the buffer be completely populated before passing it off to parse(). It would be much, much nicer if, instead, there were some InputSource (or something) that would have some callback function that would automatically ask for more data whenever parse() has run out of stuff to parse. That way, I could read and decrypt the file in reasonably-sized chunks (the crypto algorithm in use supports streaming decryption).

So, first of all, is there such a thing? In case it matters, I am using Xerces 2.6; I could upgrade if absolutely necessary, but I would prefer not to at this point.

If not, I'm guessing I can build my own InputSource-derived class. But the documentation is not entirely clear.

Obviously I have to implement the pure virtual function, makeStream(). This is supposed to return a BinInputStream. This has two pure virtual functions, curPos() and readBytes(). Neither of these has informative documentation, at least not that I have found.
That needs to be fixed. Please file a Jira issue so we can update the headers files.


I assume that, in curPos(), I am supposed to return the total number of bytes that have been read (using readBytes()) so far. Correct?
yes


Then, readBytes(): I assume I am supposed to return the number of bytes read during this call. Correct?
yes


What if an error occurs (such as me being unable to read from the underlying file)? I throw... something? Or what?
You can throw any exception you want.


When there are no more bytes to read (and not because of an error condition), I assume I am supposed to return zero. Correct? Or do I throw something? Or what?
You return 0 bytes read. The underlying code will call readBytes() one more time to make sure you really meant no more bytes are left.


Any help, regarding these questions specifically, or a better way to accomplish what I want, or some hints in general, would be appreciated. Thanks.
You can look at any of the existing implementations:

BinFileInputStream
BinMemInputStream
BinURLInputStream
URLAccessBinInputStream
URLAccessCFBinInputStream
UnixHTTPURLInputStream
BinHTTPURLInputStream

Dave

Reply via email to