class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream) : stream(stream) {
        data = new char[stream->PackageLen()];
        len = stream->ReadPackage(data);
    }

    int32_t Read(char* output_buffer, int32_t buffer_len) {
        int32_t readed = 0;
        while (len <= buffer_len - readed && len != 0) {
            memcpy(output_buffer + readed, data, len);
            readed += len;
            len = stream->ReadPackage(data);
        }
        return readed;
    }

    ~BufferedReader() {
        delete[] data;
    }

 private:
    PackageStream* stream;
    char* data;
    int len;
};