ASSA::CharInBuffer Class Reference

CharInBuffer is a bucket for the character-based streams/messages. More...

#include <CharInBuffer.h>

Collaboration diagram for ASSA::CharInBuffer:

Collaboration graph
[legend]
List of all members.

Public Types

enum  state_t { start, waiting, complete, error }
 States: start, waiting, complete, error. More...

Public Member Functions

 CharInBuffer (size_t size_, const string &delimiter_)
 Constructor.
 operator void * () const
 Test the state of an object.
const char * c_str () const
 Get the constant character pointer to the buffer.
size_t length () const
 Bytes in the buffer so far.
size_t size () const
 Bytes in the buffer so far.
void reset ()
 Discard all accumulated characters and be ready to receive a new message.
void dump () const
 Write the state of an object to the log file.
state_t state () const
 Report the current state of the object.

Private Member Functions

void state (state_t new_state_)
 Go to the new state.
void chop ()
 Remove the delimiter from the end of the buffer.

Static Private Member Functions

static const char * state_name (state_t state_)
 Report the state name.

Private Attributes

state_t m_state
 Internal state of an object.
std::string m_buffer
 Buffer to store the bytes received.
size_t m_max_size
 Maximum allowable size (delimiter included) before overflow occurs.
std::string m_delimiter
 Delimiter. Multibyte delimiter is allowed.

Friends

ASSA::Socketoperator>> (ASSA::Socket &, ASSA::CharInBuffer &)
 Read bytes from Socket stream until either record delimiter is detected, or EOF occured, or Socket stream is exhausted.

Detailed Description

CharInBuffer is a bucket for the character-based streams/messages.

It helps in reading, parsing, and storing record-oriented character streams from Socket stream asynchronously. The record terminator can be multibyte. The terminator is detected and removed from the bucket. When terminator is detected, the block of characters collected in the bucket is ready to be processed further by the application according to its communication protocol. If either Socket read() error is encountered, or an overflow occurs (number of characters read exceeds the maximum limit), the object goes into the error state and won't accept further input, unless reset.

Definition at line 44 of file CharInBuffer.h.


Member Enumeration Documentation

enum ASSA::CharInBuffer::state_t
 

States: start, waiting, complete, error.

Enumerator:
start  start state
waiting  incomplete record is in the buffer
complete  matched end-of-record - full record
error  overflow or Socket I/O error

Definition at line 85 of file CharInBuffer.h.

00085                  { 
00086         start,                  
00087         waiting,                
00088         complete,               
00089         error                   
00090     };


Constructor & Destructor Documentation

CharInBuffer::CharInBuffer size_t  size_,
const string &  delimiter_
 

Constructor.

Parameters:
size_ Maximum expected size before buffer overflow
delimiter_ End-of-record character(s). Can be multi-byte.

Definition at line 25 of file CharInBuffer.cpp.

References ASSA::CHARINBUF, error, m_delimiter, m_max_size, state(), and trace_with_mask.

00026     : m_state (start), m_max_size (size_), m_delimiter (delimiter_)
00027 {
00028     trace_with_mask ("CharInBuffer::CharInBuffer", CHARINBUF);
00029 
00030     if (m_max_size == 0 || m_delimiter.length () == 0) {
00031         state (error);
00032     }
00033     state (waiting);
00034 }


Member Function Documentation

const char* ASSA::CharInBuffer::c_str  )  const [inline]
 

Get the constant character pointer to the buffer.

Definition at line 66 of file CharInBuffer.h.

References m_buffer.

00066 { return m_buffer.c_str (); }

void CharInBuffer::chop  )  [inline, private]
 

Remove the delimiter from the end of the buffer.

Definition at line 145 of file CharInBuffer.h.

References m_buffer, and m_delimiter.

00146 {
00147     m_buffer.replace (m_buffer.find (m_delimiter), m_delimiter.length (), "");
00148 }

void CharInBuffer::dump  )  const
 

Write the state of an object to the log file.

Definition at line 51 of file CharInBuffer.cpp.

References ASSA::CHARINBUF, DL, ASSA::MemDump::dump_to_log(), m_buffer, m_delimiter, m_max_size, m_state, state_name(), and ASSA::TRACE.

00052 {
00053     DL((CHARINBUF,"== CharInBuffer state ==\n"));
00054     DL((CHARINBUF,"m_state    = %s\n", state_name (m_state)));
00055     DL((CHARINBUF,"m_max_size = %d\n", m_max_size));
00056 
00057     MemDump::dump_to_log (TRACE, "m_delimiter:\n",
00058                           m_delimiter.c_str (), m_delimiter.length ());
00059 
00060     MemDump::dump_to_log (TRACE, "m_buffer:\n",
00061                           m_buffer.c_str (), m_buffer.length ());
00062 
00063     DL((CHARINBUF,"========================\n"));
00064 }

size_t ASSA::CharInBuffer::length  )  const [inline]
 

