Index: dbus/test_service.cc |
diff --git a/dbus/test_service.cc b/dbus/test_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c25f803c3079b55ca26a81291bab6478c943d58e |
--- /dev/null |
+++ b/dbus/test_service.cc |
@@ -0,0 +1,101 @@ |
+// 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. |
+ |
+#include "dbus/test_service.h" |
+ |
+#include "base/bind.h" |
+#include "base/threading/platform_thread.h" |
+#include "dbus/bus.h" |
+#include "dbus/exported_object.h" |
+#include "dbus/message.h" |
+ |
+namespace dbus { |
+ |
+const int TestService::kSlowEchoSleepMs = 100; // In milliseconds. |
+ |
+TestService::TestService() |
+ : base::Thread("TestService"), |
+ service_started_(false), |
+ on_service_started_(&service_started_lock_) { |
+} |
+ |
+TestService::~TestService() { |
+} |
+ |
+void TestService::StartService() { |
+ base::Thread::Options thread_options; |
+ thread_options.message_loop_type = MessageLoop::TYPE_IO; |
+ StartWithOptions(thread_options); |
+} |
+ |
+void TestService::WaitUntilServiceIsStarted() { |
+ message_loop()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&TestService::OnServiceStarted, |
+ base::Unretained(this))); |
+ base::AutoLock auto_lock(service_started_lock_); |
+ while (!service_started_) |
+ on_service_started_.Wait(); |
+} |
+ |
+void TestService::OnServiceStarted() { |
+ base::AutoLock auto_lock(service_started_lock_); |
+ service_started_ = true; |
+ on_service_started_.Signal(); |
+} |
+ |
+void TestService::Run(MessageLoop* message_loop) { |
+ Bus::Options bus_options; |
+ bus_options.bus_type = Bus::SESSION; |
+ bus_options.connection_type = Bus::PRIVATE; |
+ bus_ = new Bus(bus_options); |
+ |
+ exported_object_ = bus_->GetExportedObject( |
+ "org.chromium.TestService", |
+ "/org/chromium/TestObject"); |
+ CHECK(exported_object_->ExportMethodAndBlock( |
+ "org.chromium.TestInterface", |
+ "Echo", |
+ base::Bind(&TestService::Echo, |
+ base::Unretained(this)))); |
+ CHECK(exported_object_->ExportMethodAndBlock( |
+ "org.chromium.TestInterface", |
+ "SlowEcho", |
+ base::Bind(&TestService::SlowEcho, |
+ base::Unretained(this)))); |
+ CHECK(exported_object_->ExportMethodAndBlock( |
+ "org.chromium.TestInterface", |
+ "BrokenMethod", |
+ base::Bind(&TestService::BrokenMethod, |
+ base::Unretained(this)))); |
+ |
+ message_loop->Run(); |
+} |
+ |
+void TestService::CleanUp() { |
+ bus_->ShutdownAndBlock(); |
+} |
+ |
+Response* TestService::Echo(MethodCall* method_call) { |
+ MessageReader reader(method_call); |
+ std::string text_message; |
+ if (!reader.PopString(&text_message)) |
+ return NULL; |
+ |
+ Response* response = Response::FromMethodCall(method_call); |
+ MessageWriter writer(response); |
+ writer.AppendString(text_message); |
+ return response; |
+} |
+ |
+Response* TestService::SlowEcho(MethodCall* method_call) { |
+ base::PlatformThread::Sleep(kSlowEchoSleepMs); |
+ return Echo(method_call); |
+} |
+ |
+Response* TestService::BrokenMethod(MethodCall* method_call) { |
+ return NULL; |
+} |
+ |
+} // namespace dbus |