winlin

kafka encode and send packet.

@@ -236,7 +236,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -236,7 +236,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
236 #define ERROR_REQUEST_DATA 3066 236 #define ERROR_REQUEST_DATA 3066
237 237
238 /////////////////////////////////////////////////////// 238 ///////////////////////////////////////////////////////
239 -// HTTP/StreamCaster protocol error. 239 +// HTTP/StreamCaster/KAFKA protocol error.
240 /////////////////////////////////////////////////////// 240 ///////////////////////////////////////////////////////
241 #define ERROR_HTTP_PATTERN_EMPTY 4000 241 #define ERROR_HTTP_PATTERN_EMPTY 4000
242 #define ERROR_HTTP_PATTERN_DUPLICATED 4001 242 #define ERROR_HTTP_PATTERN_DUPLICATED 4001
@@ -268,6 +268,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -268,6 +268,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
268 #define ERROR_AVC_NALU_UEV 4027 268 #define ERROR_AVC_NALU_UEV 4027
269 #define ERROR_AAC_BYTES_INVALID 4028 269 #define ERROR_AAC_BYTES_INVALID 4028
270 #define ERROR_HTTP_REQUEST_EOF 4029 270 #define ERROR_HTTP_REQUEST_EOF 4029
  271 +#define ERROR_KAFKA_CODEC_STRING 4030
  272 +#define ERROR_KAFKA_CODEC_BYTES 4031
  273 +#define ERROR_KAFKA_CODEC_REQUEST 4032
  274 +#define ERROR_KAFKA_CODEC_RESPONSE 4033
271 275
272 /////////////////////////////////////////////////////// 276 ///////////////////////////////////////////////////////
273 // HTTP API error. 277 // HTTP API error.
@@ -29,22 +29,23 @@ using namespace std; @@ -29,22 +29,23 @@ using namespace std;
29 #include <srs_kernel_error.hpp> 29 #include <srs_kernel_error.hpp>
30 #include <srs_core_autofree.hpp> 30 #include <srs_core_autofree.hpp>
31 #include <srs_kernel_log.hpp> 31 #include <srs_kernel_log.hpp>
  32 +#include <srs_protocol_io.hpp>
