Revision control

Copy as Markdown

// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "qprint_p.h"
QT_BEGIN_NAMESPACE
#ifndef QT_NO_PRINTER
// Note: PPD standard does not define a standard set of InputSlot keywords,
// it is a free form text field left to the PPD writer to decide,
// but it does suggest some names for consistency with the Windows enum.
static const InputSlotMap inputSlotMap[] = {
{ QPrint::Upper, DMBIN_UPPER, "Upper" },
{ QPrint::Lower, DMBIN_LOWER, "Lower" },
{ QPrint::Middle, DMBIN_MIDDLE, "Middle" },
{ QPrint::Manual, DMBIN_MANUAL, "Manual" },
{ QPrint::Envelope, DMBIN_ENVELOPE, "Envelope" },
{ QPrint::EnvelopeManual, DMBIN_ENVMANUAL, "EnvelopeManual" },
{ QPrint::Auto, DMBIN_AUTO, "Auto" },
{ QPrint::Tractor, DMBIN_TRACTOR, "Tractor" },
{ QPrint::SmallFormat, DMBIN_SMALLFMT, "AnySmallFormat" },
{ QPrint::LargeFormat, DMBIN_LARGEFMT, "AnyLargeFormat" },
{ QPrint::LargeCapacity, DMBIN_LARGECAPACITY, "LargeCapacity" },
{ QPrint::Cassette, DMBIN_CASSETTE, "Cassette" },
{ QPrint::FormSource, DMBIN_FORMSOURCE, "FormSource" },
{ QPrint::Manual, DMBIN_MANUAL, "ManualFeed" },
{ QPrint::OnlyOne, DMBIN_ONLYONE, "OnlyOne" }, // = QPrint::Upper
{ QPrint::CustomInputSlot, DMBIN_USER, "" } // Must always be last row
};
static const OutputBinMap outputBinMap[] = {
{ QPrint::AutoOutputBin, "" }, // Not a PPD defined value, internal use only
{ QPrint::UpperBin, "Upper" },
{ QPrint::LowerBin, "Lower" },
{ QPrint::RearBin, "Rear" },
{ QPrint::CustomOutputBin, "" } // Must always be last row
};
namespace QPrintUtils {
QPrint::InputSlotId inputSlotKeyToInputSlotId(const QByteArray &key)
{
for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) {
if (inputSlotMap[i].key == key)
return inputSlotMap[i].id;
}
return QPrint::CustomInputSlot;
}
QByteArray inputSlotIdToInputSlotKey(QPrint::InputSlotId id)
{
for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) {
if (inputSlotMap[i].id == id)
return QByteArray(inputSlotMap[i].key);
}
return QByteArray();
}
int inputSlotIdToWindowsId(QPrint::InputSlotId id)
{
for (int i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) {
if (inputSlotMap[i].id == id)
return inputSlotMap[i].windowsId;
}
return 0;
}
QPrint::OutputBinId outputBinKeyToOutputBinId(const QByteArray &key)
{
for (int i = 0; outputBinMap[i].id != QPrint::CustomOutputBin; ++i) {
if (outputBinMap[i].key == key)
return outputBinMap[i].id;
}
return QPrint::CustomOutputBin;
}
QByteArray outputBinIdToOutputBinKey(QPrint::OutputBinId id)
{
for (int i = 0; outputBinMap[i].id != QPrint::CustomOutputBin; ++i) {
if (outputBinMap[i].id == id)
return QByteArray(outputBinMap[i].key);
}
return QByteArray();
}
QPrint::InputSlot paperBinToInputSlot(int windowsId, const QString &name)
{
QPrint::InputSlot slot;
slot.name = name;
int i;
for (i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) {
if (inputSlotMap[i].windowsId == windowsId) {
slot.key = inputSlotMap[i].key;
slot.id = inputSlotMap[i].id;
slot.windowsId = inputSlotMap[i].windowsId;
return slot;
}
}
slot.key = inputSlotMap[i].key;
slot.id = inputSlotMap[i].id;
slot.windowsId = windowsId;
return slot;
}
#if (defined Q_OS_MACOS) || (defined Q_OS_UNIX && QT_CONFIG(cups))
// PPD utilities shared by CUPS and Mac plugins requiring CUPS headers
// May turn into a proper internal QPpd class if enough shared between Mac and CUPS,
// but where would it live? Not in base module as don't want to link to CUPS.
// May have to have two copies in plugins to keep in sync.
QPrint::InputSlot ppdChoiceToInputSlot(const ppd_choice_t &choice)
{
QPrint::InputSlot input;
input.key = choice.choice;
input.name = QString::fromUtf8(choice.text);
input.id = inputSlotKeyToInputSlotId(input.key);
input.windowsId = inputSlotMap[input.id].windowsId;
return input;
}
QPrint::OutputBin ppdChoiceToOutputBin(const ppd_choice_t &choice)
{
QPrint::OutputBin output;
output.key = choice.choice;
output.name = QString::fromUtf8(choice.text);
output.id = outputBinKeyToOutputBinId(output.key);
return output;
}
int parsePpdResolution(const QByteArray &value)
{
if (value.isEmpty())
return -1;
// value can be in form 600dpi or 600x600dpi
QByteArray result = value.split('x').at(0);
if (result.endsWith("dpi"))
result.chop(3);
return result.toInt();
}
QPrint::DuplexMode ppdChoiceToDuplexMode(const QByteArray &choice)
{
if (choice == "DuplexTumble")
return QPrint::DuplexShortSide;
else if (choice == "DuplexNoTumble")
return QPrint::DuplexLongSide;
else // None or SimplexTumble or SimplexNoTumble
return QPrint::DuplexNone;
}
#endif // Mac and CUPS PPD Utilities
}
#endif // QT_NO_PRINTER
QT_END_NAMESPACE