• 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 <filesystem>
22 #include "print_system_data.h"
23 #include "print_log.h"
24 #include "print_util.h"
25 #include "print_constant.h"
26 
27 namespace OHOS {
28 namespace Print {
29 
ParsePrinterListJsonV1(Json::Value & jsonObject)30 bool PrintSystemData::ParsePrinterListJsonV1(Json::Value &jsonObject)
31 {
32     if (!PrintJsonUtil::IsMember(jsonObject, "printer_list") || !jsonObject["printer_list"].isArray()) {
33         PRINT_HILOGW("can not find printer_list");
34         return false;
35     }
36     uint32_t jsonSize = jsonObject["printer_list"].size();
37     if (jsonSize > MAX_PRINTER_SIZE) {
38         PRINT_HILOGE("printerlist size is illegal");
39         return false;
40     }
41     for (uint32_t i = 0; i < jsonSize; i++) {
42         Json::Value object = jsonObject["printer_list"][i];
43         if (!ConvertJsonToCupsPrinterInfo(object)) {
44             PRINT_HILOGW("can not find necessary param");
45             continue;
46         }
47     }
48     return true;
49 }
50 
ConvertJsonToCupsPrinterInfo(Json::Value & object)51 bool PrintSystemData::ConvertJsonToCupsPrinterInfo(Json::Value &object)
52 {
53     if (!PrintJsonUtil::IsMember(object, "id") || !object["id"].isString()) {
54         PRINT_HILOGW("can not find id");
55         return false;
56     }
57     std::string id = object["id"].asString();
58     if (!PrintJsonUtil::IsMember(object, "name") || !object["name"].isString()) {
59         PRINT_HILOGW("can not find name");
60         return false;
61     }
62     std::string name = object["name"].asString();
63     if (!PrintJsonUtil::IsMember(object, "uri") || !object["uri"].isString()) {
64         PRINT_HILOGW("can not find uri");
65         return false;
66     }
67     std::string uri = object["uri"].asString();
68     if (!PrintJsonUtil::IsMember(object, "maker") || !object["maker"].isString()) {
69         PRINT_HILOGW("can not find maker");
70         return false;
71     }
72     std::string maker = object["maker"].asString();
73     if (!PrintJsonUtil::IsMember(object, "capability") || !object["capability"].isObject()) {
74         PRINT_HILOGW("can not find capability");
75         return false;
76     }
77     PrinterCapability printerCapability;
78     Json::Value capsJson = object["capability"];
79     if (!ConvertJsonToPrinterCapability(capsJson, printerCapability)) {
80         PRINT_HILOGW("convert json to printer capability failed");
81         return false;
82     }
83     printerCapability.Dump();
84     CupsPrinterInfo info;
85     info.name = name;
86     info.uri = uri;
87     info.maker = maker;
88     info.printerCapability = printerCapability;
89     ConvertInnerJsonToCupsPrinterInfo(object, info);
90     InsertCupsPrinter(id, info);
91     return true;
92 }
93 
ConvertInnerJsonToCupsPrinterInfo(Json::Value & object,CupsPrinterInfo & info)94 void PrintSystemData::ConvertInnerJsonToCupsPrinterInfo(Json::Value &object, CupsPrinterInfo &info)
95 {
96     if (PrintJsonUtil::IsMember(object, "alias") && object["alias"].isString()) {
97         info.alias = object["alias"].asString();
98     }
99     if (PrintJsonUtil::IsMember(object, "printerStatus") && object["printerStatus"].isInt()) {
100         info.printerStatus = static_cast<PrinterStatus>(object["printerStatus"].asInt());
101     }
102     if (PrintJsonUtil::IsMember(object, "preferences") && object["preferences"].isObject()) {
103         info.printPreferences.ConvertJsonToPrinterPreferences(object["preferences"]);
104         PRINT_HILOGI("convert json to printer preferences success");
105     }
106 }
107 
Init()108 bool PrintSystemData::Init()
109 {
110     addedPrinterMap_.Clear();
111     PRINT_HILOGI("load new printer list file");
112     std::filesystem::path printersDir(PRINTER_SERVICE_PRINTERS_PATH);
113     for (const auto& entry : std::filesystem::directory_iterator(printersDir)) {
114         if (!entry.is_directory()) {
115             ReadJsonFile(entry.path());
116         }
117     }
118 
119     Json::Value printerListJson;
120     std::string printerListFilePath = PRINTER_SERVICE_FILE_PATH + "/" + PRINTER_LIST_FILE;
121     if (GetJsonObjectFromFile(printerListJson, printerListFilePath) && ParsePrinterListJsonV1(printerListJson)) {
122         PRINT_HILOGW("previous printer list file exist");
123         Json::Value preferencesJson;
124         std::string preferencesFilePath = PRINTER_SERVICE_FILE_PATH + "/" + PRINTER_PREFERENCE_FILE;
125         if (GetJsonObjectFromFile(preferencesJson, preferencesFilePath) &&
126             ParsePrinterPreferencesJson(preferencesJson)) {
127             PRINT_HILOGI("parse previous preferences file success");
128         }
129         std::vector<std::string> addedPrinterList = QueryAddedPrinterIdList();
130         for (auto printerId : addedPrinterList) {
131             SavePrinterFile(printerId);
132         }
133         DeleteFile(preferencesFilePath);
134         DeleteFile(printerListFilePath);
135     }
136     return true;
137 }
138 
ReadJsonFile(const std::filesystem::path & path)139 bool PrintSystemData::ReadJsonFile(const std::filesystem::path &path)
140 {
141     std::ifstream file(path);
142     if (!file.is_open()) {
143         PRINT_HILOGW("open printer list file fail");
144         return false;
145     }
146     Json::Value fileJson;
147     if (!PrintJsonUtil::ParseFromStream(file, fileJson)) {
148         PRINT_HILOGW("json accept fail");
149         return false;
150     }
151     file.close();
152 
153     if (!ConvertJsonToCupsPrinterInfo(fileJson)) {
154         PRINT_HILOGW("can not find necessary param");
155         return false;
156     }
157     return true;
158 }
159 
GetJsonObjectFromFile(Json::Value & jsonObject,const std::string & fileName)160 bool PrintSystemData::GetJsonObjectFromFile(Json::Value &jsonObject, const std::string &fileName)
161 {
162     std::ifstream ifs(fileName.c_str(), std::ios::in | std::ios::binary);
163     if (!ifs.is_open()) {
164         PRINT_HILOGW("open printer list file fail");
165         return false;
166     }
167     if (!PrintJsonUtil::ParseFromStream(ifs, jsonObject)) {
168         PRINT_HILOGW("json accept fail");
169         return false;
170     }
171     ifs.close();
172     if (fileName.find(PRINTER_PREFERENCE_FILE) != std::string::npos) {
173         return true;
174     }
175     if (!PrintJsonUtil::IsMember(jsonObject, "version") || !jsonObject["version"].isString()) {
176         PRINT_HILOGW("can not find version");
177         return false;
178     }
179     std::string version = jsonObject["version"].asString();
180     PRINT_HILOGI("json version: %{public}s", version.c_str());
181     std::string fileVersion = "";
182     std::string printerListFilePath = PRINTER_SERVICE_FILE_PATH + "/" + PRINTER_LIST_FILE;
183     if (strcmp(fileName.c_str(), printerListFilePath.c_str())) {
184         fileVersion = PRINTER_LIST_VERSION;
185     } else {
186         fileVersion = PRINT_USER_DATA_VERSION;
187     }
188     if (strcmp(version.c_str(), PRINTER_LIST_VERSION.c_str())) {
189         PRINT_HILOGW("printer list version is error.");
190         return false;
191     }
192     return true;
193 }
194 
ParsePrinterPreferencesJson(Json::Value & jsonObject)195 bool PrintSystemData::ParsePrinterPreferencesJson(Json::Value &jsonObject)
196 {
197     if (!PrintJsonUtil::IsMember(jsonObject, "printer_list") || !jsonObject["printer_list"].isArray()) {
198         PRINT_HILOGW("can not find printer_list");
199         return false;
200     }
201     uint32_t jsonSize = jsonObject["printer_list"].size();
202     if (jsonSize > MAX_PRINTER_SIZE) {
203         PRINT_HILOGE("printerlist size is illegal");
204         return false;
205     }
206     for (uint32_t i = 0; i < jsonSize; i++) {
207         Json::Value object = jsonObject["printer_list"][i];
208         Json::Value::Members keys = object.getMemberNames();
209         for (auto it = keys.begin(); it != keys.end(); it++) {
210             std::string printerId = *it;
211             auto info = addedPrinterMap_.Find(printerId);
212             if (info == nullptr) {
213                 continue;
214             }
215             if (printerId.find(EPRINTER) != std::string::npos) {
216                 PRINT_HILOGI("ePrinter Enter");
217                 BuildEprintPreference(info->printerCapability, info->printPreferences);
218             } else {
219                 BuildPrinterPreference(info->printerCapability, info->printPreferences);
220             }
221             UpdatePrinterPreferences(printerId, info->printPreferences);
222             Json::Value printPreferenceJson = object[printerId];
223             if (!PrintJsonUtil::IsMember(jsonObject, "setting") || !printPreferenceJson["setting"].isObject()) {
224                 PRINT_HILOGW("can not find setting");
225                 continue;
226             }
227             Json::Value settingJson = printPreferenceJson["setting"];
228             PRINT_HILOGD("ParsePrinterPreferencesJson settingJson: %{public}s",
229                 (PrintJsonUtil::WriteString(settingJson)).c_str());
230             PrinterPreferences preferences;
231             if (ParsePreviousPreferencesSetting(settingJson, preferences)) {
232                 PRINT_HILOGI("need update preferences by previous settings");
233                 preferences.Dump();
234                 UpdatePrinterPreferences(printerId, preferences);
235             }
236         }
237     }
238     return true;
239 }
240 
ParsePreviousPreferencesSetting(Json::Value & settingJson,PrinterPreferences & preferences)241 bool PrintSystemData::ParsePreviousPreferencesSetting(Json::Value &settingJson, PrinterPreferences &preferences)
242 {
243     bool updatePreferences = false;
244     if (PrintJsonUtil::IsMember(settingJson, "pagesizeId") && settingJson["pagesizeId"].isString() &&
245         !settingJson["pagesizeId"].asString().empty()) {
246         updatePreferences = true;
247         preferences.SetDefaultPageSizeId(settingJson["pagesizeId"].asString());
248     }
249     if (PrintJsonUtil::IsMember(settingJson, "orientation") && settingJson["orientation"].isString() &&
250         !settingJson["orientation"].asString().empty()) {
251         updatePreferences = true;
252         int32_t defaultOrientation = 0;
253         PrintUtil::ConvertToInt(settingJson["orientation"].asString(), defaultOrientation);
254         preferences.SetDefaultOrientation(defaultOrientation);
255     }
256     if (PrintJsonUtil::IsMember(settingJson, "duplex") && settingJson["duplex"].isString() &&
257         !settingJson["duplex"].asString().empty()) {
258         updatePreferences = true;
259         int32_t defaultDuplexMode = DUPLEX_MODE_NONE;
260         PrintUtil::ConvertToInt(settingJson["duplex"].asString(), defaultDuplexMode);
261         preferences.SetDefaultDuplexMode(defaultDuplexMode);
262     }
263     if (PrintJsonUtil::IsMember(settingJson, "quality") && settingJson["quality"].isString() &&
264         !settingJson["quality"].asString().empty()) {
265         updatePreferences = true;
266         int32_t defaultPrintQuality = PRINT_QUALITY_NORMAL;
267         PrintUtil::ConvertToInt(settingJson["quality"].asString(), defaultPrintQuality);
268         preferences.SetDefaultPrintQuality(defaultPrintQuality);
269     }
270     if (PrintJsonUtil::IsMember(settingJson, "mediaType") && settingJson["mediaType"].isString() &&
271         !settingJson["mediaType"].asString().empty()) {
272         updatePreferences = true;
273         preferences.SetDefaultMediaType(settingJson["mediaType"].asString());
274     }
275     if (PrintJsonUtil::IsMember(settingJson, "hasMargin") && settingJson["hasMargin"].isBool() &&
276         settingJson["hasMargin"].asBool() == false) {
277         updatePreferences = true;
278         preferences.SetBorderless(true);
279     }
280     return updatePreferences;
281 }
282 
InsertCupsPrinter(const std::string & printerId,const CupsPrinterInfo & printerInfo)283 void PrintSystemData::InsertCupsPrinter(const std::string &printerId, const CupsPrinterInfo &printerInfo)
284 {
285     auto info = addedPrinterMap_.Find(printerId);
286     if (info == nullptr) {
287         PRINT_HILOGI("insert new printer");
288         addedPrinterMap_.Insert(printerId, printerInfo);
289     } else {
290         PRINT_HILOGI("update exist printer");
291         info->name = printerInfo.name;
292         info->uri = printerInfo.uri;
293         info->maker = printerInfo.maker;
294         info->printerStatus = printerInfo.printerStatus;
295         info->printerCapability = printerInfo.printerCapability;
296         if (!printerInfo.alias.empty()) {
297             info->alias = printerInfo.alias;
298         }
299         info->printPreferences = printerInfo.printPreferences;
300     }
301 }
302 
DeleteCupsPrinter(const std::string & printerId,const std::string & printerName)303 void PrintSystemData::DeleteCupsPrinter(const std::string &printerId, const std::string &printerName)
304 {
305     if (!printerId.empty()) {
306         PRINT_HILOGI("DeleteCupsPrinter printerName: %{private}s", printerName.c_str());
307         addedPrinterMap_.Remove(printerId);
308         std::filesystem::path filePath =
309             PRINTER_SERVICE_PRINTERS_PATH + "/" + PrintUtil::StandardizePrinterName(printerName) + ".json";
310         DeleteFile(filePath);
311     }
312 }
313 
DeleteFile(const std::filesystem::path & path)314 void PrintSystemData::DeleteFile(const std::filesystem::path &path)
315 {
316     if (std::filesystem::remove(path)) {
317         PRINT_HILOGI("file deleted successfully");
318     } else {
319         PRINT_HILOGE("failed to delete file");
320     }
321 }
322 
SavePrinterFile(const std::string & printerId)323 void PrintSystemData::SavePrinterFile(const std::string &printerId)
324 {
325     auto info = addedPrinterMap_.Find(printerId);
326     if (info == nullptr) {
327         return;
328     }
329     std::string printerListFilePath =
330         PRINTER_SERVICE_PRINTERS_PATH + "/" + PrintUtil::StandardizePrinterName(info->name) + ".json";
331     char realPidFile[PATH_MAX] = {};
332     if (realpath(PRINTER_SERVICE_FILE_PATH.c_str(), realPidFile) == nullptr) {
333         PRINT_HILOGE("The realPidFile is null, errno:%{public}s", std::to_string(errno).c_str());
334         return;
335     }
336     FILE *file = fopen(printerListFilePath.c_str(), "w+");
337     if (file == nullptr) {
338         PRINT_HILOGW("Failed to open file errno: %{public}s", std::to_string(errno).c_str());
339         return;
340     }
341     Json::Value printerJson;
342     printerJson["id"] = printerId;
343     printerJson["name"] = info->name;
344     printerJson["uri"] = info->uri;
345     printerJson["maker"] = info->maker;
346     printerJson["alias"] = info->alias;
347     if (QueryIpPrinterInfoById(printerId) != nullptr) {
348         printerJson["printerStatus"] = info->printerStatus;
349     }
350     Json::Value capsJson;
351     ConvertPrinterCapabilityToJson(info->printerCapability, capsJson);
352     printerJson["capability"] = capsJson;
353     printerJson["preferences"] = info->printPreferences.ConvertToJson();
354     std::string jsonString = PrintJsonUtil::WriteString(printerJson);
355     size_t jsonLength = jsonString.length();
356     size_t writeLength = fwrite(jsonString.c_str(), strlen(jsonString.c_str()), 1, file);
357     int fcloseResult = fclose(file);
358     if (fcloseResult != 0) {
359         PRINT_HILOGE("Close File Failure.");
360         return;
361     }
362     PRINT_HILOGI("SavePrinterFile finished");
363     if (writeLength < 0 || (size_t)writeLength != jsonLength) {
364         PRINT_HILOGE("SavePrinterFile error");
365     }
366 }
367 
QueryPrinterIdByStandardizeName(const std::string & printerName)368 std::string PrintSystemData::QueryPrinterIdByStandardizeName(const std::string &printerName)
369 {
370     std::string stardardizeName = PrintUtil::StandardizePrinterName(printerName);
371     return addedPrinterMap_.FindKey([this, stardardizeName](const CupsPrinterInfo &cupsPrinter) -> bool {
372         return PrintUtil::StandardizePrinterName(cupsPrinter.name) == stardardizeName;
373     });
374 }
375 
QueryCupsPrinterInfoByPrinterId(const std::string & printerId,CupsPrinterInfo & cupsPrinter)376 bool PrintSystemData::QueryCupsPrinterInfoByPrinterId(const std::string &printerId, CupsPrinterInfo &cupsPrinter)
377 {
378     auto info = addedPrinterMap_.Find(printerId);
379     if (info == nullptr) {
380         return false;
381     }
382     cupsPrinter.name = info->name;
383     cupsPrinter.uri = info->uri;
384     cupsPrinter.maker = info->maker;
385     cupsPrinter.printerCapability = info->printerCapability;
386     cupsPrinter.printerStatus = info->printerStatus;
387     cupsPrinter.alias = info->alias;
388     cupsPrinter.printPreferences = info->printPreferences;
389     return true;
390 }
391 
QueryPrinterInfoById(const std::string & printerId,PrinterInfo & printerInfo)392 void PrintSystemData::QueryPrinterInfoById(const std::string &printerId, PrinterInfo &printerInfo)
393 {
394     CupsPrinterInfo cupsPrinter;
395     if (QueryCupsPrinterInfoByPrinterId(printerId, cupsPrinter)) {
396         printerInfo.SetPrinterId(printerId);
397         printerInfo.SetPrinterName(PrintUtil::RemoveUnderlineFromPrinterName(cupsPrinter.name));
398         printerInfo.SetCapability(cupsPrinter.printerCapability);
399         printerInfo.SetPrinterStatus(cupsPrinter.printerStatus);
400         Json::Value option;
401         option["printerName"] = cupsPrinter.name;
402         option["printerUri"] = cupsPrinter.uri;
403         option["make"] = cupsPrinter.maker;
404         option["alias"] = cupsPrinter.alias;
405         printerInfo.SetOption(PrintJsonUtil::WriteString(option));
406         printerInfo.Dump();
407     } else {
408         PRINT_HILOGE("query printer info failed.");
409     }
410 }
411 
UpdatePrinterStatus(const std::string & printerId,PrinterStatus printerStatus)412 void PrintSystemData::UpdatePrinterStatus(const std::string& printerId, PrinterStatus printerStatus)
413 {
414     auto info = addedPrinterMap_.Find(printerId);
415     if (info != nullptr) {
416         info->printerStatus = printerStatus;
417         PRINT_HILOGI("UpdatePrinterStatus success, status: %{public}d", info->printerStatus);
418     }
419 }
420 
UpdatePrinterAlias(const std::string & printerId,const std::string & printerAlias)421 bool PrintSystemData::UpdatePrinterAlias(const std::string& printerId, const std::string& printerAlias)
422 {
423     auto info = addedPrinterMap_.Find(printerId);
424     if (info != nullptr) {
425         if (info->alias != printerAlias) {
426             info->alias = printerAlias;
427             PRINT_HILOGI("UpdatePrinterAlias success, alias: %{public}s", info->alias.c_str());
428             return true;
429         }
430         PRINT_HILOGW("Alias is the same, no update needed.");
431         return false;
432     }
433     PRINT_HILOGE("Unable to find the corresponding printId.");
434     return false;
435 }
436 
UpdatePrinterUri(const std::shared_ptr<PrinterInfo> & printerInfo)437 void PrintSystemData::UpdatePrinterUri(const std::shared_ptr<PrinterInfo> &printerInfo)
438 {
439     auto info = addedPrinterMap_.Find(printerInfo->GetPrinterId());
440     if (info != nullptr) {
441         info->uri = printerInfo->GetUri();
442         PRINT_HILOGI("UpdatePrinterUri success");
443     }
444 }
445 
UpdatePrinterPreferences(const std::string & printerId,const PrinterPreferences & preferences)446 void PrintSystemData::UpdatePrinterPreferences(const std::string &printerId, const PrinterPreferences &preferences)
447 {
448     auto info = addedPrinterMap_.Find(printerId);
449     if (info != nullptr) {
450         info->printPreferences = preferences;
451         PRINT_HILOGI("UpdatePrinterPreferences success");
452         preferences.Dump();
453     }
454 }
455 
InsertPrinterInfo(const std::string & printerId,const PrinterInfo & printerInfo)456 void PrintSystemData::InsertPrinterInfo(const std::string &printerId, const PrinterInfo &printerInfo)
457 {
458     auto iter = addedPrinterInfoList_.find(printerId);
459     if (iter == addedPrinterInfoList_.end() || iter->second == nullptr) {
460         PRINT_HILOGI("insert new printerInfo");
461         addedPrinterInfoList_[printerId] = std::make_shared<PrinterInfo>(printerInfo);
462     }
463 }
464 
QueryPrinterInfoByPrinterId(const std::string & printerId)465 std::shared_ptr<PrinterInfo> PrintSystemData::QueryPrinterInfoByPrinterId(const std::string &printerId)
466 {
467     auto iter = addedPrinterInfoList_.find(printerId);
468     if (iter != addedPrinterInfoList_.end()) {
469         return iter->second;
470     }
471     return nullptr;
472 }
473 
GetAddedPrinterListFromSystemData(std::vector<std::string> & printerNameList)474 void PrintSystemData::GetAddedPrinterListFromSystemData(std::vector<std::string> &printerNameList)
475 {
476     std::vector<std::string> addedPrinterList = QueryAddedPrinterIdList();
477     for (auto printerId : addedPrinterList) {
478         auto info = addedPrinterMap_.Find(printerId);
479         if (info == nullptr) {
480             continue;
481         }
482         PRINT_HILOGD("GetAddedPrinterListFromSystemData info->name: %{public}s", info->name.c_str());
483         printerNameList.push_back(info->name);
484     }
485 }
486 
IsPrinterAdded(const std::string & printerId)487 bool PrintSystemData::IsPrinterAdded(const std::string &printerId)
488 {
489     auto info = addedPrinterMap_.Find(printerId);
490     if (info == nullptr) {
491         return false;
492     }
493     return true;
494 }
495 
ConvertPrinterCapabilityToJson(PrinterCapability & printerCapability,Json::Value & capsJson)496 void PrintSystemData::ConvertPrinterCapabilityToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
497 {
498     capsJson["colorMode"] = printerCapability.GetColorMode();
499     capsJson["duplexMode"] = printerCapability.GetDuplexMode();
500     ConvertPageSizeToJson(printerCapability, capsJson);
501 
502     if (printerCapability.HasMargin()) {
503         ConvertPrintMarginToJson(printerCapability, capsJson);
504     }
505 
506     if (printerCapability.HasResolution()) {
507         ConvertPrintResolutionToJson(printerCapability, capsJson);
508     }
509 
510     if (printerCapability.HasSupportedColorMode()) {
511         ConvertSupportedColorModeToJson(printerCapability, capsJson);
512     }
513 
514     if (printerCapability.HasSupportedDuplexMode()) {
515         ConvertSupportedDuplexModeToJson(printerCapability, capsJson);
516     }
517 
518     if (printerCapability.HasSupportedMediaType()) {
519         ConvertSupportedMediaTypeToJson(printerCapability, capsJson);
520     }
521 
522     if (printerCapability.HasSupportedQuality()) {
523         ConvertSupportedQualityToJson(printerCapability, capsJson);
524     }
525 
526     if (printerCapability.HasOption()) {
527         std::string options = printerCapability.GetOption();
528         if (!PrintJsonUtil::Parse(options, capsJson["options"])) {
529             PRINT_HILOGE("json accept capability options fail");
530             return;
531         }
532     }
533 }
534 
ConvertPrintResolutionToJson(PrinterCapability & printerCapability,Json::Value & capsJson)535 void PrintSystemData::ConvertPrintResolutionToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
536 {
537     Json::Value resolutionListJson;
538     std::vector<PrintResolution> resolutionList;
539     printerCapability.GetResolution(resolutionList);
540     for (auto iter : resolutionList) {
541         Json::Value resolutionJson;
542         resolutionJson["id"] = iter.GetId();
543         resolutionJson["horizontalDpi"] = iter.GetHorizontalDpi();
544         resolutionJson["verticalDpi"] = iter.GetVerticalDpi();
545         resolutionListJson.append(resolutionJson);
546     }
547     capsJson["resolution"] = resolutionListJson;
548 }
549 
ConvertSupportedColorModeToJson(PrinterCapability & printerCapability,Json::Value & capsJson)550 void PrintSystemData::ConvertSupportedColorModeToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
551 {
552     Json::Value SupportedColorModeListJson;
553     std::vector<uint32_t> SupportedColorModeList;
554     printerCapability.GetSupportedColorMode(SupportedColorModeList);
555     for (auto iter : SupportedColorModeList) {
556         SupportedColorModeListJson.append(iter);
557     }
558     capsJson["supportedColorMode"] = SupportedColorModeListJson;
559 }
560 
ConvertSupportedDuplexModeToJson(PrinterCapability & printerCapability,Json::Value & capsJson)561 void PrintSystemData::ConvertSupportedDuplexModeToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
562 {
563     Json::Value supportedDuplexModeListJson;
564     std::vector<uint32_t> supportedDuplexModeList;
565     printerCapability.GetSupportedDuplexMode(supportedDuplexModeList);
566     for (auto iter : supportedDuplexModeList) {
567         supportedDuplexModeListJson.append(iter);
568     }
569     capsJson["supportedDuplexMode"] = supportedDuplexModeListJson;
570 }
571 
ConvertSupportedMediaTypeToJson(PrinterCapability & printerCapability,Json::Value & capsJson)572 void PrintSystemData::ConvertSupportedMediaTypeToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
573 {
574     Json::Value supportedMediaTypeListJson;
575     std::vector<std::string> supportedMediaTypeList;
576     printerCapability.GetSupportedMediaType(supportedMediaTypeList);
577     for (auto iter : supportedMediaTypeList) {
578         supportedMediaTypeListJson.append(iter);
579     }
580     capsJson["supportedMediaType"] = supportedMediaTypeListJson;
581 }
582 
ConvertSupportedQualityToJson(PrinterCapability & printerCapability,Json::Value & capsJson)583 void PrintSystemData::ConvertSupportedQualityToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
584 {
585     Json::Value supportedQualityListJson;
586     std::vector<uint32_t> supportedQualityList;
587     printerCapability.GetSupportedQuality(supportedQualityList);
588     for (auto iter : supportedQualityList) {
589         supportedQualityListJson.append(iter);
590     }
591     capsJson["supportedQuality"] = supportedQualityListJson;
592 }
593 
ConvertPageSizeToJson(PrinterCapability & printerCapability,Json::Value & capsJson)594 void PrintSystemData::ConvertPageSizeToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
595 {
596     Json::Value pageSizeListJson;
597     std::vector<PrintPageSize> pageSizeList;
598     printerCapability.GetSupportedPageSize(pageSizeList);
599     for (auto iter : pageSizeList) {
600         Json::Value pageSizeJson;
601         pageSizeJson["id"] = iter.GetId();
602         pageSizeJson["name"] = iter.GetName();
603         pageSizeJson["width"] = iter.GetWidth();
604         pageSizeJson["height"] = iter.GetHeight();
605         pageSizeListJson.append(pageSizeJson);
606     }
607     capsJson["pageSize"] = pageSizeListJson;
608 }
609 
ConvertPrintMarginToJson(PrinterCapability & printerCapability,Json::Value & capsJson)610 void PrintSystemData::ConvertPrintMarginToJson(PrinterCapability &printerCapability, Json::Value &capsJson)
611 {
612     Json::Value marginJson;
613     PrintMargin minMargin;
614     printerCapability.GetMinMargin(minMargin);
615     if (minMargin.HasTop()) {
616         marginJson["top"] = minMargin.GetTop();
617     }
618     if (minMargin.HasBottom()) {
619         marginJson["bottom"] = minMargin.GetBottom();
620     }
621     if (minMargin.HasLeft()) {
622         marginJson["left"] = minMargin.GetLeft();
623     }
624     if (minMargin.HasRight()) {
625         marginJson["right"] = minMargin.GetRight();
626     }
627     capsJson["minMargin"] = marginJson;
628 }
629 
ConvertJsonToPrinterCapability(Json::Value & capsJson,PrinterCapability & printerCapability)630 bool PrintSystemData::ConvertJsonToPrinterCapability(Json::Value &capsJson, PrinterCapability &printerCapability)
631 {
632     if (!PrintJsonUtil::IsMember(capsJson, "colorMode") || !capsJson["colorMode"].isInt()) {
633         PRINT_HILOGW("can not find colorMode");
634         return false;
635     }
636     if (!PrintJsonUtil::IsMember(capsJson, "duplexMode") || !capsJson["duplexMode"].isInt()) {
637         PRINT_HILOGW("can not find duplexMode");
638         return false;
639     }
640 
641     printerCapability.SetColorMode(capsJson["colorMode"].asInt());
642 
643     printerCapability.SetDuplexMode(capsJson["duplexMode"].asInt());
644 
645     if (PrintJsonUtil::IsMember(capsJson, "minMargin") && capsJson["minMargin"].isObject()) {
646         PRINT_HILOGD("find minMargin");
647         ConvertJsonToPrintMargin(capsJson, printerCapability);
648     }
649 
650     if (!ConvertJsonToPrintResolution(capsJson, printerCapability)) {
651         PRINT_HILOGW("convert json to print resolution failed");
652         return false;
653     }
654 
655     if (!ConvertJsonToPageSize(capsJson, printerCapability)) {
656         PRINT_HILOGW("convert json to pageSize failed");
657         return false;
658     }
659 
660     if (!ConvertJsonToSupportedColorMode(capsJson, printerCapability)) {
661         PRINT_HILOGW("convert json to supportedColorMode failed.");
662         return false;
663     }
664 
665     if (!ConvertJsonToSupportedDuplexMode(capsJson, printerCapability)) {
666         PRINT_HILOGW("convert json to supportedDuplexMode failed.");
667         return false;
668     }
669 
670     if (!ConvertJsonToSupportedMediaType(capsJson, printerCapability)) {
671         PRINT_HILOGW("convert json to supportedMediaType failed.");
672         return false;
673     }
674 
675     if (!ConvertJsonToSupportedQuality(capsJson, printerCapability)) {
676         PRINT_HILOGW("convert json to supportedQuality failed.");
677         return false;
678     }
679 
680     if (!ConvertJsonToSupportedOrientation(capsJson, printerCapability)) {
681         PRINT_HILOGW("convert json to supportedOrientation failed.");
682         return false;
683     }
684 
685     if (PrintJsonUtil::IsMember(capsJson, "options") && capsJson["options"].isObject()) {
686         PRINT_HILOGD("find options");
687         printerCapability.SetOption(PrintJsonUtil::WriteString(capsJson["options"]));
688     }
689     return true;
690 }
691 
ConvertJsonToPageSize(Json::Value & capsJson,PrinterCapability & printerCapability)692 bool PrintSystemData::ConvertJsonToPageSize(Json::Value &capsJson, PrinterCapability &printerCapability)
693 {
694     return ProcessJsonToCapabilityList<PrintPageSize>(
695         capsJson, "pageSize", printerCapability, &PrinterCapability::SetSupportedPageSize,
696         [](const Json::Value &item, PrintPageSize &pageSize) -> bool {
697             if (!item.isObject() ||
698                 !PrintJsonUtil::IsMember(item, "id") ||!PrintUtils::CheckJsonType<std::string>(item["id"]) ||
699                 !PrintJsonUtil::IsMember(item, "name") ||!PrintUtils::CheckJsonType<std::string>(item["name"]) ||
700                 !PrintJsonUtil::IsMember(item, "width") ||!PrintUtils::CheckJsonType<uint32_t>(item["width"]) ||
701                 !PrintJsonUtil::IsMember(item, "height") ||!PrintUtils::CheckJsonType<uint32_t>(item["height"])) {
702                 return false;
703             }
704             pageSize.SetId(item["id"].asString());
705             pageSize.SetName(item["name"].asString());
706             pageSize.SetWidth(item["width"].asInt());
707             pageSize.SetHeight(item["height"].asInt());
708             return true;
709         }
710     );
711 }
712 
ConvertJsonToPrintResolution(Json::Value & capsJson,PrinterCapability & printerCapability)713 bool PrintSystemData::ConvertJsonToPrintResolution(Json::Value &capsJson, PrinterCapability &printerCapability)
714 {
715     return ProcessJsonToCapabilityList<PrintResolution>(capsJson, "resolution", printerCapability,
716         &PrinterCapability::SetResolution,
717         [](const Json::Value &item, PrintResolution &resolution) -> bool {
718             if (!item.isObject() ||
719                 !PrintJsonUtil::IsMember(item, "id") || !PrintUtils::CheckJsonType<std::string>(item["id"]) ||
720                 !PrintJsonUtil::IsMember(item, "horizontalDpi") ||
721                 !PrintUtils::CheckJsonType<uint32_t>(item["horizontalDpi"]) ||
722                 !PrintJsonUtil::IsMember(item, "verticalDpi") ||
723                 !PrintUtils::CheckJsonType<uint32_t>(item["verticalDpi"])) {
724                 return false;
725             }
726             resolution.SetId(item["id"].asString());
727             resolution.SetHorizontalDpi(item["horizontalDpi"].asInt());
728             resolution.SetVerticalDpi(item["verticalDpi"].asInt());
729             return true;
730         }
731     );
732 }
733 
ConvertJsonToSupportedColorMode(Json::Value & capsJson,PrinterCapability & printerCapability)734 bool PrintSystemData::ConvertJsonToSupportedColorMode(Json::Value &capsJson, PrinterCapability &printerCapability)
735 {
736     return ProcessJsonToCapabilityList<uint32_t>(capsJson, "supportedColorMode", printerCapability,
737         &PrinterCapability::SetSupportedColorMode,
738         [](const Json::Value &item, uint32_t &colorMode) -> bool {
739             colorMode = item.asInt();
740             return true;
741         });
742 }
743 
ConvertJsonToSupportedDuplexMode(Json::Value & capsJson,PrinterCapability & printerCapability)744 bool PrintSystemData::ConvertJsonToSupportedDuplexMode(Json::Value &capsJson, PrinterCapability &printerCapability)
745 {
746     return ProcessJsonToCapabilityList<uint32_t>(capsJson, "supportedDuplexMode", printerCapability,
747         &PrinterCapability::SetSupportedDuplexMode,
748         [](const Json::Value &item, uint32_t &duplexMode) -> bool {
749             duplexMode = item.asInt();
750             return true;
751         });
752 }
753 
ConvertJsonToSupportedMediaType(Json::Value & capsJson,PrinterCapability & printerCapability)754 bool PrintSystemData::ConvertJsonToSupportedMediaType(Json::Value &capsJson, PrinterCapability &printerCapability)
755 {
756     return ProcessJsonToCapabilityList<std::string>(capsJson, "supportedMediaType", printerCapability,
757         &PrinterCapability::SetSupportedMediaType,
758         [](const Json::Value &item, std::string &mediaType) -> bool {
759             mediaType = item.asString();
760             return true;
761         });
762 }
763 
ConvertJsonToSupportedQuality(Json::Value & capsJson,PrinterCapability & printerCapability)764 bool PrintSystemData::ConvertJsonToSupportedQuality(Json::Value &capsJson, PrinterCapability &printerCapability)
765 {
766     return ProcessJsonToCapabilityList<uint32_t>(capsJson, "supportedQuality", printerCapability,
767         &PrinterCapability::SetSupportedQuality,
768         [](const Json::Value &item, uint32_t &quality) -> bool {
769             quality = item.asInt();
770             return true;
771         });
772 }
773 
ConvertJsonToSupportedOrientation(Json::Value & capsJson,PrinterCapability & printerCapability)774 bool PrintSystemData::ConvertJsonToSupportedOrientation(Json::Value &capsJson, PrinterCapability &printerCapability)
775 {
776     return ProcessJsonToCapabilityList<uint32_t>(capsJson, "supportedOrientation", printerCapability,
777         &PrinterCapability::SetSupportedOrientation,
778         [](const Json::Value &item, uint32_t &orientation) -> bool {
779             orientation = item.asInt();
780             return true;
781         });
782 }
783 
ConvertJsonToPrintMargin(Json::Value & capsJson,PrinterCapability & printerCapability)784 bool PrintSystemData::ConvertJsonToPrintMargin(Json::Value &capsJson, PrinterCapability &printerCapability)
785 {
786     Json::Value marginJson = capsJson["minMargin"];
787     PrintMargin minMargin;
788     if (!marginJson.isObject() ||
789         !PrintJsonUtil::IsMember(marginJson, "top") || !PrintUtils::CheckJsonType<uint32_t>(marginJson["top"]) ||
790         !PrintJsonUtil::IsMember(marginJson, "bottom") || !PrintUtils::CheckJsonType<uint32_t>(marginJson["bottom"]) ||
791         !PrintJsonUtil::IsMember(marginJson, "left") || !PrintUtils::CheckJsonType<uint32_t>(marginJson["left"]) ||
792         !PrintJsonUtil::IsMember(marginJson, "right") || !PrintUtils::CheckJsonType<uint32_t>(marginJson["right"])) {
793         PRINT_HILOGE("Invalid format,key is minMargin");
794         return false;
795     }
796     minMargin.SetTop(marginJson["top"].asInt());
797     minMargin.SetBottom(marginJson["bottom"].asInt());
798     minMargin.SetLeft(marginJson["left"].asInt());
799     minMargin.SetRight(marginJson["right"].asInt());
800     printerCapability.SetMinMargin(minMargin);
801     PRINT_HILOGD("ProcessJsonToCapabilityList success, key is minMargin");
802     return true;
803 }
804 
GetPrinterCapabilityFromSystemData(CupsPrinterInfo & cupsPrinter,std::string printerId,PrinterCapability & printerCapability)805 bool PrintSystemData::GetPrinterCapabilityFromSystemData(CupsPrinterInfo &cupsPrinter,
806     std::string printerId, PrinterCapability &printerCapability)
807 {
808     PrinterCapability cupsPrinterCaps = cupsPrinter.printerCapability;
809     std::vector<PrintPageSize> pageSizeList;
810     cupsPrinterCaps.GetPageSize(pageSizeList);
811     if (!pageSizeList.empty()) {
812         PRINT_HILOGI("find printer capability in system data");
813         printerCapability = cupsPrinterCaps;
814         return true;
815     } else if (GetPrinterCapabilityFromFile(printerId, printerCapability)) {
816         return true;
817     }
818     return false;
819 }
820 
GetPrinterCapabilityFromFile(std::string printerId,PrinterCapability & printerCapability)821 bool PrintSystemData::GetPrinterCapabilityFromFile(std::string printerId, PrinterCapability &printerCapability)
822 {
823     PRINT_HILOGI("GetPrinterCapabilityFromFile printerId: %{private}s", printerId.c_str());
824     Json::Value jsonObject;
825     std::string printerListFilePath = PRINTER_SERVICE_FILE_PATH + "/" + PRINTER_LIST_FILE;
826     if (!GetJsonObjectFromFile(jsonObject, printerListFilePath)) {
827         PRINT_HILOGW("get json from file fail");
828         return false;
829     }
830 
831     if (!GetPrinterCapabilityFromJson(printerId, jsonObject, printerCapability)) {
832         PRINT_HILOGW("get caps from file json fail");
833         return false;
834     }
835     return true;
836 }
837 
GetPrinterCapabilityFromJson(std::string printerId,Json::Value & jsonObject,PrinterCapability & printerCapability)838 bool PrintSystemData::GetPrinterCapabilityFromJson(
839     std::string printerId, Json::Value &jsonObject, PrinterCapability &printerCapability)
840 {
841     if (!PrintJsonUtil::IsMember(jsonObject, "printer_list") || !jsonObject["printer_list"].isArray()) {
842         PRINT_HILOGW("can not find printer_list");
843         return false;
844     }
845     Json::Value printerMapJson = jsonObject["printer_list"];
846     if (printerMapJson.empty()) {
847         PRINT_HILOGW("printer map is empty");
848         return false;
849     }
850     uint32_t jsonSize = jsonObject["printer_list"].size();
851     if (jsonSize > MAX_PRINTER_SIZE) {
852         PRINT_HILOGE("printerlist size is illegal");
853         return false;
854     }
855     for (uint32_t i = 0; i < jsonSize; i++) {
856         Json::Value object = jsonObject["printer_list"][i];
857         if (!CheckPrinterInfoJson(object, printerId)) {
858             continue;
859         }
860         if (!PrintJsonUtil::IsMember(object, "capability")) {
861             PRINT_HILOGE("json does not contain the key as capability");
862             continue;
863         }
864         Json::Value capsJson = object["capability"];
865         PrinterCapability caps;
866         if (!ConvertJsonToPrinterCapability(capsJson, caps)) {
867             PRINT_HILOGW("convert json to printer capability failed");
868             continue;
869         }
870         std::vector<PrintPageSize> pageSizeList;
871         caps.GetPageSize(pageSizeList);
872         if (pageSizeList.size() != 0) {
873             PRINT_HILOGI("find printer capability in file");
874             caps.Dump();
875             printerCapability = caps;
876             return true;
877         }
878     }
879     return false;
880 }
881 
CheckPrinterInfoJson(Json::Value & object,std::string & printerId)882 bool PrintSystemData::CheckPrinterInfoJson(Json::Value &object, std::string &printerId)
883 {
884     if (!PrintJsonUtil::IsMember(object, "id") || !object["id"].isString()) {
885         PRINT_HILOGW("can not find id");
886         return false;
887     }
888     std::string id = object["id"].asString();
889     if (id != printerId) {
890         return false;
891     }
892     if (!PrintJsonUtil::IsMember(object, "name") || !object["name"].isString()) {
893         PRINT_HILOGW("can not find name");
894         return false;
895     }
896     if (!PrintJsonUtil::IsMember(object, "uri") || !object["uri"].isString()) {
897         PRINT_HILOGW("can not find uri");
898         return false;
899     }
900     if (!PrintJsonUtil::IsMember(object, "maker") || !object["maker"].isString()) {
901         PRINT_HILOGW("can not find maker");
902         return false;
903     }
904     if (!PrintJsonUtil::IsMember(object, "capability") || !object["capability"].isObject()) {
905         PRINT_HILOGW("can not find capability");
906         return false;
907     }
908     return true;
909 }
910 
CheckPrinterBusy(const std::string & printerId)911 bool PrintSystemData::CheckPrinterBusy(const std::string &printerId)
912 {
913     CupsPrinterInfo cupsPrinter;
914     QueryCupsPrinterInfoByPrinterId(printerId, cupsPrinter);
915     if (cupsPrinter.printerStatus == PRINTER_STATUS_BUSY) {
916         PRINT_HILOGI("printer is busy");
917         return true;
918     }
919     return false;
920 }
921 
GetAllPrintUser(std::vector<int32_t> & allPrintUserList)922 bool PrintSystemData::GetAllPrintUser(std::vector<int32_t> &allPrintUserList)
923 {
924     Json::Value jsonObject;
925     std::string userDataFilePath = PRINTER_SERVICE_FILE_PATH + "/" + PRINT_USER_DATA_FILE;
926     if (!GetJsonObjectFromFile(jsonObject, userDataFilePath)) {
927         PRINT_HILOGW("get json from file fail");
928         return false;
929     }
930     return ParseUserListJsonV1(jsonObject, allPrintUserList);
931 }
932 
ParseUserListJsonV1(Json::Value & jsonObject,std::vector<int32_t> & allPrintUserList)933 bool PrintSystemData::ParseUserListJsonV1(Json::Value &jsonObject, std::vector<int32_t> &allPrintUserList)
934 {
935     if (!PrintJsonUtil::IsMember(jsonObject, "print_user_data") || !jsonObject["print_user_data"].isObject()) {
936         PRINT_HILOGE("can not find print_user_data");
937         return false;
938     }
939     Json::Value::Members keys = jsonObject["print_user_data"].getMemberNames();
940     for (auto key = keys.begin(); key != keys.end(); key++) {
941         std::string userIdStr = *key;
942         if (userIdStr.empty()) {
943             continue;
944         }
945         int32_t userId = 0;
946         if (!PrintUtil::ConvertToInt(userIdStr, userId)) {
947             PRINT_HILOGE("userIdStr [%{private}s] can not parse to number.", userIdStr.c_str());
948             return false;
949         }
950         PRINT_HILOGI("ParseUserListJsonV1 userId: %{private}d", userId);
951         allPrintUserList.push_back(userId);
952     }
953     if (!allPrintUserList.size()) {
954         PRINT_HILOGE("allPrintUserList is empty.");
955         return false;
956     }
957     return true;
958 }
959 
QueryAddedPrinterIdList()960 std::vector<std::string> PrintSystemData::QueryAddedPrinterIdList()
961 {
962     return addedPrinterMap_.GetKeyList();
963 }
964 
QueryDiscoveredPrinterInfoById(const std::string & printerId)965 std::shared_ptr<PrinterInfo> PrintSystemData::QueryDiscoveredPrinterInfoById(const std::string &printerId)
966 {
967     std::lock_guard<std::mutex> lock(discoveredListMutex);
968     auto printerIt = discoveredPrinterInfoList_.find(printerId);
969     if (printerIt != discoveredPrinterInfoList_.end()) {
970         return printerIt ->second;
971     }
972     return nullptr;
973 }
QueryDiscoveredPrinterInfoByName(const std::string & printerName)974 std::shared_ptr<PrinterInfo> PrintSystemData::QueryDiscoveredPrinterInfoByName(const std::string &printerName)
975 {
976     std::lock_guard<std::mutex> lock(discoveredListMutex);
977     std::string name = PrintUtil::StandardizePrinterName(printerName);
978     for (auto iter = discoveredPrinterInfoList_.begin(); iter != discoveredPrinterInfoList_.end(); ++iter) {
979         auto printerInfoPtr = iter->second;
980         if (printerInfoPtr == nullptr) {
981             continue;
982         }
983         if (PrintUtil::StandardizePrinterName(printerInfoPtr->GetPrinterName()) != name) {
984             continue;
985         }
986         return printerInfoPtr;
987     }
988     return nullptr;
989 }
990 
AddPrinterToDiscovery(std::shared_ptr<PrinterInfo> printerInfo)991 void PrintSystemData::AddPrinterToDiscovery(std::shared_ptr<PrinterInfo> printerInfo)
992 {
993     std::lock_guard<std::mutex> lock(discoveredListMutex);
994     if (printerInfo != nullptr) {
995         discoveredPrinterInfoList_[printerInfo->GetPrinterId()] = printerInfo;
996     }
997 }
998 
RemovePrinterFromDiscovery(const std::string & printerId)999 void PrintSystemData::RemovePrinterFromDiscovery(const std::string &printerId)
1000 {
1001     std::lock_guard<std::mutex> lock(discoveredListMutex);
1002     discoveredPrinterInfoList_.erase(printerId);
1003 }
1004 
GetDiscoveredPrinterCount()1005 size_t PrintSystemData::GetDiscoveredPrinterCount()
1006 {
1007     std::lock_guard<std::mutex> lock(discoveredListMutex);
1008     return discoveredPrinterInfoList_.size();
1009 }
1010 
ClearDiscoveredPrinterList()1011 void PrintSystemData::ClearDiscoveredPrinterList()
1012 {
1013     std::lock_guard<std::mutex> lock(discoveredListMutex);
1014     discoveredPrinterInfoList_.clear();
1015 }
1016 
GetDiscoveredPrinterInfo()1017 std::map<std::string, std::shared_ptr<PrinterInfo>> PrintSystemData::GetDiscoveredPrinterInfo()
1018 {
1019     std::lock_guard<std::mutex> lock(discoveredListMutex);
1020     return discoveredPrinterInfoList_;
1021 }
1022 
AddIpPrinterToList(std::shared_ptr<PrinterInfo> printerInfo)1023 void PrintSystemData::AddIpPrinterToList(std::shared_ptr<PrinterInfo> printerInfo)
1024 {
1025     std::lock_guard<std::mutex> lock(connectingIpPrinterListMutex);
1026     if (printerInfo != nullptr) {
1027         connectingIpPrinterInfoList_[printerInfo->GetPrinterId()] = printerInfo;
1028     }
1029 }
1030 
RemoveIpPrinterFromList(const std::string & printerId)1031 void PrintSystemData::RemoveIpPrinterFromList(const std::string &printerId)
1032 {
1033     std::lock_guard<std::mutex> lock(connectingIpPrinterListMutex);
1034     connectingIpPrinterInfoList_.erase(printerId);
1035 }
1036 
QueryIpPrinterInfoById(const std::string & printerId)1037 std::shared_ptr<PrinterInfo> PrintSystemData::QueryIpPrinterInfoById(const std::string &printerId)
1038 {
1039     std::lock_guard<std::mutex> lock(connectingIpPrinterListMutex);
1040     auto printerIt = connectingIpPrinterInfoList_.find(printerId);
1041     if (printerIt != connectingIpPrinterInfoList_.end()) {
1042         return printerIt ->second;
1043     }
1044     return nullptr;
1045 }
1046 
BuildEprintPreference(const PrinterCapability & cap,PrinterPreferences & printPreferences)1047 void PrintSystemData::BuildEprintPreference(const PrinterCapability &cap, PrinterPreferences &printPreferences)
1048 {
1049     Json::Value capOpt;
1050     printPreferences.SetDefaultPageSizeId(ParseDefaultPageSizeId(cap, capOpt));
1051     printPreferences.SetDefaultOrientation(ParseDefaultOrientation(cap, capOpt));
1052     printPreferences.SetDefaultDuplexMode(ParseDefaultDuplexMode(cap, capOpt));
1053     printPreferences.SetDefaultPrintQuality(ParseDefaultPrintQuality(cap, capOpt));
1054     printPreferences.SetDefaultMediaType(ParseDefaultMediaType(cap, capOpt));
1055     printPreferences.SetBorderless(false);
1056     printPreferences.Dump();
1057     return;
1058 }
1059 
BuildPrinterPreference(const PrinterCapability & cap,PrinterPreferences & printPreferences)1060 int32_t PrintSystemData::BuildPrinterPreference(const PrinterCapability &cap, PrinterPreferences &printPreferences)
1061 {
1062     PRINT_HILOGI("BuildPrinterPreference enter");
1063     if (!cap.HasOption()) {
1064         PRINT_HILOGE("capability does not have a cupsOptions attribute");
1065         return E_PRINT_INVALID_PRINTER;
1066     }
1067     std::string capOption = cap.GetOption();
1068     PRINT_HILOGI("printer capOption %{public}s", capOption.c_str());
1069     Json::Value capJson;
1070     if (!PrintJsonUtil::Parse(capOption, capJson)) {
1071         PRINT_HILOGW("capOption can not parse to json object");
1072         return E_PRINT_INVALID_PARAMETER;
1073     }
1074     if (!PrintJsonUtil::IsMember(capJson, "cupsOptions")) {
1075         PRINT_HILOGW("The capJson does not have a cupsOptions attribute.");
1076         return E_PRINT_INVALID_PARAMETER;
1077     }
1078     Json::Value capOpt = capJson["cupsOptions"];
1079 
1080     printPreferences.SetDefaultPageSizeId(ParseDefaultPageSizeId(cap, capOpt));
1081     printPreferences.SetDefaultOrientation(ParseDefaultOrientation(cap, capOpt));
1082     printPreferences.SetDefaultDuplexMode(ParseDefaultDuplexMode(cap, capOpt));
1083     printPreferences.SetDefaultPrintQuality(ParseDefaultPrintQuality(cap, capOpt));
1084     printPreferences.SetDefaultMediaType(ParseDefaultMediaType(cap, capOpt));
1085     printPreferences.SetBorderless(false);
1086     printPreferences.Dump();
1087     return E_PRINT_NONE;
1088 }
1089 
ParseDefaultPageSizeId(const PrinterCapability & cap,Json::Value & capOpt)1090 std::string PrintSystemData::ParseDefaultPageSizeId(const PrinterCapability &cap, Json::Value &capOpt)
1091 {
1092     if (PrintJsonUtil::IsMember(capOpt, "defaultPageSizeId") && capOpt["defaultPageSizeId"].isString()) {
1093         return capOpt["defaultPageSizeId"].asString();
1094     }
1095     std::vector<PrintPageSize> supportedPageSize;
1096     cap.GetSupportedPageSize(supportedPageSize);
1097     if (supportedPageSize.size() == 0) {
1098         return "";
1099     }
1100     for (auto pageSize : supportedPageSize) {
1101         if (pageSize.GetId() == DEFAULT_PAGESIZE_ID) {
1102             return DEFAULT_PAGESIZE_ID;
1103         }
1104     }
1105     return supportedPageSize[0].GetId();
1106 }
1107 
ParseDefaultOrientation(const PrinterCapability & cap,Json::Value & capOpt)1108 int32_t PrintSystemData::ParseDefaultOrientation(const PrinterCapability &cap, Json::Value &capOpt)
1109 {
1110     int32_t defaultOrientation = 0;
1111     if (PrintJsonUtil::IsMember(capOpt, "orientation-requested-default") &&
1112         capOpt["orientation-requested-default"].isString()) {
1113         PrintUtil::ConvertToInt(capOpt["orientation-requested-default"].asString(), defaultOrientation);
1114     }
1115     return defaultOrientation;
1116 }
1117 
ParseDefaultDuplexMode(const PrinterCapability & cap,Json::Value & capOpt)1118 int32_t PrintSystemData::ParseDefaultDuplexMode(const PrinterCapability &cap, Json::Value &capOpt)
1119 {
1120     if (PrintJsonUtil::IsMember(capOpt, "sides-default") && capOpt["sides-default"].isString()) {
1121         int32_t defaultDuplexMode = DUPLEX_MODE_NONE;
1122         PrintUtil::ConvertToInt(capOpt["sides-default"].asString(), defaultDuplexMode);
1123         return defaultDuplexMode;
1124     }
1125     std::vector<uint32_t> supportedDuplexModeList;
1126     cap.GetSupportedDuplexMode(supportedDuplexModeList);
1127     if (supportedDuplexModeList.size() == 0) {
1128         return 0;
1129     }
1130     for (auto duplexMode : supportedDuplexModeList) {
1131         if (duplexMode == DUPLEX_MODE_NONE) {
1132             return DUPLEX_MODE_NONE;
1133         }
1134     }
1135     return supportedDuplexModeList[0];
1136 }
1137 
ParseDefaultPrintQuality(const PrinterCapability & cap,Json::Value & capOpt)1138 int32_t PrintSystemData::ParseDefaultPrintQuality(const PrinterCapability &cap, Json::Value &capOpt)
1139 {
1140     if (PrintJsonUtil::IsMember(capOpt, "print-quality-default") && capOpt["print-quality-default"].isString()) {
1141         int32_t defaultPrintQuality = PRINT_QUALITY_NORMAL;
1142         PrintUtil::ConvertToInt(capOpt["print-quality-default"].asString(), defaultPrintQuality);
1143         return defaultPrintQuality;
1144     }
1145     std::vector<uint32_t> supportedQualityList;
1146     cap.GetSupportedQuality(supportedQualityList);
1147     if (supportedQualityList.size() == 0) {
1148         return 0;
1149     }
1150     for (auto quality : supportedQualityList) {
1151         if (quality == PRINT_QUALITY_NORMAL) {
1152             return PRINT_QUALITY_NORMAL;
1153         }
1154     }
1155     return supportedQualityList[0];
1156 }
1157 
ParseDefaultMediaType(const PrinterCapability & cap,Json::Value & capOpt)1158 std::string PrintSystemData::ParseDefaultMediaType(const PrinterCapability &cap, Json::Value &capOpt)
1159 {
1160     if (PrintJsonUtil::IsMember(capOpt, "media-type-default") && capOpt["media-type-default"].isString()) {
1161         return capOpt["media-type-default"].asString();
1162     }
1163     std::vector<std::string> supportedMediaTypeList;
1164     cap.GetSupportedMediaType(supportedMediaTypeList);
1165     if (supportedMediaTypeList.size() == 0) {
1166         return "";
1167     }
1168     for (auto mediaType : supportedMediaTypeList) {
1169         if (mediaType == DEFAULT_MEDIA_TYPE) {
1170             return DEFAULT_MEDIA_TYPE;
1171         }
1172     }
1173     return supportedMediaTypeList[0];
1174 }
1175 }  // namespace Print
1176 }  // namespace OHOS