class BufferedReader {
public:
explicit BufferedReader(PackageStream* stream)
: stream(stream) {}
int32_t Read(char* output_buffer, int32_t buffer_len) {
int32_t package_len = stream->PackageLen();
int32_t read_len = 0;
while (buffer_len >= package_len) {
stream->ReadPackage(output_buffer);
buffer_len -= package_len;
read_len += package_len;
}
if (package_len > buffer_len) {
char* temp_buffer = new char[package_len];
stream->ReadPackage(temp_buffer);
memcpy(output_buffer, temp_buffer, buffer_len);
read_len += buffer_len;
}
return read_len;
}
private:
PackageStream* stream;
};