1 /*
2 * Copyright (c) 2025 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 "printer_preferences_helper.h"
17 #include "napi_print_utils.h"
18 #include "print_constant.h"
19 #include "print_log.h"
20
21 namespace OHOS::Print {
22 static constexpr const char *PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE = "defaultDuplexMode";
23 static constexpr const char *PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY = "defaultPrintQuality";
24 static constexpr const char *PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE = "defaultMediaType";
25 static constexpr const char *PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID = "defaultPageSizeId";
26 static constexpr const char *PARAM_PREFERENCES_DEFAULT_ORIENTATION = "defaultOrientation";
27 static constexpr const char *PARAM_PREFERENCES_BORDERLESS = "borderless";
28 static constexpr const char *PARAM_PREFERENCES_OPTION = "options";
29
MakeJsObject(napi_env env,const PrinterPreferences & preferences)30 napi_value PrinterPreferencesHelper::MakeJsObject(napi_env env, const PrinterPreferences &preferences)
31 {
32 napi_value jsObj = nullptr;
33 PRINT_CALL(env, napi_create_object(env, &jsObj));
34 if (preferences.HasDefaultDuplexMode()) {
35 NapiPrintUtils::SetUint32Property(
36 env, jsObj, PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE, preferences.GetDefaultDuplexMode());
37 }
38
39 if (preferences.HasDefaultPrintQuality()) {
40 NapiPrintUtils::SetUint32Property(
41 env, jsObj, PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY, preferences.GetDefaultPrintQuality());
42 }
43
44 if (preferences.HasDefaultMediaType()) {
45 NapiPrintUtils::SetStringPropertyUtf8(
46 env, jsObj, PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE, preferences.GetDefaultMediaType());
47 }
48
49 if (preferences.HasDefaultPageSizeId()) {
50 NapiPrintUtils::SetStringPropertyUtf8(
51 env, jsObj, PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID, preferences.GetDefaultPageSizeId());
52 }
53
54 if (preferences.HasDefaultOrientation()) {
55 NapiPrintUtils::SetUint32Property(
56 env, jsObj, PARAM_PREFERENCES_DEFAULT_ORIENTATION, preferences.GetDefaultOrientation());
57 }
58
59 if (preferences.HasBorderless()) {
60 NapiPrintUtils::SetBooleanProperty(env, jsObj, PARAM_PREFERENCES_BORDERLESS, preferences.GetBorderless());
61 }
62
63 if (preferences.HasOption()) {
64 NapiPrintUtils::SetStringPropertyUtf8(env, jsObj, PARAM_PREFERENCES_OPTION, preferences.GetOption());
65 }
66
67 return jsObj;
68 }
69
BuildFromJs(napi_env env,napi_value jsValue)70 std::shared_ptr<PrinterPreferences> PrinterPreferencesHelper::BuildFromJs(napi_env env, napi_value jsValue)
71 {
72 auto nativeObj = std::make_shared<PrinterPreferences>();
73
74 if (!ValidateProperty(env, jsValue)) {
75 PRINT_HILOGE("Invalid property of printer preferences");
76 return nullptr;
77 }
78
79 auto jsDefaultDuplexMode = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE);
80 if (jsDefaultDuplexMode != nullptr) {
81 nativeObj->SetDefaultDuplexMode(
82 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE));
83 }
84
85 auto jsDefaultPrintQuality =
86 NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY);
87 if (jsDefaultPrintQuality != nullptr) {
88 nativeObj->SetDefaultPrintQuality(
89 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY));
90 }
91
92 auto jsDefaultMediaType = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE);
93 if (jsDefaultMediaType != nullptr) {
94 nativeObj->SetDefaultMediaType(
95 NapiPrintUtils::GetStringPropertyUtf8(env, jsValue, PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE));
96 }
97
98 auto jsDefaultPageSizeId = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID);
99 if (jsDefaultPageSizeId != nullptr) {
100 nativeObj->SetDefaultPageSizeId(
101 NapiPrintUtils::GetStringPropertyUtf8(env, jsValue, PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID));
102 }
103
104 auto jsDefaultOrientation = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_ORIENTATION);
105 if (jsDefaultOrientation != nullptr) {
106 nativeObj->SetDefaultOrientation(
107 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_ORIENTATION));
108 }
109
110 auto jsBorderless = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_BORDERLESS);
111 if (jsBorderless != nullptr) {
112 nativeObj->SetBorderless(NapiPrintUtils::GetBooleanProperty(env, jsValue, PARAM_PREFERENCES_BORDERLESS));
113 }
114
115 auto jsOption = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_OPTION);
116 if (jsOption != nullptr) {
117 nativeObj->SetOption(NapiPrintUtils::GetStringPropertyUtf8(env, jsValue, PARAM_PREFERENCES_OPTION));
118 }
119 return nativeObj;
120 }
121
ValidateProperty(napi_env env,napi_value object)122 bool PrinterPreferencesHelper::ValidateProperty(napi_env env, napi_value object)
123 {
124 std::map<std::string, PrintParamStatus> propertyList = {
125 {PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE, PRINT_PARAM_OPT},
126 {PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY, PRINT_PARAM_OPT},
127 {PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE, PRINT_PARAM_OPT},
128 {PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID, PRINT_PARAM_OPT},
129 {PARAM_PREFERENCES_DEFAULT_ORIENTATION, PRINT_PARAM_OPT},
130 {PARAM_PREFERENCES_BORDERLESS, PRINT_PARAM_OPT},
131 {PARAM_PREFERENCES_OPTION, PRINT_PARAM_OPT},
132 };
133
134 auto names = NapiPrintUtils::GetPropertyNames(env, object);
135 return NapiPrintUtils::VerifyProperty(names, propertyList);
136 }
137 } // namespace OHOS::Print
138