32 33
33 #ifdef SRS_AUTO_KAFKA 34 #ifdef SRS_AUTO_KAFKA
34 35
35 SrsKafkaString::SrsKafkaString() 36 SrsKafkaString::SrsKafkaString()
36 { 37 {
37 - size = -1; 38 + _size = -1;
38 data = NULL; 39 data = NULL;
39 } 40 }
40 41
41 SrsKafkaString::SrsKafkaString(string v) 42 SrsKafkaString::SrsKafkaString(string v)
42 { 43 {
43 - size = (int16_t)v.length(); 44 + _size = (int16_t)v.length();
44 45
45 - srs_assert(size > 0);  
46 - data = new char[size];  
47 - memcpy(data, v.data(), size); 46 + srs_assert(_size > 0);
  47 + data = new char[_size];
  48 + memcpy(data, v.data(), _size);
48 } 49 }
49 50
50 SrsKafkaString::~SrsKafkaString() 51 SrsKafkaString::~SrsKafkaString()
@@ -54,32 +55,92 @@ SrsKafkaString::~SrsKafkaString() @@ -54,32 +55,92 @@ SrsKafkaString::~SrsKafkaString()
54 55
55 bool SrsKafkaString::null() 56 bool SrsKafkaString::null()
56 { 57 {
57 - return size == -1; 58 + return _size == -1;
58 } 59 }
59 60
60 bool SrsKafkaString::empty() 61 bool SrsKafkaString::empty()
61 { 62 {
62 - return size <= 0; 63 + return _size <= 0;
63 } 64 }
64 65
65 -int SrsKafkaString::total_size() 66 +int SrsKafkaString::size()
66 { 67 {
67 - return 2 + (size == -1? 0 : size); 68 + return _size == -1? 2 : 2 + _size;
  69 +}
  70 +
  71 +int SrsKafkaString::encode(SrsBuffer* buf)
  72 +{
  73 + int ret = ERROR_SUCCESS;
  74 +
  75 + if (!buf->require(2)) {
  76 + ret = ERROR_KAFKA_CODEC_STRING;
  77 + srs_error("kafka encode string failed. ret=%d", ret);
  78 + return ret;
  79 + }
  80 + buf->write_2bytes(_size);
  81 +
  82 + if (_size <= 0) {
  83 + return ret;
  84 + }
  85 +
  86 + if (!buf->require(_size)) {
  87 + ret = ERROR_KAFKA_CODEC_STRING;
  88 + srs_error("kafka encode string data failed. ret=%d", ret);
  89 + return ret;
  90 + }
  91 + buf->write_bytes(data, _size);
  92 +
  93 + return ret;
  94 +}
  95 +
  96 +int SrsKafkaString::decode(SrsBuffer* buf)
  97 +{
  98 + int ret = ERROR_SUCCESS;
  99 +
  100 + if (!buf->require(2)) {
  101 + ret = ERROR_KAFKA_CODEC_STRING;
  102 + srs_error("kafka decode string failed. ret=%d", ret);
  103 + return ret;
  104 + }
  105 + _size = buf->read_2bytes();
  106 +
  107 + if (_size != -1 && _size < 0) {
  108 + ret = ERROR_KAFKA_CODEC_STRING;
  109 + srs_error("kafka string must be -1 or >=0, actual is %d. ret=%d", _size, ret);
  110 + return ret;
  111 + }
  112 +
  113 + if (_size <= 0) {
  114 + return ret;
  115 + }
  116 +
  117 + if (!buf->require(_size)) {
  118 + ret = ERROR_KAFKA_CODEC_STRING;
  119 + srs_error("kafka decode string data failed. ret=%d", ret);
  120 + return ret;
  121 + }
  122 +
  123 + srs_freep(data);
  124 + data = new char[_size];
  125 +
  126 + buf->read_bytes(data, _size);
  127 +
  128 + return ret;
68 } 129 }
69 130
70 SrsKafkaBytes::SrsKafkaBytes() 131 SrsKafkaBytes::SrsKafkaBytes()
71 { 132 {
72 - size = -1; 133 + _size = -1;
73 data = NULL; 134 data = NULL;
74 } 135 }
75 136
76 SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v) 137 SrsKafkaBytes::SrsKafkaBytes(const char* v, int nb_v)
77 { 138 {
78 - size = (int16_t)nb_v; 139 + _size = (int16_t)nb_v;
79 140
80 - srs_assert(size > 0);  
81 - data = new char[size];  
82 - memcpy(data, v, size); 141 + srs_assert(_size > 0);
  142 + data = new char[_size];
  143 + memcpy(data, v, _size);
83 } 144 }
84 145
85 SrsKafkaBytes::~SrsKafkaBytes() 146 SrsKafkaBytes::~SrsKafkaBytes()
@@ -89,17 +150,72 @@ SrsKafkaBytes::~SrsKafkaBytes() @@ -89,17 +150,72 @@ SrsKafkaBytes::~SrsKafkaBytes()
89 150
90 bool SrsKafkaBytes::null() 151 bool SrsKafkaBytes::null()
91 { 152 {
92 - return size == -1; 153 + return _size == -1;
93 } 154 }
94 155
95 bool SrsKafkaBytes::empty() 156 bool SrsKafkaBytes::empty()
96 { 157 {
97 - return size <= 0; 158 + return _size <= 0;
98 } 159 }
99 160
100 -int SrsKafkaBytes::total_size() 161 +int SrsKafkaBytes::size()
101 { 162 {
102 - return 4 + (size == -1? 0 : size); 163 + return 4 + (_size == -1? 0 : _size);
  164 +}
  165 +
  166 +int SrsKafkaBytes::encode(SrsBuffer* buf)
  167 +{
  168 + int ret = ERROR_SUCCESS;
  169 +
  170 + if (!buf->require(4)) {
  171 + ret = ERROR_KAFKA_CODEC_BYTES;
  172 + srs_error("kafka encode bytes failed. ret=%d", ret);
  173 + return ret;
  174 + }
  175 + buf->write_4bytes(_size);
  176 +
  177 + if (_size <= 0) {
  178 + return ret;
  179 + }
  180 +
  181 + if (!buf->require(_size)) {
  182 + ret = ERROR_KAFKA_CODEC_BYTES;
  183 + srs_error("kafka encode bytes data failed. ret=%d", ret);
  184 + return ret;
  185 + }
  186 + buf->write_bytes(data, _size);
  187 +
  188 + return ret;
  189 +}
  190 +
  191 +int SrsKafkaBytes::decode(SrsBuffer* buf)
  192 +{
  193 + int ret = ERROR_SUCCESS;
  194 +
  195 + if (!buf->require(4)) {
  196 + ret = ERROR_KAFKA_CODEC_BYTES;
  197 + srs_error("kafka decode bytes failed. ret=%d", ret);
  198 + return ret;
  199 + }
  200 + _size = buf->read_4bytes();
  201 +
  202 + if (_size != -1 && _size < 0) {
  203 + ret = ERROR_KAFKA_CODEC_BYTES;
  204 + srs_error("kafka bytes must be -1 or >=0, actual is %d. ret=%d", _size, ret);
  205 + return ret;
  206 + }
  207 +
  208 + if (!buf->require(_size)) {
  209 + ret = ERROR_KAFKA_CODEC_BYTES;
  210 + srs_error("kafka decode bytes data failed. ret=%d", ret);
  211 + return ret;
  212 + }
  213 +
  214 + srs_freep(data);
  215 + data = new char[_size];
  216 + buf->read_bytes(data, _size);
  217 +
  218 + return ret;
103 } 219 }
104 220
105 SrsKafkaRequestHeader::SrsKafkaRequestHeader() 221 SrsKafkaRequestHeader::SrsKafkaRequestHeader()
@@ -117,7 +233,7 @@ SrsKafkaRequestHeader::~SrsKafkaRequestHeader() @@ -117,7 +233,7 @@ SrsKafkaRequestHeader::~SrsKafkaRequestHeader()
117 233
118 int SrsKafkaRequestHeader::header_size() 234 int SrsKafkaRequestHeader::header_size()
119 { 235 {
120 - return 2 + 2 + 4 + client_id->total_size(); 236 + return 2 + 2 + 4 + client_id->size();
121 } 237 }
122 238
123 int SrsKafkaRequestHeader::message_size() 239 int SrsKafkaRequestHeader::message_size()
@@ -178,14 +294,56 @@ int SrsKafkaRequestHeader::size() @@ -178,14 +294,56 @@ int SrsKafkaRequestHeader::size()
178 int SrsKafkaRequestHeader::encode(SrsBuffer* buf) 294 int SrsKafkaRequestHeader::encode(SrsBuffer* buf)
179 { 295 {
180 int ret = ERROR_SUCCESS; 296 int ret = ERROR_SUCCESS;
181 - // TODO: FIXME: implements it. 297 +
  298 + if (!buf->require(4 + _size)) {
  299 + ret = ERROR_KAFKA_CODEC_REQUEST;
  300 + srs_error("kafka encode request failed. ret=%d", ret);
  301 + return ret;
  302 + }
  303 +
  304 + buf->write_4bytes(_size);
  305 + buf->write_2bytes(api_key);
  306 + buf->write_2bytes(api_version);
  307 + buf->write_4bytes(correlation_id);
  308 +
  309 + if ((ret = client_id->encode(buf)) != ERROR_SUCCESS) {
  310 + srs_error("kafka encode request client_id failed. ret=%d", ret);
  311 + return ret;
  312 + }
  313 +
182 return ret; 314 return ret;
183 } 315 }
184 316
185 int SrsKafkaRequestHeader::decode(SrsBuffer* buf) 317 int SrsKafkaRequestHeader::decode(SrsBuffer* buf)
186 { 318 {
187 int ret = ERROR_SUCCESS; 319 int ret = ERROR_SUCCESS;
188 - // TODO: FIXME: implements it. 320 +
  321 + if (!buf->require(4)) {
  322 + ret = ERROR_KAFKA_CODEC_REQUEST;
  323 + srs_error("kafka decode request size failed. ret=%d", ret);
  324 + return ret;
  325 + }
  326 + _size = buf->read_4bytes();
  327 +
  328 + if (_size <= 0) {
  329 + srs_warn("kafka got empty request");
  330 + return ret;
  331 + }
  332 +
  333 + if (!buf->require(_size)) {
  334 + ret = ERROR_KAFKA_CODEC_REQUEST;
  335 + srs_error("kafka decode request message failed. ret=%d", ret);
  336 + return ret;
  337 + }
  338 + api_key = buf->read_2bytes();
  339 + api_version = buf->read_2bytes();
  340 + correlation_id = buf->read_4bytes();
  341 +
  342 + if ((ret = client_id->decode(buf)) != ERROR_SUCCESS) {
  343 + srs_error("kafka decode request client_id failed. ret=%d", ret);
  344 + return ret;
  345 + }
  346 +
189 return ret; 347 return ret;
190 } 348 }
191 349
@@ -222,14 +380,42 @@ int SrsKafkaResponseHeader::size() @@ -222,14 +380,42 @@ int SrsKafkaResponseHeader::size()
222 int SrsKafkaResponseHeader::encode(SrsBuffer* buf) 380 int SrsKafkaResponseHeader::encode(SrsBuffer* buf)
223 { 381 {
224 int ret = ERROR_SUCCESS; 382 int ret = ERROR_SUCCESS;
225 - // TODO: FIXME: implements it. 383 +
  384 + if (!buf->require(4 + _size)) {
  385 + ret = ERROR_KAFKA_CODEC_RESPONSE;
  386 + srs_error("kafka encode response failed. ret=%d", ret);
  387 + return ret;
  388 + }
  389 +
  390 + buf->write_4bytes(_size);
  391 + buf->write_4bytes(correlation_id);
  392 +
226 return ret; 393 return ret;
227 } 394 }
228 395
229 int SrsKafkaResponseHeader::decode(SrsBuffer* buf) 396 int SrsKafkaResponseHeader::decode(SrsBuffer* buf)
230 { 397 {
231 int ret = ERROR_SUCCESS; 398 int ret = ERROR_SUCCESS;
232 - // TODO: FIXME: implements it. 399 +
  400 + if (!buf->require(4)) {
  401 + ret = ERROR_KAFKA_CODEC_RESPONSE;
  402 + srs_error("kafka decode response size failed. ret=%d", ret);
  403 + return ret;
  404 + }
  405 + _size = buf->read_4bytes();
  406 +
  407 + if (_size <= 0) {
  408 + srs_warn("kafka got empty response");
  409 + return ret;
  410 + }
  411 +
  412 + if (!buf->require(_size)) {
  413 + ret = ERROR_KAFKA_CODEC_RESPONSE;
  414 + srs_error("kafka decode response message failed. ret=%d", ret);
  415 + return ret;
  416 + }
  417 + correlation_id = buf->read_4bytes();
  418 +
233 return ret; 419 return ret;
234 } 420 }
235 421
@@ -326,22 +512,40 @@ void SrsKafkaTopicMetadataRequest::add_topic(string topic) @@ -326,22 +512,40 @@ void SrsKafkaTopicMetadataRequest::add_topic(string topic)
326 512
327 int SrsKafkaTopicMetadataRequest::size() 513 int SrsKafkaTopicMetadataRequest::size()
328 { 514 {
329 - int ret = ERROR_SUCCESS;  
330 - // TODO: FIXME: implements it.  
331 - return ret; 515 + return SrsKafkaRequest::size() + topics.size();
332 } 516 }
333 517
334 int SrsKafkaTopicMetadataRequest::encode(SrsBuffer* buf) 518 int SrsKafkaTopicMetadataRequest::encode(SrsBuffer* buf)
335 { 519 {
336 int ret = ERROR_SUCCESS; 520 int ret = ERROR_SUCCESS;
337 - // TODO: FIXME: implements it. 521 +
  522 + if ((ret = SrsKafkaRequest::encode(buf)) != ERROR_SUCCESS) {
  523 + srs_error("kafka encode metadata request failed. ret=%d", ret);
  524 + return ret;
  525 + }
  526 +
  527 + if ((ret = topics.encode(buf)) != ERROR_SUCCESS) {
  528 + srs_error("kafka encode metadata topics failed. ret=%d", ret);
  529 + return ret;
  530 + }
  531 +
338 return ret; 532 return ret;
339 } 533 }
340 534
341 int SrsKafkaTopicMetadataRequest::decode(SrsBuffer* buf) 535 int SrsKafkaTopicMetadataRequest::decode(SrsBuffer* buf)
342 { 536 {
343 int ret = ERROR_SUCCESS; 537 int ret = ERROR_SUCCESS;
344 - // TODO: FIXME: implements it. 538 +
  539 + if ((ret = SrsKafkaRequest::decode(buf)) != ERROR_SUCCESS) {
  540 + srs_error("kafka decode metadata request failed. ret=%d", ret);
  541 + return ret;
  542 + }
  543 +
  544 + if ((ret = topics.decode(buf)) != ERROR_SUCCESS) {
  545 + srs_error("kafka decode metadata topics failed. ret=%d", ret);
  546 + return ret;
  547 + }
  548 +
345 return ret; 549 return ret;
346 } 550 }
347 551
@@ -355,14 +559,19 @@ SrsKafkaTopicMetadataResponse::~SrsKafkaTopicMetadataResponse() @@ -355,14 +559,19 @@ SrsKafkaTopicMetadataResponse::~SrsKafkaTopicMetadataResponse()
355 559
356 int SrsKafkaTopicMetadataResponse::size() 560 int SrsKafkaTopicMetadataResponse::size()
357 { 561 {
358 - int ret = ERROR_SUCCESS;  
359 // TODO: FIXME: implements it. 562 // TODO: FIXME: implements it.
360 - return ret; 563 + return SrsKafkaResponse::size();
361 } 564 }
362 565
363 int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf) 566 int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf)
364 { 567 {
365 int ret = ERROR_SUCCESS; 568 int ret = ERROR_SUCCESS;
  569 +
  570 + if ((ret = SrsKafkaResponse::encode(buf)) != ERROR_SUCCESS) {
  571 + srs_error("kafka encode metadata response failed. ret=%d", ret);
  572 + return ret;
  573 + }
  574 +
366 // TODO: FIXME: implements it. 575 // TODO: FIXME: implements it.
367 return ret; 576 return ret;
368 } 577 }
@@ -370,6 +579,12 @@ int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf) @@ -370,6 +579,12 @@ int SrsKafkaTopicMetadataResponse::encode(SrsBuffer* buf)
370 int SrsKafkaTopicMetadataResponse::decode(SrsBuffer* buf) 579 int SrsKafkaTopicMetadataResponse::decode(SrsBuffer* buf)
371 { 580 {
372 int ret = ERROR_SUCCESS; 581 int ret = ERROR_SUCCESS;
  582 +
  583 + if ((ret = SrsKafkaResponse::decode(buf)) != ERROR_SUCCESS) {
  584 + srs_error("kafka decode metadata response failed. ret=%d", ret);
  585 + return ret;
  586 + }
  587 +
373 // TODO: FIXME: implements it. 588 // TODO: FIXME: implements it.
374 return ret; 589 return ret;
375 } 590 }
@@ -387,7 +602,36 @@ int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg) @@ -387,7 +602,36 @@ int SrsKafkaProtocol::send_and_free_message(SrsKafkaRequest* msg)
387 { 602 {
388 int ret = ERROR_SUCCESS; 603 int ret = ERROR_SUCCESS;
389 604
390 - // TODO: FIXME: implements it. 605 + // TODO: FIXME: refine for performance issue.
  606 + SrsAutoFree(SrsKafkaRequest, msg);
  607 +
  608 + int size = msg->size();
  609 + if (size <= 0) {
  610 + return ret;
  611 + }
  612 +
  613 + // TODO: FIXME: refine for performance issue.
  614 + char* bytes = new char[size];
  615 + SrsAutoFree(char, bytes);
  616 +
  617 + // TODO: FIXME: refine for performance issue.
  618 + SrsBuffer* buf = new SrsBuffer();
  619 + SrsAutoFree(SrsBuffer, buf);
  620 +
  621 + if ((ret = buf->initialize(bytes, size)) != ERROR_SUCCESS) {
  622 + srs_error("kafka create buffer failed. ret=%d", ret);
  623 + return ret;
  624 + }
  625 +
  626 + if ((ret = msg->encode(buf)) != ERROR_SUCCESS) {
  627 + srs_error("kafka encode message failed. ret=%d", ret);
  628 + return ret;
  629 + }
  630 +
  631 + if ((ret = skt->write(bytes, size, NULL)) != ERROR_SUCCESS) {
  632 + srs_error("kafka send message failed. ret=%d", ret);
  633 + return ret;
  634 + }
391 635
392 return ret; 636 return ret;
393 } 637 }
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 #include <string> 33 #include <string>
34 34
35 #include <srs_kernel_buffer.hpp> 35 #include <srs_kernel_buffer.hpp>
  36 +#include <srs_kernel_error.hpp>
