| Index: dbus/exported_object.h
|
| diff --git a/dbus/exported_object.h b/dbus/exported_object.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8e03118996a085f7b7b7eeee70ea1123745cc9d8
|
| --- /dev/null
|
| +++ b/dbus/exported_object.h
|
| @@ -0,0 +1,144 @@
|
| +// 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_EXPORTED_OBJECT_H_
|
| +#define DBUS_EXPORTED_OBJECT_H_
|
| +#pragma once
|
| +
|
| +#include <string>
|
| +#include <map>
|
| +#include <utility>
|
| +
|
| +#include <dbus/dbus.h>
|
| +
|
| +#include "base/callback.h"
|
| +#include "base/memory/ref_counted.h"
|
| +#include "base/synchronization/condition_variable.h"
|
| +#include "base/threading/platform_thread.h"
|
| +
|
| +class MessageLoop;
|
| +
|
| +namespace dbus {
|
| +
|
| +class Bus;
|
| +class MethodCall;
|
| +class Response;
|
| +
|
| +// ExportedObject is used to export objects and methods to other D-Bus
|
| +// clients.
|
| +//
|
| +// ExportedObject is a ref counted object, to ensure that |this| of the
|
| +// object is alive when callbacks referencing |this| are called.
|
| +class ExportedObject : public base::RefCountedThreadSafe<ExportedObject> {
|
| + public:
|
| + // Client code should use Bus::GetExportedObject() instead of this
|
| + // constructor.
|
| + ExportedObject(Bus* bus,
|
| + const std::string& service_name,
|
| + const std::string& object_path);
|
| +
|
| + // Called when an exported method is called. MethodCall* is the request
|
| + // message.
|
| + typedef base::Callback<Response* (MethodCall*)> MethodCallCallback;
|
| +
|
| + // Called when method exporting is done.
|
| + // Parameters:
|
| + // - the interface name.
|
| + // - the method name.
|
| + // - whether exporting was successful or not.
|
| + typedef base::Callback<void (const std::string&, const std::string&, bool)>
|
| + OnExportedCallback;
|
| +
|
| + // Exports the method specified by |interface_name| and |method_name|,
|
| + // and blocks until exporting is done. Returns true on success.
|
| + //
|
| + // |method_call_callback| will be called in the origin thread, when the
|
| + // exported method is called. As it's called in the origin thread,
|
| + // callback| can safely reference objects in the origin thread (i.e. UI
|
| + // thread in most cases).
|
| + //
|
| + // BLOCKING CALL.
|
| + virtual bool ExportMethodAndBlock(const std::string& interface_name,
|
| + const std::string& method_name,
|
| + MethodCallCallback method_call_callback);
|
| +
|
| + // Requests to export the method specified by |interface_name| and
|
| + // |method_name|. See Also ExportMethodAndBlock().
|
| + //
|
| + // |on_exported_callback| is called when the method is exported or
|
| + // failed to be exported, in the origin thread.
|
| + //
|
| + // Must be called in the origin thread.
|
| + virtual void ExportMethod(const std::string& interface_name,
|
| + const std::string& method_name,
|
| + MethodCallCallback method_call_callback,
|
| + OnExportedCallback on_exported_callback);
|
| +
|
| + // Unregisters the object from the bus. The Bus object will take care of
|
| + // unregistering so you don't have to do this manually.
|
| + //
|
| + // BLOCKING CALL.
|
| + virtual void Unregister();
|
| +
|
| + private:
|
| + friend class base::RefCountedThreadSafe<ExportedObject>;
|
| + virtual ~ExportedObject();
|
| +
|
| + // Helper function for ExportMethod().
|
| + void ExportMethodInternal(const std::string& interface_name,
|
| + const std::string& method_name,
|
| + MethodCallCallback method_call_callback,
|
| + OnExportedCallback exported_callback);
|
| +
|
| + // Called when the object is exported.
|
| + void OnExported(OnExportedCallback on_exported_callback,
|
| + const std::string& interface_name,
|
| + const std::string& method_name,
|
| + bool success);
|
| +
|
| + // Registers this object to the bus.
|
| + // Returns true on success, or the object is already registered.
|
| + //
|
| + // BLOCKING CALL.
|
| + bool Register();
|
| +
|
| + // Handles the incoming request messages and dispatches to the exported
|
| + // methods.
|
| + DBusHandlerResult HandleMessage(DBusConnection* connection,
|
| + DBusMessage* raw_message);
|
| +
|
| + // Runs the method. Helper function for HandleMessage().
|
| + void RunMethod(MethodCallCallback method_call_callback,
|
| + MethodCall* method_call);
|
| +
|
| + // Called when the object is unregistered.
|
| + void OnUnregistered(DBusConnection* connection);
|
| +
|
| + // Redirects the function call to HandleMessage().
|
| + static DBusHandlerResult HandleMessageThunk(DBusConnection* connection,
|
| + DBusMessage* raw_message,
|
| + void* user_data);
|
| +
|
| + // Redirects the function call to OnUnregistered().
|
| + static void OnUnregisteredThunk(DBusConnection* connection,
|
| + void* user_data);
|
| +
|
| + Bus* bus_;
|
| + std::string service_name_;
|
| + std::string object_path_;
|
| + bool object_is_registered_;
|
| + bool method_is_called_;
|
| + dbus::Response* response_from_method_;
|
| + base::Lock method_is_called_lock_;
|
| + base::ConditionVariable on_method_is_called_;
|
| +
|
| + // The method table where keys are absolute method names (i.e. interface
|
| + // name + method name), and values are the corresponding callbacks.
|
| + typedef std::map<std::string, MethodCallCallback> MethodTable;
|
| + MethodTable method_table_;
|
| +};
|
| +
|
| +} // namespace dbus
|
| +
|
| +#endif // DBUS_EXPORTED_OBJECT_H_
|
|
|