| Index: dbus/object_proxy.h
|
| diff --git a/dbus/object_proxy.h b/dbus/object_proxy.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..30599a9b1f4d23af9954e03b802dea44b56d4e49
|
| --- /dev/null
|
| +++ b/dbus/object_proxy.h
|
| @@ -0,0 +1,135 @@
|
| +// 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.
|
| +//
|
| +// D-Bus library for Chrome.
|
| +
|
| +#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"
|
| +#include "base/threading/platform_thread.h"
|
| +
|
| +class MessageLoop;
|
| +
|
| +namespace dbus {
|
| +
|
| +class Bus;
|
| +class MethodCall;
|
| +class Response;
|
| +
|
| +// ObjectProxy is used to communicate with remote objects, such as calling
|
| +// methods and sending signals.
|
| +//
|
| +// TODO(satorux): Add support for sending signals.
|
| +class ObjectProxy {
|
| + public:
|
| + virtual ~ObjectProxy();
|
| +
|
| + // 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.
|
| + // http://dbus.freedesktop.org/doc/api/html/group__DBusPendingCall.html
|
| + enum {
|
| + // Note: the default timeout is set to 25 secs per
|
| + // dbus-1.2.16/dbus/dbus-connection-internal.h
|
| + // #define _DBUS_DEFAULT_TIMEOUT_VALUE (25 * 1000)
|
| + TIMEOUT_USE_DEFAULT = -1,
|
| + TIMEOUT_INFINITE = 0x7fffffff,
|
| + };
|
| +
|
| + // Used for CallMethodAsync().
|
| + typedef base::Callback<void(Response*)> ResponseCallback;
|
| +
|
| + // Calls the method of the remote object and waits until the response is
|
| + // returned. This is a blocking call hence shouldn't be called from the
|
| + // UI thread.
|
| + virtual bool CallMethodAndWait(MethodCall* method_call,
|
| + Response* response,
|
| + int timeout_ms);
|
| +
|
| + // Calls the method of the remote object. |callback| will be called in
|
| + // the message loop of the thread that calls this function. If the
|
| + // method call is successful, a valid Response object will be passed to
|
| + // the callback, and the callback needs to delete the response object.
|
| + // If the method call is unsuccessful, NULL will be passed to the
|
| + // callback.
|
| + //
|
| + // This is not a blocking call (this function just posts a task to the
|
| + // message loop in another thread maintained by Bus object), hence it's
|
| + // safe to be called from the UI thread.
|
| + //
|
| + // TODO(satorux): Implement timeout. timeout_ms is currently unused.
|
| + virtual void CallMethod(MethodCall* method_call,
|
| + ResponseCallback callback,
|
| + int timeout_ms);
|
| +
|
| + const std::string& service_name() const { return service_name_; }
|
| + const std::string& object_path() const { return object_path_; }
|
| +
|
| + private:
|
| + // Struct of data we'll be passing from StartAsyncMethodCall() to
|
| + // OnPendingCallIsCompleteStub().
|
| + struct OnPendingCallIsCompleteData {
|
| + OnPendingCallIsCompleteData(ObjectProxy* in_object_proxy,
|
| + MessageLoop* in_origin_loop,
|
| + ResponseCallback in_response_callback);
|
| + ObjectProxy* object_proxy;
|
| + MessageLoop* origin_loop;
|
| + ResponseCallback response_callback;
|
| + };
|
| +
|
| + // Starts the async method call.
|
| + void StartAsyncMethodCall(int timeout_ms,
|
| + void* request_message,
|
| + MessageLoop* origin_loop,
|
| + ResponseCallback response_callback);
|
| +
|
| + // Called when the pending call is complete.
|
| + void OnPendingCallIsComplete(DBusPendingCall* pending_call,
|
| + ResponseCallback response_callback,
|
| + MessageLoop* origin_loop);
|
| +
|
| + // Runs the response callback with the given response object.
|
| + void RunResponseCallback(ResponseCallback response_callback,
|
| + Response* response);
|
| +
|
| + // Checks whether the current thread is on the same thread that created
|
| + // the object proxy. If not, DCHECK() will fail.
|
| + void AssertOnOriginThread();
|
| +
|
| + // Checks whether the current thread is on the IO thread, if the
|
| + // underlying bus is configured to use it. If not, DCHECK() will fail.
|
| + //
|
| + // The function does the same with AssertOnOriginThread() if the bus is
|
| + // NOT configured to use the IO thread.
|
| + void AssertOnIoThreadIfConfigured();
|
| +
|
| + // Redirects the function call to OnPendingCallIsComplete().
|
| + static void OnPendingCallIsCompleteStub(DBusPendingCall* pending_call,
|
| + void* user_data);
|
| +
|
| + friend class Bus;
|
| +
|
| + // The object proxy can only be created by Bus.
|
| + ObjectProxy(Bus* bus,
|
| + const std::string& service_name,
|
| + const std::string& object_path);
|
| +
|
| + Bus* bus_;
|
| + std::string service_name_;
|
| + std::string object_path_;
|
| + const base::PlatformThreadId origin_thread_id_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ObjectProxy);
|
| +};
|
| +
|
| +} // namespace dbus
|
| +
|
| +#endif // DBUS_OBJECT_PROXY_H_
|
|
|