class BufferedReader {
public:
explicit BufferedReader(PackageStream* stream) : pacStream(stream),
buf(new char[stream->PackageLen()]) {}
int32_t Read(char* output_buffer, int32_t buffer_len) {
int readed = 0, i = 0;
while (buffer_len != 0 && iter != rmb) {
output_buffer[i++] = this->buf[iter++];
readed++;
buffer_len--;
}
if (buffer_len > 0) {
iter = 0;
rmb = pacStream->ReadPackage(this->buf);
while (buffer_len != 0 && iter != rmb) {
output_buffer[i++] = this->buf[iter++];
readed++;
buffer_len--;
if (iter == pacStream->PackageLen()) {
rmb = pacStream->ReadPackage(this->buf);
iter = 0;
}
}
}
return readed;
}
private:
int iter = 0, rmb = 0;
char* buf;
PackageStream* pacStream;
};