Hi Kelly,

This is the implementation:
void MemBufInputSource::resetMemBufInputSource(const XMLByte* const  srcDocBytes
                                             , const XMLSize_t       byteCount)
{
    fByteCount = byteCount;
    fSrcBytes  = srcDocBytes;
}
So answer to your question is:
 No, it doesn't make internal copy of data.

Good luck!
   Vitaly


Kelly Beard wrote:
Lets say you have a bit of code that reads characters off of a socket, and
you save them to a vector<char>.  You call this vector<char> 'big_buf'.

You have this code to dump your vector<char> to a char[]:

char *DumpVectorToChar(vector<char>& buf)
{
     char *ret_val = 0;

     int size = buf.size();                              // Get vector size
     vector<char>::iterator buf_end = buf.end();         // Should prevent
unnecessary calls to end()
     if (size > 0) {
         ret_val = new char[size + 1];
         if (ret_val != 0) {                     // Don't assume you got
anything
             int i = 0;
             for (vector<char>::iterator it = buf.begin(); it != buf_end;
++it) {        // Copy vector over
                 ret_val[i++] = *it;
             }
             ret_val[i] = '\0';          // null-terminate
         }
     }

     return ret_val;         // return ptr to memory or null (unlikely)
}

somewhere down in your code you have this:

     if (isComplete) {
         int size = big_buf.size();

         // DumpVectorToChar() bolted for failed on new[], so bolt out of
here.
         if (cBuf == 0) {
             throw runtime_error("XMLSocketApp::doreceive(bool& isComplete,
vector<char>& ret_buf) "
                 "MEMORY ALLOCATION ERROR BEFORE FINAL PARSE");
         }

         m_memBufIS->resetMemBufInputSource((const XMLByte *)cBuf, size);
         delete [] cBuf;

         if (m_defaultHandler != 0) {
             m_parser->setContentHandler(m_defaultHandler);
         }
         if (m_errorHandler != 0) {
             m_parser->setErrorHandler(m_errorHandler);
         }
         m_parser->parse(*m_memBufIS);
     }

You have a program that calls this routine.  It crashes, but not all of the
time.  It does crash when you have your debug flag set to no (of course),
works fine when it is on.  You know this is a sign of a pointer problem.
So, on a hunch and with prayer beads in tow, you do this:

     if (isComplete) {
         int size = big_buf.size();

         // DumpVectorToChar() bolted for failed on new[], so bolt out of
here.
         if (cBuf == 0) {
             throw runtime_error("XMLSocketApp::doreceive(bool& isComplete,
vector<char>& ret_buf) "
                 "MEMORY ALLOCATION ERROR BEFORE FINAL PARSE");
         }

         m_memBufIS->resetMemBufInputSource((const XMLByte *)cBuf, size);

         if (m_defaultHandler != 0) {
             m_parser->setContentHandler(m_defaultHandler);
         }
         if (m_errorHandler != 0) {
             m_parser->setErrorHandler(m_errorHandler);
         }
         m_parser->parse(*m_memBufIS);
         delete [] cBuf;
     }

See if you can spot the difference.  :-)

I was under the impression that resetMemBufInputSource() would make its own
internal copy of the buffer passed to it.  True?  I generally find the
documentation for Xerces is lacking in these little detail member routines.


Reply via email to