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;
};