|  | /* | 
|  | *   Copyright (c) 2022 Project CHIP Authors | 
|  | *   All rights reserved. | 
|  | * | 
|  | *   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. | 
|  | * | 
|  | */ | 
|  |  | 
|  | #pragma once | 
|  |  | 
|  | #include "TraceDecoderOptions.h" | 
|  | #include "TraceHandlers.h" | 
|  |  | 
|  | #include <json/json.h> | 
|  | #include <lib/core/CHIPError.h> | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | namespace chip { | 
|  | namespace trace { | 
|  |  | 
|  | class TraceDecoder : public TraceStream | 
|  | { | 
|  | public: | 
|  | CHIP_ERROR ReadFile(const char * fp); | 
|  | CHIP_ERROR ReadString(const char * str); | 
|  |  | 
|  | void SetOptions(TraceDecoderOptions options) { mOptions = options; } | 
|  |  | 
|  | // TraceStream Interface | 
|  | void StartEvent(const std::string & label) override { ReadString(label.c_str()); } | 
|  |  | 
|  | void AddField(const std::string & tag, const std::string & data) override | 
|  | { | 
|  | char buffer[4096] = {}; | 
|  | snprintf(buffer, sizeof(buffer), "    %s\t %s", tag.c_str(), data.c_str()); | 
|  | CHIP_ERROR err = ReadString(buffer); | 
|  |  | 
|  | if (err != CHIP_NO_ERROR) | 
|  | { | 
|  | ChipLogError(Automation, "Failed to add field: %" CHIP_ERROR_FORMAT, err.Format()); | 
|  | } | 
|  | } | 
|  |  | 
|  | void FinishEvent() override {} | 
|  |  | 
|  | private: | 
|  | CHIP_ERROR LogJSON(Json::Value & value); | 
|  | CHIP_ERROR LogAndConsumeProtocol(Json::Value & value); | 
|  | CHIP_ERROR MaybeLogAndConsumeHeaderFlags(Json::Value & value); | 
|  | CHIP_ERROR MaybeLogAndConsumeSecurityFlags(Json::Value & value); | 
|  | CHIP_ERROR MaybeLogAndConsumeMessageFlags(Json::Value & value); | 
|  | CHIP_ERROR MaybeLogAndConsumeExchangeFlags(Json::Value & value); | 
|  | CHIP_ERROR MaybeLogAndConsumePayload(Json::Value & value, bool isResponse); | 
|  | CHIP_ERROR MaybeLogAndConsumeOthers(Json::Value & value); | 
|  |  | 
|  | private: | 
|  | TraceDecoderOptions mOptions; | 
|  | }; | 
|  |  | 
|  | } // namespace trace | 
|  | } // namespace chip |