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