1 /*
2 SPDX-FileCopyrightText: 2010-2018 Daniel Nicoletti <dantti12@gmail.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "AddPrinter.h"
8
9 #include "AddPrinterAssistant.h"
10
11 #include <KCupsRequest.h>
12 #include <KWindowSystem>
13
14 #include <QPointer>
15
16 #include <QLoggingCategory>
17
Q_DECLARE_LOGGING_CATEGORY(PM_ADD_PRINTER)18 Q_DECLARE_LOGGING_CATEGORY(PM_ADD_PRINTER)
19
20 AddPrinter::AddPrinter(int &argc, char **argv) :
21 QApplication(argc, argv)
22 {
23 setQuitOnLastWindowClosed(true);
24 }
25
~AddPrinter()26 AddPrinter::~AddPrinter()
27 {
28 }
29
addPrinter(qulonglong wid)30 void AddPrinter::addPrinter(qulonglong wid)
31 {
32 auto wizard = new AddPrinterAssistant();
33 wizard->initAddPrinter();
34 show(wizard, wid);
35 }
36
addClass(qulonglong wid)37 void AddPrinter::addClass(qulonglong wid)
38 {
39 auto wizard = new AddPrinterAssistant();
40 wizard->initAddClass();
41 show(wizard, wid);
42 }
43
changePPD(qulonglong wid,const QString & name)44 void AddPrinter::changePPD(qulonglong wid, const QString &name)
45 {
46 // Fist we need to get the printer attributes
47 QPointer<KCupsRequest> request = new KCupsRequest;
48 const QStringList attr({
49 KCUPS_PRINTER_TYPE, // needed to know if it's a remote printer
50 KCUPS_PRINTER_MAKE_AND_MODEL,
51 KCUPS_DEVICE_URI
52 });
53 request->getPrinterAttributes(name, false, attr);
54 request->waitTillFinished();
55 if (request) {
56 if (!request->hasError() && request->printers().size() == 1) {
57 const KCupsPrinter printer = request->printers().first();
58 if (printer.type() & CUPS_PRINTER_REMOTE) {
59 qCWarning(PM_ADD_PRINTER) << "Ignoring request, can not change PPD of remote printer" << name;
60 } else {
61 auto wizard = new AddPrinterAssistant();
62 wizard->initChangePPD(name, printer.deviceUri(), printer.makeAndModel());
63 show(wizard, wid);
64 }
65 } else {
66 qWarning() << "Ignoring request, printer not found" << name << request->errorMsg();
67 }
68 request->deleteLater();
69 }
70 }
71
newPrinterFromDevice(qulonglong wid,const QString & name,const QString & device_id)72 void AddPrinter::newPrinterFromDevice(qulonglong wid, const QString &name, const QString &device_id)
73 {
74 // Example of data
75 // "direct"
76 // "MFG:Samsung;CMD:GDI;MDL:SCX-4200 Series;CLS:PRINTER;MODE:PCL;STATUS:IDLE;"
77 // "Samsung SCX-4200 Series"
78 // "Samsung SCX-4200 Series"
79 // "usb://Samsung/SCX-4200%20Series"
80 // ""
81
82 // printer = "Samsung SCX-3400 Series";
83 // deviceId = "MFG:Samsung;CMD:SPL,FWV,PIC,BDN,EXT;MDL:SCX-3400 Series;CLS:PRINTER;MODE:SCN,SPL3,R000105;STATUS:BUSY;";
84
85 // printer = "Samsung SCX-4200 Series";
86 // deviceId = "MFG:Samsung;CMD:GDI;MDL:SCX-4200 Series;CLS:PRINTER;MODE:PCL;STATUS:IDLE;";
87
88 // printer = "HP PSC 1400 series";
89 // deviceId = "MFG:HP;MDL:PSC 1400 series;DES:;CMD:LDL,MLC,PML,DYN;";
90
91 auto wizard = new AddPrinterAssistant();
92 wizard->initAddPrinter(name, device_id);
93 show(wizard, wid);
94 }
95
show(QWidget * widget,qulonglong wid) const96 void AddPrinter::show(QWidget *widget, qulonglong wid) const
97 {
98 widget->show();
99 KWindowSystem::forceActiveWindow(widget->winId());
100 widget->setAttribute(Qt::WA_NativeWindow, true);
101 KWindowSystem::setMainWindow(widget->windowHandle(), wid);
102 }
103
104 #include "moc_AddPrinter.cpp"
105