17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#include "TraceTool.h"
177c804472Sopenharmony_ci#include "JsonReader.h"
187c804472Sopenharmony_ci#include "CommandParser.h"
197c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
207c804472Sopenharmony_ci#include "TimeTool.h"
217c804472Sopenharmony_ci#include "LocalSocket.h"
227c804472Sopenharmony_ci
237c804472Sopenharmony_civoid TraceTool::InitPipe()
247c804472Sopenharmony_ci{
257c804472Sopenharmony_ci    if (socket != nullptr) {
267c804472Sopenharmony_ci        socket.reset();
277c804472Sopenharmony_ci        ELOG("TraceTool::InitPipe socket is not null");
287c804472Sopenharmony_ci    }
297c804472Sopenharmony_ci
307c804472Sopenharmony_ci    socket = std::make_unique<LocalSocket>();
317c804472Sopenharmony_ci    if (socket == nullptr) {
327c804472Sopenharmony_ci        FLOG("TraceTool::Connect socket memory allocation failed!");
337c804472Sopenharmony_ci    }
347c804472Sopenharmony_ci    std::string name = GetTracePipeName();
357c804472Sopenharmony_ci    if (!socket->ConnectToServer(socket->GetTracePipeName(name), LocalSocket::READ_WRITE)) {
367c804472Sopenharmony_ci        ELOG("TraceTool::pipe connect failed");
377c804472Sopenharmony_ci        return;
387c804472Sopenharmony_ci    }
397c804472Sopenharmony_ci    isReady = true;
407c804472Sopenharmony_ci    ELOG("TraceTool::pipe connect successed");
417c804472Sopenharmony_ci}
427c804472Sopenharmony_ci
437c804472Sopenharmony_ciTraceTool& TraceTool::GetInstance()
447c804472Sopenharmony_ci{
457c804472Sopenharmony_ci    static TraceTool instance;
467c804472Sopenharmony_ci    return instance;
477c804472Sopenharmony_ci}
487c804472Sopenharmony_ci
497c804472Sopenharmony_civoid TraceTool::SendTraceData(const Json2::Value& value)
507c804472Sopenharmony_ci{
517c804472Sopenharmony_ci    *(GetInstance().socket) << value.ToString();
527c804472Sopenharmony_ci}
537c804472Sopenharmony_ci
547c804472Sopenharmony_civoid TraceTool::HandleTrace(const std::string msg) const
557c804472Sopenharmony_ci{
567c804472Sopenharmony_ci    if (!isReady) {
577c804472Sopenharmony_ci        ILOG("Trace pipe is not prepared");
587c804472Sopenharmony_ci        return;
597c804472Sopenharmony_ci    }
607c804472Sopenharmony_ci    Json2::Value val = JsonReader::CreateObject();
617c804472Sopenharmony_ci    val.Add("sid", "10007");
627c804472Sopenharmony_ci    Json2::Value detail = JsonReader::CreateObject();
637c804472Sopenharmony_ci    detail.Add("ProjectId", CommandParser::GetInstance().GetProjectID().c_str());
647c804472Sopenharmony_ci    detail.Add("device", CommandParser::GetInstance().GetDeviceType().c_str());
657c804472Sopenharmony_ci    detail.Add("time", TimeTool::GetTraceFormatTime().c_str());
667c804472Sopenharmony_ci    val.Add("detail", detail);
677c804472Sopenharmony_ci    val.Add("action", msg.c_str());
687c804472Sopenharmony_ci    SendTraceData(val);
697c804472Sopenharmony_ci}
707c804472Sopenharmony_ci
717c804472Sopenharmony_ciTraceTool::TraceTool() : socket(nullptr), isReady(false)
727c804472Sopenharmony_ci{
737c804472Sopenharmony_ci    InitPipe();
747c804472Sopenharmony_ci}
757c804472Sopenharmony_ci
767c804472Sopenharmony_ciTraceTool::~TraceTool()
777c804472Sopenharmony_ci{
787c804472Sopenharmony_ci    if (socket != nullptr) {
797c804472Sopenharmony_ci        socket->DisconnectFromServer();
807c804472Sopenharmony_ci        socket = nullptr;
817c804472Sopenharmony_ci    }
827c804472Sopenharmony_ci}
837c804472Sopenharmony_ci
847c804472Sopenharmony_cistd::string TraceTool::GetTracePipeName() const
857c804472Sopenharmony_ci{
867c804472Sopenharmony_ci    return CommandParser::GetInstance().Value("ts");
877c804472Sopenharmony_ci}
88