On Dec 12, 2007, at 7:17 AM, Mykhailo Parfeniuk wrote:

When I use XMLSocketAppender in my application it fails with assertion "invalid subscript". The reason is it tries to append zero length string to output .
When I looked at code I saw strange implementation of function write:

void OutputStreamWriter::write(const LogString& str, Pool& p) {
  if (str.length() > 0) {
    enum { BUFSIZE = 1024 };
    char rawbuf[BUFSIZE];
    ByteBuffer buf(rawbuf, (size_t) BUFSIZE);
    enc->reset();
    LogString::const_iterator iter = str.begin();
    while(iter != str.end()) {
      CharsetEncoder::encode(enc, str, iter, buf);
      buf.flip();
      out->write(buf, p);
      buf.clear();
    }
    CharsetEncoder::encode(enc, str, iter, buf);
    enc->flush(buf);
    buf.flip();
    out->write(buf, p);
  }
}

It seems to me that there should be iterator changing.
Am I right or not?
If use another appenders - file, console, all works normally.
Maybe I forgot initialize something? Or function is implemented incorrectly?




OutputStreamWriter::write is also used by all FileAppenders, so any flaw in its implementation would be seen there too. CharsetEncoder::encode() will advance the iterator as it encodes the string into the specified encoding.

There was recent work to make SocketAppender functional with Chainsaw. I did some sanity tests with it and the SocketAppender did work. However, those changes resulted in some refactoring of XMLSocketAppender and it is possible that I messed that up. I didn't do any sanity tests with XMLSocketAppender, since I could not figure out how to get Chainsaw to work with it. It would be helpful if you could

a) See if SocketAppender works with Chainsaw for you
b) Give me instructions on how to set up Chainsaw to work with the socket appender



Reply via email to