1 /*
2 * Copyright (C) 2024 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include "src/trace_processor/importers/proto/args_parser.h"
18
19 #include "perfetto/ext/base/base64.h"
20 #include "src/trace_processor/importers/json/json_utils.h"
21
22 namespace perfetto::trace_processor {
23
24 using BoundInserter = ArgsTracker::BoundInserter;
25
ArgsParser(int64_t packet_timestamp,BoundInserter & inserter,TraceStorage & storage,PacketSequenceStateGeneration * sequence_state,bool support_json)26 ArgsParser::ArgsParser(int64_t packet_timestamp,
27 BoundInserter& inserter,
28 TraceStorage& storage,
29 PacketSequenceStateGeneration* sequence_state,
30 bool support_json)
31 : support_json_(support_json),
32 packet_timestamp_(packet_timestamp),
33 sequence_state_(sequence_state),
34 inserter_(inserter),
35 storage_(storage) {}
36
37 ArgsParser::~ArgsParser() = default;
38
AddInteger(const Key & key,int64_t value)39 void ArgsParser::AddInteger(const Key& key, int64_t value) {
40 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
41 storage_.InternString(base::StringView(key.key)),
42 Variadic::Integer(value));
43 }
44
AddUnsignedInteger(const Key & key,uint64_t value)45 void ArgsParser::AddUnsignedInteger(const Key& key, uint64_t value) {
46 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
47 storage_.InternString(base::StringView(key.key)),
48 Variadic::UnsignedInteger(value));
49 }
50
AddString(const Key & key,const protozero::ConstChars & value)51 void ArgsParser::AddString(const Key& key, const protozero::ConstChars& value) {
52 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
53 storage_.InternString(base::StringView(key.key)),
54 Variadic::String(storage_.InternString(value)));
55 }
56
AddString(const Key & key,const std::string & value)57 void ArgsParser::AddString(const Key& key, const std::string& value) {
58 inserter_.AddArg(
59 storage_.InternString(base::StringView(key.flat_key)),
60 storage_.InternString(base::StringView(key.key)),
61 Variadic::String(storage_.InternString(base::StringView(value))));
62 }
63
AddDouble(const Key & key,double value)64 void ArgsParser::AddDouble(const Key& key, double value) {
65 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
66 storage_.InternString(base::StringView(key.key)),
67 Variadic::Real(value));
68 }
69
AddPointer(const Key & key,const void * value)70 void ArgsParser::AddPointer(const Key& key, const void* value) {
71 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
72 storage_.InternString(base::StringView(key.key)),
73 Variadic::Pointer(reinterpret_cast<uintptr_t>(value)));
74 }
75
AddBoolean(const Key & key,bool value)76 void ArgsParser::AddBoolean(const Key& key, bool value) {
77 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
78 storage_.InternString(base::StringView(key.key)),
79 Variadic::Boolean(value));
80 }
81
AddBytes(const Key & key,const protozero::ConstBytes & value)82 void ArgsParser::AddBytes(const Key& key, const protozero::ConstBytes& value) {
83 std::string b64_data = base::Base64Encode(value.data, value.size);
84 AddString(key, b64_data);
85 }
86
AddJson(const Key & key,const protozero::ConstChars & value)87 bool ArgsParser::AddJson(const Key& key, const protozero::ConstChars& value) {
88 if (!support_json_)
89 PERFETTO_FATAL("Unexpected JSON value when parsing data");
90
91 auto json_value = json::ParseJsonString(value);
92 if (!json_value)
93 return false;
94 return json::AddJsonValueToArgs(*json_value, base::StringView(key.flat_key),
95 base::StringView(key.key), &storage_,
96 &inserter_);
97 }
98
AddNull(const Key & key)99 void ArgsParser::AddNull(const Key& key) {
100 inserter_.AddArg(storage_.InternString(base::StringView(key.flat_key)),
101 storage_.InternString(base::StringView(key.key)),
102 Variadic::Null());
103 }
104
GetArrayEntryIndex(const std::string & array_key)105 size_t ArgsParser::GetArrayEntryIndex(const std::string& array_key) {
106 return inserter_.GetNextArrayEntryIndex(
107 storage_.InternString(base::StringView(array_key)));
108 }
109
IncrementArrayEntryIndex(const std::string & array_key)110 size_t ArgsParser::IncrementArrayEntryIndex(const std::string& array_key) {
111 return inserter_.IncrementArrayEntryIndex(
112 storage_.InternString(base::StringView(array_key)));
113 }
114
packet_timestamp()115 int64_t ArgsParser::packet_timestamp() {
116 return packet_timestamp_;
117 }
118
seq_state()119 PacketSequenceStateGeneration* ArgsParser::seq_state() {
120 return sequence_state_;
121 }
122
GetInternedMessageView(uint32_t field_id,uint64_t iid)123 InternedMessageView* ArgsParser::GetInternedMessageView(uint32_t field_id,
124 uint64_t iid) {
125 if (!sequence_state_)
126 return nullptr;
127 return sequence_state_->GetInternedMessageView(field_id, iid);
128 }
129
130 } // namespace perfetto::trace_processor
131