summaryrefslogtreecommitdiffstats
path: root/src/printsupport/kernel/qprint.cpp
blob: 755da40a0845f248f6350da28df4daa3cd15f28d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// 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

#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