diff options
author | satorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-17 20:58:12 +0000 |
---|---|---|
committer | satorux@chromium.org <satorux@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-17 20:58:12 +0000 |
commit | a510761104333ec7da3943399f059ff693839856 (patch) | |
tree | 2a9f81a60bccf4db3367ad1b8f71e9ea130efb7d /dbus/object_proxy.h | |
parent | 07f93af15169ee054552a376ac4953abd1346cb2 (diff) | |
download | chromium_src-a510761104333ec7da3943399f059ff693839856.zip chromium_src-a510761104333ec7da3943399f059ff693839856.tar.gz chromium_src-a510761104333ec7da3943399f059ff693839856.tar.bz2 |
Implement Bus and ObjectProxy classes for our D-Bus library.
ObjectProxy is used to access remote objects.
ExportedObject is used to export objects to other D-Bus
BUG=90036
TEST=run unit tests. The code is not yet used in Chrome.
Review URL: http://codereview.chromium.org/7491029
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@97204 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'dbus/object_proxy.h')
-rw-r--r-- | dbus/object_proxy.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/dbus/object_proxy.h b/dbus/object_proxy.h new file mode 100644 index 0000000..024ba2c --- /dev/null +++ b/dbus/object_proxy.h @@ -0,0 +1,116 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef DBUS_OBJECT_PROXY_H_ +#define DBUS_OBJECT_PROXY_H_ +#pragma once + +#include <string> +#include <vector> +#include <dbus/dbus.h> + +#include "base/callback.h" +#include "base/memory/ref_counted.h" + +class MessageLoop; + +namespace dbus { + +class Bus; +class MethodCall; +class Response; + +// ObjectProxy is used to communicate with remote objects, mainly for +// calling methods of these objects. +// +// ObjectProxy is a ref counted object, to ensure that |this| of the +// object is is alive when callbacks referencing |this| are called. +class ObjectProxy : public base::RefCountedThreadSafe<ObjectProxy> { + public: + // Client code should use Bus::GetObjectProxy() instead of this + // constructor. + ObjectProxy(Bus* bus, + const std::string& service_name, + const std::string& object_path); + + // Special timeout constants. + // + // The constants correspond to DBUS_TIMEOUT_USE_DEFAULT and + // DBUS_TIMEOUT_INFINITE. Here we use literal numbers instead of these + // macros as these aren't defined with D-Bus earlier than 1.4.12. + enum { + TIMEOUT_USE_DEFAULT = -1, + TIMEOUT_INFINITE = 0x7fffffff, + }; + + // Called when the response is returned. Used for CallMethod(). + typedef base::Callback<void(Response*)> ResponseCallback; + + // Calls the method of the remote object and blocks until the response + // is returned. + // + // BLOCKING CALL. + virtual bool CallMethodAndBlock(MethodCall* method_call, + int timeout_ms, + Response* response); + + // Requests to call the method of the remote object. + // + // |callback| will be called in the origin thread, once the method call + // is complete. As it's called in the origin thread, |callback| can + // safely reference objects in the origin thread (i.e. UI thread in most + // cases). + // + // If the method call is successful, a pointer to Response object will + // be passed to the callback. If unsuccessful, NULL will be passed to + // the callback. + // + // Must be called in the origin thread. + virtual void CallMethod(MethodCall* method_call, + int timeout_ms, + ResponseCallback callback); + + private: + friend class base::RefCountedThreadSafe<ObjectProxy>; + virtual ~ObjectProxy(); + + // Struct of data we'll be passing from StartAsyncMethodCall() to + // OnPendingCallIsCompleteThunk(). + struct OnPendingCallIsCompleteData { + OnPendingCallIsCompleteData(ObjectProxy* in_object_proxy, + ResponseCallback in_response_callback); + ~OnPendingCallIsCompleteData(); + + ObjectProxy* object_proxy; + ResponseCallback response_callback; + }; + + // Starts the async method call. This is a helper function to implement + // CallMethod(). + void StartAsyncMethodCall(int timeout_ms, + void* request_message, + ResponseCallback response_callback); + + // Called when the pending call is complete. + void OnPendingCallIsComplete(DBusPendingCall* pending_call, + ResponseCallback response_callback); + + // Runs the response callback with the given response object. + void RunResponseCallback(ResponseCallback response_callback, + Response* response); + + // Redirects the function call to OnPendingCallIsComplete(). + static void OnPendingCallIsCompleteThunk(DBusPendingCall* pending_call, + void* user_data); + + Bus* bus_; + std::string service_name_; + std::string object_path_; + + DISALLOW_COPY_AND_ASSIGN(ObjectProxy); +}; + +} // namespace dbus + +#endif // DBUS_OBJECT_PROXY_H_ |