blob: 3fccc58064eba784e287a913e3dc8bf27e71e147 [file] [log] [blame]
#include "TBufferedTransport.h"
using std::string;
uint32_t TBufferedTransport::read(uint8_t* buf, uint32_t len) {
uint32_t need = len;
// We don't have enough data yet
if (rLen_-rPos_ < need) {
// Copy out whatever we have
if (rLen_ > 0) {
memcpy(buf, rBuf_+rPos_, rLen_-rPos_);
need -= rLen_-rPos_;
buf += rLen_-rPos_;
}
// Get more from underlying transport up to buffer size
rLen_ = transport_->read(rBuf_, rBufSize_);
rPos_ = 0;
}
// Hand over whatever we have
uint32_t give = need;
if (rLen_-rPos_ < give) {
give = rLen_-rPos_;
}
memcpy(buf, rBuf_+rPos_, give);
rPos_ += give;
need -= give;
return (len - need);
}
void TBufferedTransport::write(const uint8_t* buf, uint32_t len) {
if (len == 0) {
return;
}
if (len + wLen_ >= wBufSize_) {
uint32_t copy = wBufSize_ - wLen_;
memcpy(wBuf_ + wLen_, buf, copy);
transport_->write(wBuf_, wBufSize_);
wLen_ = len - copy;
if (wLen_ > 0) {
memcpy(wBuf_, buf+copy, wLen_);
}
} else {
memcpy(wBuf_+wLen_, buf, len);
wLen_ += len;
}
}
void TBufferedTransport::flush() {
// Write out any data waiting in the write buffer
if (wLen_ > 0) {
transport_->write(wBuf_, wLen_);
wLen_ = 0;
}
// Flush the underlying transport
transport_->flush();
}