in Sources/aliyun-log-c-sdk/log_builder.c [448:624]
extern size_t serialize_pb_buffer_to_webtracking(char *pb_buffer, size_t len, char **new_buffer)
{
if (0 == len || NULL == pb_buffer)
{
return 0;
}
if (0x0A != pb_buffer[0])
{
return 0;
}
log_sds root = log_sdsnew("{");
log_sds _root_logs_ = log_sdsnew("[");
log_sds _root_tags_ = log_sdsnew("{");
uint8_t * buf = (uint8_t *)pb_buffer;
uint8_t * startBuf = (uint8_t *)pb_buffer;
// log package
while (buf - startBuf < len && *buf == 0x0A)
{
aos_info_log("serialize_pb_buffer_to_webtracking, start process single log.");
++buf;
unsigned logSizeLen = read_length_from_pb(buf);
buf += logSizeLen;
uint32_t time = 0;
// time
if (*buf == 0x08)
{
buf++;
unsigned timeLen = read_length_from_pb(buf);
if (timeLen != 5)
{
return 0;
}
time = parse_uint32(timeLen, buf);
buf += timeLen;
aos_info_log("serialize_pb_buffer_to_webtracking, time: %d", time);
}
log_sds _log_ = log_sdsnew("{");
if (time)
{
_log_ = log_sdscatprintf(_log_, "\"__time__\":%u,", time);
}
// Content
// Header
while (*buf == 0x12)
{
buf++;
unsigned kvLen = read_length_from_pb(buf);
buf += kvLen;
char *key = NULL;
char *val = NULL;
// key
if (*buf == 0x0A)
{
read_chars_from_pb(&buf, &key);
}
// value
if (*buf == 0x12)
{
read_chars_from_pb(&buf, &val);
}
if (key && val)
{
_log_ = put_kv(_log_, key, val);
}
aos_info_log("serialize_pb_buffer_to_webtracking, content {%s: %s}", key, val);
free(key);
free(val);
}
if (log_sdslen(_log_) > 1)
{
// remove last ','
_log_ = remove_comma(_log_);
}
_log_ = log_sdscat(_log_, "}");
_root_logs_ = log_sdscat(_root_logs_, _log_);
_root_logs_ = log_sdscat(_root_logs_, ",");
log_sdsfree(_log_);
// Topic
if (0x1A == *buf)
{
char *topic;
read_chars_from_pb(&buf, &topic);
aos_info_log("serialize_pb_buffer_to_webtracking, topic: %s", topic);
root = put_kv(root, "__topic__", topic);
free(topic);
}
// Source
if (0x22 == *buf)
{
char *source;
read_chars_from_pb(&buf, &source);
aos_info_log("serialize_pb_buffer_to_webtracking, source: %s", source);
root = put_kv(root, "__source__", source);
free(source);
}
// Tag
while (0x32 == *buf)
{
buf ++;
unsigned int tagLen = read_length_from_pb(buf);
buf += tagLen;
char *key = NULL;
char *val = NULL;
// key
if (*buf == 0x0A)
{
read_chars_from_pb(&buf, &key);
}
// value
if (*buf == 0x12)
{
read_chars_from_pb(&buf, &val);
}
if (key && val)
{
_root_tags_ = put_kv(_root_tags_, key, val);
}
aos_info_log("serialize_pb_buffer_to_webtracking, tag {%s: %s}", key, val);
free(key);
free(val);
}
}
aos_info_log("serialize_pb_buffer_to_webtracking, log package has been processed.");
if (log_sdslen(_root_logs_) > 1)
{
_root_logs_ = remove_comma(_root_logs_);
}
_root_logs_ = log_sdscat(_root_logs_, "]");
_root_logs_ = log_sdscat(_root_logs_, ",");
root = put_array(root, "__logs__", _root_logs_);
if (log_sdslen(_root_tags_) > 1)
{
_root_tags_ = remove_comma(_root_tags_);
}
_root_tags_ = log_sdscat(_root_tags_, "}");
root = put_array(root, "__tags__", _root_tags_);
root = log_sdscat(root, "}");
size_t root_len = log_sdslen(root);
*new_buffer = (char *)malloc(sizeof(char) * root_len);
memcpy(*new_buffer, root, root_len);
log_sdsfree(_root_logs_);
log_sdsfree(_root_tags_);
log_sdsfree(root);
aos_info_log("serialize_pb_buffer_to_webtracking, json: %s", *new_buffer);
return root_len;
}