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