Merge lp:~townsend/libertine/qtdbus-connection into lp:libertine/trunk

Proposed by Christopher Townsend
Status: Merged
Approved by: Larry Price
Approved revision: 187
Merged at revision: 189
Proposed branch: lp:~townsend/libertine/qtdbus-connection
Merge into: lp:libertine/trunk
Diff against target: 107 lines (+31/-15)
1 file modified
liblibertine/libertined.cpp (+31/-15)
To merge this branch: bzr merge lp:~townsend/libertine/qtdbus-connection
Reviewer Review Type Date Requested Status
Larry Price Approve
Review via email: mp+317244@code.launchpad.net

Commit message

Ensure we don't leak references to the DBus session bus.

To post a comment you must log in.
Revision history for this message
Larry Price (larryprice) wrote :

lgtm! we can deal with style stuff later.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'liblibertine/libertined.cpp'
2--- liblibertine/libertined.cpp 2017-01-24 16:03:25 +0000
3+++ liblibertine/libertined.cpp 2017-02-14 17:48:20 +0000
4@@ -30,6 +30,22 @@
5 static const auto SERVICE_INTERFACE = "com.canonical.libertine.Service";
6 static const auto PROGRESS_INTERFACE = "com.canonical.libertine.Service.Progress";
7
8+/* Class to handle making sure the session bus isn't a singleton
9+ which is how QtDBus does it by default. This is a bad thing for
10+ a library to do, so we'll make sure we aren't causing global leaks */
11+class SessionBus {
12+public:
13+ QDBusConnection bus;
14+ SessionBus() :
15+ /* NOTE: Must get the envvar each time or Qt caches that too */
16+ bus{QDBusConnection::connectToBus(getenv("DBUS_SESSION_BUS_ADDRESS"), "libertined")}
17+ {
18+ }
19+ ~SessionBus() {
20+ QDBusConnection::disconnectFromBus("libertined");
21+ }
22+};
23+
24 static QVariantList
25 dbusCall(QDBusConnection const& bus, QString const& iface, QString const& path,
26 QString const& method, QVariantList const& args = QVariantList())
27@@ -119,65 +135,65 @@
28 QString
29 container_info(char const* container_id, QString const& key)
30 {
31- auto bus = QDBusConnection::sessionBus();
32- auto path = call(bus, "container_info", QVariantList{QVariant(container_id)});
33+ SessionBus session;
34+ auto path = call(session.bus, "container_info", QVariantList{QVariant(container_id)});
35
36- if (!waitForFinish(bus, path))
37+ if (!waitForFinish(session.bus, path))
38 {
39 return QString();
40 }
41
42- auto error = lastError(bus, path);
43+ auto error = lastError(session.bus, path);
44 if (!error.isEmpty())
45 {
46 qWarning() << "error:" << error;
47 return QString();
48 }
49
50- return QJsonDocument::fromJson(result(bus, path).toLatin1()).object().value(key).toString();
51+ return QJsonDocument::fromJson(result(session.bus, path).toLatin1()).object().value(key).toString();
52 }
53 }
54
55 QJsonArray
56 libertined_list()
57 {
58- auto bus = QDBusConnection::sessionBus();
59- auto path = call(bus, "list", QVariantList());
60+ SessionBus session;
61+ auto path = call(session.bus, "list", QVariantList());
62
63- if (!waitForFinish(bus, path))
64+ if (!waitForFinish(session.bus, path))
65 {
66 return QJsonArray();
67 }
68
69- auto error = lastError(bus, path);
70+ auto error = lastError(session.bus, path);
71 if (!error.isEmpty())
72 {
73 qWarning() << "error:" << error;
74 return QJsonArray();
75 }
76
77- return QJsonDocument::fromJson(result(bus, path).toLatin1()).array();
78+ return QJsonDocument::fromJson(result(session.bus, path).toLatin1()).array();
79 }
80
81 QJsonArray
82 libertined_list_app_ids(char const* container_id)
83 {
84- auto bus = QDBusConnection::sessionBus();
85- auto path = call(bus, "list_app_ids", QVariantList{QVariant(container_id)});
86+ SessionBus session;
87+ auto path = call(session.bus, "list_app_ids", QVariantList{QVariant(container_id)});
88
89- if (!waitForFinish(bus, path))
90+ if (!waitForFinish(session.bus, path))
91 {
92 return QJsonArray();
93 }
94
95- auto error = lastError(bus, path);
96+ auto error = lastError(session.bus, path);
97 if (!error.isEmpty())
98 {
99 qWarning() << "error:" << error;
100 return QJsonArray();
101 }
102
103- return QJsonDocument::fromJson(result(bus, path).toLatin1()).array();
104+ return QJsonDocument::fromJson(result(session.bus, path).toLatin1()).array();
105 }
106
107 QString

Subscribers

People subscribed via source and target branches