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