Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Core::ExternalStream Class Reference

#include <ExternalStream.h>

Inheritance diagram for Core::ExternalStream:

Inheritance graph
[legend]
Collaboration diagram for Core::ExternalStream:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 ExternalStream (IOAccessor *accessor)
virtual StringclassName (void) const
 Answer receiver class name.
virtual SequenceableCollectioncontents (void)
 Answer content of the receiver.
virtual long readPosition (void)
virtual void close (void)
virtual bool closed (void)
virtual void commit (void)
virtual bool atEnd (void)
virtual bool isBinary (void)
virtual bool isExternalStream (void)
virtual void closeConnection (void)
virtual bool nextBuffer (void)
virtual ObjectpastEnd (void)
virtual void setPosition (long position)

Protected Attributes

IOAccessorio_accessor
IOBufferio_buffer

Constructor & Destructor Documentation

ExternalStream::ExternalStream IOAccessor accessor  ) 
 

Definition at line 35 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::IOBuffer::buffer(), Core::IOBuffer::firstDataPosition(), Core::PositionableStream::initialize(), io_accessor, io_buffer, Core::PositionableStream::read_limit, and Core::PositionableStream::write_limit.

00036 {
00037     io_accessor = accessor;
00038     io_buffer = new IOBuffer(io_accessor);
00039     PositionableStream::initialize(io_buffer->buffer());
00040     _position = io_buffer->firstDataPosition();
00041     read_limit = 0;
00042     write_limit = -1;
00043 }


Member Function Documentation

bool ExternalStream::atEnd void   )  [virtual]
 

Reimplemented from Core::PositionableStream.

Reimplemented in Core::ExternalWriteStream.

Definition at line 94 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::PositionableStream::basicAtEnd(), nextBuffer(), and Core::PositionableStream::read_limit.

Referenced by contents().

00095 {
00096     if (!basicAtEnd()) return false;
00097     if (!nextBuffer()) return true;
00098     return _position == read_limit;
00099 }

String * ExternalStream::className void   )  const [virtual]
 

Answer receiver class name.

Because there isn't any standard way to obtain class name this method comes to place.

Every class should rewrite this method but many didn't (yet).

Reimplemented from Core::PositionableStream.

Reimplemented in Core::ExternalReadAppendStream, Core::ExternalReadStream, and Core::ExternalWriteStream.

Definition at line 46 of file ExternalStream.cc.

00047 {
00048     return new String("ExternalStream");
00049 }

void ExternalStream::close void   )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalReadAppendStream.

Definition at line 74 of file ExternalStream.cc.

References closeConnection(), closed(), Core::PositionableStream::collection, Core::PositionableStream::contentSpeciesFor(), io_buffer, and nil.

Referenced by Core::ExternalReadAppendStream::close().

00075 {
00076     if (!closed()) {
00077         closeConnection();
00078         io_buffer = nil;
00079         collection = contentSpeciesFor(0);
00080     }
00081 }

void ExternalStream::closeConnection void   )  [virtual]
 

Reimplemented in Core::ExternalWriteStream.

Definition at line 112 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::IOAccessor::close(), Core::Stream::flush(), io_accessor, Core::PositionableStream::read_limit, and Core::PositionableStream::write_limit.

Referenced by close().

00113 {
00114     try {
00115         flush();
00116         io_accessor->close();
00117         _position = read_limit = 0;
00118         write_limit = -1;
00119     }
00120     catch (Error *ex) {
00121         /* Do nothing */
00122     }
00123 }

bool ExternalStream::closed void   )  [virtual]
 

Definition at line 83 of file ExternalStream.cc.

References io_buffer, and nil.

Referenced by close().

00084 {
00085     return io_buffer == nil;
00086 }

void ExternalStream::commit void   )  [virtual]
 

Reimplemented from Core::Stream.

Reimplemented in Core::ExternalReadAppendStream.

Definition at line 88 of file ExternalStream.cc.

References Core::IOBuffer::commit(), and io_buffer.

Referenced by Core::ExternalReadAppendStream::commit().

00089 {
00090     io_buffer->commit();
00091 }

SequenceableCollection * ExternalStream::contents void   )  [virtual]
 

Answer content of the receiver.

In many cases it doesn't matter if it is ReadStream or WriteStream because they don't do any conversion. I does matter on streams like EncodedStream where some conversion takes place. In that case contents() always answer collection of encoded data (for ex. as it would be written to the disk). To get all data decoded you can use upToEnd() method.

