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