1/*
2 * Copyright (C) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#ifndef SERVICES_INCLUDE_SYS_CFG_PARSE_H
17#define SERVICES_INCLUDE_SYS_CFG_PARSE_H
18
19#include <map>
20#include <string>
21#include <utility>
22#include <vector>
23
24#include "input_method_utils.h"
25#include "serializable.h"
26namespace OHOS {
27namespace MiscServices {
28struct SystemConfig : public Serializable {
29    std::string systemInputMethodConfigAbility;
30    std::string defaultInputMethod;
31    bool enableInputMethodFeature = false;
32    bool enableFullExperienceFeature = false;
33    bool Unmarshal(cJSON *node) override
34    {
35        GetValue(node, GET_NAME(systemInputMethodConfigAbility), systemInputMethodConfigAbility);
36        GetValue(node, GET_NAME(defaultInputMethod), defaultInputMethod);
37        GetValue(node, GET_NAME(enableInputMethodFeature), enableInputMethodFeature);
38        GetValue(node, GET_NAME(enableFullExperienceFeature), enableFullExperienceFeature);
39        return true;
40    }
41};
42struct ImeSystemConfig : public Serializable {
43    SystemConfig systemConfig;
44    bool Unmarshal(cJSON *node) override
45    {
46        return GetValue(node, GET_NAME(systemConfig), systemConfig);
47    }
48};
49
50struct InputTypeInfo : public Serializable {
51    InputType type{ InputType::NONE };
52    std::string bundleName;
53    std::string subName;
54    bool Unmarshal(cJSON *node) override
55    {
56        int32_t typeTemp = -1;
57        auto ret = GetValue(node, GET_NAME(inputType), typeTemp);
58        if (typeTemp <= static_cast<int32_t>(InputType::NONE) || typeTemp >= static_cast<int32_t>(InputType::END)) {
59            return false;
60        }
61        type = static_cast<InputType>(typeTemp);
62        ret = GetValue(node, GET_NAME(bundleName), bundleName) && ret;
63        ret = GetValue(node, GET_NAME(subtypeId), subName) && ret;
64        return ret;
65    }
66};
67struct InputTypeCfg : public Serializable {
68    std::vector<InputTypeInfo> inputType;
69    bool Unmarshal(cJSON *node) override
70    {
71        return GetValue(node, GET_NAME(supportedInputTypeList), inputType);
72    }
73};
74
75struct SysPanelAdjust : public Serializable {
76    std::vector<std::string> style;
77    int32_t top = 0;
78    int32_t left = 0;
79    int32_t right = 0;
80    int32_t bottom = 0;
81    bool Unmarshal(cJSON *node) override
82    {
83        auto ret = GetValue(node, GET_NAME(style), style);
84        ret = GetValue(node, GET_NAME(top), top) && ret;
85        ret = GetValue(node, GET_NAME(left), left) && ret;
86        ret = GetValue(node, GET_NAME(right), right) && ret;
87        ret = GetValue(node, GET_NAME(bottom), bottom) && ret;
88        return ret;
89    }
90};
91
92struct SysPanelAdjustCfg : public Serializable {
93    std::vector<SysPanelAdjust> panelAdjust;
94    bool Unmarshal(cJSON *node) override
95    {
96        return GetValue(node, GET_NAME(sysPanelAdjust), panelAdjust);
97    }
98};
99
100struct DefaultFullImeInfo : public Serializable {
101    std::string appId;
102    std::string expirationTime;
103    uint32_t expirationVersionCode{ 0 };
104    bool Unmarshal(cJSON *node) override
105    {
106        bool ret = GetValue(node, GET_NAME(appIdentifier), appId);
107        ret &= GetValue(node, GET_NAME(expirationTime), expirationTime);
108        GetValue(node, GET_NAME(expirationVersionCode), expirationVersionCode);
109        return ret;
110    }
111};
112
113struct DefaultFullImeCfg : Serializable {
114    std::vector<DefaultFullImeInfo> defaultFullImeList;
115    bool Unmarshal(cJSON *node) override
116    {
117        return GetValue(node, GET_NAME(defaultFullImeList), defaultFullImeList);
118    }
119};
120
121class SysCfgParser {
122public:
123    static bool ParseSystemConfig(SystemConfig &systemConfig);
124    static bool ParseInputType(std::vector<InputTypeInfo> &inputType);
125    static bool ParsePanelAdjust(std::vector<SysPanelAdjust> &sysPanelAdjust);
126    static bool ParseDefaultFullIme(std::vector<DefaultFullImeInfo> &defaultFullImeList);
127
128private:
129    static constexpr const char *SYS_CFG_FILE_PATH = "etc/inputmethod/inputmethod_framework_config.json";
130    static std::string GetSysCfgContent(const std::string &key);
131};
132} // namespace MiscServices
133} // namespace OHOS
134#endif // SERVICES_INCLUDE_SYS_CFG_PARSE_H
135