summaryrefslogtreecommitdiffstats
path: root/ipc/dbus/RawDBusConnection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/dbus/RawDBusConnection.cpp')
-rw-r--r--ipc/dbus/RawDBusConnection.cpp114
1 files changed, 114 insertions, 0 deletions
diff --git a/ipc/dbus/RawDBusConnection.cpp b/ipc/dbus/RawDBusConnection.cpp
new file mode 100644
index 000000000..420ecfe44
--- /dev/null
+++ b/ipc/dbus/RawDBusConnection.cpp
@@ -0,0 +1,114 @@
+/* -*- Mode: c++; c-basic-offset: 2; indent-tabs-mode: nil; tab-width: 40 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "RawDBusConnection.h"
+#include "base/message_loop.h"
+#include "mozilla/ipc/DBusHelpers.h"
+#include "mozilla/ipc/DBusWatcher.h"
+
+namespace mozilla {
+namespace ipc {
+
+//
+// RawDBusConnection
+//
+
+bool RawDBusConnection::sDBusIsInit(false);
+
+RawDBusConnection::RawDBusConnection()
+{
+}
+
+RawDBusConnection::~RawDBusConnection()
+{
+}
+
+nsresult RawDBusConnection::EstablishDBusConnection()
+{
+ if (!sDBusIsInit) {
+ dbus_bool_t success = dbus_threads_init_default();
+ NS_ENSURE_TRUE(success == TRUE, NS_ERROR_FAILURE);
+ sDBusIsInit = true;
+ }
+
+ DBusError err;
+ dbus_error_init(&err);
+
+ mConnection = already_AddRefed<DBusConnection>(
+ dbus_bus_get_private(DBUS_BUS_SYSTEM, &err));
+
+ if (dbus_error_is_set(&err)) {
+ dbus_error_free(&err);
+ return NS_ERROR_FAILURE;
+ }
+
+ dbus_connection_set_exit_on_disconnect(mConnection, FALSE);
+
+ return NS_OK;
+}
+
+bool RawDBusConnection::Watch()
+{
+ MOZ_ASSERT(MessageLoop::current());
+
+ return NS_SUCCEEDED(DBusWatchConnection(mConnection));
+}
+
+bool RawDBusConnection::Send(DBusMessage* aMessage)
+{
+ MOZ_ASSERT(MessageLoop::current());
+
+ auto rv = DBusSendMessage(mConnection, aMessage);
+
+ if (NS_FAILED(rv)) {
+ dbus_message_unref(aMessage);
+ return false;
+ }
+
+ return true;
+}
+
+bool RawDBusConnection::SendWithReply(DBusReplyCallback aCallback,
+ void* aData,
+ int aTimeout,
+ DBusMessage* aMessage)
+{
+ MOZ_ASSERT(MessageLoop::current());
+
+ auto rv = DBusSendMessageWithReply(mConnection, aCallback, aData, aTimeout,
+ aMessage);
+ if (NS_FAILED(rv)) {
+ return false;
+ }
+
+ dbus_message_unref(aMessage);
+
+ return true;
+}
+
+bool RawDBusConnection::SendWithReply(DBusReplyCallback aCallback,
+ void* aData,
+ int aTimeout,
+ const char* aDestination,
+ const char* aPath,
+ const char* aIntf,
+ const char* aFunc,
+ int aFirstArgType,
+ ...)
+{
+ va_list args;
+ va_start(args, aFirstArgType);
+
+ auto rv = DBusSendMessageWithReply(mConnection, aCallback, aData,
+ aTimeout, aDestination, aPath, aIntf,
+ aFunc, aFirstArgType, args);
+ va_end(args);
+
+ return NS_SUCCEEDED(rv);
+}
+
+}
+}