| Line | Source Code | Coverage |
|---|
| 1 | /**************************************************************************** | - |
| 2 | ** | - |
| 3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
| 4 | ** Contact: http://www.qt-project.org/legal | - |
| 5 | ** | - |
| 6 | ** This file is part of the QtGui module of the Qt Toolkit. | - |
| 7 | ** | - |
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
| 9 | ** Commercial License Usage | - |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
| 11 | ** accordance with the commercial license agreement provided with the | - |
| 12 | ** Software or, alternatively, in accordance with the terms contained in | - |
| 13 | ** a written agreement between you and Digia. For licensing terms and | - |
| 14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
| 15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
| 16 | ** | - |
| 17 | ** GNU Lesser General Public License Usage | - |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
| 19 | ** General Public License version 2.1 as published by the Free Software | - |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
| 21 | ** packaging of this file. Please review the following information to | - |
| 22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
| 23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
| 24 | ** | - |
| 25 | ** In addition, as a special exception, Digia gives you certain additional | - |
| 26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
| 27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
| 28 | ** | - |
| 29 | ** GNU General Public License Usage | - |
| 30 | ** Alternatively, this file may be used under the terms of the GNU | - |
| 31 | ** General Public License version 3.0 as published by the Free Software | - |
| 32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
| 33 | ** packaging of this file. Please review the following information to | - |
| 34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
| 35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
| 36 | ** | - |
| 37 | ** | - |
| 38 | ** $QT_END_LICENSE$ | - |
| 39 | ** | - |
| 40 | ****************************************************************************/ | - |
| 41 | | - |
| 42 | #include "qcups_p.h" | - |
| 43 | | - |
| 44 | #include <qdebug.h> | - |
| 45 | | - |
| 46 | #ifndef QT_NO_CUPS | - |
| 47 | | - |
| 48 | #ifndef QT_LINUXBASE // LSB merges everything into cups.h | - |
| 49 | # include <cups/language.h> | - |
| 50 | #endif | - |
| 51 | #include <qtextcodec.h> | - |
| 52 | | - |
| 53 | QT_BEGIN_NAMESPACE | - |
| 54 | | - |
| 55 | typedef int (*CupsGetDests)(cups_dest_t **dests); | - |
| 56 | typedef void (*CupsFreeDests)(int num_dests, cups_dest_t *dests); | - |
| 57 | typedef const char* (*CupsGetPPD)(const char *printer); | - |
| 58 | typedef int (*CupsMarkOptions)(ppd_file_t *ppd, int num_options, cups_option_t *options); | - |
| 59 | typedef ppd_file_t* (*PPDOpenFile)(const char *filename); | - |
| 60 | typedef void (*PPDMarkDefaults)(ppd_file_t *ppd); | - |
| 61 | typedef int (*PPDMarkOption)(ppd_file_t *ppd, const char *keyword, const char *option); | - |
| 62 | typedef void (*PPDClose)(ppd_file_t *ppd); | - |
| 63 | typedef int (*PPDMarkOption)(ppd_file_t *ppd, const char *keyword, const char *option); | - |
| 64 | typedef void (*CupsFreeOptions)(int num_options, cups_option_t *options); | - |
| 65 | typedef void (*CupsSetDests)(int num_dests, cups_dest_t *dests); | - |
| 66 | typedef cups_lang_t* (*CupsLangGet)(const char *language); | - |
| 67 | typedef const char* (*CupsLangEncoding)(cups_lang_t *language); | - |
| 68 | typedef int (*CupsAddOption)(const char *name, const char *value, int num_options, cups_option_t **options); | - |
| 69 | typedef int (*CupsTempFd)(char *name, int len); | - |
| 70 | typedef int (*CupsPrintFile)(const char * name, const char * filename, const char * title, int num_options, cups_option_t * options); | - |
| 71 | | - |
| 72 | static bool cupsLoaded = false; | - |
| 73 | static int qt_cups_num_printers = 0; | - |
| 74 | static CupsGetDests _cupsGetDests = 0; | - |
| 75 | static CupsFreeDests _cupsFreeDests = 0; | - |
| 76 | static CupsGetPPD _cupsGetPPD = 0; | - |
| 77 | static PPDOpenFile _ppdOpenFile = 0; | - |
| 78 | static PPDMarkDefaults _ppdMarkDefaults = 0; | - |
| 79 | static PPDClose _ppdClose = 0; | - |
| 80 | static CupsMarkOptions _cupsMarkOptions = 0; | - |
| 81 | static PPDMarkOption _ppdMarkOption = 0; | - |
| 82 | static CupsFreeOptions _cupsFreeOptions = 0; | - |
| 83 | static CupsSetDests _cupsSetDests = 0; | - |
| 84 | static CupsLangGet _cupsLangGet = 0; | - |
| 85 | static CupsLangEncoding _cupsLangEncoding = 0; | - |
| 86 | static CupsAddOption _cupsAddOption = 0; | - |
| 87 | static CupsTempFd _cupsTempFd = 0; | - |
| 88 | static CupsPrintFile _cupsPrintFile = 0; | - |
| 89 | | - |
| 90 | static void resolveCups() | - |
| 91 | { | - |
| 92 | QLibrary cupsLib(QLatin1String("cups"), 2); executed (the execution status of this line is deduced): QLibrary cupsLib(QLatin1String("cups"), 2); | - |
| 93 | if(cupsLib.load()) { partially evaluated: cupsLib.load()| yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
| 94 | _cupsGetDests = (CupsGetDests) cupsLib.resolve("cupsGetDests"); executed (the execution status of this line is deduced): _cupsGetDests = (CupsGetDests) cupsLib.resolve("cupsGetDests"); | - |
| 95 | _cupsFreeDests = (CupsFreeDests) cupsLib.resolve("cupsFreeDests"); executed (the execution status of this line is deduced): _cupsFreeDests = (CupsFreeDests) cupsLib.resolve("cupsFreeDests"); | - |
| 96 | _cupsGetPPD = (CupsGetPPD) cupsLib.resolve("cupsGetPPD"); executed (the execution status of this line is deduced): _cupsGetPPD = (CupsGetPPD) cupsLib.resolve("cupsGetPPD"); | - |
| 97 | _cupsLangGet = (CupsLangGet) cupsLib.resolve("cupsLangGet"); executed (the execution status of this line is deduced): _cupsLangGet = (CupsLangGet) cupsLib.resolve("cupsLangGet"); | - |
| 98 | _cupsLangEncoding = (CupsLangEncoding) cupsLib.resolve("cupsLangEncoding"); executed (the execution status of this line is deduced): _cupsLangEncoding = (CupsLangEncoding) cupsLib.resolve("cupsLangEncoding"); | - |
| 99 | _ppdOpenFile = (PPDOpenFile) cupsLib.resolve("ppdOpenFile"); executed (the execution status of this line is deduced): _ppdOpenFile = (PPDOpenFile) cupsLib.resolve("ppdOpenFile"); | - |
| 100 | _ppdMarkDefaults = (PPDMarkDefaults) cupsLib.resolve("ppdMarkDefaults"); executed (the execution status of this line is deduced): _ppdMarkDefaults = (PPDMarkDefaults) cupsLib.resolve("ppdMarkDefaults"); | - |
| 101 | _ppdClose = (PPDClose) cupsLib.resolve("ppdClose"); executed (the execution status of this line is deduced): _ppdClose = (PPDClose) cupsLib.resolve("ppdClose"); | - |
| 102 | _cupsMarkOptions = (CupsMarkOptions) cupsLib.resolve("cupsMarkOptions"); executed (the execution status of this line is deduced): _cupsMarkOptions = (CupsMarkOptions) cupsLib.resolve("cupsMarkOptions"); | - |
| 103 | _ppdMarkOption = (PPDMarkOption) cupsLib.resolve("ppdMarkOption"); executed (the execution status of this line is deduced): _ppdMarkOption = (PPDMarkOption) cupsLib.resolve("ppdMarkOption"); | - |
| 104 | _cupsFreeOptions = (CupsFreeOptions) cupsLib.resolve("cupsFreeOptions"); executed (the execution status of this line is deduced): _cupsFreeOptions = (CupsFreeOptions) cupsLib.resolve("cupsFreeOptions"); | - |
| 105 | _cupsSetDests = (CupsSetDests) cupsLib.resolve("cupsSetDests"); executed (the execution status of this line is deduced): _cupsSetDests = (CupsSetDests) cupsLib.resolve("cupsSetDests"); | - |
| 106 | _cupsAddOption = (CupsAddOption) cupsLib.resolve("cupsAddOption"); executed (the execution status of this line is deduced): _cupsAddOption = (CupsAddOption) cupsLib.resolve("cupsAddOption"); | - |
| 107 | _cupsTempFd = (CupsTempFd) cupsLib.resolve("cupsTempFd"); executed (the execution status of this line is deduced): _cupsTempFd = (CupsTempFd) cupsLib.resolve("cupsTempFd"); | - |
| 108 | _cupsPrintFile = (CupsPrintFile) cupsLib.resolve("cupsPrintFile"); executed (the execution status of this line is deduced): _cupsPrintFile = (CupsPrintFile) cupsLib.resolve("cupsPrintFile"); | - |
| 109 | | - |
| 110 | if (_cupsGetDests && _cupsFreeDests) { partially evaluated: _cupsGetDests| yes Evaluation Count:2 | no Evaluation Count:0 |
partially evaluated: _cupsFreeDests| yes Evaluation Count:2 | no Evaluation Count:0 |
| 0-2 |
| 111 | cups_dest_t *printers; executed (the execution status of this line is deduced): cups_dest_t *printers; | - |
| 112 | int num_printers = _cupsGetDests(&printers); executed (the execution status of this line is deduced): int num_printers = _cupsGetDests(&printers); | - |
| 113 | if (num_printers) partially evaluated: num_printers| no Evaluation Count:0 | yes Evaluation Count:2 |
| 0-2 |
| 114 | _cupsFreeDests(num_printers, printers); never executed: _cupsFreeDests(num_printers, printers); | 0 |
| 115 | qt_cups_num_printers = num_printers; executed (the execution status of this line is deduced): qt_cups_num_printers = num_printers; | - |
| 116 | } executed: }Execution Count:2 | 2 |
| 117 | } executed: }Execution Count:2 | 2 |
| 118 | cupsLoaded = true; executed (the execution status of this line is deduced): cupsLoaded = true; | - |
| 119 | } executed: }Execution Count:2 | 2 |
| 120 | | - |
| 121 | // ================ CUPS Support class ======================== | - |
| 122 | | - |
| 123 | QCUPSSupport::QCUPSSupport() | - |
| 124 | : | - |
| 125 | prnCount(0), | - |
| 126 | printers(0), | - |
| 127 | page_sizes(0), | - |
| 128 | currPrinterIndex(0), | - |
| 129 | currPPD(0) | - |
| 130 | { | - |
| 131 | if (!cupsLoaded) never evaluated: !cupsLoaded | 0 |
| 132 | resolveCups(); never executed: resolveCups(); | 0 |
| 133 | | - |
| 134 | // getting all available printers | - |
| 135 | if (!isAvailable()) never evaluated: !isAvailable() | 0 |
| 136 | return; | 0 |
| 137 | | - |
| 138 | qt_cups_num_printers = prnCount = _cupsGetDests(&printers); never executed (the execution status of this line is deduced): qt_cups_num_printers = prnCount = _cupsGetDests(&printers); | - |
| 139 | | - |
| 140 | for (int i = 0; i < prnCount; ++i) { never evaluated: i < prnCount | 0 |
| 141 | if (printers[i].is_default) { never evaluated: printers[i].is_default | 0 |
| 142 | currPrinterIndex = i; never executed (the execution status of this line is deduced): currPrinterIndex = i; | - |
| 143 | setCurrentPrinter(i); never executed (the execution status of this line is deduced): setCurrentPrinter(i); | - |
| 144 | break; | 0 |
| 145 | } | - |
| 146 | } | 0 |
| 147 | | - |
| 148 | #ifndef QT_NO_TEXTCODEC | - |
| 149 | cups_lang_t *cupsLang = _cupsLangGet(0); never executed (the execution status of this line is deduced): cups_lang_t *cupsLang = _cupsLangGet(0); | - |
| 150 | codec = QTextCodec::codecForName(_cupsLangEncoding(cupsLang)); never executed (the execution status of this line is deduced): codec = QTextCodec::codecForName(_cupsLangEncoding(cupsLang)); | - |
| 151 | if (!codec) | 0 |
| 152 | codec = QTextCodec::codecForLocale(); never executed: codec = QTextCodec::codecForLocale(); | 0 |
| 153 | #endif | - |
| 154 | } | 0 |
| 155 | | - |
| 156 | QCUPSSupport::~QCUPSSupport() | - |
| 157 | { | - |
| 158 | if (currPPD) | 0 |
| 159 | _ppdClose(currPPD); never executed: _ppdClose(currPPD); | 0 |
| 160 | if (prnCount) never evaluated: prnCount | 0 |
| 161 | _cupsFreeDests(prnCount, printers); never executed: _cupsFreeDests(prnCount, printers); | 0 |
| 162 | } | 0 |
| 163 | | - |
| 164 | int QCUPSSupport::availablePrintersCount() const | - |
| 165 | { | - |
| 166 | return prnCount; never executed: return prnCount; | 0 |
| 167 | } | - |
| 168 | | - |
| 169 | const cups_dest_t* QCUPSSupport::availablePrinters() const | - |
| 170 | { | - |
| 171 | return printers; never executed: return printers; | 0 |
| 172 | } | - |
| 173 | | - |
| 174 | const ppd_file_t* QCUPSSupport::currentPPD() const | - |
| 175 | { | - |
| 176 | return currPPD; never executed: return currPPD; | 0 |
| 177 | } | - |
| 178 | | - |
| 179 | const ppd_file_t* QCUPSSupport::setCurrentPrinter(int index) | - |
| 180 | { | - |
| 181 | Q_ASSERT(index >= 0 && index <= prnCount); never executed (the execution status of this line is deduced): qt_noop(); | - |
| 182 | if (index == prnCount) never evaluated: index == prnCount | 0 |
| 183 | return 0; never executed: return 0; | 0 |
| 184 | | - |
| 185 | currPrinterIndex = index; never executed (the execution status of this line is deduced): currPrinterIndex = index; | - |
| 186 | | - |
| 187 | if (currPPD) | 0 |
| 188 | _ppdClose(currPPD); never executed: _ppdClose(currPPD); | 0 |
| 189 | currPPD = 0; never executed (the execution status of this line is deduced): currPPD = 0; | - |
| 190 | page_sizes = 0; never executed (the execution status of this line is deduced): page_sizes = 0; | - |
| 191 | | - |
| 192 | const char *ppdFile = _cupsGetPPD(printers[index].name); never executed (the execution status of this line is deduced): const char *ppdFile = _cupsGetPPD(printers[index].name); | - |
| 193 | | - |
| 194 | if (!ppdFile) never evaluated: !ppdFile | 0 |
| 195 | return 0; never executed: return 0; | 0 |
| 196 | | - |
| 197 | currPPD = _ppdOpenFile(ppdFile); never executed (the execution status of this line is deduced): currPPD = _ppdOpenFile(ppdFile); | - |
| 198 | unlink(ppdFile); never executed (the execution status of this line is deduced): unlink(ppdFile); | - |
| 199 | | - |
| 200 | // marking default options | - |
| 201 | _ppdMarkDefaults(currPPD); never executed (the execution status of this line is deduced): _ppdMarkDefaults(currPPD); | - |
| 202 | | - |
| 203 | // marking options explicitly set | - |
| 204 | _cupsMarkOptions(currPPD, printers[currPrinterIndex].num_options, printers[currPrinterIndex].options); never executed (the execution status of this line is deduced): _cupsMarkOptions(currPPD, printers[currPrinterIndex].num_options, printers[currPrinterIndex].options); | - |
| 205 | | - |
| 206 | // getting pointer to page sizes | - |
| 207 | page_sizes = ppdOption("PageSize"); never executed (the execution status of this line is deduced): page_sizes = ppdOption("PageSize"); | - |
| 208 | | - |
| 209 | return currPPD; never executed: return currPPD; | 0 |
| 210 | } | - |
| 211 | | - |
| 212 | int QCUPSSupport::currentPrinterIndex() const | - |
| 213 | { | - |
| 214 | return currPrinterIndex; never executed: return currPrinterIndex; | 0 |
| 215 | } | - |
| 216 | | - |
| 217 | bool QCUPSSupport::isAvailable() | - |
| 218 | { | - |
| 219 | if(!cupsLoaded) evaluated: !cupsLoaded| yes Evaluation Count:2 | yes Evaluation Count:117 |
| 2-117 |
| 220 | resolveCups(); executed: resolveCups();Execution Count:2 | 2 |
| 221 | | - |
| 222 | return _cupsGetDests && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 223 | _cupsFreeDests && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 224 | _cupsGetPPD && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 225 | _ppdOpenFile && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 226 | _ppdMarkDefaults && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 227 | _ppdClose && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 228 | _cupsMarkOptions && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 229 | _ppdMarkOption && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 230 | _cupsFreeOptions && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 231 | _cupsSetDests && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 232 | _cupsLangGet && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 233 | _cupsLangEncoding && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 234 | _cupsAddOption && executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 235 | (qt_cups_num_printers > 0); executed: return _cupsGetDests && _cupsFreeDests && _cupsGetPPD && _ppdOpenFile && _ppdMarkDefaults && _ppdClose && _cupsMarkOptions && _ppdMarkOption && _cupsFreeOptions && _cupsSetDests && _cupsLangGet && _cupsLangEncoding && _cupsAddOption && (qt_cups_num_printers > 0);Execution Count:119 | 119 |
| 236 | } | - |
| 237 | | - |
| 238 | const ppd_option_t* QCUPSSupport::ppdOption(const char *key) const | - |
| 239 | { | - |
| 240 | if (currPPD) { | 0 |
| 241 | for (int gr = 0; gr < currPPD->num_groups; ++gr) { never evaluated: gr < currPPD->num_groups | 0 |
| 242 | for (int opt = 0; opt < currPPD->groups[gr].num_options; ++opt) { never evaluated: opt < currPPD->groups[gr].num_options | 0 |
| 243 | if (qstrcmp(currPPD->groups[gr].options[opt].keyword, key) == 0) never evaluated: qstrcmp(currPPD->groups[gr].options[opt].keyword, key) == 0 | 0 |
| 244 | return &currPPD->groups[gr].options[opt]; never executed: return &currPPD->groups[gr].options[opt]; | 0 |
| 245 | } | 0 |
| 246 | } | 0 |
| 247 | } | 0 |
| 248 | return 0; never executed: return 0; | 0 |
| 249 | } | - |
| 250 | | - |
| 251 | const cups_option_t* QCUPSSupport::printerOption(const QString &key) const | - |
| 252 | { | - |
| 253 | for (int i = 0; i < printers[currPrinterIndex].num_options; ++i) { never evaluated: i < printers[currPrinterIndex].num_options | 0 |
| 254 | if (QLatin1String(printers[currPrinterIndex].options[i].name) == key) never evaluated: QLatin1String(printers[currPrinterIndex].options[i].name) == key | 0 |
| 255 | return &printers[currPrinterIndex].options[i]; never executed: return &printers[currPrinterIndex].options[i]; | 0 |
| 256 | } | 0 |
| 257 | return 0; never executed: return 0; | 0 |
| 258 | } | - |
| 259 | | - |
| 260 | const ppd_option_t* QCUPSSupport::pageSizes() const | - |
| 261 | { | - |
| 262 | return page_sizes; never executed: return page_sizes; | 0 |
| 263 | } | - |
| 264 | | - |
| 265 | int QCUPSSupport::markOption(const char* name, const char* value) | - |
| 266 | { | - |
| 267 | return _ppdMarkOption(currPPD, name, value); never executed: return _ppdMarkOption(currPPD, name, value); | 0 |
| 268 | } | - |
| 269 | | - |
| 270 | void QCUPSSupport::saveOptions(QList<const ppd_option_t*> options, QList<const char*> markedOptions) | - |
| 271 | { | - |
| 272 | int oldOptionCount = printers[currPrinterIndex].num_options; never executed (the execution status of this line is deduced): int oldOptionCount = printers[currPrinterIndex].num_options; | - |
| 273 | cups_option_t* oldOptions = printers[currPrinterIndex].options; never executed (the execution status of this line is deduced): cups_option_t* oldOptions = printers[currPrinterIndex].options; | - |
| 274 | | - |
| 275 | int newOptionCount = 0; never executed (the execution status of this line is deduced): int newOptionCount = 0; | - |
| 276 | cups_option_t* newOptions = 0; never executed (the execution status of this line is deduced): cups_option_t* newOptions = 0; | - |
| 277 | | - |
| 278 | // copying old options that are not on the new list | - |
| 279 | for (int i = 0; i < oldOptionCount; ++i) { never evaluated: i < oldOptionCount | 0 |
| 280 | bool contains = false; never executed (the execution status of this line is deduced): bool contains = false; | - |
| 281 | for (int j = 0; j < options.count(); ++j) { never evaluated: j < options.count() | 0 |
| 282 | if (qstrcmp(options.at(j)->keyword, oldOptions[i].name) == 0) { never evaluated: qstrcmp(options.at(j)->keyword, oldOptions[i].name) == 0 | 0 |
| 283 | contains = true; never executed (the execution status of this line is deduced): contains = true; | - |
| 284 | break; | 0 |
| 285 | } | - |
| 286 | } | 0 |
| 287 | | - |
| 288 | if (!contains) { never evaluated: !contains | 0 |
| 289 | newOptionCount = _cupsAddOption(oldOptions[i].name, oldOptions[i].value, newOptionCount, &newOptions); never executed (the execution status of this line is deduced): newOptionCount = _cupsAddOption(oldOptions[i].name, oldOptions[i].value, newOptionCount, &newOptions); | - |
| 290 | } | 0 |
| 291 | } | 0 |
| 292 | | - |
| 293 | // we can release old option list | - |
| 294 | _cupsFreeOptions(oldOptionCount, oldOptions); never executed (the execution status of this line is deduced): _cupsFreeOptions(oldOptionCount, oldOptions); | - |
| 295 | | - |
| 296 | // adding marked options | - |
| 297 | for (int i = 0; i < markedOptions.count(); ++i) { never evaluated: i < markedOptions.count() | 0 |
| 298 | const char* name = markedOptions.at(i); never executed (the execution status of this line is deduced): const char* name = markedOptions.at(i); | - |
| 299 | ++i; never executed (the execution status of this line is deduced): ++i; | - |
| 300 | newOptionCount = _cupsAddOption(name, markedOptions.at(i), newOptionCount, &newOptions); never executed (the execution status of this line is deduced): newOptionCount = _cupsAddOption(name, markedOptions.at(i), newOptionCount, &newOptions); | - |
| 301 | } | 0 |
| 302 | | - |
| 303 | // placing the new option list | - |
| 304 | printers[currPrinterIndex].num_options = newOptionCount; never executed (the execution status of this line is deduced): printers[currPrinterIndex].num_options = newOptionCount; | - |
| 305 | printers[currPrinterIndex].options = newOptions; never executed (the execution status of this line is deduced): printers[currPrinterIndex].options = newOptions; | - |
| 306 | | - |
| 307 | // saving new default values | - |
| 308 | _cupsSetDests(prnCount, printers); never executed (the execution status of this line is deduced): _cupsSetDests(prnCount, printers); | - |
| 309 | } | 0 |
| 310 | | - |
| 311 | QRect QCUPSSupport::paperRect(const char *choice) const | - |
| 312 | { | - |
| 313 | if (!currPPD) never evaluated: !currPPD | 0 |
| 314 | return QRect(); never executed: return QRect(); | 0 |
| 315 | for (int i = 0; i < currPPD->num_sizes; ++i) { never evaluated: i < currPPD->num_sizes | 0 |
| 316 | if (qstrcmp(currPPD->sizes[i].name, choice) == 0) never evaluated: qstrcmp(currPPD->sizes[i].name, choice) == 0 | 0 |
| 317 | return QRect(0, 0, qRound(currPPD->sizes[i].width), qRound(currPPD->sizes[i].length)); never executed: return QRect(0, 0, qRound(currPPD->sizes[i].width), qRound(currPPD->sizes[i].length)); | 0 |
| 318 | } | 0 |
| 319 | return QRect(); never executed: return QRect(); | 0 |
| 320 | } | - |
| 321 | | - |
| 322 | QRect QCUPSSupport::pageRect(const char *choice) const | - |
| 323 | { | - |
| 324 | if (!currPPD) never evaluated: !currPPD | 0 |
| 325 | return QRect(); never executed: return QRect(); | 0 |
| 326 | for (int i = 0; i < currPPD->num_sizes; ++i) { never evaluated: i < currPPD->num_sizes | 0 |
| 327 | if (qstrcmp(currPPD->sizes[i].name, choice) == 0) never evaluated: qstrcmp(currPPD->sizes[i].name, choice) == 0 | 0 |
| 328 | return QRect(qRound(currPPD->sizes[i].left), never executed: return QRect(qRound(currPPD->sizes[i].left), qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); | 0 |
| 329 | qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), never executed: return QRect(qRound(currPPD->sizes[i].left), qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); | 0 |
| 330 | qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), never executed: return QRect(qRound(currPPD->sizes[i].left), qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); | 0 |
| 331 | qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); never executed: return QRect(qRound(currPPD->sizes[i].left), qRound(currPPD->sizes[i].length - currPPD->sizes[i].top), qRound(currPPD->sizes[i].right - currPPD->sizes[i].left), qRound(currPPD->sizes[i].top - currPPD->sizes[i].bottom)); | 0 |
| 332 | } | 0 |
| 333 | return QRect(); never executed: return QRect(); | 0 |
| 334 | } | - |
| 335 | | - |
| 336 | QStringList QCUPSSupport::options() const | - |
| 337 | { | - |
| 338 | QStringList list; never executed (the execution status of this line is deduced): QStringList list; | - |
| 339 | collectMarkedOptions(list); never executed (the execution status of this line is deduced): collectMarkedOptions(list); | - |
| 340 | return list; never executed: return list; | 0 |
| 341 | } | - |
| 342 | | - |
| 343 | bool QCUPSSupport::printerHasPPD(const char *printerName) | - |
| 344 | { | - |
| 345 | if (!isAvailable()) never evaluated: !isAvailable() | 0 |
| 346 | return false; never executed: return false; | 0 |
| 347 | const char *ppdFile = _cupsGetPPD(printerName); never executed (the execution status of this line is deduced): const char *ppdFile = _cupsGetPPD(printerName); | - |
| 348 | if (ppdFile) | 0 |
| 349 | unlink(ppdFile); never executed: unlink(ppdFile); | 0 |
| 350 | return (ppdFile != 0); never executed: return (ppdFile != 0); | 0 |
| 351 | } | - |
| 352 | | - |
| 353 | QString QCUPSSupport::unicodeString(const char *s) | - |
| 354 | { | - |
| 355 | #ifndef QT_NO_TEXTCODEC | - |
| 356 | return codec->toUnicode(s); never executed: return codec->toUnicode(s); | 0 |
| 357 | #else | - |
| 358 | return QLatin1String(s); | - |
| 359 | #endif | - |
| 360 | } | - |
| 361 | | - |
| 362 | void QCUPSSupport::collectMarkedOptions(QStringList& list, const ppd_group_t* group) const | - |
| 363 | { | - |
| 364 | if (group == 0) { never evaluated: group == 0 | 0 |
| 365 | if (!currPPD) never evaluated: !currPPD | 0 |
| 366 | return; | 0 |
| 367 | for (int i = 0; i < currPPD->num_groups; ++i) { never evaluated: i < currPPD->num_groups | 0 |
| 368 | collectMarkedOptions(list, &currPPD->groups[i]); never executed (the execution status of this line is deduced): collectMarkedOptions(list, &currPPD->groups[i]); | - |
| 369 | collectMarkedOptionsHelper(list, &currPPD->groups[i]); never executed (the execution status of this line is deduced): collectMarkedOptionsHelper(list, &currPPD->groups[i]); | - |
| 370 | } | 0 |
| 371 | } else { | 0 |
| 372 | for (int i = 0; i < group->num_subgroups; ++i) never evaluated: i < group->num_subgroups | 0 |
| 373 | collectMarkedOptionsHelper(list, &group->subgroups[i]); never executed: collectMarkedOptionsHelper(list, &group->subgroups[i]); | 0 |
| 374 | } | 0 |
| 375 | } | - |
| 376 | | - |
| 377 | void QCUPSSupport::collectMarkedOptionsHelper(QStringList& list, const ppd_group_t* group) const | - |
| 378 | { | - |
| 379 | for (int i = 0; i < group->num_options; ++i) { never evaluated: i < group->num_options | 0 |
| 380 | for (int j = 0; j < group->options[i].num_choices; ++j) { never evaluated: j < group->options[i].num_choices | 0 |
| 381 | if (group->options[i].choices[j].marked == 1 && qstrcmp(group->options[i].choices[j].choice, group->options[i].defchoice) != 0) never evaluated: group->options[i].choices[j].marked == 1 never evaluated: qstrcmp(group->options[i].choices[j].choice, group->options[i].defchoice) != 0 | 0 |
| 382 | list << QString::fromLocal8Bit(group->options[i].keyword) << QString::fromLocal8Bit(group->options[i].choices[j].choice); never executed: list << QString::fromLocal8Bit(group->options[i].keyword) << QString::fromLocal8Bit(group->options[i].choices[j].choice); | 0 |
| 383 | } | 0 |
| 384 | } | 0 |
| 385 | } | 0 |
| 386 | | - |
| 387 | QPair<int, QString> QCUPSSupport::tempFd() | - |
| 388 | { | - |
| 389 | char filename[512]; never executed (the execution status of this line is deduced): char filename[512]; | - |
| 390 | int fd = _cupsTempFd(filename, 512); never executed (the execution status of this line is deduced): int fd = _cupsTempFd(filename, 512); | - |
| 391 | return QPair<int, QString>(fd, QString::fromLocal8Bit(filename)); never executed: return QPair<int, QString>(fd, QString::fromLocal8Bit(filename)); | 0 |
| 392 | } | - |
| 393 | | - |
| 394 | // Prints the given file and returns a job id. | - |
| 395 | int QCUPSSupport::printFile(const char * printerName, const char * filename, const char * title, | - |
| 396 | int num_options, cups_option_t * options) | - |
| 397 | { | - |
| 398 | return _cupsPrintFile(printerName, filename, title, num_options, options); never executed: return _cupsPrintFile(printerName, filename, title, num_options, options); | 0 |
| 399 | } | - |
| 400 | | - |
| 401 | QCUPSSupport::Printer::Printer(const QString &n) : name(n), isDefault(false), cupsPrinterIndex(-1) | - |
| 402 | { | - |
| 403 | } | 0 |
| 404 | | - |
| 405 | QList<QCUPSSupport::Printer> QCUPSSupport::availableUnixPrinters() | - |
| 406 | { | - |
| 407 | QList<Printer> printers; never executed (the execution status of this line is deduced): QList<Printer> printers; | - |
| 408 | | - |
| 409 | if (QCUPSSupport::isAvailable()) { never evaluated: QCUPSSupport::isAvailable() | 0 |
| 410 | QCUPSSupport cups; never executed (the execution status of this line is deduced): QCUPSSupport cups; | - |
| 411 | int cupsPrinterCount = cups.availablePrintersCount(); never executed (the execution status of this line is deduced): int cupsPrinterCount = cups.availablePrintersCount(); | - |
| 412 | const cups_dest_t* cupsPrinters = cups.availablePrinters(); never executed (the execution status of this line is deduced): const cups_dest_t* cupsPrinters = cups.availablePrinters(); | - |
| 413 | for (int i = 0; i < cupsPrinterCount; ++i) { never evaluated: i < cupsPrinterCount | 0 |
| 414 | QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); never executed (the execution status of this line is deduced): QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); | - |
| 415 | if (cupsPrinters[i].instance) never evaluated: cupsPrinters[i].instance | 0 |
| 416 | printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); never executed: printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); | 0 |
| 417 | | - |
| 418 | Printer p(printerName); never executed (the execution status of this line is deduced): Printer p(printerName); | - |
| 419 | if (cupsPrinters[i].is_default) never evaluated: cupsPrinters[i].is_default | 0 |
| 420 | p.isDefault = true; never executed: p.isDefault = true; | 0 |
| 421 | p.cupsPrinterIndex = i; never executed (the execution status of this line is deduced): p.cupsPrinterIndex = i; | - |
| 422 | printers.append(p); never executed (the execution status of this line is deduced): printers.append(p); | - |
| 423 | } | 0 |
| 424 | } | 0 |
| 425 | | - |
| 426 | return printers; never executed: return printers; | 0 |
| 427 | } | - |
| 428 | | - |
| 429 | // preserve names in ascending order for the binary search | - |
| 430 | static const struct NamedPaperSize { | - |
| 431 | const char *const name; | - |
| 432 | QPrinter::PaperSize size; | - |
| 433 | } named_sizes_map[QPrinter::NPageSize] = { | - |
| 434 | { "A0", QPrinter::A0 }, | - |
| 435 | { "A1", QPrinter::A1 }, | - |
| 436 | { "A2", QPrinter::A2 }, | - |
| 437 | { "A3", QPrinter::A3 }, | - |
| 438 | { "A4", QPrinter::A4 }, | - |
| 439 | { "A5", QPrinter::A5 }, | - |
| 440 | { "A6", QPrinter::A6 }, | - |
| 441 | { "A7", QPrinter::A7 }, | - |
| 442 | { "A8", QPrinter::A8 }, | - |
| 443 | { "A9", QPrinter::A9 }, | - |
| 444 | { "B0", QPrinter::B0 }, | - |
| 445 | { "B1", QPrinter::B1 }, | - |
| 446 | { "B10", QPrinter::B10 }, | - |
| 447 | { "B2", QPrinter::B2 }, | - |
| 448 | { "B4", QPrinter::B4 }, | - |
| 449 | { "B5", QPrinter::B5 }, | - |
| 450 | { "B6", QPrinter::B6 }, | - |
| 451 | { "B7", QPrinter::B7 }, | - |
| 452 | { "B8", QPrinter::B8 }, | - |
| 453 | { "B9", QPrinter::B9 }, | - |
| 454 | { "C5E", QPrinter::C5E }, | - |
| 455 | { "Comm10E", QPrinter::Comm10E }, | - |
| 456 | { "Custom", QPrinter::Custom }, | - |
| 457 | { "DLE", QPrinter::DLE }, | - |
| 458 | { "Executive", QPrinter::Executive }, | - |
| 459 | { "Folio", QPrinter::Folio }, | - |
| 460 | { "Ledger", QPrinter::Ledger }, | - |
| 461 | { "Legal", QPrinter::Legal }, | - |
| 462 | { "Letter", QPrinter::Letter }, | - |
| 463 | { "Tabloid", QPrinter::Tabloid } | - |
| 464 | }; | - |
| 465 | | - |
| 466 | inline bool operator<(const char *name, const NamedPaperSize &data) | - |
| 467 | { return qstrcmp(name, data.name) < 0; } never executed: return qstrcmp(name, data.name) < 0; | 0 |
| 468 | inline bool operator<(const NamedPaperSize &data, const char *name) | - |
| 469 | { return qstrcmp(data.name, name) < 0; } never executed: return qstrcmp(data.name, name) < 0; | 0 |
| 470 | | - |
| 471 | static inline QPrinter::PaperSize string2PaperSize(const char *name) | - |
| 472 | { | - |
| 473 | const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name); never executed (the execution status of this line is deduced): const NamedPaperSize *r = qBinaryFind(named_sizes_map, named_sizes_map + QPrinter::NPageSize, name); | - |
| 474 | if (r - named_sizes_map != QPrinter::NPageSize) never evaluated: r - named_sizes_map != QPrinter::NPageSize | 0 |
| 475 | return r->size; never executed: return r->size; | 0 |
| 476 | return QPrinter::Custom; never executed: return QPrinter::Custom; | 0 |
| 477 | } | - |
| 478 | | - |
| 479 | static inline const char *paperSize2String(QPrinter::PaperSize size) | - |
| 480 | { | - |
| 481 | for (int i = 0; i < QPrinter::NPageSize; ++i) { never evaluated: i < QPrinter::NPageSize | 0 |
| 482 | if (size == named_sizes_map[i].size) never evaluated: size == named_sizes_map[i].size | 0 |
| 483 | return named_sizes_map[i].name; never executed: return named_sizes_map[i].name; | 0 |
| 484 | } | 0 |
| 485 | return 0; never executed: return 0; | 0 |
| 486 | } | - |
| 487 | | - |
| 488 | QList<QPrinter::PaperSize> QCUPSSupport::getCupsPrinterPaperSizes(int cupsPrinterIndex) | - |
| 489 | { | - |
| 490 | QList<QPrinter::PaperSize> result; never executed (the execution status of this line is deduced): QList<QPrinter::PaperSize> result; | - |
| 491 | if (!QCUPSSupport::isAvailable() || cupsPrinterIndex < 0) never evaluated: !QCUPSSupport::isAvailable() never evaluated: cupsPrinterIndex < 0 | 0 |
| 492 | return result; never executed: return result; | 0 |
| 493 | // Find paper sizes from CUPS. | - |
| 494 | QCUPSSupport cups; never executed (the execution status of this line is deduced): QCUPSSupport cups; | - |
| 495 | cups.setCurrentPrinter(cupsPrinterIndex); never executed (the execution status of this line is deduced): cups.setCurrentPrinter(cupsPrinterIndex); | - |
| 496 | if (const ppd_option_t* size = cups.pageSizes()) { never evaluated: const ppd_option_t* size = cups.pageSizes() | 0 |
| 497 | for (int j = 0; j < size->num_choices; ++j) never evaluated: j < size->num_choices | 0 |
| 498 | result.append(string2PaperSize(size->choices[j].choice)); never executed: result.append(string2PaperSize(size->choices[j].choice)); | 0 |
| 499 | } | 0 |
| 500 | return result; never executed: return result; | 0 |
| 501 | } | - |
| 502 | | - |
| 503 | QT_END_NAMESPACE | - |
| 504 | | - |
| 505 | #endif // QT_NO_CUPS | - |
| 506 | | - |
| | |