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