00001
00002
00003 #ifndef MusclePacketizedDataIO_h
00004 #define MusclePacketizedDataIO_h
00005
00006 #include "dataio/DataIO.h"
00007 #include "util/ByteBuffer.h"
00008
00009 BEGIN_NAMESPACE(muscle);
00010
00024 class PacketizedDataIO : public DataIO
00025 {
00026 public:
00034 PacketizedDataIO(const DataIORef & slaveIO, uint32 maxTransferUnit = MUSCLE_NO_LIMIT);
00035
00037 const DataIORef & GetSlaveIO() const {return _slaveIO;}
00038
00040 void SetSlaveIO(const DataIORef & sio) {_slaveIO = sio;}
00041
00043 uint32 GetMaxTransferUnit() const {return _maxTransferUnit;}
00044
00045 virtual int32 Read(void * buffer, uint32 size);
00046 virtual int32 Write(const void * buffer, uint32 size);
00047 virtual status_t Seek(int64 offset, int whence) {return _slaveIO() ? _slaveIO()->Seek(offset, whence) : B_ERROR;}
00048 virtual int64 GetPosition() const {return _slaveIO() ? _slaveIO()->GetPosition() : -1;}
00049 virtual uint64 GetOutputStallLimit() const {return _slaveIO() ? _slaveIO()->GetOutputStallLimit() : MUSCLE_TIME_NEVER;}
00050 virtual void FlushOutput() {if (_slaveIO()) _slaveIO()->FlushOutput();}
00051 virtual void Shutdown() {if (_slaveIO()) _slaveIO()->Shutdown(); _slaveIO.Reset(); _outputBuffer.Clear(true); _inputBuffer.Clear(true); _inputBufferSizeBytesRead = 0;}
00052 virtual const SocketRef & GetSelectSocket() const {return _slaveIO() ? _slaveIO()->GetSelectSocket() : GetNullSocket();}
00053 virtual int64 GetLength() {return _slaveIO() ? _slaveIO()->GetLength() : -1;}
00054
00055 virtual bool HasBufferedOutput() const {return (_outputBufferBytesSent < _outputBuffer.GetNumBytes());}
00056 virtual void WriteBufferedOutput() {(void) WriteBufferedOutputAux();}
00057
00058 private:
00059 int32 SlaveRead(void * buffer, uint32 size) {return _slaveIO() ? _slaveIO()->Read(buffer, size) : -1;}
00060 int32 SlaveWrite(const void * buffer, uint32 size) {return _slaveIO() ? _slaveIO()->Write(buffer, size) : -1;}
00061 status_t WriteBufferedOutputAux();
00062
00063 DataIORef _slaveIO;
00064 uint32 _maxTransferUnit;
00065
00066 ByteBuffer _inputBuffer;
00067 uint32 _inputBufferSize;
00068 uint32 _inputBufferSizeBytesRead;
00069 uint32 _inputBufferBytesRead;
00070
00071 ByteBuffer _outputBuffer;
00072 uint32 _outputBufferBytesSent;
00073 };
00074
00075 END_NAMESPACE(muscle);
00076
00077 #endif