1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include <stdio.h>
18*6dbdd20aSAndroid Build Coastguard Worker #include <string.h>
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/file_utils.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "src/trace_config_utils/pb_to_txt.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "src/trace_config_utils/txt_to_pb.h"
23*6dbdd20aSAndroid Build Coastguard Worker
24*6dbdd20aSAndroid Build Coastguard Worker namespace {
PrintUsage(const char * argv0)25*6dbdd20aSAndroid Build Coastguard Worker void PrintUsage(const char* argv0) {
26*6dbdd20aSAndroid Build Coastguard Worker printf(R"(
27*6dbdd20aSAndroid Build Coastguard Worker Converts a TraceConfig from pbtxt to proto-encoded bytes and viceversa
28*6dbdd20aSAndroid Build Coastguard Worker
29*6dbdd20aSAndroid Build Coastguard Worker Usage: %s txt_to_pb | pb_to_txt < in > out
30*6dbdd20aSAndroid Build Coastguard Worker )",
31*6dbdd20aSAndroid Build Coastguard Worker argv0);
32*6dbdd20aSAndroid Build Coastguard Worker }
33*6dbdd20aSAndroid Build Coastguard Worker
34*6dbdd20aSAndroid Build Coastguard Worker } // namespace
35*6dbdd20aSAndroid Build Coastguard Worker
main(int argc,char ** argv)36*6dbdd20aSAndroid Build Coastguard Worker int main(int argc, char** argv) {
37*6dbdd20aSAndroid Build Coastguard Worker using namespace ::perfetto;
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard Worker if (argc < 2) {
40*6dbdd20aSAndroid Build Coastguard Worker PrintUsage(argv[0]);
41*6dbdd20aSAndroid Build Coastguard Worker return 1;
42*6dbdd20aSAndroid Build Coastguard Worker }
43*6dbdd20aSAndroid Build Coastguard Worker
44*6dbdd20aSAndroid Build Coastguard Worker const char* cmd = argv[1];
45*6dbdd20aSAndroid Build Coastguard Worker std::string in_data;
46*6dbdd20aSAndroid Build Coastguard Worker if (argc == 2) {
47*6dbdd20aSAndroid Build Coastguard Worker base::ReadFileStream(stdin, &in_data);
48*6dbdd20aSAndroid Build Coastguard Worker } else {
49*6dbdd20aSAndroid Build Coastguard Worker bool ok = base::ReadFile(argv[2], &in_data);
50*6dbdd20aSAndroid Build Coastguard Worker if (!ok) {
51*6dbdd20aSAndroid Build Coastguard Worker printf("Failed to open input file %s\n", argv[2]);
52*6dbdd20aSAndroid Build Coastguard Worker return 1;
53*6dbdd20aSAndroid Build Coastguard Worker }
54*6dbdd20aSAndroid Build Coastguard Worker }
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker if (strcmp(cmd, "txt_to_pb") == 0) {
57*6dbdd20aSAndroid Build Coastguard Worker base::StatusOr<std::vector<uint8_t>> res = TraceConfigTxtToPb(in_data);
58*6dbdd20aSAndroid Build Coastguard Worker if (!res.ok()) {
59*6dbdd20aSAndroid Build Coastguard Worker printf("%s\n", res.status().c_message());
60*6dbdd20aSAndroid Build Coastguard Worker return 1;
61*6dbdd20aSAndroid Build Coastguard Worker }
62*6dbdd20aSAndroid Build Coastguard Worker fwrite(res->data(), res->size(), 1, stdout);
63*6dbdd20aSAndroid Build Coastguard Worker return 0;
64*6dbdd20aSAndroid Build Coastguard Worker }
65*6dbdd20aSAndroid Build Coastguard Worker
66*6dbdd20aSAndroid Build Coastguard Worker if (strcmp(cmd, "pb_to_txt") == 0) {
67*6dbdd20aSAndroid Build Coastguard Worker std::string txt = TraceConfigPbToTxt(in_data.data(), in_data.size());
68*6dbdd20aSAndroid Build Coastguard Worker printf("%s\n", txt.c_str());
69*6dbdd20aSAndroid Build Coastguard Worker return 0;
70*6dbdd20aSAndroid Build Coastguard Worker }
71*6dbdd20aSAndroid Build Coastguard Worker
72*6dbdd20aSAndroid Build Coastguard Worker PrintUsage(argv[0]);
73*6dbdd20aSAndroid Build Coastguard Worker return 1;
74*6dbdd20aSAndroid Build Coastguard Worker }
75