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_DEFAULT_COLORMODE = "defaultColorMode";
28 static constexpr const char *PARAM_PREFERENCES_BORDERLESS = "borderless";
29 static constexpr const char *PARAM_PREFERENCES_COLLATE = "defaultCollate";
30 static constexpr const char *PARAM_PREFERENCES_REVERSE = "defaultReverse";
31 static constexpr const char *PARAM_PREFERENCES_OPTION = "options";
32
MakeJsObject(napi_env env,const PrinterPreferences & preferences)33 napi_value PrinterPreferencesHelper::MakeJsObject(napi_env env, const PrinterPreferences &preferences)
34 {
35 napi_value jsObj = nullptr;
36 PRINT_CALL(env, napi_create_object(env, &jsObj));
37 if (preferences.HasDefaultDuplexMode()) {
38 NapiPrintUtils::SetUint32Property(
39 env, jsObj, PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE, preferences.GetDefaultDuplexMode());
40 }
41
42 if (preferences.HasDefaultPrintQuality()) {
43 NapiPrintUtils::SetUint32Property(
44 env, jsObj, PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY, preferences.GetDefaultPrintQuality());
45 }
46
47 if (preferences.HasDefaultMediaType()) {
48 NapiPrintUtils::SetStringPropertyUtf8(
49 env, jsObj, PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE, preferences.GetDefaultMediaType());
50 }
51
52 if (preferences.HasDefaultPageSizeId()) {
53 NapiPrintUtils::SetStringPropertyUtf8(
54 env, jsObj, PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID, preferences.GetDefaultPageSizeId());
55 }
56
57 if (preferences.HasDefaultOrientation()) {
58 NapiPrintUtils::SetUint32Property(
59 env, jsObj, PARAM_PREFERENCES_DEFAULT_ORIENTATION, preferences.GetDefaultOrientation());
60 }
61
62 if (preferences.HasDefaultColorMode()) {
63 NapiPrintUtils::SetUint32Property(
64 env, jsObj, PARAM_PREFERENCES_DEFAULT_COLORMODE, preferences.GetDefaultColorMode());
65 }
66
67 if (preferences.HasBorderless()) {
68 NapiPrintUtils::SetBooleanProperty(env, jsObj, PARAM_PREFERENCES_BORDERLESS, preferences.GetBorderless());
69 }
70
71 if (preferences.HasDefaultCollate()) {
72 NapiPrintUtils::SetBooleanProperty(env, jsObj, PARAM_PREFERENCES_COLLATE, preferences.GetDefaultCollate());
73 }
74
75 if (preferences.HasDefaultReverse()) {
76 NapiPrintUtils::SetBooleanProperty(env, jsObj, PARAM_PREFERENCES_REVERSE, preferences.GetDefaultReverse());
77 }
78
79 if (preferences.HasOption()) {
80 NapiPrintUtils::SetStringPropertyUtf8(env, jsObj, PARAM_PREFERENCES_OPTION, preferences.GetOption());
81 }
82
83 return jsObj;
84 }
85
BuildFromBoolOptionJs(napi_env env,napi_value jsValue,std::shared_ptr<PrinterPreferences> nativeObj)86 void PrinterPreferencesHelper::BuildFromBoolOptionJs(napi_env env, napi_value jsValue,
87 std::shared_ptr<PrinterPreferences> nativeObj)
88 {
89 auto jsBorderless = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_BORDERLESS);
90 if (jsBorderless != nullptr) {
91 nativeObj->SetBorderless(NapiPrintUtils::GetBooleanProperty(env, jsValue, PARAM_PREFERENCES_BORDERLESS));
92 }
93
94 auto jsCollate = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_COLLATE);
95 if (jsCollate != nullptr) {
96 nativeObj->SetDefaultCollate(NapiPrintUtils::GetBooleanProperty(env, jsValue, PARAM_PREFERENCES_COLLATE));
97 }
98
99 auto jsReverse = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_REVERSE);
100 if (jsReverse != nullptr) {
101 nativeObj->SetDefaultReverse(NapiPrintUtils::GetBooleanProperty(env, jsValue, PARAM_PREFERENCES_REVERSE));
102 }
103 }
104
BuildFromJs(napi_env env,napi_value jsValue)105 std::shared_ptr<PrinterPreferences> PrinterPreferencesHelper::BuildFromJs(napi_env env, napi_value jsValue)
106 {
107 auto nativeObj = std::make_shared<PrinterPreferences>();
108
109 if (!ValidateProperty(env, jsValue)) {
110 PRINT_HILOGE("Invalid property of printer preferences");
111 return nullptr;
112 }
113
114 auto jsDefaultDuplexMode = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE);
115 if (jsDefaultDuplexMode != nullptr) {
116 nativeObj->SetDefaultDuplexMode(
117 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE));
118 }
119
120 auto jsDefaultPrintQuality =
121 NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY);
122 if (jsDefaultPrintQuality != nullptr) {
123 nativeObj->SetDefaultPrintQuality(
124 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY));
125 }
126
127 auto jsDefaultMediaType = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE);
128 if (jsDefaultMediaType != nullptr) {
129 nativeObj->SetDefaultMediaType(
130 NapiPrintUtils::GetStringPropertyUtf8(env, jsValue, PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE));
131 }
132
133 auto jsDefaultPageSizeId = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID);
134 if (jsDefaultPageSizeId != nullptr) {
135 nativeObj->SetDefaultPageSizeId(
136 NapiPrintUtils::GetStringPropertyUtf8(env, jsValue, PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID));
137 }
138
139 auto jsDefaultOrientation = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_ORIENTATION);
140 if (jsDefaultOrientation != nullptr) {
141 nativeObj->SetDefaultOrientation(
142 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_ORIENTATION));
143 }
144
145 auto jsDefaultColorMode = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_DEFAULT_COLORMODE);
146 if (jsDefaultColorMode != nullptr) {
147 nativeObj->SetDefaultColorMode(
148 NapiPrintUtils::GetUint32Property(env, jsValue, PARAM_PREFERENCES_DEFAULT_COLORMODE));
149 }
150 auto jsOption = NapiPrintUtils::GetNamedProperty(env, jsValue, PARAM_PREFERENCES_OPTION);
151 if (jsOption != nullptr) {
152 nativeObj->SetOption(NapiPrintUtils::GetStringPropertyUtf8(env, jsValue, PARAM_PREFERENCES_OPTION));
153 }
154
155 BuildFromBoolOptionJs(env, jsValue, nativeObj);
156 return nativeObj;
157 }
158
ValidateProperty(napi_env env,napi_value object)159 bool PrinterPreferencesHelper::ValidateProperty(napi_env env, napi_value object)
160 {
161 std::map<std::string, PrintParamStatus> propertyList = {
162 {PARAM_PREFERENCES_DEFAULT_DEPLEX_MODE, PRINT_PARAM_OPT},
163 {PARAM_PREFERENCES_DEFAULT_PRINT_QUALITY, PRINT_PARAM_OPT},
164 {PARAM_PREFERENCES_DEFAULT_MEDIA_TYPE, PRINT_PARAM_OPT},
165 {PARAM_PREFERENCES_DEFAULT_PAFESIZE_ID, PRINT_PARAM_OPT},
166 {PARAM_PREFERENCES_DEFAULT_ORIENTATION, PRINT_PARAM_OPT},
167 {PARAM_PREFERENCES_DEFAULT_COLORMODE, PRINT_PARAM_OPT},
168 {PARAM_PREFERENCES_BORDERLESS, PRINT_PARAM_OPT},
169 {PARAM_PREFERENCES_COLLATE, PRINT_PARAM_OPT},
170 {PARAM_PREFERENCES_REVERSE, PRINT_PARAM_OPT},
171 {PARAM_PREFERENCES_OPTION, PRINT_PARAM_OPT},
172 };
173
174 auto names = NapiPrintUtils::GetPropertyNames(env, object);
175 return NapiPrintUtils::VerifyProperty(names, propertyList);
176 }
177 } // namespace OHOS::Print
178