#include #include class BufferedReader { public: explicit BufferedReader(PackageStream* stream) { buffer_stream_ = stream; buffer_ = new char[buffer_stream_->PackageLen()]; pos_ = 0; buffer_size_ = 0; } int32_t Read(char* output_buffer, int32_t buffer_len) { int32_t buffer_len_ = buffer_len; int32_t current_strpos = 0; while (buffer_len > 0) { if (pos_ == buffer_size_) { buffer_size_ = buffer_stream_->ReadPackage(buffer_); pos_ = 0; if (buffer_size_ == 0) { delete[] buffer_; return buffer_len_ - buffer_len; } } if (buffer_size_ - pos_ < buffer_len) { memcpy(output_buffer + current_strpos, \ buffer_ + pos_, buffer_size_ - pos_); buffer_len -= (buffer_size_ - pos_); current_strpos += buffer_size_ - pos_; buffer_size_ = buffer_stream_->ReadPackage(buffer_); pos_ = 0; if (buffer_size_ == 0) { delete[] buffer_; return buffer_len_ - buffer_len; } } else { memcpy(output_buffer + current_strpos, \ buffer_ + pos_, buffer_len); pos_ += buffer_len; buffer_len = 0; } } return buffer_len_; } private: char* buffer_; PackageStream* buffer_stream_; int32_t pos_; int32_t buffer_size_; };