Index: dbus/bus.h |
diff --git a/dbus/bus.h b/dbus/bus.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..529d5be7c1a82ef6f58ed81c363d416257d2d4d2 |
--- /dev/null |
+++ b/dbus/bus.h |
@@ -0,0 +1,136 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef DBUS_BUS_H_ |
+#define DBUS_BUS_H_ |
+#pragma once |
+ |
+#include <string> |
+#include <dbus/dbus.h> |
+ |
+#include "base/callback.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/tracked_objects.h" |
+ |
+namespace base { |
+class Thread; |
+} |
+ |
+namespace dbus { |
+ |
+class ObjectProxy; |
+ |
+// Bus is used to establish a connection with D-Bus, and create object |
+// proxies. |
+// |
+// |
+// For asynchronous method and signal calls, the bus object will use a |
+// separate thread if io_thread option is specified. This is useful if you |
+// want to issue D-Bus calls from UI thread. |
+class Bus { |
+ public: |
+ // Specifies the bus type. SESSION is used to communicate with per-user |
+ // services like GNOME applications. SYSTEM is used to communicate with |
+ // system-wide services like NetworkManager. |
+ enum BusType { |
+ SESSION = DBUS_BUS_SESSION, |
+ SYSTEM = DBUS_BUS_SYSTEM, |
+ }; |
+ |
+ // Specifies the connection type. PRIVATE should usually be used unless |
+ // you are sure that SHARED is safe for you. PRIVATE gives you a private |
+ // connection, that won't be shared with other Bus objects. SHARED gives |
+ // you a connection shared among other Bus objects, which is unsafe if |
+ // the connection is shared with multiple threads. |
+ enum ConnectionType { |
+ PRIVATE, |
+ SHARED, |
+ }; |
+ |
+ // Options used to create a Bus object. |
+ struct Options { |
+ Options(); |
stevenjb
2011/07/29 21:54:17
For a struct should probably just inline the const
satorux1
2011/08/01 19:56:41
That will break the Clang bot. I learned it hard w
satorux1
2011/08/01 20:01:49
I take it back. This struct is probably ok, as mem
|
+ BusType bus_type; |
+ ConnectionType connection_type; |
+ // If the thread is set, the bus object will use this thread to |
+ // process asynchronous method and signal calls. The thread has to be |
+ // 1) already running. 2) has a MessageLoopForIO. |
+ base::Thread* io_thread; |
+ }; |
+ |
+ // Creates a Bus object. The actual connection will be established when |
+ // Init() is called. |
+ Bus(const Options& options); |
stevenjb
2011/07/29 21:54:17
explicit
satorux1
2011/08/01 19:56:41
Done.
|
+ virtual ~Bus(); |
+ |
+ // Gets the object proxy for the given service name and the object path. |
+ // |service_name| looks like "org.freedesktop.NetworkManager", and |
+ // |object_path| looks like "/org/freedesktop/NetworkManager/Devices/0". |
+ // |
+ // This method never returns NULL. The caller should delete the object. |
+ virtual ObjectProxy* GetObjectProxy(const std::string& service_name, |
+ const std::string& object_path); |
+ |
+ // Returns true if the bus is configured to use the IO thread. |
+ bool use_io_thread() { |
+ return io_thread_ != NULL; |
+ } |
+ |
+ private: |
+ friend class ObjectProxy; |
stevenjb
2011/07/29 21:54:17
We should avoid necessitating this friendship if p
satorux1
2011/08/01 19:56:41
Removed them for now.
|
+ DBusConnection* connection() { return connection_; } |
+ base::Thread* io_thread() { return io_thread_; } |
+ |
+ // Initializes the bus by establishing a connection with the D-Bus. |
+ // Returns true on success. |
+ // |
+ // This is a bit tricky but we put off calling this function until when |
+ // we first send a message to the D-Bus, as connecting to D-Bus is a |
+ // blocking call, and we don't want to do this when the Bus object is |
+ // created (that can be in the UI thread). |
+ bool Init(); |
stevenjb
2011/07/29 21:54:17
Should probably rename this since Init() is typica
satorux1
2011/08/01 19:56:41
Good point. Renamed to Connect().
|
+ |
+ // Sets up things needed to start async operations. |
+ void SetUpAsyncOperations(); |
+ |
+ // Processes the all incoming data to the connection, if any. |
+ void ProcessAllIncomingDataIfAny(DBusConnection* connection); |
+ |
+ // Posts the task to the message loop of the IO thread. |
+ virtual void PostTaskToIoThread( |
+ const tracked_objects::Location& from_here, |
+ const base::Closure& task); |
+ |
+ // Called when a watch object is added. |
+ dbus_bool_t OnAddWatch(DBusWatch* raw_watch); |
+ // Called when a watch object is removed. |
+ void OnRemoveWatch(DBusWatch* raw_watch); |
+ // Called when the "enabled" status of |raw_watch| is toggled. |
+ void OnToggleWatch(DBusWatch* raw_watch); |
+ // Called when the dispatch status (i.e. if any incoming data is |
+ // available) is changed. |
+ void OnDispatchStatusChanged(DBusConnection* connection, |
+ DBusDispatchStatus status); |
+ |
+ // Redirects the function call to OnAddWatch(). |
+ static dbus_bool_t OnAddWatchStub(DBusWatch* raw_watch, void* data); |
+ // Redirects the function call to OnRemoveWatch(). |
+ static void OnRemoveWatchStub(DBusWatch* raw_watch, void* data); |
+ // Redirects the function call to OnToggleWatch(). |
+ static void OnToggleWatchStub(DBusWatch* raw_watch, void* data); |
+ // Redirects the function call to OnDispatchStatusChanged(). |
+ static void OnDispatchStatusChangedStub(DBusConnection* connection, |
+ DBusDispatchStatus status, |
+ void* data); |
+ const BusType bus_type_; |
+ const ConnectionType connection_type_; |
+ base::Thread* io_thread_; |
+ DBusConnection* connection_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Bus); |
+}; |
+ |
+} // namespace dbus |
+ |
+#endif // DBUS_BUS_H_ |