1ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Use of this source code is governed by a BSD-style license that can be
3ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// found in the LICENSE file.
4ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
5ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#ifndef DBUS_BUS_H_
6ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#define DBUS_BUS_H_
7ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
8ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <dbus/dbus.h>
9cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h>
10ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
11ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <map>
12ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <set>
13ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <string>
14ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <utility>
15ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include <vector>
16ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
17ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/callback.h"
18cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/macros.h"
19ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/memory/ref_counted.h"
20ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/synchronization/waitable_event.h"
21ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "base/threading/platform_thread.h"
22ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/dbus_export.h"
23ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#include "dbus/object_path.h"
24ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
25ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace base {
26ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass SequencedTaskRunner;
27ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass SingleThreadTaskRunner;
28ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass TaskRunner;
29ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}
30ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
31ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace tracked_objects {
32ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass Location;
33ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}
34ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
35ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratnamespace dbus {
36ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
37ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass ExportedObject;
38ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass ObjectManager;
39ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass ObjectProxy;
40ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
41ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Bus is used to establish a connection with D-Bus, create object
42ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// proxies, and export objects.
43ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
44ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// For asynchronous operations such as an asynchronous method call, the
45ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// bus object will use a task runner to monitor the underlying file
46ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// descriptor used for D-Bus communication. By default, the bus will use
47ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// the current thread's task runner. If |dbus_task_runner| option is
48ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// specified, the bus will use that task runner instead.
49ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
50ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// THREADING
51ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
52ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// In the D-Bus library, we use the two threads:
53ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
54ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// - The origin thread: the thread that created the Bus object.
55ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// - The D-Bus thread: the thread servicing |dbus_task_runner|.
56ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
57ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// The origin thread is usually Chrome's UI thread. The D-Bus thread is
58ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// usually a dedicated thread for the D-Bus library.
59ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
60ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// BLOCKING CALLS
61ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
62ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Functions that issue blocking calls are marked "BLOCKING CALL" and
63ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// these functions should be called in the D-Bus thread (if
64ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// supplied). AssertOnDBusThread() is placed in these functions.
65ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
66ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Note that it's hard to tell if a libdbus function is actually blocking
67ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// or not (ex. dbus_bus_request_name() internally calls
68ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// dbus_connection_send_with_reply_and_block(), which is a blocking
69ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// call). To err on the safe side, we consider all libdbus functions that
70ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// deal with the connection to dbus-daemon to be blocking.
71ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
72ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// SHUTDOWN
73ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
74ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// The Bus object must be shut down manually by ShutdownAndBlock() and
75ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// friends. We require the manual shutdown to make the operation explicit
76ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// rather than doing it silently in the destructor.
77ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
78ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// EXAMPLE USAGE:
79ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
80ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Synchronous method call:
81ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
82ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   dbus::Bus::Options options;
83ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   // Set up the bus options here.
84ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   ...
85ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   dbus::Bus bus(options);
86ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
87ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   dbus::ObjectProxy* object_proxy =
88ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//       bus.GetObjectProxy(service_name, object_path);
89ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
90ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   dbus::MethodCall method_call(interface_name, method_name);
91ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   scoped_ptr<dbus::Response> response(
92ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//       object_proxy.CallMethodAndBlock(&method_call, timeout_ms));
93ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   if (response.get() != NULL) {  // Success.
94ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     ...
95ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   }
96ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
97ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Asynchronous method call:
98ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
99ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   void OnResponse(dbus::Response* response) {
100ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // response is NULL if the method call failed.
101ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     if (!response)
102ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//       return;
103ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   }
104ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
105ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   ...
106ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   object_proxy.CallMethod(&method_call, timeout_ms,
107ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//                           base::Bind(&OnResponse));
108ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
109ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Exporting a method:
110ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
111ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   void Echo(dbus::MethodCall* method_call,
112ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//             dbus::ExportedObject::ResponseSender response_sender) {
113ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // Do something with method_call.
114ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     Response* response = Response::FromMethodCall(method_call);
115ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // Build response here.
116ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // Can send an immediate response here to implement a synchronous service
117ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // or store the response_sender and send a response later to implement an
118ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // asynchronous service.
119ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     response_sender.Run(response);
120ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   }
121ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
122ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   void OnExported(const std::string& interface_name,
123ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//                   const ObjectPath& object_path,
124ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//                   bool success) {
125ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//     // success is true if the method was exported successfully.
126ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   }
127ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
128ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   ...
129ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   dbus::ExportedObject* exported_object =
130ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//       bus.GetExportedObject(service_name, object_path);
131ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//   exported_object.ExportMethod(interface_name, method_name,
132ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//                                base::Bind(&Echo),
133ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//                                base::Bind(&OnExported));
134ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
135ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// WHY IS THIS A REF COUNTED OBJECT?
136ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat//
137ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// Bus is a ref counted object, to ensure that |this| of the object is
138ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// alive when callbacks referencing |this| are called. However, after the
139ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// bus is shut down, |connection_| can be NULL. Hence, callbacks should
140ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat// not rely on that |connection_| is alive.
141ae6a045d2239408e25198ad17e2413bdde105788Daniel Eratclass CHROME_DBUS_EXPORT Bus : public base::RefCountedThreadSafe<Bus> {
142ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat public:
143ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Specifies the bus type. SESSION is used to communicate with per-user
144ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // services like GNOME applications. SYSTEM is used to communicate with
145ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // system-wide services like NetworkManager. CUSTOM_ADDRESS is used to
146ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // communicate with an user specified address.
147ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum BusType {
148ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    SESSION = DBUS_BUS_SESSION,
149ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    SYSTEM = DBUS_BUS_SYSTEM,
150ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    CUSTOM_ADDRESS,
151ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
152ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
153ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Specifies the connection type. PRIVATE should usually be used unless
154ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // you are sure that SHARED is safe for you, which is unlikely the case
155ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // in Chrome.
156ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
157ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // PRIVATE gives you a private connection, that won't be shared with
158ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // other Bus objects.
159ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
160ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // SHARED gives you a connection shared among other Bus objects, which
161ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // is unsafe if the connection is shared with multiple threads.
162ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum ConnectionType {
163ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    PRIVATE,
164ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    SHARED,
165ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
166ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
167ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Specifies whether the GetServiceOwnerAndBlock call should report or
168ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // suppress errors.
169ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum GetServiceOwnerOption {
170ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    REPORT_ERRORS,
171ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    SUPPRESS_ERRORS,
172ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
173ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
174ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Specifies service ownership options.
175ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
176ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // REQUIRE_PRIMARY indicates that you require primary ownership of the
177ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // service name.
178ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
179ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // ALLOW_REPLACEMENT indicates that you'll allow another connection to
180ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // steal ownership of this service name from you.
181ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
182ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // REQUIRE_PRIMARY_ALLOW_REPLACEMENT does the obvious.
183ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  enum ServiceOwnershipOptions {
184ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    REQUIRE_PRIMARY = (DBUS_NAME_FLAG_DO_NOT_QUEUE |
185ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                       DBUS_NAME_FLAG_REPLACE_EXISTING),
186ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    REQUIRE_PRIMARY_ALLOW_REPLACEMENT = (REQUIRE_PRIMARY |
187ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                         DBUS_NAME_FLAG_ALLOW_REPLACEMENT),
188ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
189ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
190ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Options used to create a Bus object.
191ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  struct CHROME_DBUS_EXPORT Options {
192ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    Options();
193ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ~Options();
194ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
195ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    BusType bus_type;  // SESSION by default.
196ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    ConnectionType connection_type;  // PRIVATE by default.
197ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // If dbus_task_runner is set, the bus object will use that
198ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // task runner to process asynchronous operations.
199ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //
200ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // The thread servicing the task runner should meet the following
201ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // requirements:
202ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // 1) Already running.
203ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // 2) Has a MessageLoopForIO.
204ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    scoped_refptr<base::SequencedTaskRunner> dbus_task_runner;
205ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
206ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // Specifies the server addresses to be connected. If you want to
207ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // communicate with non dbus-daemon such as ibus-daemon, set |bus_type| to
208ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // CUSTOM_ADDRESS, and |address| to the D-Bus server address you want to
209ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // connect to. The format of this address value is the dbus address style
210ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // which is described in
211ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // http://dbus.freedesktop.org/doc/dbus-specification.html#addresses
212ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //
213ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    // EXAMPLE USAGE:
214ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //   dbus::Bus::Options options;
215ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //   options.bus_type = CUSTOM_ADDRESS;
216ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //   options.address.assign("unix:path=/tmp/dbus-XXXXXXX");
217ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //   // Set up other options
218ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //   dbus::Bus bus(options);
219ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //
220ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //   // Do something.
221ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    //
222ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat    std::string address;
223ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  };
224ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
225ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Creates a Bus object. The actual connection will be established when
226ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Connect() is called.
227ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  explicit Bus(const Options& options);
228ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
229ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when an ownership request is complete.
230ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Parameters:
231ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - the requested service name.
232ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - whether ownership has been obtained or not.
233ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void (const std::string&, bool)> OnOwnershipCallback;
234ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
235ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when GetServiceOwner() completes.
236ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_owner| is the return value from GetServiceOwnerAndBlock().
237ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef base::Callback<void (const std::string& service_owner)>
238ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      GetServiceOwnerCallback;
239ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
240ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // TODO(satorux): Remove the service name parameter as the caller of
241ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // RequestOwnership() knows the service name.
242ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
243ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the object proxy for the given service name and the object path.
244ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The caller must not delete the returned object.
245ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
246ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns an existing object proxy if the bus object already owns the
247ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // object proxy for the given service name and the object path.
248ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Never returns NULL.
249ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
250ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The bus will own all object proxies created by the bus, to ensure
251ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // that the object proxies are detached from remote objects at the
252ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // shutdown time of the bus.
253ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
254ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The object proxy is used to call methods of remote objects, and
255ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // receive signals from them.
256ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
257ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_name| looks like "org.freedesktop.NetworkManager", and
258ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |object_path| looks like "/org/freedesktop/NetworkManager/Devices/0".
259ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
260ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
261ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ObjectProxy* GetObjectProxy(const std::string& service_name,
262ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                      const ObjectPath& object_path);
263ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
264ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Same as above, but also takes a bitfield of ObjectProxy::Options.
265ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // See object_proxy.h for available options.
266ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ObjectProxy* GetObjectProxyWithOptions(
267ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& service_name,
268ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const ObjectPath& object_path,
269ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      int options);
270ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
271ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Removes the previously created object proxy for the given service
272ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // name and the object path and releases its memory.
273ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
274ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // If and object proxy for the given service name and object was
275ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // created with GetObjectProxy, this function removes it from the
276ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // bus object and detaches the ObjectProxy, invalidating any pointer
277ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // previously acquired for it with GetObjectProxy. A subsequent call
278ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // to GetObjectProxy will return a new object.
279ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
280ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // All the object proxies are detached from remote objects at the
281ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // shutdown time of the bus, but they can be detached early to reduce
282ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // memory footprint and used match rules for the bus connection.
283ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
284ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_name| looks like "org.freedesktop.NetworkManager", and
285ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |object_path| looks like "/org/freedesktop/NetworkManager/Devices/0".
286ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |callback| is called when the object proxy is successfully removed and
287ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // detached.
288ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
289ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The function returns true when there is an object proxy matching the
290ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_name| and |object_path| to remove, and calls |callback| when it
291ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // is removed. Otherwise, it returns false and the |callback| function is
292c1e61c51d2705905445d148721157030614694cdPeter Qiu  // never called. The |callback| argument must not be null.
293ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
294ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
295ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool RemoveObjectProxy(const std::string& service_name,
296ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 const ObjectPath& object_path,
297ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 const base::Closure& callback);
298ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
299ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Same as above, but also takes a bitfield of ObjectProxy::Options.
300ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // See object_proxy.h for available options.
301ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool RemoveObjectProxyWithOptions(
302ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& service_name,
303ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const ObjectPath& object_path,
304ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      int options,
305ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const base::Closure& callback);
306ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
307ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the exported object for the given object path.
308ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The caller must not delete the returned object.
309ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
310ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns an existing exported object if the bus object already owns
311ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the exported object for the given object path. Never returns NULL.
312ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
313ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The bus will own all exported objects created by the bus, to ensure
314ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // that the exported objects are unregistered at the shutdown time of
315ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the bus.
316ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
317ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The exported object is used to export methods of local objects, and
318ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // send signal from them.
319ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
320ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
321ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ExportedObject* GetExportedObject(const ObjectPath& object_path);
322ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
323ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Unregisters the exported object for the given object path |object_path|.
324ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
325ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Getting an exported object for the same object path after this call
326ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // will return a new object, method calls on any remaining copies of the
327ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // previous object will not be called.
328ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
329ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
330ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void UnregisterExportedObject(const ObjectPath& object_path);
331ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
332ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
333ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets an object manager for the given remote object path |object_path|
334ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // exported by the service |service_name|.
335ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
336ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns an existing object manager if the bus object already owns a
337ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // matching object manager, never returns NULL.
338ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
339ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The caller must not delete the returned object, the bus retains ownership
340ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // of all object managers.
341ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
342ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
343ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ObjectManager* GetObjectManager(const std::string& service_name,
344ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                          const ObjectPath& object_path);
345ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
346ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Unregisters the object manager for the given remote object path
347ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |object_path| exported by the srevice |service_name|.
348ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
349ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Getting an object manager for the same remote object after this call
350ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // will return a new object, method calls on any remaining copies of the
351ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // previous object are not permitted.
352ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
353ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // This method will asynchronously clean up any match rules that have been
354ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // added for the object manager and invoke |callback| when the operation is
355ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // complete. If this method returns false, then |callback| is never called.
356ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The |callback| argument must not be null.
357ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
358ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
359ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool RemoveObjectManager(const std::string& service_name,
360ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                   const ObjectPath& object_path,
361ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                   const base::Closure& callback);
362ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
363ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Instructs all registered object managers to retrieve their set of managed
364ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // objects from their respective remote objects. There is no need to call this
365ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // manually, this is called automatically by the D-Bus thread manager once
366ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // implementation classes are registered.
367ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void GetManagedObjects();
368ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
369ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Shuts down the bus and blocks until it's done. More specifically, this
370ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function does the following:
371ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
372ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - Unregisters the object paths
373ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - Releases the service names
374ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // - Closes the connection to dbus-daemon.
375ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
376ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // This function can be called multiple times and it is no-op for the 2nd time
377ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // calling.
378ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
379ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
380ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void ShutdownAndBlock();
381ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
382ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Similar to ShutdownAndBlock(), but this function is used to
383ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // synchronously shut down the bus that uses the D-Bus thread. This
384ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // function is intended to be used at the very end of the browser
385ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // shutdown, where it makes more sense to shut down the bus
386ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // synchronously, than trying to make it asynchronous.
387ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
388ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL, but must be called in the origin thread.
389ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void ShutdownOnDBusThreadAndBlock();
390ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
391ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true if the shutdown has been completed.
392ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool shutdown_completed() { return shutdown_completed_; }
393ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
394ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
395ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The public functions below are not intended to be used in client
396ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // code. These are used to implement ObjectProxy and ExportedObject.
397ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
398ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
399ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Connects the bus to the dbus-daemon.
400ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true on success, or the bus is already connected.
401ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
402ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
403ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool Connect();
404ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
405ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Disconnects the bus from the dbus-daemon.
406ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Safe to call multiple times and no operation after the first call.
407ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Do not call for shared connection it will be released by libdbus.
408ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
409ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
410ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void ClosePrivateConnection();
411ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
412ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Requests the ownership of the service name given by |service_name|.
413ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // See also RequestOwnershipAndBlock().
414ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
415ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |on_ownership_callback| is called when the service name is obtained
416ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // or failed to be obtained, in the origin thread.
417ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
418ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
419ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void RequestOwnership(const std::string& service_name,
420ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                ServiceOwnershipOptions options,
421ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                OnOwnershipCallback on_ownership_callback);
422ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
423ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Requests the ownership of the given service name.
424ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true on success, or the the service name is already obtained.
425ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
426ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Note that it's important to expose methods before requesting a service
427ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // name with this method.  See also ExportedObject::ExportMethodAndBlock()
428ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // for details.
429ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
430ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
431ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool RequestOwnershipAndBlock(const std::string& service_name,
432ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                        ServiceOwnershipOptions options);
433ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
434ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Releases the ownership of the given service name.
435ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true on success.
436ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
437ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
438ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool ReleaseOwnership(const std::string& service_name);
439ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
440ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Sets up async operations.
441ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true on success, or it's already set up.
442ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // This function needs to be called before starting async operations.
443ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
444ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
445ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool SetUpAsyncOperations();
446ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
447ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Sends a message to the bus and blocks until the response is
448ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // received. Used to implement synchronous method calls.
449ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
450ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
451ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual DBusMessage* SendWithReplyAndBlock(DBusMessage* request,
452ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                             int timeout_ms,
453ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                             DBusError* error);
454ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
455ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Requests to send a message to the bus. The reply is handled with
456ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |pending_call| at a later time.
457ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
458ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
459ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void SendWithReply(DBusMessage* request,
460ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                             DBusPendingCall** pending_call,
461ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                             int timeout_ms);
462ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
463ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Requests to send a message to the bus. The message serial number will
464ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // be stored in |serial|.
465ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
466ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
467cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko  virtual void Send(DBusMessage* request, uint32_t* serial);
468ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
469ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Adds the message filter function. |filter_function| will be called
470ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // when incoming messages are received.
471ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
472ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // When a new incoming message arrives, filter functions are called in
473ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the order that they were added until the the incoming message is
474ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // handled by a filter function.
475ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
476ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The same filter function associated with the same user data cannot be
477ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // added more than once.
478ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
479ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
480ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void AddFilterFunction(DBusHandleMessageFunction filter_function,
481ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 void* user_data);
482ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
483ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Removes the message filter previously added by AddFilterFunction().
484ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
485ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
486ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void RemoveFilterFunction(DBusHandleMessageFunction filter_function,
487ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                    void* user_data);
488ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
489ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Adds the match rule. Messages that match the rule will be processed
490ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // by the filter functions added by AddFilterFunction().
491ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
492ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // You cannot specify which filter function to use for a match rule.
493ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Instead, you should check if an incoming message is what you are
494ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // interested in, in the filter functions.
495ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
496ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The same match rule can be added more than once and should be removed
497ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // as many times as it was added.
498ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
499ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The match rule looks like:
500ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // "type='signal', interface='org.chromium.SomeInterface'".
501ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
502ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // See "Message Bus Message Routing" section in the D-Bus specification
503ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // for details about match rules:
504ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // http://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-routing
505ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
506ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
507ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void AddMatch(const std::string& match_rule, DBusError* error);
508ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
509ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Removes the match rule previously added by AddMatch().
510ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns false if the requested match rule is unknown or has already been
511ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // removed. Otherwise, returns true and sets |error| accordingly.
512ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
513ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
514ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool RemoveMatch(const std::string& match_rule, DBusError* error);
515ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
516ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Tries to register the object path. Returns true on success.
517ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns false if the object path is already registered.
518ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
519ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |message_function| in |vtable| will be called every time when a new
520ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |message sent to the object path arrives.
521ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
522ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The same object path must not be added more than once.
523ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
524ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // See also documentation of |dbus_connection_try_register_object_path| at
525ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // http://dbus.freedesktop.org/doc/api/html/group__DBusConnection.html
526ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
527ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
528ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool TryRegisterObjectPath(const ObjectPath& object_path,
529ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                     const DBusObjectPathVTable* vtable,
530ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                     void* user_data,
531ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                     DBusError* error);
532ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
533ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Unregister the object path.
534ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
535ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
536ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void UnregisterObjectPath(const ObjectPath& object_path);
537ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
538ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns the task runner of the D-Bus thread.
539ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual base::TaskRunner* GetDBusTaskRunner();
540ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
541ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns the task runner of the thread that created the bus.
542ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual base::TaskRunner* GetOriginTaskRunner();
543ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
544ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true if the bus has the D-Bus thread.
545ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual bool HasDBusThread();
546ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
547ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Check whether the current thread is on the origin thread (the thread
548ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // that created the bus). If not, DCHECK will fail.
549ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void AssertOnOriginThread();
550ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
551ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Check whether the current thread is on the D-Bus thread. If not,
552ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // DCHECK will fail. If the D-Bus thread is not supplied, it calls
553ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // AssertOnOriginThread().
554ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void AssertOnDBusThread();
555ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
556ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Gets the owner for |service_name| via org.freedesktop.DBus.GetNameOwner.
557ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns the owner name, if any, or an empty string on failure.
558ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |options| specifies where to printing error messages or not.
559ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
560ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
561ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual std::string GetServiceOwnerAndBlock(const std::string& service_name,
562ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                              GetServiceOwnerOption options);
563ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
564ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // A non-blocking version of GetServiceOwnerAndBlock().
565ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
566ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void GetServiceOwner(const std::string& service_name,
567ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               const GetServiceOwnerCallback& callback);
568ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
569ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Whenever the owner for |service_name| changes, run |callback| with the
570ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // name of the new owner. If the owner goes away, then |callback| receives
571ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // an empty string.
572ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
573ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Any unique (service_name, callback) can be used. Duplicate are ignored.
574ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_name| must not be empty and |callback| must not be null.
575ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
576ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
577ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void ListenForServiceOwnerChange(
578ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& service_name,
579ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const GetServiceOwnerCallback& callback);
580ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
581ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Stop listening for |service_name| owner changes for |callback|.
582ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Any unique (service_name, callback) can be used. Non-registered callbacks
583ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // for a given service name are ignored.
584ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // |service_name| must not be empty and |callback| must not be null.
585ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
586ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Must be called in the origin thread.
587ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual void UnlistenForServiceOwnerChange(
588ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& service_name,
589ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const GetServiceOwnerCallback& callback);
590ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
5915db5da5e853a090b44ab9cc2becda1670c69cbf1Daniel Erat  // Return the unique name of the bus connnection if it is connected to
5925db5da5e853a090b44ab9cc2becda1670c69cbf1Daniel Erat  // D-BUS. Otherwise, return an empty string.
5935db5da5e853a090b44ab9cc2becda1670c69cbf1Daniel Erat  std::string GetConnectionName();
5945db5da5e853a090b44ab9cc2becda1670c69cbf1Daniel Erat
595ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Returns true if the bus is connected to D-Bus.
596ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool is_connected() { return connection_ != NULL; }
597ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
598ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat protected:
599ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // This is protected, so we can define sub classes.
600ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  virtual ~Bus();
601ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
602ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat private:
603ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  friend class base::RefCountedThreadSafe<Bus>;
604ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
605ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for RemoveObjectProxy().
606ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RemoveObjectProxyInternal(scoped_refptr<dbus::ObjectProxy> object_proxy,
607ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                 const base::Closure& callback);
608ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
609ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper functions used for RemoveObjectManager().
610ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RemoveObjectManagerInternal(
611ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      scoped_refptr<dbus::ObjectManager> object_manager,
612ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const base::Closure& callback);
613ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RemoveObjectManagerInternalHelper(
614ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      scoped_refptr<dbus::ObjectManager> object_manager,
615ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const base::Closure& callback);
616ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
617ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for UnregisterExportedObject().
618ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void UnregisterExportedObjectInternal(
619ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      scoped_refptr<dbus::ExportedObject> exported_object);
620ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
621ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for ShutdownOnDBusThreadAndBlock().
622ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void ShutdownOnDBusThreadAndBlockInternal();
623ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
624ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for RequestOwnership().
625ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void RequestOwnershipInternal(const std::string& service_name,
626ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                ServiceOwnershipOptions options,
627ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                OnOwnershipCallback on_ownership_callback);
628ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
629ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for GetServiceOwner().
630ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void GetServiceOwnerInternal(const std::string& service_name,
631ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               const GetServiceOwnerCallback& callback);
632ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
633ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for ListenForServiceOwnerChange().
634ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void ListenForServiceOwnerChangeInternal(
635ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& service_name,
636ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const GetServiceOwnerCallback& callback);
637ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
638ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Helper function used for UnListenForServiceOwnerChange().
639ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void UnlistenForServiceOwnerChangeInternal(
640ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const std::string& service_name,
641ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      const GetServiceOwnerCallback& callback);
642ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
643ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Processes the all incoming data to the connection, if any.
644ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //
645ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // BLOCKING CALL.
646ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void ProcessAllIncomingDataIfAny();
647ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
648ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when a watch object is added. Used to start monitoring the
649ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // file descriptor used for D-Bus communication.
650ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  dbus_bool_t OnAddWatch(DBusWatch* raw_watch);
651ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
652ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when a watch object is removed.
653ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnRemoveWatch(DBusWatch* raw_watch);
654ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
655ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the "enabled" status of |raw_watch| is toggled.
656ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnToggleWatch(DBusWatch* raw_watch);
657ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
658ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when a timeout object is added. Used to start monitoring
659ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // timeout for method calls.
660ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  dbus_bool_t OnAddTimeout(DBusTimeout* raw_timeout);
661ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
662ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when a timeout object is removed.
663ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnRemoveTimeout(DBusTimeout* raw_timeout);
664ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
665ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the "enabled" status of |raw_timeout| is toggled.
666ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnToggleTimeout(DBusTimeout* raw_timeout);
667ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
668ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when the dispatch status (i.e. if any incoming data is
669ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // available) is changed.
670ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnDispatchStatusChanged(DBusConnection* connection,
671ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                               DBusDispatchStatus status);
672ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
673ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Called when a service owner change occurs.
674ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  void OnServiceOwnerChanged(DBusMessage* message);
675ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
676ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Callback helper functions. Redirects to the corresponding member function.
677ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static dbus_bool_t OnAddWatchThunk(DBusWatch* raw_watch, void* data);
678ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static void OnRemoveWatchThunk(DBusWatch* raw_watch, void* data);
679ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static void OnToggleWatchThunk(DBusWatch* raw_watch, void* data);
680ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static dbus_bool_t OnAddTimeoutThunk(DBusTimeout* raw_timeout, void* data);
681ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static void OnRemoveTimeoutThunk(DBusTimeout* raw_timeout, void* data);
682ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static void OnToggleTimeoutThunk(DBusTimeout* raw_timeout, void* data);
683ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static void OnDispatchStatusChangedThunk(DBusConnection* connection,
684ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           DBusDispatchStatus status,
685ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                                           void* data);
686ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
687ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Calls OnConnectionDisconnected if the Disconnected signal is received.
688ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static DBusHandlerResult OnConnectionDisconnectedFilter(
689ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      DBusConnection* connection,
690ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      DBusMessage* message,
691ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      void* user_data);
692ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
693ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Calls OnServiceOwnerChanged for a NameOwnerChanged signal.
694ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  static DBusHandlerResult OnServiceOwnerChangedFilter(
695ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      DBusConnection* connection,
696ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      DBusMessage* message,
697ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      void* user_data);
698ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
699ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  const BusType bus_type_;
700ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  const ConnectionType connection_type_;
701ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  scoped_refptr<base::SequencedTaskRunner> dbus_task_runner_;
702ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  base::WaitableEvent on_shutdown_;
703ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DBusConnection* connection_;
704ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
705ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_;
706ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  base::PlatformThreadId origin_thread_id_;
707ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
708ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::set<std::string> owned_service_names_;
709ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The following sets are used to check if rules/object_paths/filters
710ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // are properly cleaned up before destruction of the bus object.
711ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Since it's not an error to add the same match rule twice, the repeated
712ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // match rules are counted in a map.
713ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::map<std::string, int> match_rules_added_;
714ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::set<ObjectPath> registered_object_paths_;
715ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::set<std::pair<DBusHandleMessageFunction, void*> >
716ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      filter_functions_added_;
717ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
718ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // ObjectProxyTable is used to hold the object proxies created by the
719ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // bus object. Key is a pair; the first part is a concatenated string of
720ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // service name + object path, like
721ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // "org.chromium.TestService/org/chromium/TestObject".
722ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // The second part is the ObjectProxy::Options for the proxy.
723ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef std::map<std::pair<std::string, int>,
724ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                   scoped_refptr<dbus::ObjectProxy> > ObjectProxyTable;
725ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ObjectProxyTable object_proxy_table_;
726ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
727ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // ExportedObjectTable is used to hold the exported objects created by
728ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // the bus object. Key is a concatenated string of service name +
729ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // object path, like "org.chromium.TestService/org/chromium/TestObject".
730ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef std::map<const dbus::ObjectPath,
731ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                   scoped_refptr<dbus::ExportedObject> > ExportedObjectTable;
732ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ExportedObjectTable exported_object_table_;
733ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
734ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // ObjectManagerTable is used to hold the object managers created by the
735ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // bus object. Key is a concatenated string of service name + object path,
736ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // like "org.chromium.TestService/org/chromium/TestObject".
737ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef std::map<std::string,
738ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat                   scoped_refptr<dbus::ObjectManager> > ObjectManagerTable;
739ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ObjectManagerTable object_manager_table_;
740ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
741ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // A map of NameOwnerChanged signals to listen for and the callbacks to run
742ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // on the origin thread when the owner changes.
743ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Only accessed on the DBus thread.
744ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Key: Service name
745ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Value: Vector of callbacks. Unique and expected to be small. Not using
746ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  //        std::set here because base::Callbacks don't have a '<' operator.
747ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  typedef std::map<std::string, std::vector<GetServiceOwnerCallback> >
748ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat      ServiceOwnerChangedListenerMap;
749ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  ServiceOwnerChangedListenerMap service_owner_changed_listener_map_;
750ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
751ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool async_operations_set_up_;
752ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  bool shutdown_completed_;
753ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
754ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // Counters to make sure that OnAddWatch()/OnRemoveWatch() and
755ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  // OnAddTimeout()/OnRemoveTimeou() are balanced.
756ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  int num_pending_watches_;
757ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  int num_pending_timeouts_;
758ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
759ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  std::string address_;
760ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
761ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat  DISALLOW_COPY_AND_ASSIGN(Bus);
762ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat};
763ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
764ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat}  // namespace dbus
765ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat
766ae6a045d2239408e25198ad17e2413bdde105788Daniel Erat#endif  // DBUS_BUS_H_
767