| Index: dbus/test_service.cc
|
| diff --git a/dbus/test_service.cc b/dbus/test_service.cc
|
| index fcc34121d9b7e8ec81fca131b8c16d3117c0154c..4b739bfe3f39b7d2505a19b31c8026ba1f0ad9bb 100644
|
| --- a/dbus/test_service.cc
|
| +++ b/dbus/test_service.cc
|
| @@ -10,6 +10,7 @@
|
| #include "dbus/bus.h"
|
| #include "dbus/exported_object.h"
|
| #include "dbus/message.h"
|
| +#include "dbus/object_manager.h"
|
| #include "dbus/object_path.h"
|
| #include "dbus/property.h"
|
|
|
| @@ -22,8 +23,9 @@ void EmptyCallback(bool /* success */) {
|
|
|
| namespace dbus {
|
|
|
| -// Echo, SlowEcho, AsyncEcho, BrokenMethod, GetAll, Get, Set.
|
| -const int TestService::kNumMethodsToExport = 7;
|
| +// Echo, SlowEcho, AsyncEcho, BrokenMethod, GetAll, Get, Set, PerformAction,
|
| +// GetManagedObjects.
|
| +const int TestService::kNumMethodsToExport = 9;
|
|
|
| TestService::Options::Options() {
|
| }
|
| @@ -204,6 +206,15 @@ void TestService::Run(MessageLoop* message_loop) {
|
| ++num_methods;
|
|
|
| exported_object_->ExportMethod(
|
| + "org.chromium.TestInterface",
|
| + "PerformAction",
|
| + base::Bind(&TestService::PerformAction,
|
| + base::Unretained(this)),
|
| + base::Bind(&TestService::OnExported,
|
| + base::Unretained(this)));
|
| + ++num_methods;
|
| +
|
| + exported_object_->ExportMethod(
|
| kPropertiesInterface,
|
| kPropertiesGetAll,
|
| base::Bind(&TestService::GetAllProperties,
|
| @@ -230,6 +241,18 @@ void TestService::Run(MessageLoop* message_loop) {
|
| base::Unretained(this)));
|
| ++num_methods;
|
|
|
| + exported_object_manager_ = bus_->GetExportedObject(
|
| + dbus::ObjectPath("/org/chromium/TestService"));
|
| +
|
| + exported_object_manager_->ExportMethod(
|
| + kObjectManagerInterface,
|
| + kObjectManagerGetManagedObjects,
|
| + base::Bind(&TestService::GetManagedObjects,
|
| + base::Unretained(this)),
|
| + base::Bind(&TestService::OnExported,
|
| + base::Unretained(this)));
|
| + ++num_methods;
|
| +
|
| // Just print an error message as we don't want to crash tests.
|
| // Tests will fail at a call to WaitUntilServiceIsStarted().
|
| if (num_methods != kNumMethodsToExport) {
|
| @@ -289,59 +312,10 @@ void TestService::GetAllProperties(
|
| return;
|
| }
|
|
|
| - // The properties response is a dictionary of strings identifying the
|
| - // property and a variant containing the property value. We return all
|
| - // of the properties, thus the response is:
|
| - //
|
| - // {
|
| - // "Name": Variant<"TestService">,
|
| - // "Version": Variant<10>,
|
| - // "Methods": Variant<["Echo", "SlowEcho", "AsyncEcho", "BrokenMethod"]>,
|
| - // "Objects": Variant<[objectpath:"/TestObjectPath"]>
|
| - // ]
|
| -
|
| scoped_ptr<Response> response = Response::FromMethodCall(method_call);
|
| MessageWriter writer(response.get());
|
|
|
| - MessageWriter array_writer(NULL);
|
| - MessageWriter dict_entry_writer(NULL);
|
| - MessageWriter variant_writer(NULL);
|
| - MessageWriter variant_array_writer(NULL);
|
| -
|
| - writer.OpenArray("{sv}", &array_writer);
|
| -
|
| - array_writer.OpenDictEntry(&dict_entry_writer);
|
| - dict_entry_writer.AppendString("Name");
|
| - dict_entry_writer.AppendVariantOfString("TestService");
|
| - array_writer.CloseContainer(&dict_entry_writer);
|
| -
|
| - array_writer.OpenDictEntry(&dict_entry_writer);
|
| - dict_entry_writer.AppendString("Version");
|
| - dict_entry_writer.AppendVariantOfInt16(10);
|
| - array_writer.CloseContainer(&dict_entry_writer);
|
| -
|
| - array_writer.OpenDictEntry(&dict_entry_writer);
|
| - dict_entry_writer.AppendString("Methods");
|
| - dict_entry_writer.OpenVariant("as", &variant_writer);
|
| - variant_writer.OpenArray("s", &variant_array_writer);
|
| - variant_array_writer.AppendString("Echo");
|
| - variant_array_writer.AppendString("SlowEcho");
|
| - variant_array_writer.AppendString("AsyncEcho");
|
| - variant_array_writer.AppendString("BrokenMethod");
|
| - variant_writer.CloseContainer(&variant_array_writer);
|
| - dict_entry_writer.CloseContainer(&variant_writer);
|
| - array_writer.CloseContainer(&dict_entry_writer);
|
| -
|
| - array_writer.OpenDictEntry(&dict_entry_writer);
|
| - dict_entry_writer.AppendString("Objects");
|
| - dict_entry_writer.OpenVariant("ao", &variant_writer);
|
| - variant_writer.OpenArray("o", &variant_array_writer);
|
| - variant_array_writer.AppendObjectPath(dbus::ObjectPath("/TestObjectPath"));
|
| - variant_writer.CloseContainer(&variant_array_writer);
|
| - dict_entry_writer.CloseContainer(&variant_writer);
|
| - array_writer.CloseContainer(&dict_entry_writer);
|
| -
|
| - writer.CloseContainer(&array_writer);
|
| + AddPropertiesToWriter(&writer);
|
|
|
| response_sender.Run(response.Pass());
|
| }
|
| @@ -452,6 +426,171 @@ void TestService::SetProperty(
|
| response_sender.Run(Response::FromMethodCall(method_call));
|
| }
|
|
|
| +void TestService::PerformAction(
|
| + MethodCall* method_call,
|
| + dbus::ExportedObject::ResponseSender response_sender) {
|
| + MessageReader reader(method_call);
|
| + std::string action;
|
| + dbus::ObjectPath object_path;
|
| + if (!reader.PopString(&action) || !reader.PopObjectPath(&object_path)) {
|
| + response_sender.Run(scoped_ptr<dbus::Response>());
|
| + return;
|
| + }
|
| +
|
| + if (action == "AddObject")
|
| + AddObject(object_path);
|
| + else if (action == "RemoveObject")
|
| + RemoveObject(object_path);
|
| +
|
| + scoped_ptr<Response> response = Response::FromMethodCall(method_call);
|
| + response_sender.Run(response.Pass());
|
| +}
|
| +
|
| +void TestService::GetManagedObjects(
|
| + MethodCall* method_call,
|
| + dbus::ExportedObject::ResponseSender response_sender) {
|
| + scoped_ptr<Response> response = Response::FromMethodCall(method_call);
|
| + MessageWriter writer(response.get());
|
| +
|
| + // The managed objects response is a dictionary of object paths identifying
|
| + // the object(s) with a dictionary of strings identifying the interface(s)
|
| + // they implement and then a dictionary of property values.
|
| + //
|
| + // Thus this looks something like:
|
| + //
|
| + // {
|
| + // "/org/chromium/TestObject": {
|
| + // "org.chromium.TestInterface": { /* Properties */ }
|
| + // }
|
| + // }
|
| +
|
| +
|
| + MessageWriter array_writer(NULL);
|
| + MessageWriter dict_entry_writer(NULL);
|
| + MessageWriter object_array_writer(NULL);
|
| + MessageWriter object_dict_entry_writer(NULL);
|
| +
|
| + writer.OpenArray("{oa{sa{sv}}}", &array_writer);
|
| +
|
| + array_writer.OpenDictEntry(&dict_entry_writer);
|
| + dict_entry_writer.AppendObjectPath(
|
| + dbus::ObjectPath("/org/chromium/TestObject"));
|
| + dict_entry_writer.OpenArray("{sa{sv}}", &object_array_writer);
|
| +
|
| + object_array_writer.OpenDictEntry(&object_dict_entry_writer);
|
| + object_dict_entry_writer.AppendString("org.chromium.TestInterface");
|
| + AddPropertiesToWriter(&object_dict_entry_writer);
|
| + object_array_writer.CloseContainer(&object_dict_entry_writer);
|
| +
|
| + dict_entry_writer.CloseContainer(&object_array_writer);
|
| +
|
| + array_writer.CloseContainer(&dict_entry_writer);
|
| + writer.CloseContainer(&array_writer);
|
| +
|
| + response_sender.Run(response.Pass());
|
| +}
|
| +
|
| +void TestService::AddPropertiesToWriter(MessageWriter* writer)
|
| +{
|
| + // The properties response is a dictionary of strings identifying the
|
| + // property and a variant containing the property value. We return all
|
| + // of the properties, thus the response is:
|
| + //
|
| + // {
|
| + // "Name": Variant<"TestService">,
|
| + // "Version": Variant<10>,
|
| + // "Methods": Variant<["Echo", "SlowEcho", "AsyncEcho", "BrokenMethod"]>,
|
| + // "Objects": Variant<[objectpath:"/TestObjectPath"]>
|
| + // ]
|
| +
|
| + MessageWriter array_writer(NULL);
|
| + MessageWriter dict_entry_writer(NULL);
|
| + MessageWriter variant_writer(NULL);
|
| + MessageWriter variant_array_writer(NULL);
|
| +
|
| + writer->OpenArray("{sv}", &array_writer);
|
| +
|
| + array_writer.OpenDictEntry(&dict_entry_writer);
|
| + dict_entry_writer.AppendString("Name");
|
| + dict_entry_writer.AppendVariantOfString("TestService");
|
| + array_writer.CloseContainer(&dict_entry_writer);
|
| +
|
| + array_writer.OpenDictEntry(&dict_entry_writer);
|
| + dict_entry_writer.AppendString("Version");
|
| + dict_entry_writer.AppendVariantOfInt16(10);
|
| + array_writer.CloseContainer(&dict_entry_writer);
|
| +
|
| + array_writer.OpenDictEntry(&dict_entry_writer);
|
| + dict_entry_writer.AppendString("Methods");
|
| + dict_entry_writer.OpenVariant("as", &variant_writer);
|
| + variant_writer.OpenArray("s", &variant_array_writer);
|
| + variant_array_writer.AppendString("Echo");
|
| + variant_array_writer.AppendString("SlowEcho");
|
| + variant_array_writer.AppendString("AsyncEcho");
|
| + variant_array_writer.AppendString("BrokenMethod");
|
| + variant_writer.CloseContainer(&variant_array_writer);
|
| + dict_entry_writer.CloseContainer(&variant_writer);
|
| + array_writer.CloseContainer(&dict_entry_writer);
|
| +
|
| + array_writer.OpenDictEntry(&dict_entry_writer);
|
| + dict_entry_writer.AppendString("Objects");
|
| + dict_entry_writer.OpenVariant("ao", &variant_writer);
|
| + variant_writer.OpenArray("o", &variant_array_writer);
|
| + variant_array_writer.AppendObjectPath(dbus::ObjectPath("/TestObjectPath"));
|
| + variant_writer.CloseContainer(&variant_array_writer);
|
| + dict_entry_writer.CloseContainer(&variant_writer);
|
| + array_writer.CloseContainer(&dict_entry_writer);
|
| +
|
| + writer->CloseContainer(&array_writer);
|
| +}
|
| +
|
| +void TestService::AddObject(const dbus::ObjectPath& object_path) {
|
| + message_loop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&TestService::AddObjectInternal,
|
| + base::Unretained(this),
|
| + object_path));
|
| +}
|
| +
|
| +void TestService::AddObjectInternal(const dbus::ObjectPath& object_path) {
|
| + dbus::Signal signal(kObjectManagerInterface, kObjectManagerInterfacesAdded);
|
| + dbus::MessageWriter writer(&signal);
|
| + writer.AppendObjectPath(object_path);
|
| +
|
| + MessageWriter array_writer(NULL);
|
| + MessageWriter dict_entry_writer(NULL);
|
| +
|
| + writer.OpenArray("{sa{sv}}", &array_writer);
|
| + array_writer.OpenDictEntry(&dict_entry_writer);
|
| + dict_entry_writer.AppendString("org.chromium.TestInterface");
|
| + AddPropertiesToWriter(&dict_entry_writer);
|
| + array_writer.CloseContainer(&dict_entry_writer);
|
| + writer.CloseContainer(&array_writer);
|
| +
|
| + exported_object_manager_->SendSignal(&signal);
|
| +}
|
| +
|
| +void TestService::RemoveObject(const dbus::ObjectPath& object_path) {
|
| + message_loop()->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&TestService::RemoveObjectInternal,
|
| + base::Unretained(this),
|
| + object_path));
|
| +}
|
| +
|
| +void TestService::RemoveObjectInternal(const dbus::ObjectPath& object_path) {
|
| + dbus::Signal signal(kObjectManagerInterface, kObjectManagerInterfacesRemoved);
|
| + dbus::MessageWriter writer(&signal);
|
| +
|
| + writer.AppendObjectPath(object_path);
|
| +
|
| + std::vector<std::string> interfaces;
|
| + interfaces.push_back("org.chromium.TestInterface");
|
| + writer.AppendArrayOfStrings(interfaces);
|
| +
|
| + exported_object_manager_->SendSignal(&signal);
|
| +}
|
| +
|
| void TestService::SendPropertyChangedSignal(const std::string& name) {
|
| message_loop()->PostTask(
|
| FROM_HERE,
|
| @@ -463,7 +602,7 @@ void TestService::SendPropertyChangedSignal(const std::string& name) {
|
| void TestService::SendPropertyChangedSignalInternal(const std::string& name) {
|
| dbus::Signal signal(kPropertiesInterface, kPropertiesChanged);
|
| dbus::MessageWriter writer(&signal);
|
| - writer.AppendString("org.chromium.TestService");
|
| + writer.AppendString("org.chromium.TestInterface");
|
|
|
| MessageWriter array_writer(NULL);
|
| MessageWriter dict_entry_writer(NULL);
|
|
|