Index: ossp-pkg/l2/l2_ch_buffer.c RCS File: /v/ossp/cvs/ossp-pkg/l2/l2_ch_buffer.c,v rcsdiff -q -kk '-r1.20' '-r1.21' -u '/v/ossp/cvs/ossp-pkg/l2/l2_ch_buffer.c,v' 2>/dev/null --- l2_ch_buffer.c 2001/09/12 16:07:23 1.20 +++ l2_ch_buffer.c 2001/09/14 07:41:49 1.21 @@ -33,9 +33,10 @@ /* declare private channel configuration */ typedef struct { - char *buf; + char *buf; int bufpos; int bufsize; + int levelflush; l2_level_t level; } l2_ch_buffer_t; @@ -49,10 +50,11 @@ return L2_ERR_MEM; /* initialize configuration with reasonable defaults */ - cfg->buf = NULL; - cfg->bufpos = 0; - cfg->bufsize = 4096; - cfg->level = L2_LEVEL_NONE; + cfg->buf = NULL; + cfg->bufpos = 0; + cfg->bufsize = 4096; + cfg->levelflush = 0; + cfg->level = L2_LEVEL_NONE; /* link private channel configuration into channel context */ ctx->vp = cfg; @@ -64,12 +66,13 @@ static l2_result_t hook_configure(l2_context_t *ctx, l2_channel_t *ch, const char *fmt, va_list ap) { l2_ch_buffer_t *cfg = (l2_ch_buffer_t *)ctx->vp; - l2_param_t pa[2]; + l2_param_t pa[3]; l2_result_t rv; /* feed and call generic parameter parsing engine */ - L2_PARAM_SET(pa[0], size, INT, &cfg->bufsize); - L2_PARAM_END(pa[1]); + L2_PARAM_SET(pa[0], size, INT, &cfg->bufsize); + L2_PARAM_SET(pa[1], levelflush, INT, &cfg->levelflush); + L2_PARAM_END(pa[2]); rv = l2_util_setparams(pa, fmt, ap); if (cfg->bufsize < 0) return L2_ERR_ARG; @@ -112,25 +115,28 @@ if ((rv = l2_channel_write(downstream, cfg->level, cfg->buf, cfg->bufpos)) != L2_OK) return rv; cfg->bufpos = 0; - cfg->level = L2_LEVEL_NONE; /* reset this->context->level */ + cfg->level = L2_LEVEL_NONE; } /* pass through immediately to downstream if still too large */ if (buf_size > cfg->bufsize) return l2_channel_write(downstream, level, buf, buf_size); } - /* flush if incoming message level differs from those already in buffer */ - if ((level != cfg->level) && (cfg->level == L2_LEVEL_NONE)) - { + /* flush if level of incoming message differs from those already in buffer */ + if ( (cfg->levelflush) /* if different levels force a flush */ + && (cfg->bufpos > 0) /* and there is something in the buffer */ + && (cfg->level != L2_LEVEL_NONE) /* and a remembered level is known */ + && (level != cfg->level) /* and the levels really differ */) { if ((rv = l2_channel_write(downstream, cfg->level, cfg->buf, cfg->bufpos)) != L2_OK) return rv; cfg->bufpos = 0; - cfg->level = level; + cfg->level = L2_LEVEL_NONE; } /* finally write incoming message to channel buffer */ memcpy(cfg->buf+cfg->bufpos, buf, buf_size); cfg->bufpos += buf_size; + cfg->level = level; return L2_OK; }