#include #include #include #include class BufferedReader { public: explicit BufferedReader(PackageStream *stream) { ps_ = stream; buf_ = new char[ps_->PackageLen()]; pos_ = 0; buf_size_ = 0; } int32_t Read(char *output_buffer, int32_t buffer_len) { int32_t pos; for (pos = 0; pos < buffer_len; ++pos, ++pos_) { if (pos_ == buf_size_) { buf_size_ = ps_->ReadPackage(buf_); pos_ = 0; if (buf_size_ == 0) break; } output_buffer[pos] = buf_[pos_]; } return pos; } private: PackageStream *ps_; char *buf_; int buf_size_; int pos_; };