Reimplemented from Core::PositionableStream.

Definition at line 52 of file ExternalStream.cc.

References atEnd(), Core::Stream::contents(), Core::PositionableStream::contentSpeciesFor(), Core::IOAccessor::dataSize(), io_accessor, Core::PositionableStream::next(), and Core::Stream::nextPut().

00053 {
00054     long dataSize;
00055     Stream *newCollectionStream;
00056 
00057     dataSize = io_accessor->dataSize();
00058     newCollectionStream = contentSpeciesFor(dataSize < 256 ? 256 : dataSize)
00059                               ->writeStream();
00060     while (!atEnd()) {
00061         newCollectionStream->nextPut(next());
00062     }
00063     return newCollectionStream->contents();
00064 }

bool ExternalStream::isBinary void   )  [virtual]
 

Reimplemented from Core::PositionableStream.

Definition at line 101 of file ExternalStream.cc.

00102 {
00103     return true;
00104 }

bool ExternalStream::isExternalStream void   )  [virtual]
 

Reimplemented from Core::Stream.

Definition at line 106 of file ExternalStream.cc.

00107 {
00108     return true;
00109 }

bool ExternalStream::nextBuffer void   )  [virtual]
 

Reimplemented in Core::ExternalWriteStream.

Definition at line 125 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::PositionableStream::collection, Core::Stream::flush(), io_buffer, Core::IOBuffer::lastDataPosition(), Core::IOBuffer::nextAndSetOffset(), and Core::PositionableStream::read_limit.

Referenced by atEnd(), and pastEnd().

00126 {
00127     long offset;
00128 
00129     flush();
00130     collection = io_buffer->nextAndSetOffset(offset);
00131     _position = offset;
00132     read_limit = io_buffer->lastDataPosition();
00133     return read_limit > _position;
00134 }

Object * ExternalStream::pastEnd void   )  [virtual]
 

Definition at line 136 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::SequenceableCollection::at(), Core::PositionableStream::collection, nextBuffer(), nil, and Core::PositionableStream::read_limit.

Referenced by Core::ExternalReadStream::next().

00137 {
00138     // openIfClosed();
00139     if (_position < read_limit)
00140         return collection->at(_position++);
00141     if (nextBuffer())
00142         return collection->at(_position++);
00143     /* End of stream. Must be signaled somehow. */
00144     return nil;
00145 }

long ExternalStream::readPosition void   )  [virtual]
 

Definition at line 67 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::IOBuffer::currentBufferPosition(), and io_buffer.

Referenced by Core::ExternalReadStream::skip().

00068 {
00069     // openIfClosed();
00070     return io_buffer->currentBufferPosition() + _position;
00071 }

void ExternalStream::setPosition long  position  )  [virtual]
 

Definition at line 147 of file ExternalStream.cc.

References Core::PositionableStream::_position, Core::PositionableStream::collection, Core::Stream::flush(), io_buffer, Core::IOBuffer::lastDataPosition(), Core::GenericException::raiseFrom(), Core::PositionableStream::read_limit, and Core::IOBuffer::readPositionAndSetOffset().

Referenced by Core::ExternalReadStream::skip().

00148 {
00149     long offset;
00150 
00151     if (index < 0) {
00152         Error *ex = new Error(new String("Attempt to position to a negative number."),
00153                               new String(__PRETTY_FUNCTION__));
00154         ex->raiseFrom(this);
00155     }
00156     flush();
00157     collection = io_buffer->readPositionAndSetOffset(index, offset);
00158     _position = offset;
00159     read_limit = io_buffer->lastDataPosition();
00160 }


Member Data Documentation

IOAccessor* Core::ExternalStream::io_accessor [protected]
 

Definition at line 41 of file ExternalStream.h.

Referenced by Core::ExternalWriteStream::closeConnection(), closeConnection(), contents(), ExternalStream(), Core::ExternalWriteStream::size(), and Core::ExternalWriteStream::writePosition().

IOBuffer* Core::ExternalStream::io_buffer [protected]
 

Definition at line 42 of file ExternalStream.h.

Referenced by close(), closed(), commit(), ExternalStream(), Core::ExternalWriteStream::flush(), nextBuffer(), Core::ExternalWriteStream::nextPut(), readPosition(), setPosition(), and Core::ExternalReadStream::skip().


The documentation for this class was generated from the following files:
Generated on Mon Nov 27 09:51:28 2006 for Smalltalk like C++ Class Library by  doxygen 1.4.2