/* * Copyright (C) 2019 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_IMPORTERS_JSON_JSON_TRACE_TOKENIZER_H_ #define SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_TOKENIZER_H_ #include <cstdint> #include <optional> #include <string> #include <vector> #include "perfetto/base/status.h" #include "perfetto/ext/base/string_view.h" #include "src/trace_processor/importers/common/chunked_trace_reader.h" #include "src/trace_processor/importers/systrace/systrace_line_tokenizer.h" namespace Json { class Value; } namespace perfetto::trace_processor { class TraceProcessorContext; // Visible for testing. enum class ReadDictRes { … }; // Parses at most one JSON dictionary and returns a pointer to the end of it, // or nullptr if no dict could be detected. // This is to avoid decoding the full trace in memory and reduce heap traffic. // E.g. input: { a:1 b:{ c:2, d:{ e:3 } } } , { a:4, ... }, // output: [ only this is parsed ] ^return value points here. // Visible for testing. ReadDictRes ReadOneJsonDict(const char* start, const char* end, base::StringView* value, const char** next); enum class ReadKeyRes { … }; // Parses at most one JSON key and returns a pointer to the start of the value // associated with that key. // This is to avoid decoding the full trace in memory and reduce heap traffic. // E.g. input: a:1 b:{ c:2}} // output: ^ return value points here, key is set to "a". // Note: even if the whole key may be available, this method will return // kNeedsMoreData until the first character of the value is available. // Visible for testing. ReadKeyRes ReadOneJsonKey(const char* start, const char* end, std::string* key, const char** next); // Takes as input a JSON dictionary and returns the value associated with // the provided key (if it exists). // Implementation note: this method does not currently support dictionaries // which have arrays as JSON values because current users of this method // do not require this. // Visible for testing. base::Status ExtractValueForJsonKey(base::StringView dict, const std::string& key, std::optional<std::string>* value); enum class ReadSystemLineRes { … }; ReadSystemLineRes ReadOneSystemTraceLine(const char* start, const char* end, std::string* line, const char** next); // Reads a JSON trace in chunks and extracts top level json objects. class JsonTraceTokenizer : public ChunkedTraceReader { … }; } // namespace perfetto::trace_processor #endif // SRC_TRACE_PROCESSOR_IMPORTERS_JSON_JSON_TRACE_TOKENIZER_H_