xref: /ide/tools/previewer/RichPreviewer.cpp (revision 7c804472)
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 <chrono>
177c804472Sopenharmony_ci#include <thread>
187c804472Sopenharmony_ci#include <vector>
197c804472Sopenharmony_ci#include <new>
207c804472Sopenharmony_ci#include "CommandLineInterface.h"
217c804472Sopenharmony_ci#include "CommandParser.h"
227c804472Sopenharmony_ci#include "CppTimer.h"
237c804472Sopenharmony_ci#include "CppTimerManager.h"
247c804472Sopenharmony_ci#include "CrashHandler.h"
257c804472Sopenharmony_ci#include "Interrupter.h"
267c804472Sopenharmony_ci#include "JsAppImpl.h"
277c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
287c804472Sopenharmony_ci#include "SharedData.h"
297c804472Sopenharmony_ci#include "TraceTool.h"
307c804472Sopenharmony_ci#include "VirtualScreenImpl.h"
317c804472Sopenharmony_ci
327c804472Sopenharmony_cistatic const int NOTIFY_INTERVAL_TIME = 1000; // Unit millisecond
337c804472Sopenharmony_ci
347c804472Sopenharmony_cistatic void ApplyConfig()
357c804472Sopenharmony_ci{
367c804472Sopenharmony_ci    std::string richConfigArgs = CommandParser::GetInstance().GetConfigPath();
377c804472Sopenharmony_ci    if (richConfigArgs.empty()) {
387c804472Sopenharmony_ci        ELOG("No persistent properties path found.");
397c804472Sopenharmony_ci    }
407c804472Sopenharmony_ci    CommandLineInterface::GetInstance().ReadAndApplyConfig(richConfigArgs);
417c804472Sopenharmony_ci}
427c804472Sopenharmony_ci
437c804472Sopenharmony_cistatic void NotifyInspectorChanged()
447c804472Sopenharmony_ci{
457c804472Sopenharmony_ci    if (!VirtualScreenImpl::GetInstance().isFrameUpdated) {
467c804472Sopenharmony_ci        return;
477c804472Sopenharmony_ci    }
487c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().isFrameUpdated = false;
497c804472Sopenharmony_ci
507c804472Sopenharmony_ci    static std::string jsonTreeLast = "";
517c804472Sopenharmony_ci    std::string jsonTree = JsAppImpl::GetInstance().GetJSONTree();
527c804472Sopenharmony_ci    if (jsonTree == jsonTreeLast) {
537c804472Sopenharmony_ci        return;
547c804472Sopenharmony_ci    }
557c804472Sopenharmony_ci
567c804472Sopenharmony_ci    jsonTreeLast = jsonTree;
577c804472Sopenharmony_ci    Json2::Value commandResult = JsonReader::CreateObject();
587c804472Sopenharmony_ci    commandResult.Add("version", CommandLineInterface::COMMAND_VERSION.c_str());
597c804472Sopenharmony_ci    commandResult.Add("command", "inspector");
607c804472Sopenharmony_ci    commandResult.Add("result", jsonTree.c_str());
617c804472Sopenharmony_ci    CommandLineInterface::GetInstance().SendJsonData(commandResult);
627c804472Sopenharmony_ci    ILOG("Send inspector json tree.");
637c804472Sopenharmony_ci}
647c804472Sopenharmony_ci
657c804472Sopenharmony_cistatic void ProcessCommand()
667c804472Sopenharmony_ci{
677c804472Sopenharmony_ci    if (!CommandParser::GetInstance().IsSet("d")) {
687c804472Sopenharmony_ci        static CppTimer inspectorNotifytimer(NotifyInspectorChanged);
697c804472Sopenharmony_ci        inspectorNotifytimer.Start(NOTIFY_INTERVAL_TIME); // Notify per second
707c804472Sopenharmony_ci        CppTimerManager::GetTimerManager().AddCppTimer(inspectorNotifytimer);
717c804472Sopenharmony_ci    }
727c804472Sopenharmony_ci
737c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().InitFrameCountTimer();
747c804472Sopenharmony_ci    while (!Interrupter::IsInterrupt()) {
757c804472Sopenharmony_ci        CommandLineInterface::GetInstance().ProcessCommand();
767c804472Sopenharmony_ci        CppTimerManager::GetTimerManager().RunTimerTick();
777c804472Sopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(1));
787c804472Sopenharmony_ci    }
797c804472Sopenharmony_ci    JsAppImpl::GetInstance().Stop();
807c804472Sopenharmony_ci}
817c804472Sopenharmony_ci
827c804472Sopenharmony_cistatic void InitSharedData()
837c804472Sopenharmony_ci{
847c804472Sopenharmony_ci    CommandParser& parser = CommandParser::GetInstance();
857c804472Sopenharmony_ci    if (parser.IsSet("l")) {
867c804472Sopenharmony_ci        SharedData<std::string>(SharedDataType::LANGUAGE, parser.Value("l"));
877c804472Sopenharmony_ci    } else {
887c804472Sopenharmony_ci        SharedData<std::string>(SharedDataType::LANGUAGE, "zh_CN");
897c804472Sopenharmony_ci    }
907c804472Sopenharmony_ci    std::string lanInfo = SharedData<std::string>::GetData(SharedDataType::LANGUAGE);
917c804472Sopenharmony_ci    SharedData<std::string>(SharedDataType::LAN, lanInfo.substr(0, lanInfo.find("_")));
927c804472Sopenharmony_ci    SharedData<std::string>(SharedDataType::REGION, lanInfo.substr(lanInfo.find("_") + 1, lanInfo.length() - 1));
937c804472Sopenharmony_ci    ILOG("Start language is : %s", SharedData<std::string>::GetData(SharedDataType::LANGUAGE).c_str());
947c804472Sopenharmony_ci}
957c804472Sopenharmony_ci
967c804472Sopenharmony_cistatic void NewHandler()
977c804472Sopenharmony_ci{
987c804472Sopenharmony_ci    ELOG("Custom new handler: memory allocation failed.");
997c804472Sopenharmony_ci}
1007c804472Sopenharmony_ci
1017c804472Sopenharmony_ciint main(int argc, char* argv[])
1027c804472Sopenharmony_ci{
1037c804472Sopenharmony_ci    ILOG("RichPreviewer enter the main function.");
1047c804472Sopenharmony_ci    std::set_new_handler(NewHandler); // 设置全局new处理函数
1057c804472Sopenharmony_ci    auto richCrashHandler = std::make_unique<CrashHandler>();
1067c804472Sopenharmony_ci    // init exception handler
1077c804472Sopenharmony_ci    richCrashHandler->InitExceptionHandler();
1087c804472Sopenharmony_ci    // Parsing User Commands
1097c804472Sopenharmony_ci    CommandParser& parser = CommandParser::GetInstance();
1107c804472Sopenharmony_ci    int ret = parser.ParseArgs(argc, argv);
1117c804472Sopenharmony_ci    if (ret >= 0) {
1127c804472Sopenharmony_ci        return ret;
1137c804472Sopenharmony_ci    }
1147c804472Sopenharmony_ci    InitSharedData();
1157c804472Sopenharmony_ci    if (parser.IsSet("s")) {
1167c804472Sopenharmony_ci        CommandLineInterface::GetInstance().Init(parser.Value("s"));
1177c804472Sopenharmony_ci    }
1187c804472Sopenharmony_ci
1197c804472Sopenharmony_ci    TraceTool::GetInstance().HandleTrace("Enter the main function");
1207c804472Sopenharmony_ci
1217c804472Sopenharmony_ci    std::thread commandThead(ProcessCommand);
1227c804472Sopenharmony_ci    commandThead.detach();
1237c804472Sopenharmony_ci    VirtualScreenImpl::GetInstance().InitResolution();
1247c804472Sopenharmony_ci    ApplyConfig();
1257c804472Sopenharmony_ci    JsAppImpl::GetInstance().InitJsApp();
1267c804472Sopenharmony_ci    std::this_thread::sleep_for(std::chrono::milliseconds(500)); // sleep 500 ms
1277c804472Sopenharmony_ci    return 0;
1287c804472Sopenharmony_ci}
129