1 /*
2 * Copyright (c) 2022 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 "napi_inner_print.h"
17
18 #include "napi_print_utils.h"
19 #include "print_callback.h"
20 #include "print_extension_info_helper.h"
21 #include "print_job_helper.h"
22 #include "print_attributes_helper.h"
23 #include "print_log.h"
24 #include "print_manager_client.h"
25 #include "print_task.h"
26 #include "iprint_adapter_inner.h"
27 #include "printer_info_helper.h"
28
29 namespace OHOS::Print {
30 const std::string PRINTER_EVENT_TYPE = "printerStateChange";
31 const std::string PRINTJOB_EVENT_TYPE = "jobStateChange";
32 const std::string EXTINFO_EVENT_TYPE = "extInfoChange";
33
QueryExtensionInfo(napi_env env,napi_callback_info info)34 napi_value NapiInnerPrint::QueryExtensionInfo(napi_env env, napi_callback_info info)
35 {
36 PRINT_HILOGD("Enter ---->");
37 auto context = std::make_shared<InnerPrintContext>();
38 auto input =
39 [context](
40 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
41 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
42 return napi_ok;
43 };
44 auto output = [context](napi_env env, napi_value *result) -> napi_status {
45 PRINT_HILOGD("ouput enter---->");
46 napi_status status = napi_create_array(env, result);
47 uint32_t index = 0;
48 for (auto extInfo : context->allExtensionInfos) {
49 PRINT_HILOGD("ExtensionId = %{public}s", extInfo.GetExtensionId().c_str());
50 PRINT_HILOGD("VendorId = %{public}s", extInfo.GetVendorId().c_str());
51 PRINT_HILOGD("VendorName = %{public}s", extInfo.GetVendorName().c_str());
52 PRINT_HILOGD("VendorIcon = %{public}d", extInfo.GetVendorIcon());
53 PRINT_HILOGD("Version = %{public}s", extInfo.GetVersion().c_str());
54 status = napi_set_element(env, *result, index++, PrintExtensionInfoHelper::MakeJsObject(env, extInfo));
55 }
56 return napi_ok;
57 };
58 auto exec = [context](PrintAsyncCall::Context *ctx) {
59 int32_t ret = PrintManagerClient::GetInstance()->QueryAllExtension(context->allExtensionInfos);
60 context->result = ret == E_PRINT_NONE;
61 if (ret != E_PRINT_NONE) {
62 PRINT_HILOGE("Failed to query all ext info");
63 context->SetErrorIndex(ret);
64 }
65 };
66 context->SetAction(std::move(input), std::move(output));
67 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
68 return asyncCall.Call(env, exec);
69 }
70
StartDiscovery(napi_env env,napi_callback_info info)71 napi_value NapiInnerPrint::StartDiscovery(napi_env env, napi_callback_info info)
72 {
73 PRINT_HILOGD("Enter StartDiscovery---->");
74 auto context = std::make_shared<InnerPrintContext>();
75 auto input =
76 [context](
77 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
78 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
79 bool isArray = false;
80 napi_is_array(env, argv[NapiPrintUtils::INDEX_ZERO], &isArray);
81 PRINT_ASSERT_BASE(env, isArray, " is not array!", napi_array_expected);
82
83 uint32_t len = 0;
84 napi_get_array_length(env, argv[0], &len);
85
86 for (uint32_t index = 0; index < len; index++) {
87 napi_value value;
88 napi_get_element(env, argv[NapiPrintUtils::INDEX_ZERO], index, &value);
89 std::string extensionId = NapiPrintUtils::GetStringFromValueUtf8(env, value);
90 PRINT_HILOGD("output for :---- extensionList value is :[%{public}s]", extensionId.c_str());
91 if (extensionId != "") {
92 context->extensionList.emplace_back(extensionId);
93 }
94 }
95 return napi_ok;
96 };
97 auto output = [context](napi_env env, napi_value *result) -> napi_status {
98 napi_status status = napi_get_boolean(env, context->result, result);
99 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
100 return status;
101 };
102 auto exec = [context](PrintAsyncCall::Context *ctx) {
103 int32_t ret = PrintManagerClient::GetInstance()->StartDiscoverPrinter(context->extensionList);
104 context->result = ret == E_PRINT_NONE;
105 if (ret != E_PRINT_NONE) {
106 PRINT_HILOGE("Failed to start discover printer");
107 context->SetErrorIndex(ret);
108 }
109 };
110 context->SetAction(std::move(input), std::move(output));
111 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
112 return asyncCall.Call(env, exec);
113 }
114
StopDiscovery(napi_env env,napi_callback_info info)115 napi_value NapiInnerPrint::StopDiscovery(napi_env env, napi_callback_info info)
116 {
117 PRINT_HILOGD("Enter StopDiscovery---->");
118 auto context = std::make_shared<InnerPrintContext>();
119 auto input =
120 [context](
121 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
122 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
123 return napi_ok;
124 };
125 auto output = [context](napi_env env, napi_value *result) -> napi_status {
126 napi_status status = napi_get_boolean(env, context->result, result);
127 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
128 return status;
129 };
130 auto exec = [context](PrintAsyncCall::Context *ctx) {
131 int32_t ret = PrintManagerClient::GetInstance()->StopDiscoverPrinter();
132 context->result = ret == E_PRINT_NONE;
133 if (ret != E_PRINT_NONE) {
134 PRINT_HILOGE("Failed to stop discover printer");
135 context->SetErrorIndex(ret);
136 }
137 };
138 context->SetAction(std::move(input), std::move(output));
139 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
140 return asyncCall.Call(env, exec);
141 }
142
ConnectPrinter(napi_env env,napi_callback_info info)143 napi_value NapiInnerPrint::ConnectPrinter(napi_env env, napi_callback_info info)
144 {
145 PRINT_HILOGD("Enter ConnectPrinter---->");
146 auto context = std::make_shared<InnerPrintContext>();
147 auto input =
148 [context](
149 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
150 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
151 napi_valuetype valuetype;
152 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
153 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId is not a string", napi_string_expected);
154 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
155 PRINT_HILOGD("printerId : %{private}s", printerId.c_str());
156 context->printerId = printerId;
157 return napi_ok;
158 };
159 auto output = [context](napi_env env, napi_value *result) -> napi_status {
160 napi_status status = napi_get_boolean(env, context->result, result);
161 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
162 return status;
163 };
164 auto exec = [context](PrintAsyncCall::Context *ctx) {
165 int32_t ret = PrintManagerClient::GetInstance()->ConnectPrinter(context->printerId);
166 context->result = ret == E_PRINT_NONE;
167 if (ret != E_PRINT_NONE) {
168 PRINT_HILOGE("Failed to connect the printer");
169 context->SetErrorIndex(ret);
170 }
171 };
172 context->SetAction(std::move(input), std::move(output));
173 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
174 return asyncCall.Call(env, exec);
175 }
176
DisconnectPrinter(napi_env env,napi_callback_info info)177 napi_value NapiInnerPrint::DisconnectPrinter(napi_env env, napi_callback_info info)
178 {
179 PRINT_HILOGD("Enter DisconnectPrinter---->");
180 auto context = std::make_shared<InnerPrintContext>();
181 auto input =
182 [context](
183 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
184 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
185 napi_valuetype valuetype;
186 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
187 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId is not a string", napi_string_expected);
188 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
189 PRINT_HILOGD("printerId : %{private}s", printerId.c_str());
190 context->printerId = printerId;
191 return napi_ok;
192 };
193 auto output = [context](napi_env env, napi_value *result) -> napi_status {
194 napi_status status = napi_get_boolean(env, context->result, result);
195 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
196 return status;
197 };
198 auto exec = [context](PrintAsyncCall::Context *ctx) {
199 int32_t ret = PrintManagerClient::GetInstance()->DisconnectPrinter(context->printerId);
200 context->result = ret == E_PRINT_NONE;
201 if (ret != E_PRINT_NONE) {
202 PRINT_HILOGE("Failed to connect the printer");
203 context->SetErrorIndex(ret);
204 }
205 };
206 context->SetAction(std::move(input), std::move(output));
207 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
208 return asyncCall.Call(env, exec);
209 }
210
StartPrintJob(napi_env env,napi_callback_info info)211 napi_value NapiInnerPrint::StartPrintJob(napi_env env, napi_callback_info info)
212 {
213 PRINT_HILOGD("Enter StartPrintJob---->");
214 auto context = std::make_shared<InnerPrintContext>();
215 auto input =
216 [context](
217 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
218 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
219 auto printJobPtr = PrintJobHelper::BuildFromJs(env, argv[NapiPrintUtils::INDEX_ZERO]);
220 if (printJobPtr == nullptr) {
221 PRINT_HILOGE("ParseJob type error!");
222 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
223 return napi_invalid_arg;
224 }
225 context->printJob = *printJobPtr;
226 return napi_ok;
227 };
228 auto output = [context](napi_env env, napi_value *result) -> napi_status {
229 napi_status status = napi_get_boolean(env, context->result, result);
230 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
231 return status;
232 };
233 auto exec = [context](PrintAsyncCall::Context *ctx) {
234 context->printJob.Dump();
235 int32_t ret = PrintManagerClient::GetInstance()->StartPrintJob(context->printJob);
236 context->result = ret == E_PRINT_NONE;
237 if (ret != E_PRINT_NONE) {
238 PRINT_HILOGE("Failed to start print job");
239 context->SetErrorIndex(ret);
240 }
241 };
242 context->SetAction(std::move(input), std::move(output));
243 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
244 return asyncCall.Call(env, exec);
245 }
246
CancelPrintJob(napi_env env,napi_callback_info info)247 napi_value NapiInnerPrint::CancelPrintJob(napi_env env, napi_callback_info info)
248 {
249 PRINT_HILOGD("Enter CancelPrintJob---->");
250 auto context = std::make_shared<InnerPrintContext>();
251 auto input =
252 [context](
253 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
254 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
255 napi_valuetype valuetype;
256 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
257 PRINT_ASSERT_BASE(env, valuetype == napi_string, "jobId is not a string", napi_string_expected);
258 std::string jobId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
259 if (jobId == "") {
260 PRINT_HILOGE("Parse JobId error!");
261 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
262 return napi_invalid_arg;
263 }
264 context->jobId = jobId;
265 return napi_ok;
266 };
267 auto output = [context](napi_env env, napi_value *result) -> napi_status {
268 napi_status status = napi_get_boolean(env, context->result, result);
269 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
270 return status;
271 };
272 auto exec = [context](PrintAsyncCall::Context *ctx) {
273 context->printJob.Dump();
274 int32_t ret = PrintManagerClient::GetInstance()->CancelPrintJob(context->jobId);
275 context->result = ret == E_PRINT_NONE;
276 if (ret != E_PRINT_NONE) {
277 PRINT_HILOGE("Failed to start print job");
278 context->SetErrorIndex(ret);
279 }
280 };
281 context->SetAction(std::move(input), std::move(output));
282 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
283 return asyncCall.Call(env, exec);
284 }
285
RequestPreview(napi_env env,napi_callback_info info)286 napi_value NapiInnerPrint::RequestPreview(napi_env env, napi_callback_info info)
287 {
288 PRINT_HILOGD("Enter ---->");
289 auto context = std::make_shared<InnerPrintContext>();
290 auto input =
291 [context](
292 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
293 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
294 auto printJobPtr = PrintJobHelper::BuildFromJs(env, argv[NapiPrintUtils::INDEX_ZERO]);
295 if (printJobPtr == nullptr) {
296 PRINT_HILOGE("ParseJob type error!");
297 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
298 return napi_invalid_arg;
299 }
300 context->printJob = *printJobPtr;
301 return napi_ok;
302 };
303 auto output = [context](napi_env env, napi_value *result) -> napi_status {
304 napi_status status = napi_create_string_utf8(env, context->previewResult.c_str(), NAPI_AUTO_LENGTH, result);
305 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
306 return status;
307 };
308 auto exec = [context](PrintAsyncCall::Context *ctx) {
309 PRINT_HILOGD("exec----");
310 context->printJob.Dump();
311 int32_t ret = PrintManagerClient::GetInstance()->RequestPreview(context->printJob, context->previewResult);
312 context->result = ret == E_PRINT_NONE;
313 if (ret != E_PRINT_NONE) {
314 PRINT_HILOGE("Failed to request preview of print job");
315 context->SetErrorIndex(ret);
316 }
317 };
318 context->SetAction(std::move(input), std::move(output));
319 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
320 return asyncCall.Call(env, exec);
321 }
322
QueryCapability(napi_env env,napi_callback_info info)323 napi_value NapiInnerPrint::QueryCapability(napi_env env, napi_callback_info info)
324 {
325 PRINT_HILOGD("Enter QueryCapability---->");
326 auto context = std::make_shared<InnerPrintContext>();
327 auto input =
328 [context](
329 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
330 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
331 napi_valuetype valuetype;
332 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
333 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId number is not a string", napi_string_expected);
334 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
335 PRINT_HILOGD("printerId : %{private}s", printerId.c_str());
336 context->printerId = printerId;
337 return napi_ok;
338 };
339 auto output = [context](napi_env env, napi_value *result) -> napi_status {
340 napi_status status = napi_get_boolean(env, context->result, result);
341 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
342 return status;
343 };
344 auto exec = [context](PrintAsyncCall::Context *ctx) {
345 int32_t ret = PrintManagerClient::GetInstance()->QueryPrinterCapability(context->printerId);
346 context->result = ret == E_PRINT_NONE;
347 if (ret != E_PRINT_NONE) {
348 PRINT_HILOGE("Failed to query capability of printer");
349 context->SetErrorIndex(ret);
350 }
351 };
352 context->SetAction(std::move(input), std::move(output));
353 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
354 return asyncCall.Call(env, exec);
355 }
356
QueryAllPrintJob(napi_env env,napi_callback_info info)357 napi_value NapiInnerPrint::QueryAllPrintJob(napi_env env, napi_callback_info info)
358 {
359 PRINT_HILOGD("Enter QueryAllPrintJob---->");
360 auto context = std::make_shared<InnerPrintContext>();
361 auto input =
362 [context](
363 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
364 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
365 return napi_ok;
366 };
367 auto output = [context](napi_env env, napi_value *result) -> napi_status {
368 PRINT_HILOGD("ouput enter---->");
369 napi_status status = napi_create_array(env, result);
370 uint32_t index = 0;
371 for (auto printJob : context->allPrintJobs) {
372 PRINT_HILOGD("PrinterId = %{public}s", printJob.GetPrinterId().c_str());
373 PRINT_HILOGD("JobId = %{public}s", printJob.GetJobId().c_str());
374 status = napi_set_element(env, *result, index++, PrintJobHelper::MakeJsObject(env, printJob));
375 }
376 return napi_ok;
377 };
378 auto exec = [context](PrintAsyncCall::Context *ctx) {
379 int32_t ret = PrintManagerClient::GetInstance()->QueryAllPrintJob(context->allPrintJobs);
380 context->result = ret == E_PRINT_NONE;
381 if (ret != E_PRINT_NONE) {
382 PRINT_HILOGE("Failed to query printJobList");
383 context->SetErrorIndex(ret);
384 }
385 };
386 context->SetAction(std::move(input), std::move(output));
387 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
388 return asyncCall.Call(env, exec);
389 }
390
QueryPrintJobById(napi_env env,napi_callback_info info)391 napi_value NapiInnerPrint::QueryPrintJobById(napi_env env, napi_callback_info info)
392 {
393 PRINT_HILOGD("Enter QueryPrintJobById---->");
394 auto context = std::make_shared<InnerPrintContext>();
395 auto input =
396 [context](
397 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
398 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
399 napi_valuetype valuetype;
400 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
401 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId number is not a string", napi_string_expected);
402 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
403 PRINT_HILOGD("printerId : %{private}s", printerId.c_str());
404 context->printerId = printerId;
405 return napi_ok;
406 };
407 auto output = [context](napi_env env, napi_value *result) -> napi_status {
408 PRINT_HILOGD("ouput enter---->");
409 *result = PrintJobHelper::MakeJsObject(env, context->printJob);
410 return napi_ok;
411 };
412 auto exec = [context](PrintAsyncCall::Context *ctx) {
413 int32_t ret = PrintManagerClient::GetInstance()->QueryPrintJobById(context->printerId, context->printJob);
414 context->result = ret == E_PRINT_NONE;
415 if (ret != E_PRINT_NONE) {
416 PRINT_HILOGE("Failed to query printJob from printList");
417 context->SetErrorIndex(ret);
418 }
419 };
420 context->SetAction(std::move(input), std::move(output));
421 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
422 return asyncCall.Call(env, exec);
423 }
424
GetPrinterPreference(napi_env env,napi_callback_info info)425 napi_value NapiInnerPrint::GetPrinterPreference(napi_env env, napi_callback_info info)
426 {
427 PRINT_HILOGI("Enter GetPrinterPreference---->");
428 auto context = std::make_shared<InnerPrintContext>();
429 if (context == nullptr) {
430 PRINT_HILOGE("InnerPrintContext context nullptr");
431 return nullptr;
432 }
433 auto input =
434 [context](
435 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
436 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
437 napi_valuetype valuetype;
438 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
439 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId number is not a string", napi_string_expected);
440 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
441 PRINT_HILOGD("printerId : %{private}s", printerId.c_str());
442 context->printerId = printerId;
443 return napi_ok;
444 };
445
446 auto output = [context](napi_env env, napi_value *result) -> napi_status {
447 napi_status status = napi_create_string_utf8(env, context->printerPreference.c_str(), NAPI_AUTO_LENGTH, result);
448 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
449 return status;
450 };
451 auto exec = [context](PrintAsyncCall::Context *ctx) {
452 PRINT_HILOGD("exec----");
453 int32_t ret = PrintManagerClient::GetInstance()->GetPrinterPreference(context->printerId,
454 context->printerPreference);
455 context->result = ret == E_PRINT_NONE;
456 if (ret != E_PRINT_NONE) {
457 PRINT_HILOGE("Failed to Get PrinterPreference");
458 context->SetErrorIndex(ret);
459 }
460 };
461 context->SetAction(std::move(input), std::move(output));
462 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
463 return asyncCall.Call(env, exec);
464 }
465
SetPrinterPreference(napi_env env,napi_callback_info info)466 napi_value NapiInnerPrint::SetPrinterPreference(napi_env env, napi_callback_info info)
467 {
468 PRINT_HILOGI("Enter SetPrinterPreference---->");
469 auto context = std::make_shared<InnerPrintContext>();
470 if (context == nullptr) {
471 PRINT_HILOGE("InnerPrintContext context nullptr");
472 return nullptr;
473 }
474 auto input =
475 [context](
476 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
477 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
478 napi_valuetype valuetype;
479 PRINT_CALL_BASE(env, napi_typeof(env, argv[0], &valuetype), napi_invalid_arg);
480 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId is not a string", napi_string_expected);
481 PRINT_CALL_BASE(env, napi_typeof(env, argv[1], &valuetype), napi_invalid_arg);
482 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerPreference is not a string", napi_string_expected);
483 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[0]);
484 std::string printerPreference = NapiPrintUtils::GetStringFromValueUtf8(env, argv[1]);
485 if (printerPreference == "") {
486 PRINT_HILOGE("Parse error!");
487 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
488 return napi_invalid_arg;
489 }
490 context->printerId = printerId;
491 context->printerPreference = printerPreference;
492 return napi_ok;
493 };
494 auto output = [context](napi_env env, napi_value *result) -> napi_status {
495 napi_status status = napi_get_boolean(env, context->result, result);
496 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
497 return status;
498 };
499 auto exec = [context](PrintAsyncCall::Context *ctx) {
500 int32_t ret = PrintManagerClient::GetInstance()->SetPrinterPreference(context->printerId,
501 context->printerPreference);
502 context->result = ret == E_PRINT_NONE;
503 if (ret != E_PRINT_NONE) {
504 PRINT_HILOGE("Failed to SetPrinterPreference");
505 context->SetErrorIndex(ret);
506 }
507 };
508 context->SetAction(std::move(input), std::move(output));
509 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
510 return asyncCall.Call(env, exec);
511 }
512
On(napi_env env,napi_callback_info info)513 napi_value NapiInnerPrint::On(napi_env env, napi_callback_info info)
514 {
515 PRINT_HILOGD("Enter ---->");
516 size_t argc = NapiPrintUtils::MAX_ARGC;
517 napi_value argv[NapiPrintUtils::MAX_ARGC] = { nullptr };
518 napi_value thisVal = nullptr;
519 void *data = nullptr;
520 PRINT_CALL(env, napi_get_cb_info(env, info, &argc, argv, &thisVal, &data));
521 PRINT_ASSERT(env, argc == NapiPrintUtils::ARGC_TWO, "need 2 parameter!");
522
523 napi_valuetype valuetype;
524 PRINT_CALL(env, napi_typeof(env, argv[0], &valuetype));
525 PRINT_ASSERT(env, valuetype == napi_string, "type is not a string");
526 std::string type = NapiPrintUtils::GetStringFromValueUtf8(env, argv[0]);
527 PRINT_HILOGD("type : %{public}s", type.c_str());
528
529 if (!NapiInnerPrint::IsSupportType(type)) {
530 PRINT_HILOGE("Event On type : %{public}s not support", type.c_str());
531 return nullptr;
532 }
533
534 valuetype = napi_undefined;
535 napi_typeof(env, argv[1], &valuetype);
536 PRINT_ASSERT(env, valuetype == napi_function, "callback is not a function");
537
538 napi_ref callbackRef = NapiPrintUtils::CreateReference(env, argv[1]);
539 sptr<IPrintCallback> callback = new (std::nothrow) PrintCallback(env, callbackRef);
540 if (callback == nullptr) {
541 PRINT_HILOGE("create print callback object fail");
542 return nullptr;
543 }
544 int32_t ret = PrintManagerClient::GetInstance()->On("", type, callback);
545 if (ret != E_PRINT_NONE) {
546 PRINT_HILOGE("Failed to register event");
547 return nullptr;
548 }
549 return nullptr;
550 }
551
Off(napi_env env,napi_callback_info info)552 napi_value NapiInnerPrint::Off(napi_env env, napi_callback_info info)
553 {
554 PRINT_HILOGD("Enter ---->");
555 auto context = std::make_shared<InnerPrintContext>();
556 auto input =
557 [context](
558 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
559 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
560 napi_valuetype valuetype;
561 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
562 PRINT_ASSERT_BASE(env, valuetype == napi_string, "type is not a string", napi_string_expected);
563 std::string type = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
564 if (!NapiInnerPrint::IsSupportType(type)) {
565 PRINT_HILOGE("Event Off type : %{public}s not support", context->type.c_str());
566 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
567 return napi_invalid_arg;
568 }
569 context->type = type;
570 PRINT_HILOGD("event type : %{public}s", context->type.c_str());
571 return napi_ok;
572 };
573 auto output = [context](napi_env env, napi_value *result) -> napi_status {
574 napi_status status = napi_get_boolean(env, context->result, result);
575 PRINT_HILOGD("context->result = %{public}d", context->result);
576 return status;
577 };
578 auto exec = [context](PrintAsyncCall::Context *ctx) {
579 int32_t ret = PrintManagerClient::GetInstance()->Off("", context->type);
580 context->result = ret == E_PRINT_NONE;
581 if (ret != E_PRINT_NONE) {
582 PRINT_HILOGE("Failed to unregister event");
583 context->SetErrorIndex(ret);
584 }
585 };
586 context->SetAction(std::move(input), std::move(output));
587 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
588 return asyncCall.Call(env, exec);
589 }
590
StartGetPrintFile(napi_env env,napi_callback_info info)591 napi_value NapiInnerPrint::StartGetPrintFile(napi_env env, napi_callback_info info)
592 {
593 PRINT_HILOGI("StartGetPrintFile start ---->");
594 napi_value argv[NapiPrintUtils::MAX_ARGC] = { nullptr };
595 size_t argc = NapiPrintUtils::GetJsVal(env, info, argv, NapiPrintUtils::MAX_ARGC);
596 PRINT_ASSERT(env, argc == NapiPrintUtils::ARGC_FOUR, "StartGetPrintFile need 4 parameter!");
597
598 napi_valuetype valuetype;
599 PRINT_CALL(env, napi_typeof(env, argv[0], &valuetype));
600 PRINT_ASSERT(env, valuetype == napi_string, "type is not a string");
601 std::string jobId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[0]);
602
603 if (static_cast<uint32_t>(argc) > NapiPrintUtils::INDEX_THREE) {
604 napi_ref callbackRef = NapiPrintUtils::CreateReference(env, argv[NapiPrintUtils::INDEX_THREE]);
605 sptr<IPrintCallback> callback = new (std::nothrow) PrintCallback(env, callbackRef);
606 if (callback == nullptr) {
607 PRINT_HILOGE("create startGetPrintFile callback object fail");
608 return nullptr;
609 }
610 int32_t retCallback = PrintManagerClient::GetInstance()->On("", PRINT_GET_FILE_CALLBACK_ADAPTER, callback);
611 if (retCallback != E_PRINT_NONE) {
612 PRINT_HILOGE("Failed to register startGetPrintFile callback");
613 return nullptr;
614 }
615 }
616
617 auto printAttributes = PrintAttributesHelper::BuildFromJs(env, argv[1]);
618 if (static_cast<uint32_t>(argc) > NapiPrintUtils::INDEX_TWO) {
619 uint32_t fd = NapiPrintUtils::GetUint32FromValue(env, argv[NapiPrintUtils::INDEX_TWO]);
620 int32_t ret = PrintManagerClient::GetInstance()->StartGetPrintFile(jobId, *printAttributes, fd);
621 if (ret != E_PRINT_NONE) {
622 PRINT_HILOGE("Failed to StartGetPrintFile");
623 return nullptr;
624 }
625 }
626 return nullptr;
627 }
628
NotifyPrintService(napi_env env,napi_callback_info info)629 napi_value NapiInnerPrint::NotifyPrintService(napi_env env, napi_callback_info info)
630 {
631 PRINT_HILOGI("Enter NotifyPrintService---->");
632 auto context = std::make_shared<InnerPrintContext>();
633 auto input =
634 [context](
635 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
636 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
637 napi_valuetype valuetype;
638 PRINT_CALL_BASE(env, napi_typeof(env, argv[0], &valuetype), napi_invalid_arg);
639 PRINT_ASSERT_BASE(env, valuetype == napi_string, "jobId is not a string", napi_string_expected);
640 PRINT_CALL_BASE(env, napi_typeof(env, argv[1], &valuetype), napi_invalid_arg);
641 PRINT_ASSERT_BASE(env, valuetype == napi_string, "info type is not a string", napi_string_expected);
642 std::string jobId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[0]);
643 std::string type = NapiPrintUtils::GetStringFromValueUtf8(env, argv[1]);
644 if (type == "") {
645 PRINT_HILOGE("Parse type error!");
646 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
647 return napi_invalid_arg;
648 }
649 context->jobId = jobId;
650 context->type = type;
651 return napi_ok;
652 };
653 auto output = [context](napi_env env, napi_value *result) -> napi_status {
654 napi_status status = napi_get_boolean(env, context->result, result);
655 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
656 return status;
657 };
658 auto exec = [context](PrintAsyncCall::Context *ctx) {
659 int32_t ret = PrintManagerClient::GetInstance()->NotifyPrintService(context->jobId, context->type);
660 context->result = ret == E_PRINT_NONE;
661 if (ret != E_PRINT_NONE) {
662 PRINT_HILOGE("Failed to NotifyPrintService");
663 context->SetErrorIndex(ret);
664 }
665 };
666 context->SetAction(std::move(input), std::move(output));
667 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
668 return asyncCall.Call(env, exec);
669 }
670
QueryAddedPrinter(napi_env env,napi_callback_info info)671 napi_value NapiInnerPrint::QueryAddedPrinter(napi_env env, napi_callback_info info)
672 {
673 PRINT_HILOGD("Enter QueryAddedPrinter---->");
674 auto context = std::make_shared<InnerPrintContext>();
675 auto input =
676 [context](
677 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
678 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ZERO, " should 0 parameter!", napi_invalid_arg);
679 return napi_ok;
680 };
681 auto output = [context](napi_env env, napi_value *result) -> napi_status {
682 PRINT_HILOGD("ouput enter---->");
683 napi_status status = napi_create_array(env, result);
684 uint32_t index = 0;
685 for (auto printerId : context->allPrinters) {
686 PRINT_HILOGD("PrinterId = %{public}s", printerId.c_str());
687 status = napi_set_element(env, *result, index++, NapiPrintUtils::CreateStringUtf8(env, printerId));
688 }
689 return napi_ok;
690 };
691 auto exec = [context](PrintAsyncCall::Context *ctx) {
692 int32_t ret = PrintManagerClient::GetInstance()->QueryAddedPrinter(context->allPrinters);
693 context->result = ret == E_PRINT_NONE;
694 if (ret != E_PRINT_NONE) {
695 PRINT_HILOGE("Failed to query printerList");
696 context->SetErrorIndex(ret);
697 }
698 };
699 context->SetAction(std::move(input), std::move(output));
700 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
701 return asyncCall.Call(env, exec);
702 }
703
QueryPrinterInfoByPrinterId(napi_env env,napi_callback_info info)704 napi_value NapiInnerPrint::QueryPrinterInfoByPrinterId(napi_env env, napi_callback_info info)
705 {
706 PRINT_HILOGD("Enter QueryPrinterInfoByPrinterId---->");
707 auto context = std::make_shared<InnerPrintContext>();
708 auto input =
709 [context](
710 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
711 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_ONE, " should 1 parameter!", napi_invalid_arg);
712 napi_valuetype valuetype;
713 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
714 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId number is not a string", napi_string_expected);
715 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
716 PRINT_HILOGD("printerId : %{public}s", printerId.c_str());
717 context->printerId = printerId;
718 return napi_ok;
719 };
720 auto output = [context](napi_env env, napi_value *result) -> napi_status {
721 PRINT_HILOGD("ouput enter---->");
722 *result = PrinterInfoHelper::MakeJsObject(env, context->printerInfo);
723 return napi_ok;
724 };
725 auto exec = [context](PrintAsyncCall::Context *ctx) {
726 int32_t ret =
727 PrintManagerClient::GetInstance()->QueryPrinterInfoByPrinterId(context->printerId, context->printerInfo);
728 context->result = ret == E_PRINT_NONE;
729 if (ret != E_PRINT_NONE) {
730 PRINT_HILOGE("Failed to query printerInfo from printerList");
731 context->SetErrorIndex(ret);
732 }
733 };
734 context->SetAction(std::move(input), std::move(output));
735 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
736 return asyncCall.Call(env, exec);
737 }
738
NotifyPrintServiceEvent(napi_env env,napi_callback_info info)739 napi_value NapiInnerPrint::NotifyPrintServiceEvent(napi_env env, napi_callback_info info)
740 {
741 PRINT_HILOGI("Enter NotifyPrintServiceEvent---->");
742 auto context = std::make_shared<InnerPrintContext>();
743 auto input =
744 [context](
745 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
746 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
747 napi_valuetype valuetype;
748 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
749 PRINT_ASSERT_BASE(env, valuetype == napi_string, "jobId is not a string", napi_string_expected);
750 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
751 PRINT_ASSERT_BASE(env, valuetype == napi_number, "event is not a number", napi_number_expected);
752 std::string jobId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
753 uint32_t event = NapiPrintUtils::GetUint32FromValue(env, argv[NapiPrintUtils::INDEX_ONE]);
754 PRINT_HILOGI("jobId: %{public}s, event : %{public}d", jobId.c_str(), event);
755 if (!IsValidApplicationEvent(event)) {
756 PRINT_HILOGE("invalid event");
757 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
758 return napi_invalid_arg;
759 }
760 context->jobId = jobId;
761 context->applicationEvent = event;
762 return napi_ok;
763 };
764 auto output = [context](napi_env env, napi_value *result) -> napi_status {
765 napi_status status = napi_get_boolean(env, context->result, result);
766 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
767 return status;
768 };
769 auto exec = [context](PrintAsyncCall::Context *ctx) {
770 int32_t ret =
771 PrintManagerClient::GetInstance()->NotifyPrintServiceEvent(context->jobId, context->applicationEvent);
772 context->result = ret == E_PRINT_NONE;
773 if (ret != E_PRINT_NONE) {
774 PRINT_HILOGE("Failed to NotifyPrintServiceEvent");
775 context->SetErrorIndex(ret);
776 }
777 };
778 context->SetAction(std::move(input), std::move(output));
779 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
780 return asyncCall.Call(env, exec);
781 }
782
SetDefaultPrinter(napi_env env,napi_callback_info info)783 napi_value NapiInnerPrint::SetDefaultPrinter(napi_env env, napi_callback_info info)
784 {
785 PRINT_HILOGD("Enter SetDefaultPrinter---->");
786 auto context = std::make_shared<InnerPrintContext>();
787 auto input =
788 [context](
789 napi_env env, size_t argc, napi_value *argv, napi_value self, napi_callback_info info) -> napi_status {
790 PRINT_ASSERT_BASE(env, argc == NapiPrintUtils::ARGC_TWO, " should 2 parameter!", napi_invalid_arg);
791 napi_valuetype valuetype;
792 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ZERO], &valuetype), napi_invalid_arg);
793 PRINT_ASSERT_BASE(env, valuetype == napi_string, "printerId is not a string", napi_string_expected);
794 std::string printerId = NapiPrintUtils::GetStringFromValueUtf8(env, argv[NapiPrintUtils::INDEX_ZERO]);
795
796 PRINT_CALL_BASE(env, napi_typeof(env, argv[NapiPrintUtils::INDEX_ONE], &valuetype), napi_invalid_arg);
797 PRINT_ASSERT_BASE(env, valuetype == napi_number, "defaultPrinterType is not a number", napi_number_expected);
798 uint32_t type = NapiPrintUtils::GetUint32FromValue(env, argv[NapiPrintUtils::INDEX_ONE]);
799 if (!IsValidDefaultPrinterType(type)) {
800 PRINT_HILOGE("invalid defaultPrinterType");
801 context->SetErrorIndex(E_PRINT_INVALID_PARAMETER);
802 return napi_invalid_arg;
803 }
804 PRINT_HILOGD("printerId : %{public}s", printerId.c_str());
805 context->printerId = printerId;
806 context->defaultPrinterType = type;
807 return napi_ok;
808 };
809 auto output = [context](napi_env env, napi_value *result) -> napi_status {
810 napi_status status = napi_get_boolean(env, context->result, result);
811 PRINT_HILOGD("output ---- [%{public}s], status[%{public}d]", context->result ? "true" : "false", status);
812 return status;
813 };
814 auto exec = [context](PrintAsyncCall::Context *ctx) {
815 int32_t ret =
816 PrintManagerClient::GetInstance()->SetDefaultPrinter(context->printerId, context->defaultPrinterType);
817 context->result = ret == E_PRINT_NONE;
818 if (ret != E_PRINT_NONE) {
819 PRINT_HILOGE("Failed to set default printer");
820 context->SetErrorIndex(ret);
821 }
822 };
823 context->SetAction(std::move(input), std::move(output));
824 PrintAsyncCall asyncCall(env, info, std::dynamic_pointer_cast<PrintAsyncCall::Context>(context));
825 return asyncCall.Call(env, exec);
826 }
827
IsSupportType(const std::string & type)828 bool NapiInnerPrint::IsSupportType(const std::string &type)
829 {
830 if (type == PRINTER_EVENT_TYPE || type == PRINTJOB_EVENT_TYPE || type == EXTINFO_EVENT_TYPE ||
831 type == PRINTER_CHANGE_EVENT_TYPE) {
832 return true;
833 }
834 return false;
835 }
836
IsValidApplicationEvent(uint32_t event)837 bool NapiInnerPrint::IsValidApplicationEvent(uint32_t event)
838 {
839 if (event >= APPLICATION_CREATED && event <= APPLICATION_CLOSED_FOR_CANCELED) {
840 return true;
841 }
842 return false;
843 }
844
IsValidDefaultPrinterType(uint32_t type)845 bool NapiInnerPrint::IsValidDefaultPrinterType(uint32_t type)
846 {
847 if (type >= DEFAULT_PRINTER_TYPE_SETTED_BY_USER &&
848 type <= DEFAULT_PRINTER_TYPE_LAST_USED_PRINTER) {
849 return true;
850 }
851 return false;
852 }
853 } // namespace OHOS::Print
854