36 37
37 class ISrsProtocolReaderWriter; 38 class ISrsProtocolReaderWriter;
38 39
@@ -59,10 +60,10 @@ enum SrsKafkaApiKey @@ -59,10 +60,10 @@ enum SrsKafkaApiKey
59 * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32. 60 * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32.
60 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes 61 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes
61 */ 62 */
62 -class SrsKafkaString 63 +class SrsKafkaString : public ISrsCodec
63 { 64 {
64 private: 65 private:
65 - int16_t size; 66 + int16_t _size;
66 char* data; 67 char* data;
67 public: 68 public:
68 SrsKafkaString(); 69 SrsKafkaString();
@@ -71,7 +72,11 @@ public: @@ -71,7 +72,11 @@ public:
71 public: 72 public:
72 virtual bool null(); 73 virtual bool null();
73 virtual bool empty(); 74 virtual bool empty();
74 - virtual int total_size(); 75 +// interface ISrsCodec
  76 +public:
  77 + virtual int size();
  78 + virtual int encode(SrsBuffer* buf);
  79 + virtual int decode(SrsBuffer* buf);
75 }; 80 };
76 81
77 /** 82 /**
@@ -79,10 +84,10 @@ public: @@ -79,10 +84,10 @@ public:
79 * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32. 84 * A length of -1 indicates null. string uses an int16 for its size, and bytes uses an int32.
80 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes 85 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-ProtocolPrimitiveTypes
81 */ 86 */
82 -class SrsKafkaBytes 87 +class SrsKafkaBytes : public ISrsCodec
83 { 88 {
84 private: 89 private:
85 - int32_t size; 90 + int32_t _size;
86 char* data; 91 char* data;
87 public: 92 public:
88 SrsKafkaBytes(); 93 SrsKafkaBytes();
@@ -91,7 +96,11 @@ public: @@ -91,7 +96,11 @@ public:
91 public: 96 public:
92 virtual bool null(); 97 virtual bool null();
93 virtual bool empty(); 98 virtual bool empty();
94 - virtual int total_size(); 99 +// interface ISrsCodec
  100 +public:
  101 + virtual int size();
  102 + virtual int encode(SrsBuffer* buf);
  103 + virtual int decode(SrsBuffer* buf);
95 }; 104 };
96 105
97 /** 106 /**
@@ -107,7 +116,7 @@ public: @@ -107,7 +116,7 @@ public:
107 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests 116 * @see https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-Requests
108 */ 117 */
109 template<typename T> 118 template<typename T>
110 -class SrsKafkaArray 119 +class SrsKafkaArray : public ISrsCodec
111 { 120 {
112 private: 121 private:
113 int length; 122 int length;
@@ -132,6 +141,45 @@ public: @@ -132,6 +141,45 @@ public:
132 length++; 141 length++;
133 elems.push_back(elem); 142 elems.push_back(elem);
134 } 143 }
  144 +// interface ISrsCodec
  145 +public:
  146 + virtual int size()
  147 + {
  148 + int s = 0;
  149 +
  150 + for (SrsIterator it = elems.begin(); it != elems.end(); ++it) {
  151 + T elem = *it;
  152 + s += elem->size();
  153 + }
  154 +
  155 + return s;
  156 + }
  157 + virtual int encode(SrsBuffer* buf)
  158 + {
  159 + int ret = ERROR_SUCCESS;
  160 +
  161 + for (SrsIterator it = elems.begin(); it != elems.end(); ++it) {
  162 + T elem = *it;
  163 + if ((ret = elem->encode(buf)) != ERROR_SUCCESS) {
  164 + return ret;
  165 + }
  166 + }
  167 +
  168 + return ret;
  169 + }
  170 + virtual int decode(SrsBuffer* buf)
  171 + {
  172 + int ret = ERROR_SUCCESS;
  173 +
  174 + for (SrsIterator it = elems.begin(); it != elems.end(); ++it) {
  175 + T elem = *it;
  176 + if ((ret = elem->decode(buf)) != ERROR_SUCCESS) {
  177 + return ret;
  178 + }
  179 + }
  180 +
  181 + return ret;
  182 + }
135 }; 183 };
136 184
137 /** 185 /**