xref: /aosp_15_r20/external/perfetto/src/trace_processor/importers/proto/args_parser.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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