1c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato/*
2c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * Copyright (C) 2017 The Android Open Source Project
3c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato *
4c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * you may not use this file except in compliance with the License.
6c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * You may obtain a copy of the License at
7c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato *
8c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
9c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato *
10c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * Unless required by applicable law or agreed to in writing, software
11c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
12c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * See the License for the specific language governing permissions and
14c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * limitations under the License.
15c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato */
16c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
17484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh#define DEBUG false  // STOPSHIP if true
18c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato#include "logd/LogEvent.h"
19c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
202087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include "stats_log_util.h"
21c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
22c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratonamespace android {
23c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratonamespace os {
24c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratonamespace statsd {
25c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
2624809bdb45c28244aeaa9c1795581d685780645cyrousing namespace android::util;
279c1debe330006b2b4d5c08a55905789c57369609Yao Chenusing android::util::ProtoOutputStream;
281481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chenusing std::string;
299c1debe330006b2b4d5c08a55905789c57369609Yao Chenusing std::vector;
30c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
3180235403d2a80eee1c23dbe856d18194b1b93843Yao ChenLogEvent::LogEvent(log_msg& msg) {
323ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu    mContext =
3380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen            create_android_log_parser(msg.msg() + sizeof(uint32_t), msg.len() - sizeof(uint32_t));
34330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    mLogdTimestampNs = msg.entry_v1.sec * NS_PER_SEC + msg.entry_v1.nsec;
35d10f7b1c7bdb1c66aa04148945cae9733ee4cadfYao Chen    mLogUid = msg.entry_v4.uid;
363ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu    init(mContext);
373ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu    if (mContext) {
3848d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen        // android_log_destroy will set mContext to NULL
393ca368318ae8909c861e56c7d93035ab344ca10aChenjie Yu        android_log_destroy(&mContext);
402087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
41c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
42c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
43330af58f2b8582b855085655fae553cdfaf44e6cYangster-macLogEvent::LogEvent(int32_t tagId, int64_t wallClockTimestampNs, int64_t elapsedTimestampNs) {
44330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    mLogdTimestampNs = wallClockTimestampNs;
4580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    mTagId = tagId;
462087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    mLogUid = 0;
4780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    mContext = create_android_logger(1937006964); // the event tag shared by all stats logs
4880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
49330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac        android_log_write_int64(mContext, elapsedTimestampNs);
50330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac        android_log_write_int32(mContext, tagId);
51330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    }
52330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac}
53330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac
54330af58f2b8582b855085655fae553cdfaf44e6cYangster-macLogEvent::LogEvent(int32_t tagId, int64_t timestampNs) {
55330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    mLogdTimestampNs = timestampNs;
56330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    mTagId = tagId;
57330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    mLogUid = 0;
58330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    mContext = create_android_logger(1937006964); // the event tag shared by all stats logs
59330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac    if (mContext) {
60330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac        android_log_write_int64(mContext, timestampNs);
6180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        android_log_write_int32(mContext, tagId);
6280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
63c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
64c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
6580235403d2a80eee1c23dbe856d18194b1b93843Yao Chenvoid LogEvent::init() {
6680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
6780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        const char* buffer;
6880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        size_t len = android_log_write_list_buffer(mContext, &buffer);
6980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        // turns to reader mode
70c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu        android_log_context contextForRead = create_android_log_parser(buffer, len);
71c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu        if (contextForRead) {
72c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu            init(contextForRead);
73c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu            // destroy the context to save memory.
7448d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen            // android_log_destroy will set mContext to NULL
75c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu            android_log_destroy(&contextForRead);
7648d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen        }
77c1fe6f469d7559e36c23b4137bf9efe273d9a9f1Chenjie Yu        android_log_destroy(&mContext);
782087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
812087716f2bdca90c7c3034d556ac12911bd8018eYangster-macLogEvent::~LogEvent() {
822087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    if (mContext) {
8348d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen        // This is for the case when LogEvent is created using the test interface
8448d75189ccbfc06f24f315ff5b8a1a42cf8207c5Yao Chen        // but init() isn't called.
852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        android_log_destroy(&mContext);
8680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
87c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
88c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
8980235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(int32_t value) {
9080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
9180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        return android_log_write_int32(mContext, value) >= 0;
9280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
9380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    return false;
9480235403d2a80eee1c23dbe856d18194b1b93843Yao Chen}
9580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen
9680235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(uint32_t value) {
9780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
9880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        return android_log_write_int32(mContext, value) >= 0;
9980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
10080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    return false;
10180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen}
10280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen
103d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yubool LogEvent::write(int64_t value) {
104d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu    if (mContext) {
105d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu        return android_log_write_int64(mContext, value) >= 0;
106d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu    }
107d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu    return false;
108d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu}
109d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu
11080235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(uint64_t value) {
11180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
11280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        return android_log_write_int64(mContext, value) >= 0;
11380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
11480235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    return false;
11580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen}
11680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen
11780235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(const string& value) {
11880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
11980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        return android_log_write_string8_len(mContext, value.c_str(), value.length()) >= 0;
12080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
12180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    return false;
12280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen}
12380235403d2a80eee1c23dbe856d18194b1b93843Yao Chen
12480235403d2a80eee1c23dbe856d18194b1b93843Yao Chenbool LogEvent::write(float value) {
12580235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
12680235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        return android_log_write_float32(mContext, value) >= 0;
12780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
12880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    return false;
12980235403d2a80eee1c23dbe856d18194b1b93843Yao Chen}
13080235403d2a80eee1c23dbe856d18194b1b93843Yao Chen
1319c1debe330006b2b4d5c08a55905789c57369609Yao Chenbool LogEvent::write(const std::vector<AttributionNodeInternal>& nodes) {
13280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    if (mContext) {
1332087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         if (android_log_write_list_begin(mContext) < 0) {
1342087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            return false;
1352087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1362087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         for (size_t i = 0; i < nodes.size(); ++i) {
1372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac             if (!write(nodes[i])) {
1382087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                return false;
1392087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac             }
1402087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1412087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         if (android_log_write_list_end(mContext) < 0) {
1422087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            return false;
1432087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1442087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         return true;
1452087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
1462087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return false;
1472087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1482087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1499c1debe330006b2b4d5c08a55905789c57369609Yao Chenbool LogEvent::write(const AttributionNodeInternal& node) {
1502087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    if (mContext) {
1512087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         if (android_log_write_list_begin(mContext) < 0) {
1522087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            return false;
1532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1542087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         if (android_log_write_int32(mContext, node.uid()) < 0) {
1552087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            return false;
1562087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1572087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         if (android_log_write_string8(mContext, node.tag().c_str()) < 0) {
1582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            return false;
1592087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1602087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         if (android_log_write_list_end(mContext) < 0) {
1612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            return false;
1622087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         }
1632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac         return true;
16480235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    }
1652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return false;
1661481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chen}
1671481fe142d36d5f0b36eeebc358d5a8aef7bf28aDavid Chen
168c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato/**
169c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * The elements of each log event are stored as a vector of android_log_list_elements.
170c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * The goal is to do as little preprocessing as possible, because we read a tiny fraction
171c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato * of the elements that are written to the log.
1728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *
1738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * The idea here is to read through the log items once, we get as much information we need for
1748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen * matching as possible. Because this log will be matched against lots of matchers.
175c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato */
17680235403d2a80eee1c23dbe856d18194b1b93843Yao Chenvoid LogEvent::init(android_log_context context) {
177c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    android_log_list_element elem;
17880235403d2a80eee1c23dbe856d18194b1b93843Yao Chen    int i = 0;
1798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int depth = -1;
1808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int pos[] = {1, 1, 1};
181c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    do {
18280235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        elem = android_log_read_next(context);
183c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato        switch ((int)elem.type) {
184c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato            case EVENT_TYPE_INT:
185330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                // elem at [0] is EVENT_TYPE_LIST, [1] is the timestamp, [2] is tag id.
186330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                if (i == 2) {
18780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen                    mTagId = elem.data.int32;
1882087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                } else {
1898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    if (depth < 0 || depth > 2) {
1908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                        return;
1918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    }
1928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    mValues.push_back(
1948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                            FieldValue(Field(mTagId, pos, depth), Value((int32_t)elem.data.int32)));
1958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
1968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    pos[depth]++;
19780235403d2a80eee1c23dbe856d18194b1b93843Yao Chen                }
1982087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                break;
1998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case EVENT_TYPE_FLOAT: {
2008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                if (depth < 0 || depth > 2) {
2018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    ALOGE("Depth > 2. Not supported!");
2028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    return;
2032087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                }
2048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                mValues.push_back(FieldValue(Field(mTagId, pos, depth), Value(elem.data.float32)));
2068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth]++;
2088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } break;
2108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case EVENT_TYPE_STRING: {
2118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                if (depth < 0 || depth > 2) {
2128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    ALOGE("Depth > 2. Not supported!");
2138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    return;
2142087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                }
2158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                mValues.push_back(FieldValue(Field(mTagId, pos, depth),
2178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                             Value(string(elem.data.string, elem.len))));
2188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth]++;
2208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } break;
2228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case EVENT_TYPE_LONG: {
223330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                if (i == 1) {
224330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                    mElapsedTimestampNs = elem.data.int64;
225330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                } else {
226330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                    if (depth < 0 || depth > 2) {
227330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                        ALOGE("Depth > 2. Not supported!");
228330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                        return;
229330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                    }
230330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                    mValues.push_back(
231330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                            FieldValue(Field(mTagId, pos, depth), Value((int64_t)elem.data.int64)));
2328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
233330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                    pos[depth]++;
234330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac                }
2358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } break;
236c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato            case EVENT_TYPE_LIST:
2378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                depth++;
2388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                if (depth > 2) {
2398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    ALOGE("Depth > 2. Not supported!");
2408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    return;
2412087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                }
2428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                pos[depth] = 1;
2438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
244c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato                break;
2458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            case EVENT_TYPE_LIST_STOP: {
2468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                int prevDepth = depth;
2478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                depth--;
2488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                if (depth >= 0 && depth < 2) {
2498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    // Now go back to decorate the previous items that are last at prevDepth.
2508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    // So that we can later easily match them with Position=Last matchers.
2518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    pos[prevDepth]--;
2528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    int path = getEncodedField(pos, prevDepth, false);
253db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen                    for (auto it = mValues.rbegin(); it != mValues.rend(); ++it) {
254db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen                        if (it->mField.getDepth() >= prevDepth &&
255db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen                            it->mField.getPath(prevDepth) == path) {
256db43afcec22c11ce661decdd2b3500f2dfe2034aYao Chen                            it->mField.decorateLastPos(prevDepth);
2578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                        } else {
2588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                            // Safe to break, because the items are in DFS order.
2598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                            break;
2608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                        }
2612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                    }
2628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    pos[depth]++;
2632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                }
264c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato                break;
2658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
266c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato            case EVENT_TYPE_UNKNOWN:
267c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato                break;
268c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato            default:
269c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato                break;
270c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato        }
27180235403d2a80eee1c23dbe856d18194b1b93843Yao Chen        i++;
272c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    } while ((elem.type != EVENT_TYPE_UNKNOWN) && !elem.complete);
273c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
274c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
275c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratoint64_t LogEvent::GetLong(size_t key, status_t* err) const {
2768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    // TODO: encapsulate the magical operations all in Field struct as a static function.
2778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int field = getSimpleField(key);
2788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& value : mValues) {
2798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (value.mField.getField() == field) {
280ab92a1fdcc2c56ffe6c451711c0eb35becbdd6e3Yao Chen            if (value.mValue.getType() == LONG) {
281ab92a1fdcc2c56ffe6c451711c0eb35becbdd6e3Yao Chen                return value.mValue.long_value;
282ab92a1fdcc2c56ffe6c451711c0eb35becbdd6e3Yao Chen            } else if (value.mValue.getType() == INT) {
2838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return value.mValue.int_value;
2848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } else {
2858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                *err = BAD_TYPE;
2868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return 0;
2878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
2888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
2898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if ((size_t)value.mField.getPosAtDepth(0) > key) {
2908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
2912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        }
292c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    }
2938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
2948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    *err = BAD_INDEX;
2958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return 0;
296c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
297c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
29880f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yuint LogEvent::GetInt(size_t key, status_t* err) const {
2998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int field = getSimpleField(key);
3008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& value : mValues) {
3018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (value.mField.getField() == field) {
3028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (value.mValue.getType() == INT) {
3038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return value.mValue.int_value;
3048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } else {
3058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                *err = BAD_TYPE;
3068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return 0;
3078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
3088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
3098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if ((size_t)value.mField.getPosAtDepth(0) > key) {
3108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
3118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
3128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
3138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
31480f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu    *err = BAD_INDEX;
31580f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu    return 0;
31680f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu}
31780f9112aecf08845ef0b2b132d721b7ce850970fChenjie Yu
318c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratoconst char* LogEvent::GetString(size_t key, status_t* err) const {
3198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int field = getSimpleField(key);
3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& value : mValues) {
3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (value.mField.getField() == field) {
3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (value.mValue.getType() == STRING) {
3238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return value.mValue.str_value.c_str();
3248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } else {
3258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                *err = BAD_TYPE;
3268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return 0;
3278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
3288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
3298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if ((size_t)value.mField.getPosAtDepth(0) > key) {
3308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
3312087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        }
332c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    }
3338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
3348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    *err = BAD_INDEX;
3358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return NULL;
336c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
337c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
338c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratobool LogEvent::GetBool(size_t key, status_t* err) const {
3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int field = getSimpleField(key);
3408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& value : mValues) {
3418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (value.mField.getField() == field) {
3428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (value.mValue.getType() == INT) {
3438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return value.mValue.int_value != 0;
3448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } else if (value.mValue.getType() == LONG) {
3458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return value.mValue.long_value != 0;
3468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } else {
3478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                *err = BAD_TYPE;
3488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return false;
3498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
3502087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        }
3518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if ((size_t)value.mField.getPosAtDepth(0) > key) {
3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
3532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        }
354c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    }
355c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
3568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    *err = BAD_INDEX;
3578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return false;
3582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3592087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenfloat LogEvent::GetFloat(size_t key, status_t* err) const {
3618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    int field = getSimpleField(key);
3628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& value : mValues) {
3638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (value.mField.getField() == field) {
3648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (value.mValue.getType() == FLOAT) {
3658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return value.mValue.float_value;
3668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            } else {
3678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                *err = BAD_TYPE;
3688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return 0.0;
3698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
3708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
3718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if ((size_t)value.mField.getPosAtDepth(0) > key) {
3728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            break;
3738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
374729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
3752087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    *err = BAD_INDEX;
3778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return 0.0;
378d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac}
379d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac
380c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onoratostring LogEvent::ToString() const {
38120e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    string result;
38220e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    result += StringPrintf("{ %lld %lld (%d)", (long long)mLogdTimestampNs,
38320e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen                           (long long)mElapsedTimestampNs, mTagId);
3848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (const auto& value : mValues) {
38520e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen        result +=
38620e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen                StringPrintf("%#x", value.mField.getField()) + "->" + value.mValue.toString() + " ";
387c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato    }
38820e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    result += " }";
38920e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    return result;
390c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
391c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
3922087716f2bdca90c7c3034d556ac12911bd8018eYangster-macvoid LogEvent::ToProto(ProtoOutputStream& protoOutput) const {
3938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    writeFieldValueTreeToStream(mTagId, getValues(), &protoOutput);
394c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}
395c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato
396c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}  // namespace statsd
397c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}  // namespace os
398c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato}  // namespace android
399