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