• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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