Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Unified Diff: src/common/chromeos/dbus/dbus.cc

Issue 500008: Two changes to the DBus C++ library. (Closed)
Patch Set: Created 11 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/common/chromeos/dbus/dbus.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/common/chromeos/dbus/dbus.cc
diff --git a/src/common/chromeos/dbus/dbus.cc b/src/common/chromeos/dbus/dbus.cc
index 9ca4104b5396ea0d8a5c9fa8ecaf2dc01b3e168f..26e3c76e1e6268953d83d3bcbb6de65e9c0a04a8 100644
--- a/src/common/chromeos/dbus/dbus.cc
+++ b/src/common/chromeos/dbus/dbus.cc
@@ -44,6 +44,38 @@ BusConnection GetSystemBusConnection() {
return BusConnection(result);
}
+BusConnection GetPrivateBusConnection(const char* address) {
+ // Since dbus-glib does not have an API like dbus_g_connection_open_private(),
+ // we have to implement our own.
+
+ // We have to call _dbus_g_value_types_init() to register standard marshalers
+ // just like as dbus_g_bus_get() and dbus_g_connection_open() do, but the
+ // function is not exported. So we call GetPrivateBusConnection() which calls
+ // dbus_g_bus_get() here instead. Note that if we don't call
+ // _dbus_g_value_types_init(), we might get "WARNING **: No demarshaller
+ // registered for type xxxxx" error and might not be able to handle incoming
+ // signals nor method calls.
+ GetSystemBusConnection();
+
+ ::DBusGConnection* result = NULL;
+ ::DBusConnection* raw_connection
+ = ::dbus_connection_open_private(address, NULL);
+ CHECK(raw_connection);
+
+ ::dbus_connection_setup_with_g_main(raw_connection, NULL);
+ // A reference count of |raw_connection| is transferred to |result|. You don't
+ // have to (and should not) unref the |raw_connection|.
+ result = ::dbus_connection_get_g_connection(raw_connection);
+ CHECK(result);
+
+ ::dbus_connection_set_exit_on_disconnect(
+ ::dbus_g_connection_get_connection(result), FALSE);
+
+ // TODO(yusukes): We should call dbus_connection_close() for private
+ // connections.
+ return BusConnection(result);
+}
+
bool RetrieveProperties(const Proxy& proxy,
const char* interface,
glib::ScopedHashTable* result) {
@@ -61,6 +93,36 @@ bool RetrieveProperties(const Proxy& proxy,
return true;
}
+/* static */
+Proxy::value_type Proxy::GetGProxy(const BusConnection& connection,
+ const char* name,
+ const char* path,
+ const char* interface,
+ bool connect_to_name_owner) {
+ value_type result = NULL;
+ if (connect_to_name_owner) {
+ glib::ScopedError error;
+ result = ::dbus_g_proxy_new_for_name_owner(connection.object_,
+ name,
+ path,
+ interface,
+ &Resetter(&error).lvalue());
+ if (!result) {
+ LOG(ERROR) << "Failed to construct proxy: "
+ << (error->message ? error->message : "Unknown Error")
+ << ": " << path;
+ }
+ } else {
+ result = ::dbus_g_proxy_new_for_name(connection.object_,
+ name,
+ path,
+ interface);
+ if (!result) {
+ LOG(ERROR) << "Failed to construct proxy: " << path;
+ }
+ }
+ return result;
+}
} // namespace dbus
} // namespace chromeos
« no previous file with comments | « src/common/chromeos/dbus/dbus.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698