/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SRC_TRACE_PROCESSOR_UTIL_PROTO_TO_ARGS_PARSER_H_ #define SRC_TRACE_PROCESSOR_UTIL_PROTO_TO_ARGS_PARSER_H_ #include <functional> #include "perfetto/base/status.h" #include "perfetto/protozero/field.h" #include "protos/perfetto/trace/interned_data/interned_data.pbzero.h" #include "src/trace_processor/util/descriptors.h" namespace perfetto { namespace trace_processor { // TODO(altimin): Move InternedMessageView into trace_processor/util. class InternedMessageView; class PacketSequenceStateGeneration; namespace util { // ProtoToArgsParser encapsulates the process of taking an arbitrary proto and // parsing it into key-value arg pairs. This is done by traversing // the proto using reflection (with descriptors from |descriptor_pool|) // and passing the parsed data to |Delegate| callbacks. // // E.g. given a proto like // // package perfetto.protos; // message SubMessage { // optional int32 field = 1; // } // message MainMessage { // optional int32 field1 = 1; // optional string field2 = 2; // optional SubMessage field3 = 3; // } // // We will get the args set columns "field1", "field2", "field3.field" and will // store the values found inside as the result. // // Usage of this is as follows: // // DescriptorPool pool; // ProtoToArgsParser parser(pool); // pool.AddProtoFileDescriptor( // /* provide descriptor generated by tools/gen_binary_descriptors */); // parser.ParseMessage(const_bytes, ".perfetto.protos.MainMessage", // /* fields */, /* delegate */); class ProtoToArgsParser { … }; } // namespace util } // namespace trace_processor } // namespace perfetto #endif // SRC_TRACE_PROCESSOR_UTIL_PROTO_TO_ARGS_PARSER_H_