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