WvStreams
include/wvencoder.h
1/* -*- Mode: C++ -*-
2 * Worldvisions Weaver Software:
3 * Copyright (C) 1997-2002 Net Integration Technologies, Inc.
4 *
5 * A top-level data encoder class and a few useful encoders.
6 */
7#ifndef __WVENCODER_H
8#define __WVENCODER_H
9
10#include "wvbuf.h"
11#include "wvlinklist.h"
12#include "wvstring.h"
13
67class WvEncoder
68{
69protected:
70 bool okay;
71 bool finished;
74public:
77
79 virtual ~WvEncoder();
80
90 bool isok() const
91 { return okay && _isok(); }
92
101 bool isfinished() const
102 { return finished || _isfinished(); }
103
110
152 bool encode(WvBuf &inbuf, WvBuf &outbuf, bool flush = false,
153 bool finish = false);
154
163 bool flush(WvBuf &inbuf, WvBuf &outbuf,
164 bool finish = false)
165 { return encode(inbuf, outbuf, true, finish); }
166
184 bool finish(WvBuf &outbuf);
185
199 bool reset();
200
209 bool flushstrbuf(WvStringParm instr, WvBuf &outbuf,
210 bool finish = false);
211
222 bool flushstrstr(WvStringParm instr, WvString &outstr,
223 bool finish = false);
224
236 bool encodebufstr(WvBuf &inbuf, WvString &outstr,
237 bool flush = false, bool finish = false);
238
249 bool flushbufstr(WvBuf &inbuf, WvString &outstr,
250 bool finish = false)
251 { return encodebufstr(inbuf, outstr, true, finish); }
252
261
269 WvString strflushbuf(WvBuf &inbuf, bool finish = false);
270
280 bool flushmembuf(const void *inmem, size_t inlen, WvBuf &outbuf,
281 bool finish = false);
282
299 bool flushmemmem(const void *inmem, size_t inlen, void *outmem,
300 size_t *outlen, bool finish = false);
301
319 bool encodebufmem(WvBuf &inbuf, void *outmem, size_t *outlen,
320 bool flush = false, bool finish = false);
321
337 bool flushbufmem(WvBuf &inbuf, void *outmem, size_t *outlen,
338 bool finish = false)
339 { return encodebufmem(inbuf, outmem, outlen, true, finish); }
340
356 bool flushstrmem(WvStringParm instr, void *outmem, size_t *outlen,
357 bool finish = false);
358
367 WvString strflushmem(const void *inmem, size_t inlen, bool finish = false);
368
369protected:
371 void setnotok()
372 { okay = false; }
373
375 void seterror(WvStringParm message)
376 { errstr = message; setnotok(); }
377
379 void seterror(WVSTRING_FORMAT_DECL)
380 { seterror(WvString(WVSTRING_FORMAT_CALL)); }
381
384 { finished = true; }
385
386protected:
400 virtual bool _isok() const
401 { return true; }
402
416 virtual bool _isfinished() const
417 { return false; }
418
433 virtual WvString _geterror() const
434 { return WvString::null; }
435
459 virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush) = 0;
460
483 virtual bool _finish(WvBuf &outbuf)
484 { return true; }
485
498 virtual bool _reset()
499 { return false; }
500};
501
502
504class WvNullEncoder : public WvEncoder
505{
506protected:
507 virtual bool _encode(WvBuf &in, WvBuf &out, bool flush);
508 virtual bool _reset(); // supported: does nothing
509};
510
511
521class WvPassthroughEncoder : public WvEncoder
522{
523 size_t total;
524
525public:
527 virtual ~WvPassthroughEncoder() { }
528
533 size_t bytes_processed() { return total; }
534
535protected:
536 virtual bool _encode(WvBuf &in, WvBuf &out, bool flush);
537 virtual bool _reset(); // supported: resets the count to zero
538};
539
540
549class WvEncoderChain : public WvEncoder
550{
551 class ChainElem
552 {
553 public:
554 WvEncoder *enc;
555 WvDynBuf out;
556 bool autofree;
557
558 ChainElem(WvEncoder *enc, bool autofree)
559 : enc(enc), autofree(autofree) { }
560 ~ChainElem() { if (autofree) delete enc; }
561 };
562 DeclareWvList(ChainElem);
563
564 ChainElemList encoders;
565 ChainElem *last_run;
566
567public:
570
573
578 void append(WvEncoder *enc, bool autofree);
579
584 void prepend(WvEncoder *enc, bool autofree);
585
592 bool get_autofree(WvEncoder *enc) const;
593
601 void set_autofree(WvEncoder *enc, bool autofree);
602
607 void unlink(WvEncoder *enc);
608
613 void zap();
614
628 bool continue_encode(WvBuf &inbuf, WvBuf &outbuf);
629
633 size_t buffered();
634
635protected:
646 virtual bool _isok() const;
647
658 virtual bool _isfinished() const;
659
669 virtual WvString _geterror() const;
670
675 virtual bool _encode(WvBuf &in, WvBuf &out, bool flush);
676
688 virtual bool _finish(WvBuf & out);
689
698 virtual bool _reset();
699
700private:
702 bool do_encode(WvBuf &in, WvBuf &out, ChainElem *start_after,
703 bool flush, bool finish);
704};
705
706#endif // __WVENCODER_H
An encoder chain owns a list of encoders that are used in sequence to transform data from a source bu...
size_t buffered()
Returns true if there is data in an internal buffer.
bool get_autofree(WvEncoder *enc) const
Gets the autofree state of a particular encoder in the chain.
bool continue_encode(WvBuf &inbuf, WvBuf &outbuf)
"Continues" encoding a buffer.
void unlink(WvEncoder *enc)
Unlinks the encoder from the chain.
WvEncoderChain()
Creates an initially empty chain of encoders.
void zap()
Clears the encoder chain.
void set_autofree(WvEncoder *enc, bool autofree)
Sets the autofree state of a particular encoder in the chain.
virtual bool _isok() const
Returns true if the encoder has not encountered an error.
virtual bool _encode(WvBuf &in, WvBuf &out, bool flush)
Passes the data through the entire chain of encoders.
virtual ~WvEncoderChain()
Destroys the encoder chain.
void prepend(WvEncoder *enc, bool autofree)
Prepends an encoder to the head of the chain.
void append(WvEncoder *enc, bool autofree)
Appends an encoder to the tail of the chain.
virtual bool _isfinished() const
Returns true if the encoder can no longer encode data.
virtual bool _reset()
Resets the chain of encoders.
virtual WvString _geterror() const
Returns the error message, if any.
virtual bool _finish(WvBuf &out)
Finishes the chain of encoders.
bool finish(WvBuf &outbuf)
Tells the encoder that NO MORE DATA will ever be encoded.
Definition wvencoder.cc:49
bool isok() const
Returns true if the encoder has not encountered an error.
bool reset()
Asks an encoder to reset itself to its initial state at creation time, if supported.
WvString strflushstr(WvStringParm instr, bool finish=false)
Flushes data through the encoder from a string to a string.
bool encode(WvBuf &inbuf, WvBuf &outbuf, bool flush=false, bool finish=false)
Reads data from the input buffer, encodes it, and writes the result to the output buffer.
void seterror(WVSTRING_FORMAT_DECL)
Sets an error condition, then setnotok().
void seterror(WvStringParm message)
Sets an error condition, then setnotok().
virtual bool _finish(WvBuf &outbuf)
Template method implementation of finish().
virtual ~WvEncoder()
Destroys the encoder.
bool flushbufmem(WvBuf &inbuf, void *outmem, size_t *outlen, bool finish=false)
Flushes data through the encoder from a buffer to memory.
bool encodebufmem(WvBuf &inbuf, void *outmem, size_t *outlen, bool flush=false, bool finish=false)
Encodes data from a buffer to memory.
bool flushmembuf(const void *inmem, size_t inlen, WvBuf &outbuf, bool finish=false)
Flushes data through the encoder from memory to a buffer.
bool flushmemmem(const void *inmem, size_t inlen, void *outmem, size_t *outlen, bool finish=false)
Flushes data through the encoder from memory to memory.
bool flushstrbuf(WvStringParm instr, WvBuf &outbuf, bool finish=false)
Flushes data through the encoder from a string to a buffer.
bool isfinished() const
Returns true if the encoder can no longer encode data.
void setnotok()
Sets 'okay' to false explicitly.
WvEncoder()
Creates a new WvEncoder.
virtual bool _isok() const
Template method implementation of isok().
bool encodebufstr(WvBuf &inbuf, WvString &outstr, bool flush=false, bool finish=false)
Encodes data from a buffer to a string.
bool flush(WvBuf &inbuf, WvBuf &outbuf, bool finish=false)
Flushes the encoder and optionally finishes it.
bool flushstrmem(WvStringParm instr, void *outmem, size_t *outlen, bool finish=false)
Flushes data through the encoder from a string to memory.
bool flushstrstr(WvStringParm instr, WvString &outstr, bool finish=false)
Flushes data through the encoder from a string to a string.
virtual WvString _geterror() const
Template method implementation of geterror().
WvString strflushmem(const void *inmem, size_t inlen, bool finish=false)
Flushes data through the encoder from memory to a string.
bool flushbufstr(WvBuf &inbuf, WvString &outstr, bool finish=false)
Flushes data through the encoder from a buffer to a string.
void setfinished()
Sets 'finished' to true explicitly.
virtual bool _reset()
Template method implementation of reset().
virtual bool _isfinished() const
Template method implementation of isfinished().
WvString geterror() const
Returns an error message if any is available.
WvString strflushbuf(WvBuf &inbuf, bool finish=false)
Flushes data through the encoder from a buffer to a string.
virtual bool _encode(WvBuf &inbuf, WvBuf &outbuf, bool flush)=0
Template method implementation of encode().
A WvFastString acts exactly like a WvString, but can take (const char *) strings without needing to a...
An encoder that discards all of its input.
virtual bool _encode(WvBuf &in, WvBuf &out, bool flush)
Template method implementation of encode().
virtual bool _reset()
Template method implementation of reset().
A very efficient passthrough encoder that just merges the input buffer into the output buffer.
size_t bytes_processed()
Returns the number of bytes processed so far.
virtual bool _reset()
Template method implementation of reset().
virtual bool _encode(WvBuf &in, WvBuf &out, bool flush)
Template method implementation of encode().
WvString is an implementation of a simple and efficient printable-string class.