Merge lp:~jonas-drange/ubuntu-settings-components/cups-notifications into lp:~phablet-team/ubuntu-settings-components/printer-components

Proposed by Jonas G. Drange
Status: Merged
Approved by: Andrew Hayzen
Approved revision: 227
Merged at revision: 225
Proposed branch: lp:~jonas-drange/ubuntu-settings-components/cups-notifications
Merge into: lp:~phablet-team/ubuntu-settings-components/printer-components
Diff against target: 880 lines (+417/-79)
17 files modified
plugins/Ubuntu/Settings/Printers/CMakeLists.txt (+9/-1)
plugins/Ubuntu/Settings/Printers/backend/backend.h (+25/-5)
plugins/Ubuntu/Settings/Printers/backend/backend_cups.cpp (+46/-9)
plugins/Ubuntu/Settings/Printers/backend/backend_cups.h (+8/-0)
plugins/Ubuntu/Settings/Printers/cups/cupsfacade.cpp (+10/-0)
plugins/Ubuntu/Settings/Printers/cups/cupsfacade.h (+2/-0)
plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.cpp (+61/-0)
plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.h (+2/-0)
plugins/Ubuntu/Settings/Printers/models/printermodel.cpp (+21/-11)
plugins/Ubuntu/Settings/Printers/models/printermodel.h (+5/-5)
plugins/Ubuntu/Settings/Printers/org.cups.cupsd.Notifier.xml (+146/-0)
plugins/Ubuntu/Settings/Printers/printers/printers.cpp (+7/-5)
plugins/Ubuntu/Settings/Printers/printers/printers.h (+2/-4)
tests/unittests/Printers/mockbackend.h (+35/-20)
tests/unittests/Printers/tst_printerfilter.cpp (+8/-6)
tests/unittests/Printers/tst_printermodel.cpp (+28/-11)
tests/unittests/Printers/tst_printers.cpp (+2/-2)
To merge this branch: bzr merge lp:~jonas-drange/ubuntu-settings-components/cups-notifications
Reviewer Review Type Date Requested Status
Andrew Hayzen (community) Approve
Review via email: mp+316253@code.launchpad.net

Commit message

* Deprecate QTimer based update()
* Replace with cups subscription based update()
* Fixes tests.

To post a comment you must log in.
Revision history for this message
Jonas G. Drange (jonas-drange) wrote :
224. By Jonas G. Drange

implements fewer signals

225. By Jonas G. Drange

removes unused stuff

Revision history for this message
Andrew Hayzen (ahayzen) wrote :

This looks good, can you do a pull of trunk. Then this can be approved. We can link the JobModel in a separate branch :-)

226. By Jonas G. Drange

merges trunk

227. By Jonas G. Drange

mock backend returns an empty job list for now

Revision history for this message
Andrew Hayzen (ahayzen) wrote :

LGTM, and the tests pass now :-)

