• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 "ohprint.h"
17 
18 #include <algorithm>
19 #include <map>
20 #include <memory>
21 #include <mutex>
22 #include <vector>
23 
24 #include "ability_context.h"
25 #include "iprint_adapter.h"
26 #include "print_attributes.h"
27 #include "print_manager_client.h"
28 #include "print_constant.h"
29 #include "print_log.h"
30 #include "ability_manager_client.h"
31 #include "print_util.h"
32 #include "print_callback.h"
33 #include "print_converter.h"
34 #include "print_helper.h"
35 #include "printer_preferences.h"
36 #include "refbase.h"
37 #include "ui_extension_context.h"
38 #include "print_json_util.h"
39 
40 using namespace OHOS::Print;
41 
42 static Print_PrinterDiscoveryCallback printerDiscoverCallback = nullptr;
43 static Print_PrinterChangeCallback printerInfoCallback = nullptr;
44 
NativePrinterDiscoverFunction(uint32_t event,const PrinterInfo & info)45 static bool NativePrinterDiscoverFunction(uint32_t event, const PrinterInfo &info)
46 {
47     PRINT_HILOGD("NativePrinterDiscoverFunction event: %{public}d, printerId: [%{public}s]",
48         event, info.GetPrinterId().c_str());
49     if (printerDiscoverCallback == nullptr) {
50         PRINT_HILOGW("printerDiscoverCallback is null");
51         return false;
52     }
53     Print_PrinterInfo *nativePrinterInfo = ConvertToNativePrinterInfo(info);
54     if (nativePrinterInfo == nullptr) {
55         PRINT_HILOGW("nativePrinterInfo is null.");
56         return false;
57     }
58     printerDiscoverCallback(static_cast<Print_DiscoveryEvent>(event), nativePrinterInfo);
59     OH_Print_ReleasePrinterInfo(nativePrinterInfo);
60     return true;
61 }
62 
NativePrinterInfoFunction(uint32_t event,const PrinterInfo & info)63 static bool NativePrinterInfoFunction(uint32_t event, const PrinterInfo &info)
64 {
65     PRINT_HILOGD("NativePrinterInfoFunction event: [%{public}d, printerId: [%{public}s]",
66         event, info.GetPrinterId().c_str());
67     if (printerInfoCallback == nullptr) {
68         PRINT_HILOGW("printerInfoCallback is null");
69         return false;
70     }
71     Print_PrinterInfo *nativePrinterInfo = ConvertToNativePrinterInfo(info);
72     if (nativePrinterInfo == nullptr) {
73         PRINT_HILOGW("nativePrinterInfo is null.");
74         return false;
75     }
76     printerInfoCallback(static_cast<Print_PrinterEvent>(event), nativePrinterInfo);
77     OH_Print_ReleasePrinterInfo(nativePrinterInfo);
78     nativePrinterInfo = nullptr;
79     return true;
80 }
81 
GetUIContent(void * context)82 static OHOS::Ace::UIContent *GetUIContent(void *context)
83 {
84     if (context == nullptr) {
85         PRINT_HILOGE("input context is null.");
86         return nullptr;
87     }
88 
89     auto weakContext = static_cast<std::weak_ptr<OHOS::AbilityRuntime::Context>*>(context);
90     if (weakContext == nullptr) {
91         PRINT_HILOGE("cast context to weak is null.");
92         return nullptr;
93     }
94     auto sharedContext = weakContext->lock();
95     auto abilityContext =
96         OHOS::AbilityRuntime::Context::ConvertTo<OHOS::AbilityRuntime::AbilityContext>(sharedContext);
97     if (abilityContext != nullptr) {
98         PRINT_HILOGD("get ability ui content.");
99         return abilityContext->GetUIContent();
100     }
101     auto uiExtensionContext =
102         OHOS::AbilityRuntime::Context::ConvertTo<OHOS::AbilityRuntime::UIExtensionContext>(sharedContext);
103     if (uiExtensionContext != nullptr) {
104         PRINT_HILOGD("get ui extension ui content.");
105         return uiExtensionContext->GetUIContent();
106     }
107     PRINT_HILOGE("get ui content failed.");
108     return nullptr;
109 }
110 
NewPrintAttributes(void)111 static Print_PrintAttributes *NewPrintAttributes(void)
112 {
113     auto attributes = new (std::nothrow) Print_PrintAttributes;
114     if (attributes == nullptr) {
115         PRINT_HILOGE("OH_Print new attributes failed.");
116         return nullptr;
117     }
118     if (memset_s(attributes, sizeof(Print_PrintAttributes), 0, sizeof(Print_PrintAttributes)) != 0) {
119         PRINT_HILOGE("OH_Print attributes memset failed.");
120         delete attributes;
121         return nullptr;
122     }
123     return attributes;
124 }
125 
ReleasePrintAttributes(Print_PrintAttributes * attr)126 static void ReleasePrintAttributes(Print_PrintAttributes *attr)
127 {
128     if (attr == nullptr) {
129         PRINT_HILOGE("OH_Print release attr is null.");
130         return;
131     }
132     if (attr->pageRange.pagesArray != nullptr) {
133         delete [] attr->pageRange.pagesArray;
134         attr->pageRange.pagesArray = nullptr;
135     }
136     delete attr;
137 }
138 
139 // 初始化
OH_Print_Init()140 Print_ErrorCode OH_Print_Init()
141 {
142     int32_t ret = PrintManagerClient::GetInstance()->Init();
143     PRINT_HILOGI("OH_Print_Init ret = [%{public}d]", ret);
144     return ConvertToNativeErrorCode(ret);
145 }
146 
147 // 反初始化
OH_Print_Release()148 Print_ErrorCode OH_Print_Release()
149 {
150     int32_t ret = PrintManagerClient::GetInstance()->Release();
151     PRINT_HILOGI("OH_Print_Release ret = [%{public}d]", ret);
152     return ConvertToNativeErrorCode(ret);
153 }
154 
OH_Print_StartPrinterDiscovery(Print_PrinterDiscoveryCallback callback)155 Print_ErrorCode OH_Print_StartPrinterDiscovery(Print_PrinterDiscoveryCallback callback)
156 {
157     printerDiscoverCallback = callback;
158     std::vector<PrintExtensionInfo> extensionInfos;
159     int32_t ret = PrintManagerClient::GetInstance()->QueryAllExtension(extensionInfos);
160     PRINT_HILOGI("QueryAllExtension ret = [%{public}d]", ret);
161     if (ret == PRINT_ERROR_NONE) {
162         std::vector<std::string> extensionIds;
163         for (auto &extensionInfo : extensionInfos) {
164             extensionIds.emplace_back(extensionInfo.GetExtensionId());
165         }
166         PRINT_HILOGI("extensionIds size = [%{public}zu]", extensionIds.size());
167         PrintManagerClient::GetInstance()->SetNativePrinterChangeCallback(
168             PRINTER_DISCOVER_EVENT_TYPE, NativePrinterDiscoverFunction);
169         ret = PrintManagerClient::GetInstance()->StartDiscoverPrinter(extensionIds);
170         PRINT_HILOGI("StartDiscoverPrinter ret = [%{public}d]", ret);
171     }
172     return ConvertToNativeErrorCode(ret);
173 }
174 
OH_Print_StopPrinterDiscovery()175 Print_ErrorCode OH_Print_StopPrinterDiscovery()
176 {
177     PrintManagerClient::GetInstance()->SetNativePrinterChangeCallback(PRINTER_DISCOVER_EVENT_TYPE, nullptr);
178     printerDiscoverCallback = nullptr;
179     int32_t ret = PrintManagerClient::GetInstance()->StopDiscoverPrinter();
180     PRINT_HILOGI("StopDiscoverPrinter ret = [%{public}d]", ret);
181     return ConvertToNativeErrorCode(ret);
182 }
183 
OH_Print_ConnectPrinter(const char * printerId)184 Print_ErrorCode OH_Print_ConnectPrinter(const char *printerId)
185 {
186     if (printerId == nullptr) {
187         PRINT_HILOGW("printerId is null.");
188         return PRINT_ERROR_INVALID_PRINTER;
189     }
190     std::string nativePrinterId = printerId;
191     int32_t ret = PrintManagerClient::GetInstance()->ConnectPrinter(nativePrinterId);
192     PRINT_HILOGI("ConnectPrinter ret = [%{public}d]", ret);
193     return ConvertToNativeErrorCode(ret);
194 }
195 
OH_Print_StartPrintJob(const Print_PrintJob * printJob)196 Print_ErrorCode OH_Print_StartPrintJob(const Print_PrintJob *printJob)
197 {
198     if (printJob == nullptr) {
199         PRINT_HILOGI("printJob is null.");
200         return PRINT_ERROR_INVALID_PRINT_JOB;
201     }
202     PrintJob curPrintJob;
203     int32_t ret = ConvertNativeJobToPrintJob(*printJob, curPrintJob);
204     if (ret != 0) {
205         PRINT_HILOGW("ConvertNativeJobToPrintJob fail.");
206         return PRINT_ERROR_INVALID_PRINT_JOB;
207     }
208     ret = PrintManagerClient::GetInstance()->StartNativePrintJob(curPrintJob);
209     PRINT_HILOGI("StartNativePrintJob ret = [%{public}d]", ret);
210     return ConvertToNativeErrorCode(ret);
211 }
212 
OH_Print_RegisterPrinterChangeListener(Print_PrinterChangeCallback callback)213 Print_ErrorCode OH_Print_RegisterPrinterChangeListener(Print_PrinterChangeCallback callback)
214 {
215     printerInfoCallback = callback;
216     PrintManagerClient::GetInstance()->SetNativePrinterChangeCallback(
217         PRINTER_CHANGE_EVENT_TYPE, NativePrinterInfoFunction);
218     return PRINT_ERROR_NONE;
219 }
220 
OH_Print_UnregisterPrinterChangeListener()221 void OH_Print_UnregisterPrinterChangeListener()
222 {
223     PrintManagerClient::GetInstance()->SetNativePrinterChangeCallback(PRINTER_CHANGE_EVENT_TYPE, nullptr);
224     printerInfoCallback = nullptr;
225 }
226 
OH_Print_QueryPrinterList(Print_StringList * printerIdList)227 Print_ErrorCode OH_Print_QueryPrinterList(Print_StringList *printerIdList)
228 {
229     if (printerIdList == nullptr) {
230         PRINT_HILOGW("printerIdList is null.");
231         return PRINT_ERROR_INVALID_PARAMETER;
232     }
233     std::vector<std::string> printerNameList;
234     int32_t ret = PrintManagerClient::GetInstance()->QueryAddedPrinter(printerNameList);
235     size_t count = printerNameList.size();
236     PRINT_HILOGI("OH_Print_QueryPrinterList ret = %{public}d, count = %{public}zu.", ret, count);
237     if (ret != 0 || count == 0) {
238         return PRINT_ERROR_INVALID_PRINTER;
239     }
240     printerIdList->list = new (std::nothrow) char *[count];
241     if (printerIdList->list == nullptr) {
242         PRINT_HILOGW("printerIdList->list is null");
243         return PRINT_ERROR_GENERIC_FAILURE;
244     }
245     if (memset_s(printerIdList->list, count * sizeof(char *), 0, count * sizeof(char *)) != 0) {
246         delete[] printerIdList->list;
247         printerIdList->list = nullptr;
248         PRINT_HILOGW("memset_s fail");
249         return PRINT_ERROR_GENERIC_FAILURE;
250     }
251     for (size_t i = 0; i < count; ++i) {
252         printerIdList->list[i] = CopyString(printerNameList[i]);
253     }
254     printerIdList->count = count;
255     return PRINT_ERROR_NONE;
256 }
257 
OH_Print_ReleasePrinterList(Print_StringList * printerIdList)258 void OH_Print_ReleasePrinterList(Print_StringList *printerIdList)
259 {
260     if (printerIdList == nullptr) {
261         PRINT_HILOGW("printerIdList is null.");
262         return;
263     }
264     if (printerIdList->list != nullptr) {
265         for (uint32_t i = 0; i < printerIdList->count; i++) {
266             SAFE_DELETE_ARRAY(printerIdList->list[i]);
267         }
268         SAFE_DELETE_ARRAY(printerIdList->list);
269     }
270     printerIdList->count = 0;
271 }
272 
OH_Print_QueryPrinterInfo(const char * printerId,Print_PrinterInfo ** printerInfo)273 Print_ErrorCode OH_Print_QueryPrinterInfo(const char *printerId, Print_PrinterInfo **printerInfo)
274 {
275     if (printerId == nullptr || printerInfo == nullptr) {
276         PRINT_HILOGW("Invalid parameter.");
277         return PRINT_ERROR_INVALID_PARAMETER;
278     }
279     std::string id(printerId);
280     PrinterInfo info;
281     int32_t ret = PrintManagerClient::GetInstance()->QueryPrinterInfoByPrinterId(id, info);
282     PRINT_HILOGI("QueryPrinterInfoByPrinterId ret = %{public}d", ret);
283     if (info.GetPrinterId() != id || info.GetPrinterName().empty()) {
284         PRINT_HILOGI("QueryPrinterInfoByPrinterId invalid printer");
285         return PRINT_ERROR_INVALID_PRINTER;
286     }
287     Print_PrinterInfo *nativePrinterInfo = ConvertToNativePrinterInfo(info);
288     if (nativePrinterInfo != nullptr) {
289         if (ret != 0) {
290             nativePrinterInfo->printerState = PRINTER_UNAVAILABLE;
291         }
292         *printerInfo = nativePrinterInfo;
293     }
294     return ConvertToNativeErrorCode(ret);
295 }
296 
OH_Print_ReleasePrinterInfo(Print_PrinterInfo * printerInfo)297 void OH_Print_ReleasePrinterInfo(Print_PrinterInfo *printerInfo)
298 {
299     if (printerInfo == nullptr) {
300         PRINT_HILOGW("printerInfo is null.");
301         return;
302     }
303     ReleasePrinterInfo(*printerInfo);
304     delete printerInfo;
305     printerInfo = nullptr;
306 }
307 
OH_Print_LaunchPrinterManager()308 Print_ErrorCode OH_Print_LaunchPrinterManager()
309 {
310     PRINT_HILOGW("Ability context is needed to start ability");
311     return PRINT_ERROR_GENERIC_FAILURE;
312 }
313 
OH_Print_QueryPrinterProperties(const char * printerId,const Print_StringList * propertyKeyList,Print_PropertyList * propertyList)314 Print_ErrorCode OH_Print_QueryPrinterProperties(
315     const char *printerId, const Print_StringList *propertyKeyList, Print_PropertyList *propertyList)
316 {
317     if (printerId == nullptr || propertyKeyList == nullptr || propertyKeyList->list == nullptr ||
318         propertyList == nullptr) {
319         PRINT_HILOGW("OH_Print_QueryPrinterProperties invalid parameter.");
320         return PRINT_ERROR_INVALID_PRINTER;
321     }
322     std::vector<std::string> keyList;
323     for (uint32_t i = 0; i < propertyKeyList->count; i++) {
324         if (propertyKeyList->list[i] == nullptr) {
325             continue;
326         }
327         std::string key(propertyKeyList->list[i]);
328         if (key.empty()) {
329             continue;
330         }
331         keyList.emplace_back(key);
332     }
333     if (keyList.size() == 0) {
334         PRINT_HILOGW("empty keyList");
335         return PRINT_ERROR_INVALID_PARAMETER;
336     }
337     std::vector<std::string> valueList;
338     int32_t ret = PrintManagerClient::GetInstance()->QueryPrinterProperties(printerId, keyList, valueList);
339     PRINT_HILOGI("QueryPrinterProperties ret = %{public}d", ret);
340     if (ret != 0) {
341         PRINT_HILOGW("QueryPrinterProperties fail");
342         return PRINT_ERROR_INVALID_PRINTER;
343     }
344     return ConvertStringVectorToPropertyList(valueList, propertyList);
345 }
346 
OH_Print_ReleasePrinterProperties(Print_PropertyList * propertyList)347 void OH_Print_ReleasePrinterProperties(Print_PropertyList *propertyList)
348 {
349     if (propertyList == nullptr) {
350         PRINT_HILOGW("propertyList is null");
351         return;
352     }
353     if (propertyList->list != nullptr) {
354         for (uint32_t i = 0; i < propertyList->count; ++i) {
355             SAFE_DELETE_ARRAY(propertyList->list[i].key);
356             SAFE_DELETE_ARRAY(propertyList->list[i].value);
357         }
358         SAFE_DELETE_ARRAY(propertyList->list);
359     }
360     propertyList->count = 0;
361 }
362 
OH_Print_UpdatePrinterProperties(const char * printerId,const Print_PropertyList * propertyList)363 Print_ErrorCode OH_Print_UpdatePrinterProperties(const char *printerId, const Print_PropertyList *propertyList)
364 {
365     if (printerId == nullptr || propertyList->list == nullptr || propertyList->count <= 0) {
366         PRINT_HILOGW("OH_Print_UpdatePrinterProperties invalid parameter.");
367         return PRINT_ERROR_INVALID_PRINTER;
368     }
369     Json::Value settingJson;
370     for (uint32_t i = 0; i < propertyList->count; i++) {
371         settingJson[propertyList->list[i].key] = propertyList->list[i].value;
372     }
373     PRINT_HILOGD("OH_Print_UpdatePrinterProperties setting : %{public}s.",
374         (PrintJsonUtil::WriteString(settingJson)).c_str());
375     PrinterPreferences preferences;
376     preferences.ConvertJsonToPrinterPreferences(settingJson);
377     int32_t ret = PrintManagerClient::GetInstance()->SetPrinterPreference(printerId, preferences);
378     if (ret != 0) {
379         PRINT_HILOGW("SetPrinterPreference fail");
380         return PRINT_ERROR_INVALID_PRINTER;
381     }
382     return PRINT_ERROR_NONE;
383 }
384 
OH_Print_RestorePrinterProperties(const char * printerId,const Print_StringList * propertyKeyList)385 Print_ErrorCode OH_Print_RestorePrinterProperties(const char *printerId, const Print_StringList *propertyKeyList)
386 {
387     return PRINT_ERROR_NONE;
388 }
389 
390 namespace {
391 class PrintDocumentAdapterWrapper : public PrintDocumentAdapter {
392 public:
393     explicit PrintDocumentAdapterWrapper(Print_PrintDocCallback PrintCallback);
394     void onStartLayoutWrite(const std::string &jobId,
395                             const PrintAttributes &oldAttrs,
396                             const PrintAttributes &newAttrs,
397                             uint32_t fd,
398                             std::function<void(std::string, uint32_t)> writeResultCallback) override;
399     void onJobStateChanged(const std::string &jobId, uint32_t state) override;
400     void OnWriteResultCallback(const std::string &jobId, uint32_t code);
401     static void WriteResultCallback(const char *jobId, uint32_t code);
402 
403 private:
404     Print_PrintAttributes *BuildPrintAttributes(const PrintAttributes &attrs);
405 
406     Print_PrintDocCallback printCb_;
407     std::function<void(std::string, uint32_t)> writeResultCb_;
408     static std::mutex printDocMutex_;
409     static std::map<std::string, PrintDocumentAdapterWrapper*> printDocAdapterMap_;
410 };
411 
412 std::mutex PrintDocumentAdapterWrapper::printDocMutex_;
413 std::map<std::string, PrintDocumentAdapterWrapper*> PrintDocumentAdapterWrapper::printDocAdapterMap_;
414 
PrintDocumentAdapterWrapper(Print_PrintDocCallback PrintCallback)415 PrintDocumentAdapterWrapper::PrintDocumentAdapterWrapper(Print_PrintDocCallback PrintCallback)
416 {
417     printCb_ = PrintCallback;
418 }
419 
onStartLayoutWrite(const std::string & jobId,const PrintAttributes & oldAttrs,const PrintAttributes & newAttrs,uint32_t fd,std::function<void (std::string,uint32_t)> writeResultCallback)420 void PrintDocumentAdapterWrapper::onStartLayoutWrite(const std::string &jobId,
421                                                      const PrintAttributes &oldAttrs,
422                                                      const PrintAttributes &newAttrs,
423                                                      uint32_t fd,
424                                                      std::function<void(std::string, uint32_t)> writeResultCallback)
425 {
426     if (printCb_.startLayoutWriteCb == nullptr) {
427         PRINT_HILOGE("OH_Print start layout callback is null.");
428         return;
429     }
430     {
431         std::lock_guard<std::mutex> lock(printDocMutex_);
432         if (printDocAdapterMap_.find(jobId) == printDocAdapterMap_.end()) {
433             printDocAdapterMap_.insert({ jobId, this });
434         }
435     }
436     writeResultCb_ = writeResultCallback;
437     auto oldAttrsPtr = BuildPrintAttributes(oldAttrs);
438     auto newAttrsPtr = BuildPrintAttributes(newAttrs);
439     printCb_.startLayoutWriteCb(jobId.c_str(),
440                                 fd,
441                                 oldAttrsPtr,
442                                 newAttrsPtr,
443                                 PrintDocumentAdapterWrapper::WriteResultCallback);
444     ReleasePrintAttributes(oldAttrsPtr);
445     ReleasePrintAttributes(newAttrsPtr);
446     oldAttrsPtr = nullptr;
447     newAttrsPtr = nullptr;
448 }
449 
onJobStateChanged(const std::string & jobId,uint32_t state)450 void PrintDocumentAdapterWrapper::onJobStateChanged(const std::string &jobId, uint32_t state)
451 {
452     if (printCb_.jobStateChangedCb == nullptr) {
453         PRINT_HILOGE("OH_Print job state callback is null.");
454         return;
455     }
456     if (state == PRINT_DOC_ADAPTER_PREVIEW_ABILITY_DESTROY_FOR_CANCELED
457         || state == PRINT_DOC_ADAPTER_PREVIEW_ABILITY_DESTROY_FOR_STARTED) {
458         std::lock_guard<std::mutex> lock(printDocMutex_);
459         printDocAdapterMap_.erase(jobId);
460     }
461     printCb_.jobStateChangedCb(jobId.c_str(), state);
462 }
463 
WriteResultCallback(const char * jobId,uint32_t code)464 void PrintDocumentAdapterWrapper::WriteResultCallback(const char *jobId, uint32_t code)
465 {
466     if (jobId == nullptr) {
467         PRINT_HILOGE("OH_Print write result callback param is null.");
468         return;
469     }
470     std::string jobIdStr = jobId;
471     PrintDocumentAdapterWrapper* wrapper = nullptr;
472     {
473         std::lock_guard<std::mutex> lock(printDocMutex_);
474         auto iter = printDocAdapterMap_.find(jobId);
475         if (iter != printDocAdapterMap_.end()) {
476             wrapper = iter->second;
477         }
478     }
479     if (wrapper == nullptr) {
480         PRINT_HILOGE("OH_Print get wrapper failed.");
481         return;
482     }
483     wrapper->OnWriteResultCallback(jobIdStr, code);
484 }
485 
OnWriteResultCallback(const std::string & jobId,uint32_t code)486 void PrintDocumentAdapterWrapper::OnWriteResultCallback(const std::string &jobId, uint32_t code)
487 {
488     if (writeResultCb_ == nullptr) {
489         PRINT_HILOGE("OH_Print write callback is null.");
490         return;
491     }
492     writeResultCb_(jobId, code);
493 }
494 
BuildPrintAttributes(const PrintAttributes & attrs)495 Print_PrintAttributes *PrintDocumentAdapterWrapper::BuildPrintAttributes(const PrintAttributes &attrs)
496 {
497     auto attributesRaw = NewPrintAttributes();
498     if (attributesRaw == nullptr) {
499         PRINT_HILOGE("OH_Print attribute raw is null.");
500         return nullptr;
501     }
502     std::unique_ptr<Print_PrintAttributes> attributes(attributesRaw);
503     attributes->copyNumber = attrs.GetCopyNumber();
504     Print_Range printRange;
505     PrintRange range;
506     attrs.GetPageRange(range);
507     printRange.startPage = range.GetStartPage();
508     printRange.endPage = range.GetEndPage();
509     std::vector<uint32_t> pages;
510     range.GetPages(pages);
511     auto pageArray = new (std::nothrow) uint32_t[pages.size()];
512     if (pageArray == nullptr) {
513         PRINT_HILOGE("OH_Print pages array is null.");
514         return nullptr;
515     }
516     std::copy(pages.begin(), pages.end(), pageArray);
517     printRange.pagesArray = pageArray;
518     printRange.pagesArrayLen = pages.size();
519     attributes->pageRange = printRange;
520     attributes->isSequential = attrs.GetIsSequential();
521     Print_PageSize printPageSize;
522     PrintPageSize pageSize;
523     attrs.GetPageSize(pageSize);
524     printPageSize.width = pageSize.GetWidth();
525     printPageSize.height = pageSize.GetHeight();
526     attributes->pageSize = printPageSize;
527     attributes->isLandscape = attrs.GetIsLandscape();
528     attributes->colorMode = attrs.GetColorMode();
529     attributes->duplexMode = attrs.GetDuplexMode();
530     Print_Margin printMargin;
531     PrintMargin margin;
532     attrs.GetMargin(margin);
533     printMargin.topMargin = margin.GetTop();
534     printMargin.bottomMargin = margin.GetBottom();
535     printMargin.leftMargin = margin.GetLeft();
536     printMargin.rightMargin = margin.GetRight();
537     attributes->pageMargin = printMargin;
538     return attributes.release();
539 }
540 }
541 
OH_Print_StartPrintByNative(const char * printJobName,Print_PrintDocCallback printDocCallback,void * context)542 Print_ErrorCode OH_Print_StartPrintByNative(const char *printJobName,
543                                             Print_PrintDocCallback printDocCallback,
544                                             void *context)
545 {
546     if (printJobName == nullptr) {
547         PRINT_HILOGE("OH_Print start print native print job name is null.");
548         return PRINT_ERROR_INVALID_PARAMETER;
549     }
550 
551     auto uiContent = GetUIContent(context);
552     if (uiContent == nullptr) {
553         PRINT_HILOGE("OH_Print start print native ui content is null.");
554         return PRINT_ERROR_INVALID_PARAMETER;
555     }
556     auto wrapper = new (std::nothrow) PrintDocumentAdapterWrapper(printDocCallback);
557     if (wrapper == nullptr) {
558         PRINT_HILOGE("OH_Print start print print doc adapter is null.");
559         return PRINT_ERROR_GENERIC_FAILURE;
560     }
561     OHOS::sptr<IPrintCallback> printCb = new (std::nothrow) PrintCallback(wrapper);
562     if (printCb == nullptr) {
563         PRINT_HILOGE("OH_Print start print print callback is null.");
564         delete wrapper;
565         return PRINT_ERROR_GENERIC_FAILURE;
566     }
567     auto attributes = std::make_shared<PrintAttributes>();
568     std::string printJobNameStr = printJobName;
569     int32_t ret =
570         PrintManagerClient::GetInstance()->Print(printJobNameStr, printCb, attributes, uiContent);
571     if (ret != PRINT_ERROR_NONE) {
572         PRINT_HILOGE("OH_Print start print start failed, error code : %{public}d.", ret);
573         return ConvertToNativeErrorCode(ret);
574     }
575     return PRINT_ERROR_NONE;
576 }
577