Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosnativeprint.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <QDebug>
6#include <QDebugStateSaver>
7#include <QtCore/private/qohoslogger_p.h>
8#include <QtGlobal>
9#include <cmath>
10#include <cstdint>
11
12QT_BEGIN_NAMESPACE
13
15{
16
17namespace
18{
19
20QString stringifyOhosNativePrintReturn(std::int32_t retVal)
21{
22 QString s = QString("%1 : ").arg(retVal);
23 switch (retVal)
24 {
25 case ::PRINT_ERROR_NONE:
26 s += QStringLiteral("Ok");
27 break;
28 case ::PRINT_ERROR_NO_PERMISSION:
29 s += QStringLiteral("No Permission");
30 break;
31 case ::PRINT_ERROR_INVALID_PARAMETER:
32 s += QStringLiteral("Invalid Parameter");
33 break;
34 case ::PRINT_ERROR_GENERIC_FAILURE:
35 s += QStringLiteral("Printing Failure");
36 break;
37 case ::PRINT_ERROR_RPC_FAILURE:
38 s += QStringLiteral("RPC Failure");
39 break;
40 case ::PRINT_ERROR_SERVER_FAILURE:
41 s += QStringLiteral("Print Service Failure");
42 break;
43 case ::PRINT_ERROR_INVALID_EXTENSION:
44 s += QStringLiteral("Invalid Printer Extension");
45 break;
46 case ::PRINT_ERROR_INVALID_PRINTER:
47 s += QStringLiteral("Invalid Printer");
48 break;
49 case ::PRINT_ERROR_INVALID_PRINT_JOB:
50 s += QStringLiteral("Invalid Print Job");
51 break;
52 case ::PRINT_ERROR_FILE_IO:
53 s += QStringLiteral("Incorrect File I/O");
54 break;
55 default:
56 s += QStringLiteral("Unknown");
57 break;
58 }
59 return s;
60}
61
62QDebug operator<<(QDebug d, Print_Resolution nativePrintResolution)
63{
64 const QDebugStateSaver saver(d);
65 d.nospace() << "Print_Resolution(" << nativePrintResolution.horizontalDpi << " x "
66 << nativePrintResolution.verticalDpi << " dpi)";
67 return d;
68}
69
70PageSize convertNativeToOhosPageSize(Print_PageSize nativePageSize)
71{
72 PageSize pageSize;
73
74 pageSize.id = QString::fromUtf8(nativePageSize.id);
75 pageSize.name = QString::fromUtf8(nativePageSize.name);
76 pageSize.width = nativePageSize.width;
77 pageSize.height = nativePageSize.height;
78
79 return pageSize;
80}
81
82PrinterCapabilities convertNativeToOhosPrinterCapability(
83 Print_PrinterCapability nativeCapabilities)
84{
85 PrinterCapabilities capabilities{};
86
87 for (quint32 i = 0; i < nativeCapabilities.supportedColorModesCount; i++)
88 capabilities.supportedColorModes << nativeCapabilities.supportedColorModes[i];
89 for (quint32 i = 0; i < nativeCapabilities.supportedDuplexModesCount; i++)
90 capabilities.supportedDuplexModes << nativeCapabilities.supportedDuplexModes[i];
91 capabilities.supportedMediaTypes = QString::fromUtf8(nativeCapabilities.supportedMediaTypes);
92 for (quint32 i = 0; i < nativeCapabilities.supportedQualitiesCount; i++)
93 capabilities.supportedQualities << nativeCapabilities.supportedQualities[i];
94 capabilities.supportedPaperSources
95 = QString::fromUtf8(nativeCapabilities.supportedPaperSources);
96 capabilities.supportedCopies = nativeCapabilities.supportedCopies;
97 for (quint32 i = 0; i < nativeCapabilities.supportedResolutionsCount; i++)
98 capabilities.supportedResolutions << nativeCapabilities.supportedResolutions[i];
99 for (quint32 i = 0; i < nativeCapabilities.supportedOrientationsCount; i++)
100 capabilities.supportedOrientations << nativeCapabilities.supportedOrientations[i];
101 capabilities.advancedCapabilities = QString::fromUtf8(nativeCapabilities.advancedCapability);
102 for (quint32 i = 0; i < nativeCapabilities.supportedPageSizesCount; i++) {
103 capabilities.supportedPageSizes
104 << convertNativeToOhosPageSize(nativeCapabilities.supportedPageSizes[i]);
105 }
106
107 return capabilities;
108}
109
110PrinterDefaultValues convertNativeToOhosPrinterDefaultValue(Print_DefaultValue nativeDefaultValues)
111{
112 PrinterDefaultValues defaultValues{};
113
114 defaultValues.colorMode = nativeDefaultValues.defaultColorMode;
115 defaultValues.duplexMode = nativeDefaultValues.defaultDuplexMode;
116 defaultValues.mediaType = QString::fromUtf8(nativeDefaultValues.defaultMediaType);
117 defaultValues.pageSizeId = QString::fromUtf8(nativeDefaultValues.defaultPageSizeId);
118 defaultValues.margin = nativeDefaultValues.defaultMargin;
119 defaultValues.paperSource = QString::fromUtf8(nativeDefaultValues.defaultPaperSource);
120 defaultValues.printQuality = nativeDefaultValues.defaultPrintQuality;
121 defaultValues.copies = nativeDefaultValues.defaultCopies;
122 defaultValues.resolution = nativeDefaultValues.defaultResolution;
123 defaultValues.orientation = nativeDefaultValues.defaultOrientation;
124 defaultValues.otherDefaultValues = QString::fromUtf8(nativeDefaultValues.otherDefaultValues);
125
126 return defaultValues;
127}
128
129PrinterInfo convertNativeToOhosPrinterInfo(Print_PrinterInfo nativePrinterInfo)
130{
131 PrinterInfo printerInfo{};
132
133 printerInfo.state = nativePrinterInfo.printerState;
134 printerInfo.capabilities = convertNativeToOhosPrinterCapability(nativePrinterInfo.capability);
135 printerInfo.defaultValues
136 = convertNativeToOhosPrinterDefaultValue(nativePrinterInfo.defaultValue);
137 printerInfo.isDefault = nativePrinterInfo.isDefaultPrinter;
138 printerInfo.id = QString::fromUtf8(nativePrinterInfo.printerId);
139 printerInfo.name = QString::fromUtf8(nativePrinterInfo.printerName);
140 printerInfo.description = QString::fromUtf8(nativePrinterInfo.description);
141 printerInfo.location = QString::fromUtf8(nativePrinterInfo.location);
142 printerInfo.makeAndModel = QString::fromUtf8(nativePrinterInfo.makeAndModel);
143 printerInfo.uri = QString::fromUtf8(nativePrinterInfo.printerUri);
144 printerInfo.detailedInfo = QString::fromUtf8(nativePrinterInfo.detailInfo);
145
146 return printerInfo;
147}
148
149}
150
151bool connectPrinter(const QString &deviceId)
152{
153 qOhosDebug(QtForOhos) << "Connecting NativePrint Printer with deviceId =" << deviceId;
154 std::int32_t ret = OH_Print_ConnectPrinter(deviceId.toStdString().c_str());
155 if (ret != ::PRINT_ERROR_NONE) {
156 qOhosCritical(QtForOhos) << "Failed to connect printer with id \"" << deviceId << "\", reason: " << stringifyOhosNativePrintReturn(ret);
157 return false;
158 }
159 return true;
160}
161
162bool startPrintJob(const Print_PrintJob &job)
163{
164 qOhosDebug(QtForOhos) << "Starting NativePrint PrintJob";
165 qOhosDebug(QtForOhos) << "NativePrintJob.printerId =" << job.printerId;
166 qOhosDebug(QtForOhos) << "NativePrintJob.resolution =" << job.resolution;
167 qOhosDebug(QtForOhos) << "NativePrintJob.copies =" << job.copyNumber;
168 qOhosDebug(QtForOhos) << "NativePrintJob.paperSource =" << job.paperSource;
169 qOhosDebug(QtForOhos) << "NativePrintJob.pageSizeId = " << job.pageSizeId;
170 qOhosDebug(QtForOhos) << "NativePrintJob.colorMode =" << job.colorMode;
171 qOhosDebug(QtForOhos) << "NativePrintJob.duplexMode =" << job.duplexMode;
172 qOhosDebug(QtForOhos) << "NativePrintJob.advancedOptions =" << job.advancedOptions;
173 for (int i = 0; i < static_cast<int>(job.fdListCount); ++i)
174 qOhosWarning(QtForOhos) << "NativePrintJob.fd[" << i << "] =" << job.fdList[i];
175
176 std::int32_t ret = OH_Print_StartPrintJob(&job);
177 if (ret != ::PRINT_ERROR_NONE) {
178 qOhosCritical(QtForOhos) << "Failed to start print job, reason:" << stringifyOhosNativePrintReturn(ret);
179 return false;
180 }
181 return true;
182}
183
184bool queryPrinterIdList(QStringList &printerIdList)
185{
186 qOhosDebug(QtForOhos) << "Querying Printer Id List";
187
188 Print_StringList nativePrinterIdList;
189 std::int32_t ret = OH_Print_QueryPrinterList(&nativePrinterIdList);
190 if (ret != ::PRINT_ERROR_NONE) {
191 qOhosCritical(QtForOhos) << "Failed to query printer id list, reason:"
192 << stringifyOhosNativePrintReturn(ret);
193 return false;
194 }
195
196 for (std::uint32_t i = 0; i < nativePrinterIdList.count; i++) {
197 if (nativePrinterIdList.list[i])
198 printerIdList << QString::fromUtf8(nativePrinterIdList.list[i]);
199 }
200
201 OH_Print_ReleasePrinterList(&nativePrinterIdList);
202
203 return true;
204}
205
206bool queryPrinterInfo(const QString &printerId, PrinterInfo &printerInfo)
207{
208 qOhosDebug(QtForOhos) << "Querying Printer Info";
209
210 Print_PrinterInfo *nativePrinterInfo = nullptr;
211
212 // NOTE: OH_Print_QueryPrinterInfo requires a pointer to a pointer to Print_PrinterInfo
213 std::int32_t ret
214 = OH_Print_QueryPrinterInfo(printerId.toUtf8().constData(), &nativePrinterInfo);
215 if (ret != ::PRINT_ERROR_NONE) {
216 qOhosCritical(QtForOhos) << "Failed to query printer info, reason:"
217 << stringifyOhosNativePrintReturn(ret);
218 return false;
219 }
220
221 Q_ASSERT(nativePrinterInfo != nullptr);
222 printerInfo = convertNativeToOhosPrinterInfo(*nativePrinterInfo);
223 OH_Print_ReleasePrinterInfo(nativePrinterInfo);
224
225 return true;
226}
227
229{
230 qOhosDebug(QtForOhos) << "Initializing Print Service";
231 std::int32_t ret = OH_Print_Init();
232 if (ret != ::PRINT_ERROR_NONE) {
233 qOhosCritical(QtForOhos) << "Failed to initialize print service, reason:"
234 << stringifyOhosNativePrintReturn(ret);
235 return false;
236 }
237 return true;
238}
239
241{
242 qOhosDebug(QtForOhos) << "Releasing Print Service";
243 std::int32_t ret = OH_Print_Release();
244 if (ret != ::PRINT_ERROR_NONE) {
245 qOhosCritical(QtForOhos) << "Failed to release print service, reason:"
246 << stringifyOhosNativePrintReturn(ret);
247 return false;
248 }
249 return true;
250}
251
253{
254 qOhosDebug(QtForOhos) << "Launching Printer Manager";
255 std::int32_t ret = OH_Print_LaunchPrinterManager();
256 if (ret != ::PRINT_ERROR_NONE) {
257 qOhosCritical(QtForOhos) << "Failed to launch Printer Manager, reason:"
258 << stringifyOhosNativePrintReturn(ret);
259 return false;
260 }
261 return true;
262}
263
264int convertPixelsPerThousandDpiToPoints(quint32 pixelsPerThousandDpi)
265{
266 static constexpr double pixelsPerThousandDpiToMillimeterMultiplier = 2.54 / 0.1 / 1000.0;
267 static constexpr double millimeterToPointsMultiplier = 2.83464566929;
268
269 auto mm = std::round(
270 static_cast<double>(pixelsPerThousandDpi) * pixelsPerThousandDpiToMillimeterMultiplier);
271 auto points = std::round(mm * millimeterToPointsMultiplier);
272
273 return static_cast<int>(points);
274}
275
276}
277
278QT_END_NAMESPACE
bool queryPrinterIdList(QStringList &printerIdList)
bool connectPrinter(const QString &deviceId)
bool startPrintJob(const Print_PrintJob &job)
bool queryPrinterInfo(const QString &printerId, PrinterInfo &printerInfo)
int convertPixelsPerThousandDpiToPoints(quint32 pixelsPerThousandDpi)