13c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin/* 23c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * Copyright (C) 2017 The Android Open Source Project 33c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * 43c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * Licensed under the Apache License, Version 2.0 (the "License"); 53c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * you may not use this file except in compliance with the License. 63c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * You may obtain a copy of the License at 73c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * 83c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * http://www.apache.org/licenses/LICENSE-2.0 93c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * 103c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * Unless required by applicable law or agreed to in writing, software 113c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * distributed under the License is distributed on an "AS IS" BASIS, 123c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * See the License for the specific language governing permissions and 143c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin * limitations under the License. 153c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin */ 163c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin#define LOG_TAG "incident_helper" 173c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 183c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin#include <android/util/ProtoOutputStream.h> 193c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 203c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin#include "frameworks/base/core/proto/android/util/event_log_tags.proto.h" 213c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin#include "ih_util.h" 223c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin#include "EventLogTagsParser.h" 233c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 243c034c987e1eeb49660fb62d3426c292a01412c9Yi Jinstatus_t 253c034c987e1eeb49660fb62d3426c292a01412c9Yi JinEventLogTagsParser::Parse(const int in, const int out) const 263c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin{ 273c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin Reader reader(in); 283c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin string line; 293c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 303c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin ProtoOutputStream proto; 313c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 323c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin // parse line by line 333c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin while (reader.readLine(&line)) { 343c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (line.empty()) continue; 353c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin string debug = line; 363c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin string tagNumber = behead(&line, ' '); 373c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin string tagName = behead(&line, ' '); 383c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (tagNumber == "" || tagName == "") { 393c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin fprintf(stderr, "Bad line, expect at least two parts: %s[%s, %s]\n", 403c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin debug.c_str(), tagNumber.c_str(), tagName.c_str()); 413c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin continue; 423c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 433c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 445ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t token = proto.start(EventLogTagMapProto::EVENT_LOG_TAGS); 453c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.write(EventLogTag::TAG_NUMBER, toInt(tagNumber)); 463c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.write(EventLogTag::TAG_NAME, tagName); 473c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 483c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin record_t valueDescriptors = parseRecord(line, PARENTHESES_DELIMITER); 493c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin for (size_t i = 0; i < valueDescriptors.size(); i++) { 503c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin record_t valueDescriptor = parseRecord(valueDescriptors[i], PIPE_DELIMITER); 513c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (valueDescriptor.size() != 2 && valueDescriptor.size() != 3) { 523c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin // If the parts doesn't contains pipe, then skips it. 533c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin continue; 543c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 555ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t descriptorToken = proto.start(EventLogTag::VALUE_DESCRIPTORS); 563c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.write(EventLogTag::ValueDescriptor::NAME, valueDescriptor[0]); 573c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.write(EventLogTag::ValueDescriptor::TYPE, toInt(valueDescriptor[1])); 583c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (valueDescriptor.size() == 3) { 593c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin char c = valueDescriptor[2][0]; 603c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin int unit = 0; 613c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (c < '0' || c > '9') { 623c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin unit = (int) c; 633c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } else { 643c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin unit = toInt(valueDescriptor[2]); 653c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 663c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.write(EventLogTag::ValueDescriptor::UNIT, unit); 673c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 683c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.end(descriptorToken); 693c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 703c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin proto.end(token); 713c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 723c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 733c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (!reader.ok(&line)) { 743c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin fprintf(stderr, "Bad read from fd %d: %s\n", in, line.c_str()); 753c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin return -1; 763c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 773c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin 783c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin if (!proto.flush(out)) { 793c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin fprintf(stderr, "[%s]Error writing proto back\n", this->name.string()); 803c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin return -1; 813c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin } 823c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin fprintf(stderr, "[%s]Proto size: %zu bytes\n", this->name.string(), proto.size()); 833c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin return NO_ERROR; 843c034c987e1eeb49660fb62d3426c292a01412c9Yi Jin} 85