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 "SystemCapability.h"
177c804472Sopenharmony_ci
187c804472Sopenharmony_ci#include <fstream>
197c804472Sopenharmony_ci
207c804472Sopenharmony_ci#include "CommandParser.h"
217c804472Sopenharmony_ci#include "FileSystem.h"
227c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
237c804472Sopenharmony_ci#include "JsonReader.h"
247c804472Sopenharmony_ci
257c804472Sopenharmony_ciSystemCapability& SystemCapability::GetInstance()
267c804472Sopenharmony_ci{
277c804472Sopenharmony_ci    static SystemCapability instance;
287c804472Sopenharmony_ci    return instance;
297c804472Sopenharmony_ci}
307c804472Sopenharmony_ci
317c804472Sopenharmony_cibool SystemCapability::HasSystemCapability(const char* sysCapName)
327c804472Sopenharmony_ci{
337c804472Sopenharmony_ci    std::string capName = sysCapName;
347c804472Sopenharmony_ci    if (capabilities.find(sysCapName) == capabilities.end()) {
357c804472Sopenharmony_ci        return false;
367c804472Sopenharmony_ci    }
377c804472Sopenharmony_ci    return capabilities[sysCapName];
387c804472Sopenharmony_ci}
397c804472Sopenharmony_ci
407c804472Sopenharmony_ciSystemCapability::SystemCapability()
417c804472Sopenharmony_ci{
427c804472Sopenharmony_ci    ReadCapability();
437c804472Sopenharmony_ci}
447c804472Sopenharmony_ci
457c804472Sopenharmony_civoid SystemCapability::ReadCapability()
467c804472Sopenharmony_ci{
477c804472Sopenharmony_ci    std::string separator = FileSystem::GetSeparator();
487c804472Sopenharmony_ci    std::string filePath = FileSystem::GetApplicationPath() + separator + ".." + separator + "config" + separator +
497c804472Sopenharmony_ci                           "system_capability.json";
507c804472Sopenharmony_ci    std::ifstream inFile(filePath);
517c804472Sopenharmony_ci    if (!inFile.is_open()) {
527c804472Sopenharmony_ci        ELOG("Open capability file failed.");
537c804472Sopenharmony_ci    }
547c804472Sopenharmony_ci    std::string jsonStr((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
557c804472Sopenharmony_ci    inFile.close();
567c804472Sopenharmony_ci
577c804472Sopenharmony_ci    Json2::Value val = JsonReader::ParseJsonData2(jsonStr);
587c804472Sopenharmony_ci    if (val.IsNull()) {
597c804472Sopenharmony_ci        std::string message = JsonReader::GetErrorPtr();
607c804472Sopenharmony_ci        ELOG("Failed to parse the capability, errors: %s", message.c_str());
617c804472Sopenharmony_ci    }
627c804472Sopenharmony_ci    if (val["systemCapability"].IsNull() || !val["systemCapability"].IsArray()) {
637c804472Sopenharmony_ci        ELOG("Empty systemCapability json object: %s", val["systemCapability"].ToStyledString().c_str());
647c804472Sopenharmony_ci        return;
657c804472Sopenharmony_ci    }
667c804472Sopenharmony_ci    Json2::Value val2 = val["systemCapability"];
677c804472Sopenharmony_ci    for (int i = 0; i < val2.GetArraySize(); i++) {
687c804472Sopenharmony_ci        Json2::Value cap = val2.GetArrayItem(i);
697c804472Sopenharmony_ci        if (!cap.IsMember("name") || !cap.IsMember("register-on-startup")) {
707c804472Sopenharmony_ci            ELOG("Invalid systemCapability json object");
717c804472Sopenharmony_ci        }
727c804472Sopenharmony_ci        if (!cap["register-on-startup"].IsBool()) {
737c804472Sopenharmony_ci            ELOG("Invalid systemCapability json object");
747c804472Sopenharmony_ci        }
757c804472Sopenharmony_ci        capabilities[cap["name"].AsString()] = cap["register"].AsBool();
767c804472Sopenharmony_ci    }
777c804472Sopenharmony_ci}
78