#include <string>
#include <algorithm>

class BufferedReader {
 public:
  explicit BufferedReader(PackageStream* stream): stream_(stream) {}
  int32_t Read(char* output_buffer, int32_t buffer_len) {
    std::string s;
    int len = stream_->PackageLen();
    char* chararray = new char[len];
    while (s.length() < buffer_len) {
      int temp = stream_->ReadPackage(chararray);
      for (int i = 0; i < temp; i++) {
        s += chararray[i];
      }
      if (temp < len) {
        break;
      }
    }
    int length_buf = std::min<int>(buffer_len, s.length());
    for (int i = 0; i < length_buf; ++i) {
      output_buffer[i] = s[i];
    }
    return length_buf;
  }

 private:
  PackageStream* stream_;
};