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 PRINT_ATTRIBUTR_PREFERENCE_H
17 #define PRINT_ATTRIBUTR_PREFERENCE_H
18 
19 #include <string>
20 #include <vector>
21 #include <nlohmann/json.hpp>
22 
23 using json = nlohmann::json;
24 namespace OHOS::Print {
25 class PreferenceSetting {
26 public:
27     std::string pagesizeId;
28     std::string orientation;
29     std::string duplex;
30     std::string quality;
31     std::string mediaType;
32     bool hasMargin;
PreferenceSetting()33     PreferenceSetting() {};
PreferenceSetting(std::string pagesizeId,std::string orientation,std::string duplex,std::string quality,std::string mediaType,bool hasMargin)34     PreferenceSetting(std::string pagesizeId, std::string orientation, std::string duplex, std::string quality,
35         std::string mediaType, bool hasMargin)
36         : pagesizeId(pagesizeId), orientation(orientation), duplex(duplex), quality(quality),
37         mediaType(mediaType), hasMargin(hasMargin) {}
38 
BuildPreferenceSettingFromJson(const json & printerAttr)39     static PreferenceSetting BuildPreferenceSettingFromJson(const json& printerAttr)
40     {
41         PreferenceSetting preferenceSetting;
42         if (printerAttr.contains("pagesizeId") && printerAttr["pagesizeId"].is_string()) {
43             preferenceSetting.pagesizeId = printerAttr.at("pagesizeId").get<std::string>();
44         }
45         if (printerAttr.contains("orientation") && printerAttr["orientation"].is_string()) {
46             preferenceSetting.orientation = printerAttr.at("orientation").get<std::string>();
47         }
48         if (printerAttr.contains("duplex") && printerAttr["duplex"].is_string()) {
49             preferenceSetting.duplex = printerAttr.at("duplex").get<std::string>();
50         }
51         if (printerAttr.contains("quality") && printerAttr["quality"].is_string()) {
52             preferenceSetting.quality = printerAttr.at("quality").get<std::string>();
53         }
54         if (printerAttr.contains("mediaType") && printerAttr["mediaType"].is_string()) {
55             preferenceSetting.mediaType = printerAttr.at("mediaType").get<std::string>();
56         }
57         if (printerAttr.contains("hasMargin") && printerAttr["hasMargin"].is_boolean()) {
58             preferenceSetting.hasMargin = printerAttr.at("hasMargin").get<bool>();
59         }
60         return preferenceSetting;
61     }
62 
BuildPreferenceSettingJson()63     json BuildPreferenceSettingJson() const
64     {
65         return json{
66             {"pagesizeId", pagesizeId},
67             {"orientation", orientation},
68             {"duplex", duplex},
69             {"quality", quality},
70             {"mediaType", mediaType},
71             {"hasMargin", hasMargin}
72         };
73     }
~PreferenceSetting()74     ~PreferenceSetting() {};
75 };
76 
77 class PrinterPreference {
78 public:
79     std::vector<std::string> pagesizeId;
80     std::vector<std::string> orientation;
81     std::vector<std::string> duplex;
82     std::vector<std::string> quality;
83     std::vector<std::string> mediaType;
84     PreferenceSetting defaultSetting;
85     PreferenceSetting setting;
PrinterPreference()86     PrinterPreference() {};
PrinterPreference(std::vector<std::string> pagesizeId,std::vector<std::string> orientation,std::vector<std::string> duplex,std::vector<std::string> quality,std::vector<std::string> mediaType,PreferenceSetting defaultSetting,PreferenceSetting setting)87     PrinterPreference(std::vector<std::string> pagesizeId, std::vector<std::string> orientation,
88         std::vector<std::string> duplex, std::vector<std::string> quality, std::vector<std::string> mediaType,
89         PreferenceSetting defaultSetting, PreferenceSetting setting)
90         : pagesizeId(pagesizeId), orientation(orientation), duplex(duplex), quality(quality),
91           mediaType(mediaType), defaultSetting(defaultSetting), setting(setting) {}
92 
GetArrayFromJson(const json & value,std::vector<std::string> & target,const std::string & key)93     static void GetArrayFromJson(const json& value, std::vector<std::string> &target, const std::string& key)
94     {
95         if (value.contains(key) && value.is_object()) {
96             const json& jsonValue = value.at(key);
97             for (auto &element : jsonValue.items()) {
98                 nlohmann::json item = element.value();
99                 if (!item.is_string()) {
100                     PRINT_HILOGW("this item in preference is not string");
101                     continue;
102                 }
103                 target.emplace_back(item.get<std::string>());
104             }
105         } else {
106             PRINT_HILOGW("can not find target array in preference, key: %{public}s", key.c_str());
107         }
108     }
109 
BuildPrinterPreferenceFromJson(const json & printerAttrs)110     static PrinterPreference BuildPrinterPreferenceFromJson(const json& printerAttrs)
111     {
112         PrinterPreference printerPreference;
113         GetArrayFromJson(printerAttrs, printerPreference.pagesizeId, "pagesizeId");
114         GetArrayFromJson(printerAttrs, printerPreference.orientation, "orientation");
115         GetArrayFromJson(printerAttrs, printerPreference.duplex, "duplex");
116         GetArrayFromJson(printerAttrs, printerPreference.quality, "quality");
117         GetArrayFromJson(printerAttrs, printerPreference.mediaType, "mediaType");
118         if (printerAttrs.contains("defaultSetting") && printerAttrs["defaultSetting"].is_object()) {
119             printerPreference.defaultSetting =
120                 PreferenceSetting::BuildPreferenceSettingFromJson(printerAttrs.at("defaultSetting"));
121         }
122         if (printerAttrs.contains("setting") && printerAttrs["setting"].is_object()) {
123             printerPreference.setting = PreferenceSetting::BuildPreferenceSettingFromJson(printerAttrs.at("setting"));
124         }
125         return printerPreference;
126     }
127 
BuildPrinterPreferenceJson()128     json BuildPrinterPreferenceJson() const
129     {
130         return json{
131             {"pagesizeId", pagesizeId},
132             {"orientation", orientation},
133             {"duplex", duplex},
134             {"quality", quality},
135             {"mediaType", mediaType},
136             {"defaultSetting", defaultSetting.BuildPreferenceSettingJson()},
137             {"setting", setting.BuildPreferenceSettingJson()}
138         };
139     }
~PrinterPreference()140     ~PrinterPreference() {};
141 };
142 }
143 #endif