summaryrefslogtreecommitdiffstats
path: root/chromeos/dbus/blocking_method_caller.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromeos/dbus/blocking_method_caller.cc')
-rw-r--r--chromeos/dbus/blocking_method_caller.cc67
1 files changed, 67 insertions, 0 deletions
diff --git a/chromeos/dbus/blocking_method_caller.cc b/chromeos/dbus/blocking_method_caller.cc
new file mode 100644
index 0000000..182f0cf
--- /dev/null
+++ b/chromeos/dbus/blocking_method_caller.cc
@@ -0,0 +1,67 @@
+// Copyright (c) 2012 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.
+
+#include "chromeos/dbus/blocking_method_caller.h"
+
+#include "base/bind.h"
+#include "dbus/bus.h"
+#include "dbus/object_proxy.h"
+
+namespace chromeos {
+
+namespace {
+
+// A utility class to ensure the WaitableEvent is signaled.
+class WaitableEventSignaler {
+ public:
+ explicit WaitableEventSignaler(base::WaitableEvent* event) : event_(event) {}
+
+ ~WaitableEventSignaler() {
+ event_->Signal();
+ }
+
+ private:
+ base::WaitableEvent* event_;
+};
+
+// This function is a part of CallMethodAndBlock implementation.
+void CallMethodAndBlockInternal(
+ dbus::Response** response,
+ WaitableEventSignaler* signaler,
+ dbus::ObjectProxy* proxy,
+ dbus::MethodCall* method_call) {
+ *response = proxy->CallMethodAndBlock(
+ method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT);
+}
+
+} // namespace
+
+BlockingMethodCaller::BlockingMethodCaller(dbus::Bus* bus,
+ dbus::ObjectProxy* proxy)
+ : bus_(bus),
+ proxy_(proxy),
+ on_blocking_method_call_(false /* manual_reset */,
+ false /* initially_signaled */) {
+}
+
+BlockingMethodCaller::~BlockingMethodCaller() {
+}
+
+dbus::Response* BlockingMethodCaller::CallMethodAndBlock(
+ dbus::MethodCall* method_call) {
+ WaitableEventSignaler* signaler =
+ new WaitableEventSignaler(&on_blocking_method_call_);
+ dbus::Response* response = NULL;
+ bus_->PostTaskToDBusThread(
+ FROM_HERE,
+ base::Bind(&CallMethodAndBlockInternal,
+ &response,
+ base::Owned(signaler),
+ base::Unretained(proxy_),
+ method_call));
+ on_blocking_method_call_.Wait();
+ return response;
+}
+
+} // namespace chromeos