PacketizedDataIO Class Reference

This class can be used to "wrap" a streaming I/O object (e.g. More...

#include <PacketizedDataIO.h>

Inheritance diagram for PacketizedDataIO:

Inheritance graph
[legend]
List of all members.

Public Types

enum  { IO_SEEK_SET = 0, IO_SEEK_CUR, IO_SEEK_END, NUM_IO_SEEKS }
 Values to pass in to DataIO::Seek()'s second parameter. More...

Public Member Functions

 PacketizedDataIO (const DataIORef &slaveIO, uint32 maxTransferUnit=MUSCLE_NO_LIMIT)
 Constructor.
const DataIORefGetSlaveIO () const
 Returns a reference to our underlying DataIO object.
void SetSlaveIO (const DataIORef &sio)
 Sets our underlying Data I/O object.
uint32 GetMaxTransferUnit () const
 Returns the maximum "packet size" we will be willing to send or receive.
virtual int32 Read (void *buffer, uint32 size)
 Tries to place (size) bytes of new data into (buffer).
virtual int32 Write (const void *buffer, uint32 size)
 Takes (size) bytes from (buffer) and pushes them in to the outgoing I/O stream.
virtual status_t Seek (int64 offset, int whence)
 Seek to a given position in the I/O stream.
virtual int64 GetPosition () const
 Should return the current position, in bytes, of the stream from its start position, or -1 if the current position is not known.
virtual uint64 GetOutputStallLimit () const
 Returns the max number of microseconds to allow for an output stall, before presuming that the I/O is hosed.
virtual void FlushOutput ()
 Flushes the output buffer, if possible.
virtual void Shutdown ()
 Closes the connection.
virtual const SocketRefGetSelectSocket () const
 If this DataIO is usable with select(), this method should return the SocketRef object containing the file descriptor to select on for this DataIO.
virtual int64 GetLength ()
 Convenience method: Determines the length of this DataIO stream by Seek()'ing to the end of the stream, recording the current seek position, and then Seek()'ing back to the previous position in the stream.
virtual bool HasBufferedOutput () const
 Optional: If your DataIO subclass is holding buffered data that it wants to output as soon as possible but hasn't been able to yet, then override this method to return true, and that will cause FlushBufferedOutput() to be called ASAP.
virtual void WriteBufferedOutput ()
 Optional: If this DataIO is holding any buffered output data, this method should be implemented to Write() as much of that data as possible.
virtual status_t GetReadByteTimeStamp (int32 whichByte, uint64 &retStamp) const
 Optional interface for returning information on when a given byte returned by the previous Read() call was received.
uint32 WriteFully (const void *buffer, uint32 size)
 Convenience method: Calls Write() in a loop until the entire buffer is written, or until an error occurs.
uint32 ReadFully (void *buffer, uint32 size)
 Convenience method: Calls Read() in a loop until the entire buffer is written, or until an error occurs.
void IncrementRefCount () const
 Increments the counter and returns true iff the new value is zero.
bool DecrementRefCount () const
 Decrements the counter and returns true iff the new value is zero.
void SetManager (AbstractObjectManager *manager)
 Sets the recycle-pointer for this object.
AbstractObjectManagerGetManager () const
 Returns this object's current recyler pointer.
uint32 GetRefCount () const
 Returns this object's current reference count.

Detailed Description

This class can be used to "wrap" a streaming I/O object (e.g.

a TCPSocketDataIO) in order to make it appear like a packet-based I/O object (e.g. a UDPSocketDataIO) to the calling code.

It does this by inserting message-length fields into the outgoing byte stream, and parsing message-length fields from the incoming byte stream, so that data will be returned in Read() in the same chunk sizes that it was originally passed in to Write() on the other end. Note that this does change the underlying byte-stream protocol, so the receiver must be aware of the change (typically by having the receiver wrap his DataIO object in a PacketizedDataIO object also)

You might use this class to simulate a lossless UDP connection by "tunneling" UDP over TCP.

Definition at line 24 of file PacketizedDataIO.h.


Member Enumeration Documentation

anonymous enum [inherited]

Values to pass in to DataIO::Seek()'s second parameter.

Enumerator:
IO_SEEK_SET  Tells Seek that its value specifies bytes-after-beginning-of-stream.
IO_SEEK_CUR  Tells Seek that its value specifies bytes-after-current-stream-position.
IO_SEEK_END  Tells Seek that its value specifies bytes-after-end-of-stream (you'll usually specify a non-positive seek value with this).
NUM_IO_SEEKS  A guard value.

Definition at line 15 of file DataIO.h.


Constructor & Destructor Documentation

PacketizedDataIO::PacketizedDataIO ( const DataIORef slaveIO,
uint32  maxTransferUnit = MUSCLE_NO_LIMIT 
)

Constructor.

Parameters:
slaveIO The underlying streaming DataIO object to pass calls on through to.
maxTransferUnit the maximum "packet size" we should support. Calls to Read() or Write() with more than this many bytes specified will be truncated, analogous to the way too-large packets are handled by UDP.


Member Function Documentation

void PacketizedDataIO::SetSlaveIO ( const DataIORef sio  )  [inline]

Sets our underlying Data I/O object.

Use with caution!

Definition at line 40 of file PacketizedDataIO.h.

uint32 PacketizedDataIO::GetMaxTransferUnit (  )  const [inline]

Returns the maximum "packet size" we will be willing to send or receive.

Defaults to MUSCLE_NO_LIMIT.

Definition at line 43 of file PacketizedDataIO.h.

virtual int32 PacketizedDataIO::Read ( void *  buffer,
uint32  size 
) [virtual]

Tries to place (size) bytes of new data into (buffer).

Returns the actual number of bytes placed, or a negative value if there was an error.

Parameters:
buffer Buffer to write the bytes into
size Number of bytes in the buffer.
Returns:
Number of bytes read, or -1 on error.

Implements DataIO.

virtual int32 PacketizedDataIO::Write ( const void *  buffer,
uint32  size 
) [virtual]

Takes (size) bytes from (buffer) and pushes them in to the outgoing I/O stream.

Returns the actual number of bytes read from (buffer) and pushed, or a negative value if there was an error.

Parameters:
buffer Buffer to read the bytes from.
size Number of bytes in the buffer.
Returns:
Number of bytes written, or -1 on error.

Implements DataIO.

virtual status_t PacketizedDataIO::Seek ( int64  offset,
int  whence 
) [inline, virtual]

Seek to a given position in the I/O stream.

May not be supported by a DataIO subclass, in which case B_ERROR will always be returned.

Parameters:
offset Byte offset to seek to or by (depending on the next arg)
whence Set this to IO_SEEK_SET if you want the offset to be relative to the start of the stream; or to IO_SEEK_CUR if it should be relative to the current stream position, or IO_SEEK_END if it should be relative to the end of the stream.
Returns:
B_NO_ERROR on success, or B_ERROR on failure or if unsupported.

Implements DataIO.

Definition at line 47 of file PacketizedDataIO.h.

virtual uint64 PacketizedDataIO::GetOutputStallLimit (  )  const [inline, virtual]

Returns the max number of microseconds to allow for an output stall, before presuming that the I/O is hosed.

Default implementation returns MUSCLE_TIME_NEVER, aka no limit.

Reimplemented from DataIO.

Definition at line 49 of file PacketizedDataIO.h.

virtual void PacketizedDataIO::FlushOutput (  )  [inline, virtual]

Flushes the output buffer, if possible.

For some implementations, this is a no-op. For others (e.g. TCPSocketDataIO) this can be called to reduced latency of outgoing data blocks.

Implements DataIO.

Definition at line 50 of file PacketizedDataIO.h.

virtual void PacketizedDataIO::Shutdown (  )  [inline, virtual]

Closes the connection.

After calling this method, the DataIO object should not be used any more.

Implements DataIO.

Definition at line 51 of file PacketizedDataIO.h.

References ByteBuffer::Clear(), and Ref< Item >::Reset().

virtual const SocketRef& PacketizedDataIO::GetSelectSocket (  )  const [inline, virtual]

If this DataIO is usable with select(), this method should return the SocketRef object containing the file descriptor to select on for this DataIO.

If this DataIO isn't usable with select(), then this method should return GetNullSocket().

Note that the only thing you are allowed to do with the returned file descriptor is pass it to select(). For all other operations, use the appropriate methods in the DataIO interface. If you attempt to do any other I/O operations on this file descriptor directly, the results are non-portable and undefined and will probably break your program.

Implements DataIO.

Definition at line 52 of file PacketizedDataIO.h.

virtual int64 PacketizedDataIO::GetLength (  )  [inline, virtual]

Convenience method: Determines the length of this DataIO stream by Seek()'ing to the end of the stream, recording the current seek position, and then Seek()'ing back to the previous position in the stream.

Of course this only works with DataIOs that support seeking and have a fixed length.

Returns:
The total length of this DataIO in bytes, or -1 on error.

Reimplemented from DataIO.

Definition at line 53 of file PacketizedDataIO.h.

virtual bool PacketizedDataIO::HasBufferedOutput (  )  const [inline, virtual]

Optional: If your DataIO subclass is holding buffered data that it wants to output as soon as possible but hasn't been able to yet, then override this method to return true, and that will cause FlushBufferedOutput() to be called ASAP.

Default implementation always returns false.

Reimplemented from DataIO.

Definition at line 55 of file PacketizedDataIO.h.

References ByteBuffer::GetNumBytes().

virtual void PacketizedDataIO::WriteBufferedOutput (  )  [inline, virtual]

Optional: If this DataIO is holding any buffered output data, this method should be implemented to Write() as much of that data as possible.

Default implementation is a no-op.

Reimplemented from DataIO.

Definition at line 56 of file PacketizedDataIO.h.

virtual status_t DataIO::GetReadByteTimeStamp ( int32  whichByte,
uint64 &  retStamp 
) const [inline, virtual, inherited]

Optional interface for returning information on when a given byte returned by the previous Read() call was received.

Not implemented by default, and not implemented by any of the standard MUSCLE DataIO subclasses. (Used by an LCS dataIO class that needs precision timing)

Parameters:
whichByte Index of the byte in the previously returned read-buffer that you are interested in.
retStamp On success, this value is set to the timestamp of the byte.
Returns:
B_NO_ERROR if a timestamp was written into (retStamp), otherwise B_ERROR. Default implementation always returns B_ERROR.

Reimplemented in FailoverDataIO, MultiDataIO, and XorDataIO.

Definition at line 114 of file DataIO.h.

Referenced by MultiDataIO::GetReadByteTimeStamp(), and FailoverDataIO::GetReadByteTimeStamp().

uint32 DataIO::WriteFully ( const void *  buffer,
uint32  size 
) [inherited]

Convenience method: Calls Write() in a loop until the entire buffer is written, or until an error occurs.

This method should only be used in conjunction with blocking I/O; it will not work reliably with non-blocking I/O.

Parameters:
buffer Pointer to the first byte of the buffer to write data from.
size Number of bytes to write
Returns:
The number of bytes that were actually written. On success, This will be equal to (size). On failure, it will be a smaller value.

uint32 DataIO::ReadFully ( void *  buffer,
uint32  size 
) [inherited]

Convenience method: Calls Read() in a loop until the entire buffer is written, or until an error occurs.

This method should only be used in conjunction with blocking I/O; it will not work reliably with non-blocking I/O.

Parameters:
buffer Pointer to the first byte of the buffer to place the read data into.
size Number of bytes to read
Returns:
The number of bytes that were actually read. On success, This will be equal to (size). On failure, it will be a smaller value.

void RefCountable::IncrementRefCount (  )  const [inline, inherited]

Increments the counter and returns true iff the new value is zero.

Thread safe.

Definition at line 32 of file RefCount.h.

References AtomicCounter::AtomicIncrement().

bool RefCountable::DecrementRefCount (  )  const [inline, inherited]

Decrements the counter and returns true iff the new value is zero.

Thread safe.

Definition at line 35 of file RefCount.h.

References AtomicCounter::AtomicDecrement().

void RefCountable::SetManager ( AbstractObjectManager manager  )  [inline, inherited]

Sets the recycle-pointer for this object.

If set to non-NULL, this pointer is used by the ObjectPool class to recycle this object when it is no longer in use, so as to avoid the overhead of having to delete it and re-create it later on. The RefCountable class itself does nothing with this pointer. Default value is NULL.

Parameters:
manager Pointer to the new manager object to use, or NULL to use no manager.

Definition at line 44 of file RefCount.h.

uint32 RefCountable::GetRefCount (  )  const [inline, inherited]

Returns this object's current reference count.

Note that the value returned by this method is volatile in multithreaded environments, so it may already be wrong by the time it is returned. Be careful!

Definition at line 54 of file RefCount.h.

References AtomicCounter::GetCount().


The documentation for this class was generated from the following file:
Generated on Thu Jun 5 17:48:17 2008 for MUSCLE by  doxygen 1.5.1