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_SYSTEM_DATA_H
17 #define PRINT_SYSTEM_DATA_H
18 
19 #include <string>
20 #include <map>
21 #include <vector>
22 #include <nlohmann/json.hpp>
23 #include "printer_info.h"
24 #include "printer_capability.h"
25 #include "print_constant.h"
26 #include "print_utils.h"
27 #include "print_log.h"
28 #include "print_map_safe.h"
29 
30 namespace OHOS {
31 namespace Print {
32 
33 struct CupsPrinterInfo {
34     std::string name;
35     std::string uri;
36     std::string maker;
37     PrinterCapability printerCapability;
38     PrinterStatus printerStatus = PRINTER_STATUS_UNAVAILABLE;
39     std::string alias;
40 };
41 
42 class PrintSystemData {
43 public:
44     bool Init();
45     void InsertCupsPrinter(const std::string &printerId, const CupsPrinterInfo &printerInfo, bool needUpdateCaps);
46     bool SaveCupsPrinterMap();
47     std::string QueryPrinterIdByStandardizeName(const std::string &printerName);
48     bool QueryCupsPrinterInfoByPrinterId(const std::string &printerId, CupsPrinterInfo &cupsPrinter);
49     void InsertPrinterInfo(const std::string &printerId, const PrinterInfo &printerInfo);
50     std::shared_ptr<PrinterInfo> QueryPrinterInfoByPrinterId(const std::string &printerId);
51     bool IsPrinterAdded(const std::string &printerId);
52     bool GetPrinterCapabilityFromSystemData(
53         CupsPrinterInfo &cupsPrinter, std::string printerId, PrinterCapability &printerCapability);
54     void DeleteCupsPrinter(const std::string &printerId);
55     void GetAddedPrinterListFromSystemData(std::vector<std::string> &printerNameList);
56     void UpdatePrinterStatus(const std::string &printerId, PrinterStatus printerStatus);
57     bool UpdatePrinterAlias(const std::string& printerId, const std::string& printerAlias);
58     void UpdatePrinterUri(const std::shared_ptr<PrinterInfo> &printerInfo);
59     void QueryPrinterInfoById(const std::string &printerId, PrinterInfo &printerInfo);
60     bool CheckPrinterBusy(const std::string &printerId);
61     bool GetAllPrintUser(std::vector<int32_t> &allPrintUserList);
62 
63     std::vector<std::string> QueryAddedPrinterIdList();
64     std::shared_ptr<PrinterInfo> QueryDiscoveredPrinterInfoById(const std::string &printerId);
65     std::shared_ptr<PrinterInfo> QueryDiscoveredPrinterInfoByName(const std::string &printerName);
66     void AddPrinterToDiscovery(std::shared_ptr<PrinterInfo> printerInfo);
67     void RemovePrinterFromDiscovery(const std::string &printerId);
68     std::map<std::string, std::shared_ptr<PrinterInfo>> GetDiscoveredPrinterInfo();
69     size_t GetDiscoveredPrinterCount();
70     void ClearDiscoveredPrinterList();
71 
72 private:
73     bool ParsePrinterListJsonV1(nlohmann::json& jsonObject);
74     bool GetJsonObjectFromFile(nlohmann::json &jsonObject, const std::string &fileName);
75     void ConvertPrinterCapabilityToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
76     void ConvertPrintMarginToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
77     void ConvertPageSizeToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
78     void ConvertPrintResolutionToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
79     void ConvertSupportedColorModeToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
80     void ConvertSupportedDuplexModeToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
81     void ConvertSupportedMediaTypeToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
82     void ConvertSupportedQualityToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson);
83     bool ConvertJsonToPrinterCapability(nlohmann::json &capsJson, PrinterCapability &printerCapability);
84     bool ConvertJsonToPrintMargin(nlohmann::json &capsJson, PrinterCapability &printerCapability);
85     bool ConvertJsonToPageSize(nlohmann::json &capsJson, PrinterCapability &printerCapability);
86     bool ConvertJsonToPrintResolution(nlohmann::json &capsJson, PrinterCapability &printerCapability);
87     bool ConvertJsonToSupportedColorMode(nlohmann::json &capsJson, PrinterCapability &printerCapability);
88     bool ConvertJsonToSupportedDuplexMode(nlohmann::json &capsJson, PrinterCapability &printerCapability);
89     bool ConvertJsonToSupportedMediaType(nlohmann::json &capsJson, PrinterCapability &printerCapability);
90     bool ConvertJsonToSupportedQuality(nlohmann::json &capsJson, PrinterCapability &printerCapability);
91     bool ConvertJsonToSupportedOrientation(nlohmann::json &capsJson, PrinterCapability &printerCapability);
92     bool GetPrinterCapabilityFromFile(std::string printerId, PrinterCapability &printerCapability);
93     bool CheckPrinterInfoJson(nlohmann::json &object, std::string &printerId);
94     bool GetPrinterCapabilityFromJson(
95         std::string printerId, nlohmann::json &jsonObject, PrinterCapability &printerCapability);
96     bool ParseUserListJsonV1(
97         nlohmann::json &jsonObject, std::vector<int32_t> &allPrintUserList);
98 
99     template<typename T>
ProcessJsonToCapabilityList(nlohmann::json & capsJson,const std::string & key,PrinterCapability & printerCapability,void (PrinterCapability::* setter)(const std::vector<T> &),std::function<bool (const nlohmann::json &,T &)> converter)100     bool ProcessJsonToCapabilityList(nlohmann::json &capsJson,
101                                      const std::string &key,
102                                      PrinterCapability &printerCapability,
103                                      void (PrinterCapability::*setter)(const std::vector <T> &),
104                                      std::function<bool(const nlohmann::json &, T &)> converter)
105     {
106         if (!capsJson.contains(key) || !capsJson[key].is_array()) {
107             PRINT_HILOGW("Cannot find %{public}s or it's not an array", key.c_str());
108             return true;
109         }
110         PRINT_HILOGD("find Capability %{public}s success", key.c_str());
111         std::vector<T> resultList;
112         for (const auto &item: capsJson[key]) {
113             if (!PrintUtils::CheckJsonType<T>(item)) {
114                 PRINT_HILOGE("%{public}s item has incorrect type", key.c_str());
115                 return false;
116             }
117             T object;
118             bool ret = converter(item, object);
119             if (!ret) {
120                 PRINT_HILOGE("Invalid format,key is %{public}s", key.c_str());
121                 return false;
122             }
123             resultList.push_back(object);
124         }
125         if (!resultList.empty()) {
126             (printerCapability.*setter)(resultList);
127         }
128         PRINT_HILOGD("processCapabilityList success, %{public}s", key.c_str());
129         return true;
130     }
131 
132 private:
133     PrintMapSafe<CupsPrinterInfo> addedPrinterMap_;
134     std::map<uint32_t, std::string> addedPrinterOrderList_;
135     std::map<std::string, std::shared_ptr<PrinterInfo>> addedPrinterInfoList_;
136     std::map<std::string, std::shared_ptr<PrinterInfo>> discoveredPrinterInfoList_;
137     std::mutex discoveredListMutex;
138 };
139 
140 }  // namespace Print
141 }  // namespace OHOS
142 #endif  // PRINT_SYSTEM_DATA_H
143