extern size_t serialize_pb_buffer_to_webtracking()

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