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