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
qohosprintdevice.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
6#include <QPageSize>
7#include <QtCore/private/qohoslogger_p.h>
8#include <QtCore/qjsondocument.h>
9#include <QtCore/qjsonobject.h>
10#if __has_include(<BasicServicesKit/ohprint.h>)
11#include <BasicServicesKit/ohprint.h>
12#else
13#include <ohprint/print_base.h>
14#endif
15
17
18namespace
19{
20
21QPrint::DuplexMode convertOhosToQtDuplexMode(Print_DuplexMode nativeDuplexMode)
22{
23 switch (nativeDuplexMode) {
24 case DUPLEX_MODE_ONE_SIDED:
25 return QPrint::DuplexNone;
26 case DUPLEX_MODE_TWO_SIDED_LONG_EDGE:
27 return QPrint::DuplexLongSide;
28 case DUPLEX_MODE_TWO_SIDED_SHORT_EDGE:
29 return QPrint::DuplexShortSide;
30 }
31}
32
33QPrint::ColorMode convertOhosToQtColorMode(Print_ColorMode nativeColorMode)
34{
35 switch (nativeColorMode) {
36 case COLOR_MODE_MONOCHROME:
37 return QPrint::GrayScale;
38 case COLOR_MODE_COLOR:
39 return QPrint::Color;
40 case COLOR_MODE_AUTO:
41 // NOTE: Qt doesn't have a QPrint::ColorMode::Auto option. Use GrayScale for safety.
42 return QPrint::GrayScale;
43 }
44}
45
46QString printerAliasFromDetailedInfo(const QString &detailedInfo)
47{
48 if (detailedInfo.isEmpty())
49 return QString();
50
51 QJsonParseError error;
52 const auto detailedInfoDoc = QJsonDocument::fromJson(detailedInfo.toUtf8(), &error);
53 if (error.error != QJsonParseError::NoError) {
54 qOhosWarning(QtForOhos) << "Failed to parse PrinterInfo.detailedInfo:"
55 << error.errorString();
56 return QString();
57 }
58
59 const auto alias = detailedInfoDoc.object().value(QLatin1String("printerAlias"));
60 if (alias.isUndefined()) {
61 qOhosWarning(QtForOhos) << "PrinterInfo.detailedInfo has no \"printerAlias\" key; "
62 "it is available since OHOS API 24";
63 return QString();
64 }
65
66 return alias.toString();
67}
68
69}
70
75
78{
79 QOhosNativePrint::PrinterInfo printerInfo;
80 if (QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
81 m_location = printerInfo.location;
82 m_makeAndModel = printerInfo.makeAndModel;
83 m_supportsMultipleCopies = printerInfo.capabilities.supportedCopies > 1;
84 }
85}
86
88
90{
91 QOhosNativePrint::PrinterInfo printerInfo;
92 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
93 qOhosWarning(QtForOhos) << "Failed to get printerInfo for"
94 << m_id;
95 return QString();
96 }
97
98 const QString alias = printerAliasFromDetailedInfo(printerInfo.detailedInfo);
99 return alias.isEmpty() ? printerInfo.name : alias;
100}
101
103{
104 QStringList printerIdList;
105 if (!QOhosNativePrint::queryPrinterIdList(printerIdList))
106 return false;
107 return printerIdList.contains(m_id);
108}
109
111{
112 QOhosNativePrint::PrinterInfo printerInfo;
113 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
114 qOhosCritical(QtForOhos) << "QOhosPrintDevice::isDefault: Failed to get printerInfo";
115 return false;
116 }
117
118 return printerInfo.isDefault;
119}
120
122{
123 if (!isValid())
124 return QPrint::Error;
125
127 if (!QOhosNativePrint::queryPrinterInfo(m_id, pi)) {
128 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
129 return QPrint::Error;
130 }
131
132 switch (pi.state) {
133 case PRINTER_IDLE:
134 return QPrint::Idle;
135
136 case PRINTER_BUSY:
137 return QPrint::Active;
138
139 case PRINTER_UNAVAILABLE:
140 return QPrint::Error;
141 }
142}
143
145{
146 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::defaultPageSize");
147
148 QOhosNativePrint::PrinterInfo printerInfo;
149 if (QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
150 for (const auto &pageSize : supportedPageSizes()) {
151 if (pageSize.key() == printerInfo.defaultValues.pageSizeId)
152 return pageSize;
153 }
154 }
155
156 // NOTE: OHOS provides just a page size ID of the default page size. It does not provide the
157 // size, which is required by Qt. Use the A4 format as a backup for default page. However, we
158 // cannot simply return QPageSize(QPageSize::A4) as a backup. The problem is that page size IDs
159 // provided by OHOS are different than what Qt uses. For example, the A4 size has ID "ISO_A4" in
160 // OHOS, while Qt uses "A4".
161 QString isoA4OhosId = QString::fromLocal8Bit("ISO_A4");
162 QString isoA4OhosName = QString::fromLocal8Bit("iso_a4_210x297mm");
163 return createPageSize(isoA4OhosId, QPageSize(QPageSize::A4).sizePoints(), isoA4OhosName);
164}
165
167{
168 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::defaultDuplexMode");
169
170 QOhosNativePrint::PrinterInfo printerInfo;
171 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
172 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
173 return QPrint::DuplexNone;
174 }
175
176 return convertOhosToQtDuplexMode(printerInfo.defaultValues.duplexMode);
177}
178
180{
181 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::defaultColorMode");
182
183 QOhosNativePrint::PrinterInfo printerInfo;
184 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
185 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
186 return QPrint::GrayScale;
187 }
188
189 return convertOhosToQtColorMode(printerInfo.defaultValues.colorMode);
190}
191
193{
194 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::defaultResolution");
195
196 QOhosNativePrint::PrinterInfo printerInfo;
197 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
198 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
199 return 0;
200 }
201
202 return printerInfo.defaultValues.resolution.verticalDpi;
203}
204
205QStringList QOhosPrintDevice::availablePrintDeviceIds()
206{
207 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::availablePrintDeviceIds");
208
209 QStringList printerIdList;
210 if (!QOhosNativePrint::queryPrinterIdList(printerIdList))
211 return {};
212
213 return printerIdList;
214}
215
216QString QOhosPrintDevice::defaultPrintDeviceId()
217{
218 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::defaultPrintDeviceId");
219
220 for (const auto &printerId : availablePrintDeviceIds()) {
221 QOhosNativePrint::PrinterInfo printerInfo;
222 if (QOhosNativePrint::queryPrinterInfo(printerId, printerInfo) && printerInfo.isDefault)
223 return printerId;
224 }
225
226 return QString();
227}
228
230{
231 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::loadPageSizes");
232
233 QOhosNativePrint::PrinterInfo printerInfo;
234 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
235 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
236 return;
237 }
238
239 qOhosDebug(QtForOhos) << "Available page sizes:";
240
241 m_pageSizes.clear();
242 for (const auto &nativePageSize : printerInfo.capabilities.supportedPageSizes) {
243 QSize size(
244 QOhosNativePrint::convertPixelsPerThousandDpiToPoints(nativePageSize.width),
245 QOhosNativePrint::convertPixelsPerThousandDpiToPoints(nativePageSize.height));
246 QPageSize pageSize = createPageSize(nativePageSize.id, size, nativePageSize.name);
247
248 qOhosDebug(QtForOhos) << "\t*" << pageSize;
249
250 m_pageSizes.append(pageSize);
251 }
252
253 m_havePageSizes = true;
254}
255
257{
258 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::loadDuplexModes");
259
260 QOhosNativePrint::PrinterInfo printerInfo;
261 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
262 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
263 return;
264 }
265
266 qOhosDebug(QtForOhos) << "Available duplex modes:";
267
268 m_duplexModes.clear();
269 for (auto nativeDuplexMode : printerInfo.capabilities.supportedDuplexModes) {
270 auto duplexMode = convertOhosToQtDuplexMode(nativeDuplexMode);
271
272 qOhosDebug(QtForOhos) << "\t*" << duplexMode;
273
274 m_duplexModes.append(duplexMode);
275 }
276
277 m_haveDuplexModes = true;
278}
279
281{
282 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::loadColorModes");
283
284 QOhosNativePrint::PrinterInfo printerInfo;
285 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
286 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
287 return;
288 }
289
290 qOhosDebug(QtForOhos) << "Printer colorModes:";
291
292 m_colorModes.clear();
293 for (auto nativeColorMode : printerInfo.capabilities.supportedColorModes) {
294 auto colorMode = convertOhosToQtColorMode(nativeColorMode);
295
296 qOhosDebug(QtForOhos) << "\t*" << colorMode;
297
298 m_colorModes.append(colorMode);
299 }
300
301 m_haveColorModes = true;
302}
303
305{
306 auto __dbg = make_QCScopedDebug("QOhosPrintDevice::loadResolutions");
307
308 QOhosNativePrint::PrinterInfo printerInfo;
309 if (!QOhosNativePrint::queryPrinterInfo(m_id, printerInfo)) {
310 qOhosCritical(QtForOhos) << "Failed to get printerInfo";
311 return;
312 }
313
314 qOhosDebug(QtForOhos) << "Printer resolutions:";
315
316 m_resolutions.clear();
317 for (const auto &nativeResolution : printerInfo.capabilities.supportedResolutions) {
318 auto resolution = nativeResolution.verticalDpi;
319
320 qOhosDebug(QtForOhos) << "\t*" << resolution;
321
322 m_resolutions.append(resolution);
323 }
324
325 m_haveResolutions = true;
326}
327
328QT_END_NAMESPACE
void loadDuplexModes() const override
void loadResolutions() const override
QPrint::ColorMode defaultColorMode() const override
QPageSize defaultPageSize() const override
QOhosPrintDevice(const QString &id)
int defaultResolution() const override
bool isValid() const override
QPrint::DeviceState state() const override
QPrint::DuplexMode defaultDuplexMode() const override
void loadColorModes() const override
void loadPageSizes() const override
QString name() const override
virtual ~QOhosPrintDevice()
bool isDefault() const override
bool queryPrinterInfo(const QString &printerId, PrinterInfo &printerInfo)
Combined button and popup list for selecting options.
QString printerAliasFromDetailedInfo(const QString &detailedInfo)
QPrint::ColorMode convertOhosToQtColorMode(Print_ColorMode nativeColorMode)
QPrint::DuplexMode convertOhosToQtDuplexMode(Print_DuplexMode nativeDuplexMode)
#define __has_include(x)