2727
2828namespace brpc {
2929
30+ // Base class for CompressCallback and DecompressCallback.
31+ class CompressBase {
32+ public:
33+ void append_error (const std::string& error) {
34+ if (_error.empty ()) {
35+ _error = error;
36+ } else {
37+ _error.append (" , " ).append (error);
38+ }
39+ }
40+
41+ const std::string& get_error () const {
42+ return _error;
43+ }
44+ protected:
45+ // Error messages.
46+ std::string _error;
47+ };
48+
49+ // CompressCallback provides raw data for compression,
50+ // and a buffer for storing compressed data.
51+ class CompressCallback : public CompressBase {
52+ public:
53+ // Converts the data into `output' for later compression.
54+ virtual bool Convert (google::protobuf::io::ZeroCopyOutputStream* output) = 0;
55+ // Returns the buffer for storing compressed data.
56+ virtual butil::IOBuf& Buffer () = 0;
57+ };
58+
59+ // DecompressCallback provides raw data stored in a buffer for decompression,
60+ // and handles the decompressed data.
61+ class DecompressCallback : public CompressBase {
62+ public:
63+ // Converts the decompressed `input'.
64+ virtual bool Convert (google::protobuf::io::ZeroCopyInputStream* intput) = 0;
65+ // Returns the buffer containing compressed data.
66+ virtual const butil::IOBuf& Buffer () = 0;
67+ };
68+
3069struct CompressHandler {
31- // Compress serialized `msg' into `buf'.
32- // Returns true on success, false otherwise
33- bool (*Compress)(const google::protobuf::Message& msg, butil::IOBuf* buf);
34- bool (*Compress2Json)(const google::protobuf::Message& msg, butil::IOBuf* buf,
35- const json2pb::Pb2JsonOptions& options);
36- bool (*Compress2ProtoJson)(const google::protobuf::Message& msg, butil::IOBuf* buf,
37- const json2pb::Pb2ProtoJsonOptions& options);
38- bool (*Compress2ProtoText)(const google::protobuf::Message& msg, butil::IOBuf* buf);
39-
40- // Parse decompressed `data' as `msg'.
41- // Returns true on success, false otherwise
42- bool (*Decompress)(const butil::IOBuf& data, google::protobuf::Message* msg);
43- bool (*DecompressFromJson)(const butil::IOBuf& data, google::protobuf::Message* msg,
44- const json2pb::Json2PbOptions& options);
45- bool (*DecompressFromProtoJson)(const butil::IOBuf& data, google::protobuf::Message* msg,
46- const json2pb::ProtoJson2PbOptions& options);
47- bool (*DecompressFromProtoText)(const butil::IOBuf& data, google::protobuf::Message* msg);
70+ // Compress data from CompressCallback::Convert() into CompressCallback::Buffer().
71+ bool (*Compress)(CompressCallback& callback);
72+
73+ // Decompress data from DecompressCallback::Buffer() into DecompressCallback::Convert().
74+ bool (*Decompress)(DecompressCallback& callback);
4875
4976 // Name of the compression algorithm, must be string constant.
5077 const char * name;
@@ -63,6 +90,35 @@ const char* CompressTypeToCStr(CompressType type);
6390// Put all registered handlers into `vec'.
6491void ListCompressHandler (std::vector<CompressHandler>* vec);
6592
93+ // CompressCallback for Protobuf messages.
94+ class PBCompressCallback : public CompressCallback {
95+ public:
96+ PBCompressCallback (const google::protobuf::Message& msg, butil::IOBuf* buf)
97+ : _msg(msg), _buf(buf) {}
98+ bool Convert (google::protobuf::io::ZeroCopyOutputStream* output) override {
99+ return _msg.SerializeToZeroCopyStream (output);
100+ }
101+ butil::IOBuf& Buffer () override { return *_buf; }
102+
103+ private:
104+ const google::protobuf::Message& _msg;
105+ butil::IOBuf* _buf;
106+ };
107+
108+ // DecompressCallback for Protobuf messages.
109+ class PBDecompressCallback : public DecompressCallback {
110+ public:
111+ PBDecompressCallback (const butil::IOBuf& buf, google::protobuf::Message* msg) : _buf(buf), _msg(msg) {}
112+ bool Convert (google::protobuf::io::ZeroCopyInputStream* input) override {
113+ return _msg->ParseFromZeroCopyStream (input);
114+ }
115+ const butil::IOBuf& Buffer () override { return _buf; }
116+
117+ private:
118+ const butil::IOBuf& _buf;
119+ google::protobuf::Message* _msg;
120+ };
121+
66122// Parse decompressed `data' as `msg' using registered `compress_type'.
67123// Returns true on success, false otherwise
68124bool ParseFromCompressedData (const butil::IOBuf& data,
0 commit comments