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