Bytes in the buffer so far.

Definition at line 69 of file CharInBuffer.h.

References m_buffer.

00069 { return m_buffer.length (); }

CharInBuffer::operator void *  )  const [inline]
 

Test the state of an object.

Returns:
true if the object holds a complete message; false otherwise (eof, buffer overflow, or incomplete)

Definition at line 128 of file CharInBuffer.h.

References complete, and m_state.

00129 { 
00130     return (m_state == complete 
00131             ? (void *) (-1)     // good state
00132             : (void *) 0);      // bad state
00133 }

void CharInBuffer::reset  )  [inline]
 

Discard all accumulated characters and be ready to receive a new message.

Definition at line 137 of file CharInBuffer.h.

References m_buffer, state(), and waiting.

00138 { 
00139     m_buffer = ""; 
00140     state (waiting); 
00141 }

size_t ASSA::CharInBuffer::size  )  const [inline]
 

Bytes in the buffer so far.

Definition at line 72 of file CharInBuffer.h.

References m_buffer.

00072 { return m_buffer.size (); }

void ASSA::CharInBuffer::state state_t  new_state_  )  [inline, private]
 

Go to the new state.

Definition at line 100 of file CharInBuffer.h.

References m_state.

00100 { m_state = new_state_; }

state_t ASSA::CharInBuffer::state  )  const [inline]
 

Report the current state of the object.

Definition at line 93 of file CharInBuffer.h.

References m_state.

Referenced by CharInBuffer(), ASSA::operator>>(), and reset().

00093 { return m_state; }

const char * CharInBuffer::state_name state_t  state_  )  [static, private]
 

Report the state name.

Definition at line 38 of file CharInBuffer.cpp.

References error.

Referenced by dump(), and ASSA::operator>>().

00039 {
00040     static const char* vmsg[] = 
00041         { "start", "waiting", "complete", "error", "unknown state" };
00042 
00043     if (state_ < CharInBuffer::start || state_ > CharInBuffer::error) {
00044         return vmsg [sizeof (vmsg)-1];
00045     }
00046     return vmsg [state_];
00047 }


Friends And Related Function Documentation

ASSA::Socket& operator>> ASSA::Socket s_,
ASSA::CharInBuffer b_
[friend]
 

Read bytes from Socket stream until either record delimiter is detected, or EOF occured, or Socket stream is exhausted.

If match, bite off delimiter and set the state to complete. If not, continue reading till either there is no more characters to read, or Socket error (Fail or EOF), or buffer overflow. If overflow occurs, set the state to 'error' and terminate.

Definition at line 80 of file CharInBuffer.cpp.

00081 {
00082     trace_with_mask ("Socket >> CharInBuffer", CHARINBUF);
00083     register char c;
00084 
00085     if (b_.state () != CharInBuffer::waiting) {
00086         DL((CHARINBUF,"Wrong state %s\n", b_.state_name (b_.state ())));
00087         return s_;
00088     }
00089 
00090     while (s_.read (&c, 1) == 1) 
00091     {
00092         b_.m_buffer += c;
00093 
00094         if (b_.m_buffer.size() < b_.m_delimiter.size()) { // Bug # 1252926
00095             continue;
00096         }
00097 
00098         if (b_.m_buffer.substr (
00099                 b_.m_buffer.size ()-b_.m_delimiter.size ()) == b_.m_delimiter) 
00100         {
00101             b_.chop ();
00102             b_.m_state = CharInBuffer::complete;
00103             return s_;
00104         }
00105 
00106         if (b_.m_buffer.length () >= b_.m_max_size) {
00107             b_.m_state = CharInBuffer::error;
00108             break;
00109         }
00110     }
00111 
00112     if (!s_) {                  // EOF or error
00113         b_.state (CharInBuffer::error);
00114     }
00115     
00116     return s_;
00117 }


Member Data Documentation

std::string ASSA::CharInBuffer::m_buffer [private]
 

Buffer to store the bytes received.

Definition at line 110 of file CharInBuffer.h.

Referenced by c_str(), chop(), dump(), length(), reset(), and size().

std::string ASSA::CharInBuffer::m_delimiter [private]
 

Delimiter. Multibyte delimiter is allowed.

Definition at line 116 of file CharInBuffer.h.

Referenced by CharInBuffer(), chop(), and dump().

size_t ASSA::CharInBuffer::m_max_size [private]
 

Maximum allowable size (delimiter included) before overflow occurs.

Definition at line 113 of file CharInBuffer.h.

Referenced by CharInBuffer(), and dump().

state_t ASSA::CharInBuffer::m_state [private]
 

Internal state of an object.

Definition at line 107 of file CharInBuffer.h.

Referenced by dump(), operator void *(), and state().


The documentation for this class was generated from the following files:
Generated on Sun Aug 13 15:08:18 2006 for libassa by  doxygen 1.4.6