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
=== modified file 'liblibertine/libertined.cpp'
--- liblibertine/libertined.cpp 2017-01-24 16:03:25 +0000
+++ liblibertine/libertined.cpp 2017-02-14 17:48:20 +0000
@@ -30,6 +30,22 @@
30static const auto SERVICE_INTERFACE = "com.canonical.libertine.Service";30static const auto SERVICE_INTERFACE = "com.canonical.libertine.Service";
31static const auto PROGRESS_INTERFACE = "com.canonical.libertine.Service.Progress";31static const auto PROGRESS_INTERFACE = "com.canonical.libertine.Service.Progress";
3232
33/* Class to handle making sure the session bus isn't a singleton
34 which is how QtDBus does it by default. This is a bad thing for
35 a library to do, so we'll make sure we aren't causing global leaks */
36class SessionBus {
37public:
38 QDBusConnection bus;
39 SessionBus() :
40 /* NOTE: Must get the envvar each time or Qt caches that too */
41 bus{QDBusConnection::connectToBus(getenv("DBUS_SESSION_BUS_ADDRESS"), "libertined")}
42 {
43 }
44 ~SessionBus() {
45 QDBusConnection::disconnectFromBus("libertined");
46 }
47};
48
33static QVariantList49static QVariantList
34dbusCall(QDBusConnection const& bus, QString const& iface, QString const& path,50dbusCall(QDBusConnection const& bus, QString const& iface, QString const& path,
35 QString const& method, QVariantList const& args = QVariantList())51 QString const& method, QVariantList const& args = QVariantList())
@@ -119,65 +135,65 @@
119QString135QString
120container_info(char const* container_id, QString const& key)136container_info(char const* container_id, QString const& key)
121{137{
122 auto bus = QDBusConnection::sessionBus();138 SessionBus session;
123 auto path = call(bus, "container_info", QVariantList{QVariant(container_id)});139 auto path = call(session.bus, "container_info", QVariantList{QVariant(container_id)});
124140
125 if (!waitForFinish(bus, path))141 if (!waitForFinish(session.bus, path))
126 {142 {
127 return QString();143 return QString();
128 }144 }
129145
130 auto error = lastError(bus, path);146 auto error = lastError(session.bus, path);
131 if (!error.isEmpty())147 if (!error.isEmpty())
132 {148 {
133 qWarning() << "error:" << error;149 qWarning() << "error:" << error;
134 return QString();150 return QString();
135 }151 }
136152
137 return QJsonDocument::fromJson(result(bus, path).toLatin1()).object().value(key).toString();153 return QJsonDocument::fromJson(result(session.bus, path).toLatin1()).object().value(key).toString();
138}154}
139}155}
140156
141QJsonArray157QJsonArray
142libertined_list()158libertined_list()
143{159{
144 auto bus = QDBusConnection::sessionBus();160 SessionBus session;
145 auto path = call(bus, "list", QVariantList());161 auto path = call(session.bus, "list", QVariantList());
146162
147 if (!waitForFinish(bus, path))163 if (!waitForFinish(session.bus, path))
148 {164 {
149 return QJsonArray();165 return QJsonArray();
150 }166 }
151167
152 auto error = lastError(bus, path);168 auto error = lastError(session.bus, path);
153 if (!error.isEmpty())169 if (!error.isEmpty())
154 {170 {
155 qWarning() << "error:" << error;171 qWarning() << "error:" << error;
156 return QJsonArray();172 return QJsonArray();
157 }173 }
158174
159 return QJsonDocument::fromJson(result(bus, path).toLatin1()).array();175 return QJsonDocument::fromJson(result(session.bus, path).toLatin1()).array();
160}176}
161177
162QJsonArray178QJsonArray
163libertined_list_app_ids(char const* container_id)179libertined_list_app_ids(char const* container_id)
164{180{
165 auto bus = QDBusConnection::sessionBus();181 SessionBus session;
166 auto path = call(bus, "list_app_ids", QVariantList{QVariant(container_id)});182 auto path = call(session.bus, "list_app_ids", QVariantList{QVariant(container_id)});
167183
168 if (!waitForFinish(bus, path))184 if (!waitForFinish(session.bus, path))
169 {185 {
170 return QJsonArray();186 return QJsonArray();
171 }187 }
172188
173 auto error = lastError(bus, path);189 auto error = lastError(session.bus, path);
174 if (!error.isEmpty())190 if (!error.isEmpty())
175 {191 {
176 qWarning() << "error:" << error;192 qWarning() << "error:" << error;
177 return QJsonArray();193 return QJsonArray();
178 }194 }
179195
180 return QJsonDocument::fromJson(result(bus, path).toLatin1()).array();196 return QJsonDocument::fromJson(result(session.bus, path).toLatin1()).array();
181}197}
182198
183QString199QString

Subscribers

People subscribed via source and target branches