• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 #include <fcntl.h>
17 #include <unistd.h>
18 #include <iostream>
19 #include <fstream>
20 #include <streambuf>
21 #include "print_system_data.h"
22 #include "print_log.h"
23 #include "print_util.h"
24 #include "print_constant.h"
25 
26 namespace {
27 const std::string PRINTER_LIST_FILE = "/data/service/el2/public/print_service/printer_list.json";
28 const std::string PRINTER_LIST_VERSION = "v1";
29 const std::string PRINT_USER_DATA_FILE = "/data/service/el2/public/print_service/print_user_data.json";
30 const std::string PRINT_USER_DATA_VERSION = "v1";
31 }  // namespace
32 
33 namespace OHOS {
34 namespace Print {
35 
36 using namespace std;
37 
ParsePrinterListJsonV1(nlohmann::json & jsonObject)38 bool PrintSystemData::ParsePrinterListJsonV1(nlohmann::json &jsonObject)
39 {
40     if (!jsonObject.contains("printer_list") || !jsonObject["printer_list"].is_array()) {
41         PRINT_HILOGW("can not find printer_list");
42         return false;
43     }
44     for (auto &element : jsonObject["printer_list"].items()) {
45         nlohmann::json object = element.value();
46         if (!object.contains("id") || !object["id"].is_string()) {
47             PRINT_HILOGW("can not find id");
48             continue;
49         }
50         std::string id = object["id"];
51         if (!object.contains("name") || !object["name"].is_string()) {
52             PRINT_HILOGW("can not find name");
53             continue;
54         }
55         std::string name = object["name"];
56         if (!object.contains("uri") || !object["uri"].is_string()) {
57             PRINT_HILOGW("can not find uri");
58             continue;
59         }
60         std::string uri = object["uri"];
61         if (!object.contains("maker") || !object["maker"].is_string()) {
62             PRINT_HILOGW("can not find maker");
63             continue;
64         }
65         std::string maker = object["maker"];
66         if (!object.contains("capability") || !object["capability"].is_object()) {
67             PRINT_HILOGW("can not find capability");
68             continue;
69         }
70         nlohmann::json capsJson = object["capability"];
71         PrinterCapability printerCapability;
72         if (!ConvertJsonToPrinterCapability(capsJson, printerCapability)) {
73             PRINT_HILOGW("convert json to printer capability failed");
74             continue;
75         }
76         printerCapability.Dump();
77         CupsPrinterInfo info;
78         info.name = name;
79         info.uri = uri;
80         info.maker = maker;
81         info.printerCapability = printerCapability;
82         if (object.contains("alias") && object["alias"].is_string()) {
83             info.alias = object["alias"];
84         }
85         InsertCupsPrinter(id, info, true);
86     }
87     return true;
88 }
89 
Init()90 bool PrintSystemData::Init()
91 {
92     addedPrinterMap_.clear();
93     nlohmann::json jsonObject;
94     if (!GetJsonObjectFromFile(jsonObject, PRINTER_LIST_FILE)) {
95         PRINT_HILOGW("get json from file fail");
96         return false;
97     }
98     return ParsePrinterListJsonV1(jsonObject);
99 }
100 
GetJsonObjectFromFile(nlohmann::json & jsonObject,const std::string & fileName)101 bool PrintSystemData::GetJsonObjectFromFile(nlohmann::json &jsonObject, const std::string &fileName)
102 {
103     std::ifstream ifs(fileName.c_str(), std::ios::in | std::ios::binary);
104     if (!ifs.is_open()) {
105         PRINT_HILOGW("open printer list file fail");
106         return false;
107     }
108     std::string fileData((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
109     ifs.close();
110     if (!nlohmann::json::accept(fileData)) {
111         PRINT_HILOGW("json accept fail");
112         return false;
113     }
114     jsonObject = nlohmann::json::parse(fileData);
115     if (!jsonObject.contains("version") || !jsonObject["version"].is_string()) {
116         PRINT_HILOGW("can not find version");
117         return false;
118     }
119     std::string version = jsonObject["version"].get<std::string>();
120     PRINT_HILOGI("json version: %{public}s", version.c_str());
121     std::string fileVersion = "";
122     if (strcmp(fileName.c_str(), PRINTER_LIST_FILE.c_str())) {
123         fileVersion = PRINTER_LIST_VERSION;
124     } else {
125         fileVersion = PRINT_USER_DATA_VERSION;
126     }
127     if (strcmp(version.c_str(), PRINTER_LIST_VERSION.c_str())) {
128         PRINT_HILOGW("printer list version is error.");
129         return false;
130     }
131     return true;
132 }
133 
InsertCupsPrinter(const std::string & printerId,const CupsPrinterInfo & printerInfo,bool needUpdateCaps)134 void PrintSystemData::InsertCupsPrinter(
135     const std::string &printerId, const CupsPrinterInfo &printerInfo, bool needUpdateCaps)
136 {
137     auto orderId = 0;
138     if (addedPrinterOrderList_.size()) {
139         orderId = addedPrinterOrderList_.rbegin()->first;
140     }
141     auto iter = addedPrinterMap_.find(printerId);
142     if (iter == addedPrinterMap_.end() || iter->second == nullptr) {
143         PRINT_HILOGI("insert new printer");
144         addedPrinterMap_[printerId] = std::make_shared<CupsPrinterInfo>(printerInfo);
145     } else {
146         PRINT_HILOGI("update exist printer");
147         iter->second->name = printerInfo.name;
148         iter->second->uri = printerInfo.uri;
149         iter->second->maker = printerInfo.maker;
150         iter->second->printerStatus = printerInfo.printerStatus;
151         iter->second->alias = printerInfo.alias;
152         if (needUpdateCaps) {
153             iter->second->printerCapability = printerInfo.printerCapability;
154         }
155     }
156     if (needUpdateCaps) {
157         auto addedPrinterOrderListIter = std::find_if(addedPrinterOrderList_.begin(),
158             addedPrinterOrderList_.end(),
159             [&printerId](
160                 const std::pair<uint32_t, std::string> &addedPrinter) { return addedPrinter.second == printerId; });
161         if (addedPrinterOrderListIter != addedPrinterOrderList_.end()) {
162             PRINT_HILOGW("value found");
163         } else {
164             addedPrinterOrderList_.insert(std::make_pair(orderId + 1, printerId));
165             PRINT_HILOGI("printerId: %{public}s, orderId: %{public}d", printerId.c_str(), orderId + 1);
166         }
167     }
168 }
169 
DeleteCupsPrinter(const std::string & printerId)170 void PrintSystemData::DeleteCupsPrinter(const std::string &printerId)
171 {
172     if (!printerId.empty()) {
173         PRINT_HILOGI("DeleteCupsPrinter printerId: %{public}s", printerId.c_str());
174         addedPrinterMap_.erase(printerId);
175         for (auto printer: addedPrinterOrderList_) {
176             if (!strcmp(printerId.c_str(), printer.second.c_str())) {
177                 addedPrinterOrderList_.erase(printer.first);
178                 PRINT_HILOGI("erase printer order success");
179                 break;
180             }
181         }
182         SaveCupsPrinterMap();
183     }
184 }
185 
SaveCupsPrinterMap()186 bool PrintSystemData::SaveCupsPrinterMap()
187 {
188     int32_t fd = open(PRINTER_LIST_FILE.c_str(), O_CREAT | O_TRUNC | O_RDWR, 0740);
189     PRINT_HILOGD("SaveCupsPrinterMap fd: %{public}d", fd);
190     if (fd < 0) {
191         PRINT_HILOGW("Failed to open file errno: %{public}s", std::to_string(errno).c_str());
192         close(fd);
193         return false;
194     }
195     nlohmann::json printerMapJson = nlohmann::json::array();
196     for (auto printer : addedPrinterOrderList_) {
197         auto iter = addedPrinterMap_.find(printer.second);
198         if (iter == addedPrinterMap_.end()) {
199             continue;
200         }
201         auto info = iter->second;
202         if (info == nullptr) {
203             continue;
204         }
205         nlohmann::json printerJson = nlohmann::json::object();
206         printerJson["id"] = iter->first;
207         printerJson["name"] = info->name;
208         printerJson["uri"] = info->uri;
209         printerJson["maker"] = info->maker;
210         printerJson["alias"] = info->alias;
211         nlohmann::json capsJson;
212         ConvertPrinterCapabilityToJson(info->printerCapability, capsJson);
213         printerJson["capability"] = capsJson;
214         printerMapJson.push_back(printerJson);
215     }
216     nlohmann::json jsonObject;
217     jsonObject["version"] = PRINTER_LIST_VERSION;
218     jsonObject["printer_list"] = printerMapJson;
219     std::string jsonString = jsonObject.dump();
220     size_t jsonLength = jsonString.length();
221     auto writeLength = write(fd, jsonString.c_str(), jsonLength);
222     close(fd);
223     PRINT_HILOGI("SaveCupsPrinterMap finished");
224     if (writeLength < 0) {
225         return false;
226     }
227     return (size_t)writeLength == jsonLength;
228 }
229 
QueryPrinterIdByStandardizeName(const std::string & printerName)230 std::string PrintSystemData::QueryPrinterIdByStandardizeName(const std::string &printerName)
231 {
232     for (auto iter = addedPrinterMap_.begin(); iter != addedPrinterMap_.end(); ++iter) {
233         auto info = iter->second;
234         if (info == nullptr) {
235             continue;
236         }
237         std::string name = PrintUtil::StandardizePrinterName(info->name);
238         if (name == PrintUtil::StandardizePrinterName(printerName)) {
239             PRINT_HILOGD("printerId: %{public}s", iter->first.c_str());
240             return iter->first;
241         }
242     }
243     return "";
244 }
245 
QueryCupsPrinterInfoByPrinterId(const std::string & printerId,CupsPrinterInfo & cupsPrinter)246 bool PrintSystemData::QueryCupsPrinterInfoByPrinterId(const std::string &printerId, CupsPrinterInfo &cupsPrinter)
247 {
248     for (auto iter = addedPrinterMap_.begin(); iter != addedPrinterMap_.end(); ++iter) {
249         auto info = iter->second;
250         if (info == nullptr) {
251             continue;
252         }
253         if (printerId == iter->first) {
254             cupsPrinter.name = info->name;
255             cupsPrinter.uri = info->uri;
256             cupsPrinter.maker = info->maker;
257             cupsPrinter.printerCapability = info->printerCapability;
258             cupsPrinter.printerStatus = info->printerStatus;
259             cupsPrinter.alias = info->alias;
260             return true;
261         }
262     }
263     return false;
264 }
265 
QueryPrinterInfoById(const std::string & printerId,PrinterInfo & printerInfo)266 void PrintSystemData::QueryPrinterInfoById(const std::string &printerId, PrinterInfo &printerInfo)
267 {
268     CupsPrinterInfo cupsPrinter;
269     if (QueryCupsPrinterInfoByPrinterId(printerId, cupsPrinter)) {
270         printerInfo.SetPrinterId(printerId);
271         printerInfo.SetPrinterName(PrintUtil::RemoveUnderlineFromPrinterName(cupsPrinter.name));
272         printerInfo.SetCapability(cupsPrinter.printerCapability);
273         printerInfo.SetPrinterStatus(cupsPrinter.printerStatus);
274         nlohmann::json option;
275         option["printerName"] = cupsPrinter.name;
276         option["printerUri"] = cupsPrinter.uri;
277         option["make"] = cupsPrinter.maker;
278         option["alias"] = cupsPrinter.alias;
279         printerInfo.SetOption(option.dump());
280         printerInfo.Dump();
281     } else {
282         PRINT_HILOGE("query printer info failed.");
283     }
284 }
285 
UpdatePrinterStatus(const std::string & printerId,PrinterStatus printerStatus)286 void PrintSystemData::UpdatePrinterStatus(const std::string& printerId, PrinterStatus printerStatus)
287 {
288     auto iter = addedPrinterMap_.find(printerId);
289     if (iter != addedPrinterMap_.end() && iter->second != nullptr) {
290         iter->second->printerStatus = printerStatus;
291         PRINT_HILOGI("UpdatePrinterStatus success, status: %{public}d", iter->second->printerStatus);
292     }
293 }
294 
UpdatePrinterAlias(const std::string & printerId,const std::string & printerAlias)295 bool PrintSystemData::UpdatePrinterAlias(const std::string& printerId, const std::string& printerAlias)
296 {
297     auto iter = addedPrinterMap_.find(printerId);
298     if (iter != addedPrinterMap_.end() && iter->second != nullptr) {
299         if (iter->second->alias != printerAlias) {
300             iter->second->alias = printerAlias;
301             PRINT_HILOGI("UpdatePrinterAlias success, alias: %{public}s", iter->second->alias.c_str());
302             return true;
303         }
304         PRINT_HILOGW("Alias is the same, no update needed.");
305         return false;
306     }
307     PRINT_HILOGE("Unable to find the corresponding printId.");
308     return false;
309 }
310 
InsertPrinterInfo(const std::string & printerId,const PrinterInfo & printerInfo)311 void PrintSystemData::InsertPrinterInfo(const std::string &printerId, const PrinterInfo &printerInfo)
312 {
313     auto iter = addedPrinterInfoList_.find(printerId);
314     if (iter == addedPrinterInfoList_.end() || iter->second == nullptr) {
315         PRINT_HILOGI("insert new printerInfo");
316         addedPrinterInfoList_[printerId] = std::make_shared<PrinterInfo>(printerInfo);
317     }
318 }
319 
QueryPrinterInfoByPrinterId(const std::string & printerId)320 std::shared_ptr<PrinterInfo> PrintSystemData::QueryPrinterInfoByPrinterId(const std::string &printerId)
321 {
322     auto iter = addedPrinterInfoList_.find(printerId);
323     if (iter != addedPrinterInfoList_.end()) {
324         return iter->second;
325     }
326     return nullptr;
327 }
328 
GetAddedPrinterListFromSystemData(std::vector<std::string> & printerNameList)329 void PrintSystemData::GetAddedPrinterListFromSystemData(std::vector<std::string> &printerNameList)
330 {
331     for (auto it = addedPrinterOrderList_.rbegin(); it != addedPrinterOrderList_.rend(); ++it) {
332         auto addedPrinterIter = addedPrinterMap_.find(it->second);
333         if (addedPrinterIter == addedPrinterMap_.end()) {
334             continue;
335         }
336         auto info = addedPrinterIter->second;
337         if (info == nullptr) {
338             continue;
339         }
340         PRINT_HILOGD("GetAddedPrinterListFromSystemData info->name: %{public}s", info->name.c_str());
341         printerNameList.push_back(info->name);
342     }
343 }
344 
IsPrinterAdded(const std::string & printerId)345 bool PrintSystemData::IsPrinterAdded(const std::string &printerId)
346 {
347     auto iter = addedPrinterMap_.find(printerId);
348     if (iter == addedPrinterMap_.end() || iter->second == nullptr) {
349         return false;
350     }
351     return true;
352 }
353 
ConvertPrinterCapabilityToJson(PrinterCapability & printerCapability,nlohmann::json & capsJson)354 void PrintSystemData::ConvertPrinterCapabilityToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson)
355 {
356     capsJson["colorMode"] = printerCapability.GetColorMode();
357     capsJson["duplexMode"] = printerCapability.GetDuplexMode();
358     if (printerCapability.HasMargin()) {
359         ConvertPrintMarginToJson(printerCapability, capsJson);
360     }
361     ConvertPageSizeToJson(printerCapability, capsJson);
362     if (printerCapability.HasResolution()) {
363         ConvertPrintResolutionToJson(printerCapability, capsJson);
364     }
365     if (printerCapability.HasOption()) {
366         std::string options = printerCapability.GetOption();
367         if (!nlohmann::json::accept(options)) {
368             PRINT_HILOGE("json accept capability options fail");
369             return;
370         }
371         capsJson["options"] = nlohmann::json::parse(options);
372     }
373 }
374 
ConvertPrintResolutionToJson(PrinterCapability & printerCapability,nlohmann::json & capsJson)375 void PrintSystemData::ConvertPrintResolutionToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson)
376 {
377     nlohmann::json resolutionListJson = nlohmann::json::array();
378     std::vector<PrintResolution> resolutionList;
379     printerCapability.GetResolution(resolutionList);
380     for (auto iter : resolutionList) {
381         nlohmann::json resolutionJson = nlohmann::json::object();
382         resolutionJson["id"] = iter.GetId();
383         resolutionJson["horizontalDpi"] = iter.GetHorizontalDpi();
384         resolutionJson["verticalDpi"] = iter.GetVerticalDpi();
385         resolutionListJson.push_back(resolutionJson);
386     }
387     capsJson["resolution"] = resolutionListJson;
388 }
389 
ConvertPageSizeToJson(PrinterCapability & printerCapability,nlohmann::json & capsJson)390 void PrintSystemData::ConvertPageSizeToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson)
391 {
392     nlohmann::json pageSizeListJson = nlohmann::json::array();
393     std::vector<PrintPageSize> pageSizeList;
394     printerCapability.GetPageSize(pageSizeList);
395     for (auto iter : pageSizeList) {
396         nlohmann::json pageSizeJson = nlohmann::json::object();
397         pageSizeJson["id"] = iter.GetId();
398         pageSizeJson["name"] = iter.GetName();
399         pageSizeJson["width"] = iter.GetWidth();
400         pageSizeJson["height"] = iter.GetHeight();
401         pageSizeListJson.push_back(pageSizeJson);
402     }
403     capsJson["pageSize"] = pageSizeListJson;
404 }
405 
ConvertPrintMarginToJson(PrinterCapability & printerCapability,nlohmann::json & capsJson)406 void PrintSystemData::ConvertPrintMarginToJson(PrinterCapability &printerCapability, nlohmann::json &capsJson)
407 {
408     nlohmann::json marginJson;
409     PrintMargin minMargin;
410     printerCapability.GetMinMargin(minMargin);
411     if (minMargin.HasTop()) {
412         marginJson["top"] = minMargin.GetTop();
413     }
414     if (minMargin.HasBottom()) {
415         marginJson["bottom"] = minMargin.GetBottom();
416     }
417     if (minMargin.HasLeft()) {
418         marginJson["left"] = minMargin.GetLeft();
419     }
420     if (minMargin.HasRight()) {
421         marginJson["right"] = minMargin.GetRight();
422     }
423     capsJson["minMargin"] = marginJson;
424 }
425 
ConvertJsonToPrinterCapability(nlohmann::json & capsJson,PrinterCapability & printerCapability)426 bool PrintSystemData::ConvertJsonToPrinterCapability(nlohmann::json &capsJson, PrinterCapability &printerCapability)
427 {
428     if (!capsJson.contains("colorMode") || !capsJson["colorMode"].is_number()) {
429         PRINT_HILOGW("can not find colorMode");
430         return false;
431     }
432     printerCapability.SetColorMode(capsJson["colorMode"].get<uint32_t>());
433 
434     if (!capsJson.contains("duplexMode") || !capsJson["duplexMode"].is_number()) {
435         PRINT_HILOGW("can not find duplexMode");
436         return false;
437     }
438     printerCapability.SetDuplexMode(capsJson["duplexMode"].get<uint32_t>());
439 
440     if (capsJson.contains("minMargin") && capsJson["minMargin"].is_object()) {
441         PRINT_HILOGD("find minMargin");
442         ConvertJsonToPrintMargin(capsJson, printerCapability);
443     }
444 
445     if (!capsJson.contains("pageSize") || !capsJson["pageSize"].is_array()) {
446         PRINT_HILOGW("can not find pageSize");
447         return false;
448     }
449     if (!ConvertJsonToPageSize(capsJson, printerCapability)) {
450         PRINT_HILOGW("convert json to pageSize failed");
451         return false;
452     }
453 
454     if (capsJson.contains("resolution") && capsJson["resolution"].is_array()) {
455         PRINT_HILOGD("find resolution");
456         if (!ConvertJsonToPrintResolution(capsJson, printerCapability)) {
457             PRINT_HILOGW("convert json to print resolution failed");
458             return false;
459         }
460     }
461 
462     if (capsJson.contains("options") && capsJson["options"].is_object()) {
463         PRINT_HILOGD("find options");
464         printerCapability.SetOption(capsJson["options"].dump());
465     }
466 
467     return true;
468 }
469 
ConvertJsonToPrintResolution(nlohmann::json & capsJson,PrinterCapability & printerCapability)470 bool PrintSystemData::ConvertJsonToPrintResolution(nlohmann::json &capsJson, PrinterCapability &printerCapability)
471 {
472     nlohmann::json resolutionListJson = capsJson["resolution"];
473     std::vector<PrintResolution> resolutionList;
474     for (auto &item : resolutionListJson.items()) {
475         if (!item.value().is_object()) {
476             PRINT_HILOGW("resolutionList item is not object");
477             return false;
478         }
479         nlohmann::json resolutionJson = item.value();
480         PrintResolution printResolution;
481         if (!resolutionJson.contains("id") || !resolutionJson["id"].is_string()) {
482             PRINT_HILOGW("can not find id");
483             return false;
484         }
485         printResolution.SetId(resolutionJson["id"]);
486         if (!resolutionJson.contains("horizontalDpi") || !resolutionJson["horizontalDpi"].is_number()) {
487             PRINT_HILOGW("can not find horizontalDpi");
488             return false;
489         }
490         printResolution.SetHorizontalDpi(resolutionJson["horizontalDpi"].get<uint32_t>());
491         if (!resolutionJson.contains("verticalDpi") || !resolutionJson["verticalDpi"].is_number()) {
492             PRINT_HILOGW("can not find verticalDpi");
493             return false;
494         }
495         printResolution.SetVerticalDpi(resolutionJson["verticalDpi"].get<uint32_t>());
496         resolutionList.emplace_back(printResolution);
497     }
498     if (resolutionList.size()) {
499         printerCapability.SetResolution(resolutionList);
500     }
501 
502     return true;
503 }
504 
ConvertJsonToPageSize(nlohmann::json & capsJson,PrinterCapability & printerCapability)505 bool PrintSystemData::ConvertJsonToPageSize(nlohmann::json &capsJson, PrinterCapability &printerCapability)
506 {
507     nlohmann::json pageSizeListJson = capsJson["pageSize"];
508     std::vector<PrintPageSize> pageSizeList;
509     for (auto &item : pageSizeListJson.items()) {
510         if (!item.value().is_object()) {
511             PRINT_HILOGW("pageSizeListJson item is not object");
512             return false;
513         }
514         nlohmann::json pageSizeJson = item.value();
515         PrintPageSize pageSize;
516         if (!pageSizeJson.contains("id") || !pageSizeJson["id"].is_string()) {
517             PRINT_HILOGW("can not find id");
518             return false;
519         }
520         pageSize.SetId(pageSizeJson["id"]);
521         if (!pageSizeJson.contains("name") || !pageSizeJson["name"].is_string()) {
522             PRINT_HILOGW("can not find name");
523             return false;
524         }
525         pageSize.SetName(pageSizeJson["name"]);
526         if (!pageSizeJson.contains("width") || !pageSizeJson["width"].is_number()) {
527             PRINT_HILOGW("can not find width");
528             return false;
529         }
530         pageSize.SetWidth(pageSizeJson["width"].get<uint32_t>());
531         if (!pageSizeJson.contains("height") || !pageSizeJson["height"].is_number()) {
532             PRINT_HILOGW("can not find height");
533             return false;
534         }
535         pageSize.SetHeight(pageSizeJson["height"].get<uint32_t>());
536         pageSizeList.emplace_back(pageSize);
537     }
538     if (pageSizeList.size()) {
539         printerCapability.SetPageSize(pageSizeList);
540     }
541 
542     return true;
543 }
544 
ConvertJsonToPrintMargin(nlohmann::json & capsJson,PrinterCapability & printerCapability)545 void PrintSystemData::ConvertJsonToPrintMargin(nlohmann::json &capsJson, PrinterCapability &printerCapability)
546 {
547     nlohmann::json marginJson = capsJson["minMargin"];
548     PrintMargin minMargin;
549     uint32_t marginCount = 0;
550 
551     if (marginJson.contains("top") && marginJson["top"].is_number()) {
552         minMargin.SetTop(marginJson["top"].get<uint32_t>());
553         marginCount++;
554     }
555     if (marginJson.contains("bottom") && marginJson["bottom"].is_number()) {
556         minMargin.SetTop(marginJson["bottom"].get<uint32_t>());
557         marginCount++;
558     }
559     if (marginJson.contains("left") && marginJson["left"].is_number()) {
560         minMargin.SetLeft(marginJson["left"].get<uint32_t>());
561         marginCount++;
562     }
563     if (marginJson.contains("right") && marginJson["right"].is_number()) {
564         minMargin.SetRight(marginJson["right"].get<uint32_t>());
565         marginCount++;
566     }
567     if (marginCount) {
568         printerCapability.SetMinMargin(minMargin);
569     }
570 }
571 
GetPrinterCapabilityFromSystemData(CupsPrinterInfo & cupsPrinter,std::string printerId,PrinterCapability & printerCapability)572 bool PrintSystemData::GetPrinterCapabilityFromSystemData(
573     CupsPrinterInfo &cupsPrinter, std::string printerId, PrinterCapability &printerCapability)
574 {
575     PrinterCapability cupsPrinterCaps = cupsPrinter.printerCapability;
576     std::vector<PrintPageSize> pageSizeList;
577     cupsPrinterCaps.GetPageSize(pageSizeList);
578     if (pageSizeList.size() != 0) {
579         PRINT_HILOGI("find printer capability in system data");
580         printerCapability = cupsPrinterCaps;
581         return true;
582     } else if (GetPrinterCapabilityFromFile(printerId, printerCapability)) {
583         return true;
584     }
585     return false;
586 }
587 
GetPrinterCapabilityFromFile(std::string printerId,PrinterCapability & printerCapability)588 bool PrintSystemData::GetPrinterCapabilityFromFile(std::string printerId, PrinterCapability &printerCapability)
589 {
590     PRINT_HILOGI("GetPrinterCapabilityFromFile printerId: %{public}s", printerId.c_str());
591     nlohmann::json jsonObject;
592     if (!GetJsonObjectFromFile(jsonObject, PRINTER_LIST_FILE)) {
593         PRINT_HILOGW("get json from file fail");
594         return false;
595     }
596 
597     if (!GetPrinterCapabilityFromJson(printerId, jsonObject, printerCapability)) {
598         PRINT_HILOGW("get caps from file json fail");
599         return false;
600     }
601     return true;
602 }
603 
GetPrinterCapabilityFromJson(std::string printerId,nlohmann::json & jsonObject,PrinterCapability & printerCapability)604 bool PrintSystemData::GetPrinterCapabilityFromJson(
605     std::string printerId, nlohmann::json &jsonObject, PrinterCapability &printerCapability)
606 {
607     if (!jsonObject.contains("printer_list") || !jsonObject["printer_list"].is_array()) {
608         PRINT_HILOGW("can not find printer_list");
609         return false;
610     }
611     nlohmann::json printerMapJson = jsonObject["printer_list"];
612     if (printerMapJson.empty()) {
613         PRINT_HILOGW("printer map is empty");
614         return false;
615     }
616 
617     for (auto &element : jsonObject["printer_list"].items()) {
618         nlohmann::json object = element.value();
619         if (!CheckPrinterInfoJson(object, printerId)) {
620             continue;
621         }
622         if (!object.contains("capability")) {
623             PRINT_HILOGE("json does not contain the key as capability");
624             continue;
625         }
626         nlohmann::json capsJson = object["capability"];
627         PrinterCapability caps;
628         if (!ConvertJsonToPrinterCapability(capsJson, caps)) {
629             PRINT_HILOGW("convert json to printer capability failed");
630             continue;
631         }
632         std::vector<PrintPageSize> pageSizeList;
633         caps.GetPageSize(pageSizeList);
634         if (pageSizeList.size() != 0) {
635             PRINT_HILOGI("find printer capability in file");
636             caps.Dump();
637             printerCapability = caps;
638             return true;
639         }
640     }
641     return false;
642 }
643 
CheckPrinterInfoJson(nlohmann::json & object,std::string & printerId)644 bool PrintSystemData::CheckPrinterInfoJson(nlohmann::json &object, std::string &printerId)
645 {
646     if (!object.contains("id") || !object["id"].is_string()) {
647         PRINT_HILOGW("can not find id");
648         return false;
649     }
650     std::string id = object["id"];
651     if (id != printerId) {
652         return false;
653     }
654     if (!object.contains("name") || !object["name"].is_string()) {
655         PRINT_HILOGW("can not find name");
656         return false;
657     }
658     if (!object.contains("uri") || !object["uri"].is_string()) {
659         PRINT_HILOGW("can not find uri");
660         return false;
661     }
662     if (!object.contains("maker") || !object["maker"].is_string()) {
663         PRINT_HILOGW("can not find maker");
664         return false;
665     }
666     if (!object.contains("capability") || !object["capability"].is_object()) {
667         PRINT_HILOGW("can not find capability");
668         return false;
669     }
670     return true;
671 }
672 
CheckPrinterBusy(const std::string & printerId)673 bool PrintSystemData::CheckPrinterBusy(const std::string &printerId)
674 {
675     CupsPrinterInfo cupsPrinter;
676     QueryCupsPrinterInfoByPrinterId(printerId, cupsPrinter);
677     if (cupsPrinter.printerStatus == PRINTER_STATUS_BUSY) {
678         PRINT_HILOGI("printer is busy");
679         return true;
680     }
681     return false;
682 }
683 
GetAllPrintUser(std::vector<int32_t> & allPrintUserList)684 bool PrintSystemData::GetAllPrintUser(std::vector<int32_t> &allPrintUserList)
685 {
686     nlohmann::json jsonObject;
687     if (!GetJsonObjectFromFile(jsonObject, PRINT_USER_DATA_FILE)) {
688         PRINT_HILOGW("get json from file fail");
689         return false;
690     }
691     return ParseUserListJsonV1(jsonObject, allPrintUserList);
692 }
693 
ParseUserListJsonV1(nlohmann::json & jsonObject,std::vector<int32_t> & allPrintUserList)694 bool PrintSystemData::ParseUserListJsonV1(nlohmann::json &jsonObject, std::vector<int32_t> &allPrintUserList)
695 {
696     if (!jsonObject.contains("print_user_data") || !jsonObject["print_user_data"].is_object()) {
697         PRINT_HILOGE("can not find print_user_data");
698         return false;
699     }
700     for (auto &element : jsonObject["print_user_data"].items()) {
701         std::string userIdStr = element.key();
702         if (userIdStr.empty()) {
703             continue;
704         }
705         int32_t userId = std::atoi(userIdStr.c_str());
706         PRINT_HILOGI("ParseUserListJsonV1 userId: %{public}d", userId);
707         allPrintUserList.push_back(userId);
708     }
709     if (!allPrintUserList.size()) {
710         PRINT_HILOGE("allPrintUserList is empty.");
711         return false;
712     }
713     return true;
714 }
715 }  // namespace Print
716 }  // namespace OHOS