100% tests passed, 0 tests failed out of 7

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'plugins/Ubuntu/Settings/Printers/CMakeLists.txt'
--- plugins/Ubuntu/Settings/Printers/CMakeLists.txt 2017-02-02 16:00:55 +0000
+++ plugins/Ubuntu/Settings/Printers/CMakeLists.txt 2017-02-03 12:26:13 +0000
@@ -2,14 +2,21 @@
22
3add_definitions(-DUBUNTUSETTINGSPRINTERS_LIBRARY)3add_definitions(-DUBUNTUSETTINGSPRINTERS_LIBRARY)
44
5include_directories(${CUPS_INCLUDE_DIR})5include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CUPS_INCLUDE_DIR})
66
7find_package(Qt5Gui REQUIRED)7find_package(Qt5Gui REQUIRED)
8find_package(Qt5PrintSupport REQUIRED)8find_package(Qt5PrintSupport REQUIRED)
9find_package(Qt5Qml REQUIRED)9find_package(Qt5Qml REQUIRED)
10find_package(Qt5DBus REQUIRED)
10find_package(Qt5Concurrent REQUIRED)11find_package(Qt5Concurrent REQUIRED)
1112
13qt5_add_dbus_interface(
14 GEN_SOURCES
15 ${CMAKE_CURRENT_SOURCE_DIR}/org.cups.cupsd.Notifier.xml
16 cupsdnotifier)
17
12add_library(UbuntuSettingsPrintersQml SHARED18add_library(UbuntuSettingsPrintersQml SHARED
19 ${GEN_SOURCES}
13 backend/backend.cpp20 backend/backend.cpp
14 backend/backend_cups.cpp21 backend/backend_cups.cpp
15 backend/backend_pdf.cpp22 backend/backend_pdf.cpp
@@ -29,6 +36,7 @@
29)36)
3037
31target_link_libraries(UbuntuSettingsPrintersQml38target_link_libraries(UbuntuSettingsPrintersQml
39 Qt5::DBus
32 Qt5::Gui40 Qt5::Gui
33 Qt5::PrintSupport41 Qt5::PrintSupport
34 Qt5::Qml42 Qt5::Qml
3543
=== modified file 'plugins/Ubuntu/Settings/Printers/backend/backend.h'
--- plugins/Ubuntu/Settings/Printers/backend/backend.h 2017-02-02 17:22:55 +0000
+++ plugins/Ubuntu/Settings/Printers/backend/backend.h 2017-02-03 12:26:13 +0000
@@ -149,14 +149,34 @@
149 virtual void refresh();149 virtual void refresh();
150150
151Q_SIGNALS:151Q_SIGNALS:
152 void printerAdded(const QString &name);
153 void printerModified(const QString &name, const bool ppdChanged);
154 void printerDeleted(const QString &name);
155 void printerStateChanged(const QString &name);
156
157 void printerDriversLoaded(const QList<PrinterDriver> &drivers);152 void printerDriversLoaded(const QList<PrinterDriver> &drivers);
158 void printerDriversFailedToLoad(const QString &errorMessage);153 void printerDriversFailedToLoad(const QString &errorMessage);
159154
155 void printerAdded(
156 const QString &text,
157 const QString &printerUri,
158 const QString &printerName,
159 uint printerState,
160 const QString &printerStateReason,
161 bool acceptingJobs
162 );
163 void printerDeleted(
164 const QString &text,
165 const QString &printerUri,
166 const QString &printerName,
167 uint printerState,
168 const QString &printerStateReason,
169 bool acceptingJobs
170 );
171 void printerModified(
172 const QString &text,
173 const QString &printerUri,
174 const QString &printerName,
175 uint printerState,
176 const QString &printerStateReason,
177 bool acceptingJobs
178 );
179
160protected:180protected:
161 const QString m_printerName;181 const QString m_printerName;
162};182};
163183
=== modified file 'plugins/Ubuntu/Settings/Printers/backend/backend_cups.cpp'
--- plugins/Ubuntu/Settings/Printers/backend/backend_cups.cpp 2017-02-02 17:22:55 +0000
+++ plugins/Ubuntu/Settings/Printers/backend/backend_cups.cpp 2017-02-03 12:26:13 +0000
@@ -19,29 +19,56 @@
19#include "i18n.h"19#include "i18n.h"
20#include "utils.h"20#include "utils.h"
2121
22#include <QDBusConnection>
2223
23PrinterCupsBackend::PrinterCupsBackend(QObject *parent)24PrinterCupsBackend::PrinterCupsBackend(QObject *parent)
24 : PrinterCupsBackend(new CupsFacade(), QPrinterInfo(), parent)25 : PrinterCupsBackend(new CupsFacade(), QPrinterInfo(),
26 new OrgCupsCupsdNotifierInterface("",
27 CUPSD_NOTIFIER_DBUS_PATH,
28 QDBusConnection::systemBus()),
29 parent)
25{30{
26 // If we create the CupsFacade, we're in charge of RAII.31 // Use proper RAII of things we create:
27 m_cups->setParent(this);32 m_cups->setParent(this);
2833 m_notifier->setParent(this);
29 connect(m_cups, SIGNAL(printerDriversLoaded(const QList<PrinterDriver>&)),
30 this, SIGNAL(printerDriversLoaded(const QList<PrinterDriver>&)));
31 connect(m_cups, SIGNAL(printerDriversFailedToLoad(const QString&)),
32 this, SIGNAL(printerDriversFailedToLoad(const QString&)));
33}34}
3435
35PrinterCupsBackend::PrinterCupsBackend(CupsFacade *cups, QPrinterInfo info,36PrinterCupsBackend::PrinterCupsBackend(CupsFacade *cups, QPrinterInfo info,
37 OrgCupsCupsdNotifierInterface *notifier,
36 QObject *parent)38 QObject *parent)
37 : PrinterBackend(info.printerName(), parent)39 : PrinterBackend(info.printerName(), parent)
38 , m_cups(cups)40 , m_cups(cups)
39 , m_info(info)41 , m_info(info)
42 , m_notifier(notifier)
40{43{
44 connect(m_cups, SIGNAL(printerDriversLoaded(const QList<PrinterDriver>&)),
45 this, SIGNAL(printerDriversLoaded(const QList<PrinterDriver>&)));
46 connect(m_cups, SIGNAL(printerDriversFailedToLoad(const QString&)),
47 this, SIGNAL(printerDriversFailedToLoad(const QString&)));
48
49 connect(m_notifier, SIGNAL(PrinterAdded(const QString&, const QString&,
50 const QString&, uint,
51 const QString&, bool)),
52 this, SIGNAL(printerAdded(const QString&, const QString&,
53 const QString&, uint,
54 const QString&, bool)));
55 connect(m_notifier, SIGNAL(PrinterDeleted(const QString&, const QString&,
56 const QString&, uint,
57 const QString&, bool)),
58 this, SIGNAL(printerDeleted(const QString&, const QString&,
59 const QString&, uint,
60 const QString&, bool)));
61 connect(m_notifier, SIGNAL(PrinterModified(const QString&, const QString&,
62 const QString&, uint,
63 const QString&, bool)),
64 this, SIGNAL(printerModified(const QString&, const QString&,
65 const QString&, uint,
66 const QString&, bool)));
41}67}
4268
43PrinterCupsBackend::~PrinterCupsBackend()69PrinterCupsBackend::~PrinterCupsBackend()
44{70{
71 cancelSubscription();
45}72}
4673
47QString PrinterCupsBackend::printerAdd(const QString &name,74QString PrinterCupsBackend::printerAdd(const QString &name,
@@ -316,14 +343,13 @@
316 QPrinterInfo info = QPrinterInfo::printerInfo(name);343 QPrinterInfo info = QPrinterInfo::printerInfo(name);
317344
318 if (!info.isNull()) {345 if (!info.isNull()) {
319 list.append(new Printer(new PrinterCupsBackend(m_cups, info)));346 list.append(new Printer(new PrinterCupsBackend(m_cups, info, m_notifier)));
320 } else {347 } else {
321 qWarning() << "Printer is null so skipping (" << name << ")";348 qWarning() << "Printer is null so skipping (" << name << ")";
322 }349 }
323 }350 }
324351
325 // Cups allows a faux PDF printer.352 // Cups allows a faux PDF printer.
326 // TODO: Translate.
327 list.append(new Printer(new PrinterPdfBackend(__("Create PDF"))));353 list.append(new Printer(new PrinterPdfBackend(__("Create PDF"))));
328354
329 return list;355 return list;
@@ -362,3 +388,14 @@
362 m_info = QPrinterInfo::printerInfo(m_printerName);388 m_info = QPrinterInfo::printerInfo(m_printerName);
363 }389 }
364}390}
391
392void PrinterCupsBackend::createSubscription()
393{
394 m_cupsSubscriptionId = m_cups->createSubscription();
395}
396
397void PrinterCupsBackend::cancelSubscription()
398{
399 if (m_cupsSubscriptionId > 0)
400 m_cups->cancelSubscription(m_cupsSubscriptionId);
401}
365402
=== modified file 'plugins/Ubuntu/Settings/Printers/backend/backend_cups.h'
--- plugins/Ubuntu/Settings/Printers/backend/backend_cups.h 2017-02-02 17:22:55 +0000
+++ plugins/Ubuntu/Settings/Printers/backend/backend_cups.h 2017-02-03 12:26:13 +0000
@@ -19,14 +19,18 @@
1919
20#include "backend/backend.h"20#include "backend/backend.h"
21#include "cups/cupsfacade.h"21#include "cups/cupsfacade.h"
22#include "cupsdnotifier.h" // Note: this file was generated.
2223
23#include <QPrinterInfo>24#include <QPrinterInfo>
2425
26#define CUPSD_NOTIFIER_DBUS_PATH "/org/cups/cupsd/Notifier"
27
25class PRINTERS_DECL_EXPORT PrinterCupsBackend : public PrinterBackend28class PRINTERS_DECL_EXPORT PrinterCupsBackend : public PrinterBackend
26{29{
27public:30public:
28 explicit PrinterCupsBackend(QObject *parent = Q_NULLPTR);31 explicit PrinterCupsBackend(QObject *parent = Q_NULLPTR);
29 explicit PrinterCupsBackend(CupsFacade *cups, QPrinterInfo info,32 explicit PrinterCupsBackend(CupsFacade *cups, QPrinterInfo info,
33 OrgCupsCupsdNotifierInterface* notifier,
30 QObject *parent = Q_NULLPTR);34 QObject *parent = Q_NULLPTR);
31 virtual ~PrinterCupsBackend() override;35 virtual ~PrinterCupsBackend() override;
3236
@@ -125,10 +129,14 @@
125129
126public Q_SLOTS:130public Q_SLOTS:
127 virtual void refresh() override;131 virtual void refresh() override;
132 void createSubscription();
128133
129private:134private:
135 void cancelSubscription();
130 CupsFacade *m_cups;136 CupsFacade *m_cups;
131 QPrinterInfo m_info;137 QPrinterInfo m_info;
138 OrgCupsCupsdNotifierInterface *m_notifier;
139 int m_cupsSubscriptionId = -1;
132};140};
133141
134#endif // USC_PRINTERS_CUPS_BACKEND_H142#endif // USC_PRINTERS_CUPS_BACKEND_H
135143
=== modified file 'plugins/Ubuntu/Settings/Printers/cups/cupsfacade.cpp'
--- plugins/Ubuntu/Settings/Printers/cups/cupsfacade.cpp 2017-02-02 16:00:55 +0000
+++ plugins/Ubuntu/Settings/Printers/cups/cupsfacade.cpp 2017-02-03 12:26:13 +0000
@@ -433,6 +433,16 @@
433 Q_EMIT requestPrinterDriverCancel();433 Q_EMIT requestPrinterDriverCancel();
434}434}
435435
436int CupsFacade::createSubscription()
437{
438 return helper.createSubscription();
439}
440
441void CupsFacade::cancelSubscription(const int &subscriptionId)
442{
443 helper.cancelSubscription(subscriptionId);
444}
445
436PrinterDriverLoader::PrinterDriverLoader(446PrinterDriverLoader::PrinterDriverLoader(
437 const QString &deviceId, const QString &language,447 const QString &deviceId, const QString &language,
438 const QString &makeModel, const QString &product,448 const QString &makeModel, const QString &product,
439449
=== modified file 'plugins/Ubuntu/Settings/Printers/cups/cupsfacade.h'
--- plugins/Ubuntu/Settings/Printers/cups/cupsfacade.h 2017-02-02 16:00:55 +0000
+++ plugins/Ubuntu/Settings/Printers/cups/cupsfacade.h 2017-02-03 12:26:13 +0000
@@ -92,6 +92,8 @@
92 QList<cups_job_t *> printerGetJobs(const QString &name);92 QList<cups_job_t *> printerGetJobs(const QString &name);
93 int printFileToDest(const QString &filepath, const QString &title,93 int printFileToDest(const QString &filepath, const QString &title,
94 const cups_dest_t *dest);94 const cups_dest_t *dest);
95 int createSubscription();
96 void cancelSubscription(const int &subscriptionId);
9597
96public Q_SLOTS:98public Q_SLOTS:
97 void requestPrinterDrivers(99 void requestPrinterDrivers(
98100
=== modified file 'plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.cpp'
--- plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.cpp 2017-01-30 11:37:07 +0000
+++ plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.cpp 2017-02-03 12:26:13 +0000
@@ -735,3 +735,64 @@
735 return cupsDoRequest(m_connection, request,735 return cupsDoRequest(m_connection, request,
736 resourceChar.toUtf8());736 resourceChar.toUtf8());
737}737}
738
739int CupsPkHelper::createSubscription()
740{
741 ipp_t *req;
742 ipp_t *resp;
743 ipp_attribute_t *attr;
744 int subscriptionId = -1;
745
746 req = ippNewRequest(IPP_CREATE_PRINTER_SUBSCRIPTION);
747 ippAddString(req, IPP_TAG_OPERATION, IPP_TAG_URI,
748 "printer-uri", NULL, "/");
749 ippAddString(req, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD,
750 "notify-events", NULL, "all");
751 ippAddString(req, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI,
752 "notify-recipient-uri", NULL, "dbus://");
753 ippAddInteger(req, IPP_TAG_SUBSCRIPTION, IPP_TAG_INTEGER,
754 "notify-lease-duration", 0);
755
756 resp = cupsDoRequest(m_connection, req,
757 getResource(CphResourceRoot).toUtf8());
758 if (!isReplyOk(resp, true)) {
759 return subscriptionId;
760 }
761
762 attr = ippFindAttribute(resp, "notify-subscription-id", IPP_TAG_INTEGER);
763
764 if (!attr) {
765 qWarning() << "ipp-create-printer-subscription response doesn't"
766 " contain subscription id.";
767 } else {
768 subscriptionId = ippGetInteger(attr, 0);
769 }
770
771 ippDelete (resp);
772
773 return subscriptionId;
774}
775
776void CupsPkHelper::cancelSubscription(const int &subscriptionId)
777{
778 ipp_t *req;
779 ipp_t *resp;
780
781 if (subscriptionId <= 0) {
782 return;
783 }
784
785 req = ippNewRequest(IPP_CANCEL_SUBSCRIPTION);
786 ippAddString(req, IPP_TAG_OPERATION, IPP_TAG_URI,
787 "printer-uri", NULL, "/");
788 ippAddInteger(req, IPP_TAG_OPERATION, IPP_TAG_INTEGER,
789 "notify-subscription-id", subscriptionId);
790
791 resp = cupsDoRequest(m_connection, req,
792 getResource(CphResourceRoot).toUtf8());
793 if (!isReplyOk(resp, true)) {
794 return;
795 }
796
797 ippDelete(resp);
798}
738799
=== modified file 'plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.h'
--- plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.h 2017-01-26 16:14:55 +0000
+++ plugins/Ubuntu/Settings/Printers/cups/cupspkhelper.h 2017-02-03 12:26:13 +0000
@@ -73,6 +73,8 @@
73 const QStringList &includeSchemes = QStringList(),73 const QStringList &includeSchemes = QStringList(),
74 const QStringList &excludeSchemes = QStringList()74 const QStringList &excludeSchemes = QStringList()
75 );75 );
76 int createSubscription();
77 void cancelSubscription(const int &subscriptionId);
7678
77private:79private:
78 enum CphResource80 enum CphResource
7981
=== modified file 'plugins/Ubuntu/Settings/Printers/models/printermodel.cpp'
--- plugins/Ubuntu/Settings/Printers/models/printermodel.cpp 2017-02-02 16:00:55 +0000
+++ plugins/Ubuntu/Settings/Printers/models/printermodel.cpp 2017-02-03 12:26:13 +0000
@@ -24,31 +24,41 @@
24#include <QDebug>24#include <QDebug>
25#include <QQmlEngine>25#include <QQmlEngine>
2626
27PrinterModel::PrinterModel(const int updateIntervalMSecs, QObject *parent)27PrinterModel::PrinterModel(QObject *parent)
28 : PrinterModel(new PrinterCupsBackend, updateIntervalMSecs, parent)28 : PrinterModel(new PrinterCupsBackend, parent)
29{29{
30}30}
3131
32PrinterModel::PrinterModel(PrinterBackend *backend,32PrinterModel::PrinterModel(PrinterBackend *backend, QObject *parent)
33 const int updateIntervalMSecs,
34 QObject *parent)
35 : QAbstractListModel(parent)33 : QAbstractListModel(parent)
36 , m_backend(backend)34 , m_backend(backend)
37{35{
38 update();36 update();
39 startUpdateTimer(updateIntervalMSecs);37
38 QObject::connect(m_backend, &PrinterBackend::printerAdded,
39 this, &PrinterModel::printerSignalCatchall);
40 QObject::connect(m_backend, &PrinterBackend::printerModified,
41 this, &PrinterModel::printerSignalCatchall);
42 QObject::connect(m_backend, &PrinterBackend::printerDeleted,
43 this, &PrinterModel::printerSignalCatchall);
40}44}
4145
42PrinterModel::~PrinterModel()46PrinterModel::~PrinterModel()
43{47{
44}48}
4549
46void PrinterModel::startUpdateTimer(const int &msecs)50void PrinterModel::printerSignalCatchall(
51 const QString &text, const QString &printerUri,
52 const QString &printerName, uint printerState,
53 const QString &printerStateReason, bool acceptingJobs)
47{54{
48 // Start a timer to poll for changes in the printers55 Q_UNUSED(text);
49 m_update_timer.setParent(this);56 Q_UNUSED(printerUri);
50 connect(&m_update_timer, SIGNAL(timeout()), this, SLOT(update()));57 Q_UNUSED(printerName);
51 m_update_timer.start(msecs);58 Q_UNUSED(printerState);
59 Q_UNUSED(printerStateReason);
60 Q_UNUSED(acceptingJobs);
61 update();
52}62}
5363
54void PrinterModel::update()64void PrinterModel::update()
5565
=== modified file 'plugins/Ubuntu/Settings/Printers/models/printermodel.h'
--- plugins/Ubuntu/Settings/Printers/models/printermodel.h 2017-02-02 16:00:55 +0000
+++ plugins/Ubuntu/Settings/Printers/models/printermodel.h 2017-02-03 12:26:13 +0000
@@ -35,9 +35,8 @@
35 Q_OBJECT35 Q_OBJECT
36 Q_PROPERTY(int count READ count NOTIFY countChanged)36 Q_PROPERTY(int count READ count NOTIFY countChanged)
37public:37public:
38 explicit PrinterModel(const int updateIntervalMSecs=5000, QObject *parent = Q_NULLPTR);38 explicit PrinterModel(QObject *parent = Q_NULLPTR);
39 explicit PrinterModel(PrinterBackend *backend, const int updateIntervalMSecs=5000,39 explicit PrinterModel(PrinterBackend *backend, QObject *parent = Q_NULLPTR);
40 QObject *parent = Q_NULLPTR);
41 ~PrinterModel();40 ~PrinterModel();
4241
43 enum Roles42 enum Roles
@@ -80,7 +79,6 @@
8079
81 Q_INVOKABLE QVariantMap get(const int row) const;80 Q_INVOKABLE QVariantMap get(const int row) const;
82private:81private:
83 QTimer m_update_timer;
84 PrinterBackend *m_backend;82 PrinterBackend *m_backend;
8583
86 /* FIXME: there's currently no need to share the Printer obj with QML, so84 /* FIXME: there's currently no need to share the Printer obj with QML, so
@@ -89,8 +87,10 @@
89 QMap<QString, JobModel *> m_job_models;87 QMap<QString, JobModel *> m_job_models;
9088
91private Q_SLOTS:89private Q_SLOTS:
92 void startUpdateTimer(const int &msecs);
93 void update();90 void update();
91 void printerSignalCatchall(const QString &text, const QString &printerUri,
92 const QString &printerName, uint printerState,
93 const QString &printerStateReason, bool acceptingJobs);
9494
95Q_SIGNALS:95Q_SIGNALS:
96 void countChanged();96 void countChanged();
9797
=== added file 'plugins/Ubuntu/Settings/Printers/org.cups.cupsd.Notifier.xml'
--- plugins/Ubuntu/Settings/Printers/org.cups.cupsd.Notifier.xml 1970-01-01 00:00:00 +0000
+++ plugins/Ubuntu/Settings/Printers/org.cups.cupsd.Notifier.xml 2017-02-03 12:26:13 +0000
@@ -0,0 +1,146 @@
1<node>
2
3 <interface name="org.cups.cupsd.Notifier">
4
5 <signal name="ServerStarted">
6 <arg type="s" name="text" />
7 </signal>
8
9 <signal name="ServerRestarted">
10 <arg type="s" name="text" />
11 </signal>
12
13 <signal name="ServerStopped">
14 <arg type="s" name="text" />
15 </signal>
16
17 <signal name="ServerAudit">
18 <arg type="s" name="text" />
19 </signal>
20
21 <signal name="PrinterAdded">
22 <arg type="s" name="text" />
23 <arg type="s" name="printer_uri" />
24 <arg type="s" name="printer_name" />
25 <arg type="u" name="printer_state" />
26 <arg type="s" name="printer_state_reasons" />
27 <arg type="b" name="printer_is_accepting_jobs" />
28 </signal>
29
30 <signal name="PrinterDeleted">
31 <arg type="s" name="text" />
32 <arg type="s" name="printer_uri" />
33 <arg type="s" name="printer_name" />
34 <arg type="u" name="printer_state" />
35 <arg type="s" name="printer_state_reasons" />
36 <arg type="b" name="printer_is_accepting_jobs" />
37 </signal>
38
39 <signal name="PrinterModified">
40 <arg type="s" name="text" />
41 <arg type="s" name="printer_uri" />
42 <arg type="s" name="printer_name" />
43 <arg type="u" name="printer_state" />
44 <arg type="s" name="printer_state_reasons" />
45 <arg type="b" name="printer_is_accepting_jobs" />
46 </signal>
47
48 <signal name="PrinterRestarted">
49 <arg type="s" name="text" />
50 <arg type="s" name="printer_uri" />
51 <arg type="s" name="printer_name" />
52 <arg type="u" name="printer_state" />
53 <arg type="s" name="printer_state_reasons" />
54 <arg type="b" name="printer_is_accepting_jobs" />
55 </signal>
56
57 <signal name="PrinterStopped">
58 <arg type="s" name="text" />
59 <arg type="s" name="printer_uri" />
60 <arg type="s" name="printer_name" />
61 <arg type="u" name="printer_state" />
62 <arg type="s" name="printer_state_reasons" />
63 <arg type="b" name="printer_is_accepting_jobs" />
64 </signal>
65
66 <signal name="PrinterShutdown">
67 <arg type="s" name="text" />
68 <arg type="s" name="printer_uri" />
69 <arg type="s" name="printer_name" />
70 <arg type="u" name="printer_state" />
71 <arg type="s" name="printer_state_reasons" />
72 <arg type="b" name="printer_is_accepting_jobs" />
73 </signal>
74
75 <signal name="PrinterStateChanged">
76 <arg type="s" name="text" />
77 <arg type="s" name="printer_uri" />
78 <arg type="s" name="printer_name" />
79 <arg type="u" name="printer_state" />
80 <arg type="s" name="printer_state_reasons" />
81 <arg type="b" name="printer_is_accepting_jobs" />
82 </signal>
83
84 <signal name="PrinterFinishingsChanged">
85 <arg type="s" name="text" />
86 <arg type="s" name="printer_uri" />
87 <arg type="s" name="printer_name" />
88 <arg type="u" name="printer_state" />
89 <arg type="s" name="printer_state_reasons" />
90 <arg type="b" name="printer_is_accepting_jobs" />
91 </signal>
92
93 <signal name="PrinterMediaChanged">
94 <arg type="s" name="text" />
95 <arg type="s" name="printer_uri" />
96 <arg type="s" name="printer_name" />
97 <arg type="u" name="printer_state" />
98 <arg type="s" name="printer_state_reasons" />
99 <arg type="b" name="printer_is_accepting_jobs" />
100 </signal>
101
102 <signal name="JobCreated">
103 <arg type="s" name="text" />
104 <arg type="s" name="printer_uri" />
105 <arg type="s" name="printer_name" />
106 <arg type="u" name="printer_state" />
107 <arg type="s" name="printer_state_reasons" />
108 <arg type="b" name="printer_is_accepting_jobs" />
109 <arg type="u" name="job_id" />
110 <arg type="u" name="job_state" />
111 <arg type="s" name="job_state_reasons" />
112 <arg type="s" name="job_name" />
113 <arg type="u" name="job_impressions_completed" />
114 </signal>
115
116 <signal name="JobCompleted">
117 <arg type="s" name="text" />
118 <arg type="s" name="printer_uri" />
119 <arg type="s" name="printer_name" />
120 <arg type="u" name="printer_state" />
121 <arg type="s" name="printer_state_reasons" />
122 <arg type="b" name="printer_is_accepting_jobs" />
123 <arg type="u" name="job_id" />
124 <arg type="u" name="job_state" />
125 <arg type="s" name="job_state_reasons" />
126 <arg type="s" name="job_name" />
127 <arg type="u" name="job_impressions_completed" />
128 </signal>
129
130 <signal name="JobState">
131 <arg type="s" name="text" />
132 <arg type="s" name="printer_uri" />
133 <arg type="s" name="printer_name" />
134 <arg type="u" name="printer_state" />
135 <arg type="s" name="printer_state_reasons" />
136 <arg type="b" name="printer_is_accepting_jobs" />
137 <arg type="u" name="job_id" />
138 <arg type="u" name="job_state" />
139 <arg type="s" name="job_state_reasons" />
140 <arg type="s" name="job_name" />
141 <arg type="u" name="job_impressions_completed" />
142 </signal>
143
144 </interface>
145
146</node>
0147
=== modified file 'plugins/Ubuntu/Settings/Printers/printers/printers.cpp'
--- plugins/Ubuntu/Settings/Printers/printers/printers.cpp 2017-02-01 14:56:58 +0000
+++ plugins/Ubuntu/Settings/Printers/printers/printers.cpp 2017-02-03 12:26:13 +0000
@@ -19,17 +19,15 @@
1919
20#include <QQmlEngine>20#include <QQmlEngine>
2121
22Printers::Printers(int printerUpdateIntervalMSecs, QObject *parent)22Printers::Printers(QObject *parent) : Printers(new PrinterCupsBackend, parent)
23 : Printers(new PrinterCupsBackend, printerUpdateIntervalMSecs, parent)
24{23{
25}24}
2625
27Printers::Printers(PrinterBackend *backend, int printerUpdateIntervalMSecs,26Printers::Printers(PrinterBackend *backend, QObject *parent)
28 QObject *parent)
29 : QObject(parent)27 : QObject(parent)
30 , m_backend(backend)28 , m_backend(backend)
31 , m_drivers(backend)29 , m_drivers(backend)
32 , m_model(backend, printerUpdateIntervalMSecs)30 , m_model(backend)
33{31{
34 m_allPrinters.setSourceModel(&m_model);32 m_allPrinters.setSourceModel(&m_model);
35 m_allPrinters.setSortRole(PrinterModel::Roles::DefaultPrinterRole);33 m_allPrinters.setSortRole(PrinterModel::Roles::DefaultPrinterRole);
@@ -45,6 +43,10 @@
4543
46 connect(&m_drivers, SIGNAL(filterComplete()),44 connect(&m_drivers, SIGNAL(filterComplete()),
47 this, SIGNAL(driverFilterChanged()));45 this, SIGNAL(driverFilterChanged()));
46
47 if (m_backend->backendType() == PrinterBackend::BackendType::CupsType) {
48 ((PrinterCupsBackend*) m_backend)->createSubscription();
49 }
48}50}
4951
50Printers::~Printers()52Printers::~Printers()
5153
=== modified file 'plugins/Ubuntu/Settings/Printers/printers/printers.h'
--- plugins/Ubuntu/Settings/Printers/printers/printers.h 2017-02-01 14:56:58 +0000
+++ plugins/Ubuntu/Settings/Printers/printers/printers.h 2017-02-03 12:26:13 +0000
@@ -43,12 +43,10 @@
43 Q_PROPERTY(QString lastMessage READ lastMessage CONSTANT)43 Q_PROPERTY(QString lastMessage READ lastMessage CONSTANT)
4444
45public:45public:
46 explicit Printers(int printerUpdateIntervalMSecs = 5000, QObject *parent = nullptr);46 explicit Printers(QObject *parent = Q_NULLPTR);
4747
48 // Note: Printers takes ownership of backend.48 // Note: Printers takes ownership of backend.
49 explicit Printers(PrinterBackend *backend,49 explicit Printers(PrinterBackend *backend, QObject *parent = Q_NULLPTR);
50 int printerUpdateIntervalMSecs = 5000,
51 QObject *parent = nullptr);
52 ~Printers();50 ~Printers();
5351
54 QAbstractItemModel* allPrinters();52 QAbstractItemModel* allPrinters();
5553
=== modified file 'tests/unittests/Printers/mockbackend.h'
--- tests/unittests/Printers/mockbackend.h 2017-02-02 17:22:55 +0000
+++ tests/unittests/Printers/mockbackend.h 2017-02-03 12:26:13 +0000
@@ -224,10 +224,9 @@
224224
225 virtual QList<QSharedPointer<PrinterJob>> printerGetJobs(const QString &name) override225 virtual QList<QSharedPointer<PrinterJob>> printerGetJobs(const QString &name) override
226 {226 {
227227 return QList<QSharedPointer<PrinterJob>>();
228 }228 }
229229
230
231 virtual QString printerName() const override230 virtual QString printerName() const override
232 {231 {
233 return m_printerName;232 return m_printerName;
@@ -329,24 +328,40 @@
329 }328 }
330329
331330
332 void mockPrinterAdded(const QString &name)331 void mockPrinterAdded(
333 {332 const QString &text,
334 Q_EMIT printerAdded(name);333 const QString &printerUri,
335 }334 const QString &printerName,
336335 uint printerState,
337 void mockPrinterModified(const QString &name, const bool ppdChanged)336 const QString &printerStateReason,
338 {337 bool acceptingJobs
339 Q_EMIT printerModified(name, ppdChanged);338 )
340 }339 {
341340 Q_EMIT printerAdded(text, printerUri, printerName, printerState, printerStateReason, acceptingJobs);
342 void mockPrinterDeleted(const QString &name)341 }
343 {342
344 Q_EMIT printerDeleted(name);343 void mockPrinterModified(
345 }344 const QString &text,
346345 const QString &printerUri,
347 void mockPrinterStateChanged(const QString &name)346 const QString &printerName,
348 {347 uint printerState,
349 Q_EMIT printerStateChanged(name);348 const QString &printerStateReason,
349 bool acceptingJobs
350 )
351 {
352 Q_EMIT printerModified(text, printerUri, printerName, printerState, printerStateReason, acceptingJobs);
353 }
354
355 void mockPrinterDeleted(
356 const QString &text,
357 const QString &printerUri,
358 const QString &printerName,
359 uint printerState,
360 const QString &printerStateReason,
361 bool acceptingJobs
362 )
363 {
364 Q_EMIT printerDeleted(text, printerUri, printerName, printerState, printerStateReason, acceptingJobs);
350 }365 }
351366
352 void mockDriversLoaded(const QList<PrinterDriver> &drivers)367 void mockDriversLoaded(const QList<PrinterDriver> &drivers)
353368
=== modified file 'tests/unittests/Printers/tst_printerfilter.cpp'
--- tests/unittests/Printers/tst_printerfilter.cpp 2017-01-22 14:21:11 +0000
+++ tests/unittests/Printers/tst_printerfilter.cpp 2017-02-03 12:26:13 +0000
@@ -33,7 +33,7 @@
33 void testEmptyCount()33 void testEmptyCount()
34 {34 {
35 QScopedPointer<PrinterBackend> backend(new MockPrinterBackend);35 QScopedPointer<PrinterBackend> backend(new MockPrinterBackend);
36 PrinterModel model(backend.data(), 100);36 PrinterModel model(backend.data());
3737
38 PrinterFilter filter;38 PrinterFilter filter;
39 filter.setSourceModel(&model);39 filter.setSourceModel(&model);
@@ -42,7 +42,7 @@
42 void testNonEmptyCount()42 void testNonEmptyCount()
43 {43 {
44 QScopedPointer<PrinterBackend> backend(new MockPrinterBackend);44 QScopedPointer<PrinterBackend> backend(new MockPrinterBackend);
45 PrinterModel model(backend.data(), 100);45 PrinterModel model(backend.data());
4646
47 PrinterBackend* printerABackend = new MockPrinterBackend("a-printer");47 PrinterBackend* printerABackend = new MockPrinterBackend("a-printer");
48 PrinterBackend* printerBBackend = new MockPrinterBackend("b-printer");48 PrinterBackend* printerBBackend = new MockPrinterBackend("b-printer");
@@ -53,13 +53,14 @@
5353
54 PrinterFilter filter;54 PrinterFilter filter;
55 filter.setSourceModel(&model);55 filter.setSourceModel(&model);
56 ((MockPrinterBackend*) backend.data())->mockPrinterAdded("Test added printer", "", printerA.name(), 0, "", true);
5657
57 QTRY_COMPARE_WITH_TIMEOUT(filter.count(), 2, 101);58 QCOMPARE(filter.count(), 2);
58 }59 }
59 void testCountChanged()60 void testCountChanged()
60 {61 {
61 QScopedPointer<PrinterBackend> backend(new MockPrinterBackend);62 QScopedPointer<PrinterBackend> backend(new MockPrinterBackend);
62 PrinterModel model(backend.data(), 100);63 PrinterModel model(backend.data());
6364
64 PrinterBackend* printerABackend = new MockPrinterBackend("a-printer");65 PrinterBackend* printerABackend = new MockPrinterBackend("a-printer");
65 PrinterBackend* printerBBackend = new MockPrinterBackend("b-printer");66 PrinterBackend* printerBBackend = new MockPrinterBackend("b-printer");
@@ -73,8 +74,9 @@
7374
74 QSignalSpy modelCountSpy(&model, SIGNAL(countChanged()));75 QSignalSpy modelCountSpy(&model, SIGNAL(countChanged()));
75 QSignalSpy filterCountSpy(&filter, SIGNAL(countChanged()));76 QSignalSpy filterCountSpy(&filter, SIGNAL(countChanged()));
76 QTRY_COMPARE_WITH_TIMEOUT(modelCountSpy.count(), 1, 101);77 ((MockPrinterBackend*) backend.data())->mockPrinterAdded("Test added printer", "", printerA.name(), 0, "", true);
77 QTRY_COMPARE_WITH_TIMEOUT(filterCountSpy.count(), 1, 101);78 QCOMPARE(modelCountSpy.count(), 1);
79 QCOMPARE(filterCountSpy.count(), 1);
78 }80 }
79};81};
8082
8183
=== modified file 'tests/unittests/Printers/tst_printermodel.cpp'
--- tests/unittests/Printers/tst_printermodel.cpp 2017-01-22 14:21:11 +0000
+++ tests/unittests/Printers/tst_printermodel.cpp 2017-02-03 12:26:13 +0000
@@ -36,7 +36,7 @@
36 void init()36 void init()
37 {37 {
38 m_backend = new MockPrinterBackend;38 m_backend = new MockPrinterBackend;
39 m_model = new PrinterModel(m_backend, 100);39 m_model = new PrinterModel(m_backend);
40 }40 }
41 void cleanup()41 void cleanup()
42 {42 {
@@ -80,9 +80,10 @@
8080
81 PrinterBackend* printerABackend = new MockPrinterBackend("a-printer");81 PrinterBackend* printerABackend = new MockPrinterBackend("a-printer");
82 Printer* printerA = new Printer(printerABackend);82 Printer* printerA = new Printer(printerABackend);
83 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA;83 getBackend()->m_availablePrinters << printerA;
84 getBackend()->mockPrinterAdded("Test added printer", "", printerA->name(), 0, "", true);
8485
85 QTRY_COMPARE_WITH_TIMEOUT(m_model->count(), 1, 500);86 QCOMPARE(m_model->count(), 1);
86 QCOMPARE(countSpy.count(), 1);87 QCOMPARE(countSpy.count(), 1);
87 QCOMPARE(insertSpy.count(), 1);88 QCOMPARE(insertSpy.count(), 1);
8889
@@ -99,8 +100,10 @@
99 PrinterBackend* printerBBackend = new MockPrinterBackend("b-printer");100 PrinterBackend* printerBBackend = new MockPrinterBackend("b-printer");
100 Printer* printerB = new Printer(printerBBackend);101 Printer* printerB = new Printer(printerBBackend);
101 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA << printerB;102 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA << printerB;
103 getBackend()->mockPrinterAdded("Test added printer", "", printerA->name(), 0, "", true);
104 getBackend()->mockPrinterAdded("Test added printer", "", printerB->name(), 0, "", true);
102105
103 QTRY_COMPARE_WITH_TIMEOUT(m_model->count(), 2, 500);106 QCOMPARE(m_model->count(), 2);
104107
105 // Setup spy and move a printer108 // Setup spy and move a printer
106 int from = 1;109 int from = 1;
@@ -109,7 +112,10 @@
109112
110 // Check signals were fired113 // Check signals were fired
111 QSignalSpy moveSpy(m_model, SIGNAL(rowsMoved(const QModelIndex&, int, int, const QModelIndex&, int)));114 QSignalSpy moveSpy(m_model, SIGNAL(rowsMoved(const QModelIndex&, int, int, const QModelIndex&, int)));
112 QTRY_COMPARE_WITH_TIMEOUT(moveSpy.count(), 1, 500);115
116 getBackend()->mockPrinterModified("Test e.g. renamed printer", "", printerA->name(), 0, "", true);
117
118 QCOMPARE(moveSpy.count(), 1);
113 QCOMPARE(m_model->count(), 2);119 QCOMPARE(m_model->count(), 2);
114120
115 // Check item was moved from -> to121 // Check item was moved from -> to
@@ -127,14 +133,18 @@
127 Printer* printerB = new Printer(printerBBackend);133 Printer* printerB = new Printer(printerBBackend);
128 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA << printerB;134 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA << printerB;
129135
130 QTRY_COMPARE_WITH_TIMEOUT(m_model->count(), 2, 500);136 getBackend()->mockPrinterAdded("Test added printer", "", printerA->name(), 0, "", true);
137 getBackend()->mockPrinterAdded("Test added printer", "", printerB->name(), 0, "", true);
138
139 QCOMPARE(m_model->count(), 2);
131140
132 // Setup spy and remove a printer141 // Setup spy and remove a printer
133 QSignalSpy countSpy(m_model, SIGNAL(countChanged()));142 QSignalSpy countSpy(m_model, SIGNAL(countChanged()));
134 QSignalSpy removeSpy(m_model, SIGNAL(rowsRemoved(const QModelIndex&, int, int)));143 QSignalSpy removeSpy(m_model, SIGNAL(rowsRemoved(const QModelIndex&, int, int)));
135 ((MockPrinterBackend*) m_backend)->m_availablePrinters.removeLast();144 ((MockPrinterBackend*) m_backend)->m_availablePrinters.removeLast();
145 getBackend()->mockPrinterDeleted("Test deleted printer", "", printerB->name(), 0, "", false);
136146
137 QTRY_COMPARE_WITH_TIMEOUT(m_model->count(), 1, 500);147 QCOMPARE(m_model->count(), 1);
138 QCOMPARE(countSpy.count(), 1);148 QCOMPARE(countSpy.count(), 1);
139 QCOMPARE(removeSpy.count(), 1);149 QCOMPARE(removeSpy.count(), 1);
140150
@@ -156,17 +166,20 @@
156 Printer* printerD = new Printer(printerDBackend);166 Printer* printerD = new Printer(printerDBackend);
157 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA << printerB << printerC << printerD;167 ((MockPrinterBackend*) m_backend)->m_availablePrinters << printerA << printerB << printerC << printerD;
158168
159 QTRY_COMPARE_WITH_TIMEOUT(m_model->count(), 4, 500);169 getBackend()->mockPrinterAdded("Test added printer", "", printerA->name(), 0, "", true);
170
171 QCOMPARE(m_model->count(), 4);
160172
161 // Setup spy and remove middle two printers173 // Setup spy and remove middle two printers
162 QSignalSpy countSpy(m_model, SIGNAL(countChanged()));174 QSignalSpy countSpy(m_model, SIGNAL(countChanged()));
163 QSignalSpy removeSpy(m_model, SIGNAL(rowsRemoved(const QModelIndex&, int, int)));175 QSignalSpy removeSpy(m_model, SIGNAL(rowsRemoved(const QModelIndex&, int, int)));
176
164 ((MockPrinterBackend*) m_backend)->m_availablePrinters.removeAt(2);177 ((MockPrinterBackend*) m_backend)->m_availablePrinters.removeAt(2);
165 ((MockPrinterBackend*) m_backend)->m_availablePrinters.removeAt(1);178 ((MockPrinterBackend*) m_backend)->m_availablePrinters.removeAt(1);
166179
167 // Wait until one count signal has been fired180 getBackend()->mockPrinterDeleted("Test deleted printer", "", printerB->name(), 0, "", false);
168 // (to ensure this is only one iteration of update)181
169 QTRY_COMPARE_WITH_TIMEOUT(countSpy.count(), 1, 500);182 QCOMPARE(countSpy.count(), 1);
170 QCOMPARE(m_model->count(), 2);183 QCOMPARE(m_model->count(), 2);
171 QCOMPARE(removeSpy.count(), 2);184 QCOMPARE(removeSpy.count(), 2);
172185
@@ -181,6 +194,10 @@
181 QCOMPARE(args.at(2).toInt(), 1);194 QCOMPARE(args.at(2).toInt(), 1);
182 }195 }
183private:196private:
197 MockPrinterBackend* getBackend()
198 {
199 return (MockPrinterBackend*) m_backend;
200 }
184 PrinterBackend *m_backend;201 PrinterBackend *m_backend;
185 PrinterModel *m_model;202 PrinterModel *m_model;
186};203};
187204
=== modified file 'tests/unittests/Printers/tst_printers.cpp'
--- tests/unittests/Printers/tst_printers.cpp 2017-01-27 13:52:47 +0000
+++ tests/unittests/Printers/tst_printers.cpp 2017-02-03 12:26:13 +0000
@@ -88,10 +88,10 @@
88 PrinterBackend* backend = new MockPrinterBackend;88 PrinterBackend* backend = new MockPrinterBackend;
89 ((MockPrinterBackend*) backend)->m_availablePrinters = in;89 ((MockPrinterBackend*) backend)->m_availablePrinters = in;
9090
91 Printers printers(backend, 100);91 Printers printers(backend);
92 auto all = printers.allPrinters();92 auto all = printers.allPrinters();
9393
94 QTRY_COMPARE_WITH_TIMEOUT(all->rowCount(), out.size(), 101);94 QCOMPARE(all->rowCount(), out.size());
95 for (int i = 0; i < all->rowCount(); i++) {95 for (int i = 0; i < all->rowCount(); i++) {
96 QCOMPARE(96 QCOMPARE(
97 all->data(all->index(i, 0)).toString(),97 all->data(all->index(i, 0)).toString(),

Subscribers

People subscribed via source and target branches