diff options
author | Alex Vakulenko <avakulenko@chromium.org> | 2015-02-23 13:18:34 -0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-02-25 03:32:57 +0000 |
commit | 1b4882c32998b6ae9d4e29ea5ac44e36d22e2ae7 (patch) | |
tree | 0561ef1bc9c36ff42d470d79e5f0b68a3c786fff | |
parent | 008e19dd69bfc8439454a14df159b5a829881956 (diff) | |
download | dbus-binding-generator-1b4882c32998b6ae9d4e29ea5ac44e36d22e2ae7.tar.gz |
chromeos-dbus-bindings: Add support for dbus::Message in handler params
Added a new annotation attribute ("org.chromium.DBus.Method.IncludeDBusMessage")
for "normal" and "async" methods to allow to pass the raw D-Bus message
to the handler, so it can extract additional useful information (like
the message sender, etc).
BUG=brillo:346
TEST=`FEATURES=test emerge-link chromeos-dbus-bindings`
Change-Id: Iec2ff6154cfdbc8a36a84014688011e23762ba3a
Reviewed-on: https://chromium-review.googlesource.com/252321
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
-rw-r--r-- | chromeos-dbus-bindings/adaptor_generator.cc | 14 | ||||
-rw-r--r-- | chromeos-dbus-bindings/adaptor_generator_unittest.cc | 19 | ||||
-rw-r--r-- | chromeos-dbus-bindings/interface.h | 1 | ||||
-rw-r--r-- | chromeos-dbus-bindings/xml_interface_parser.cc | 5 | ||||
-rw-r--r-- | chromeos-dbus-bindings/xml_interface_parser.h | 1 | ||||
-rw-r--r-- | chromeos-dbus-bindings/xml_interface_parser_unittest.cc | 4 |
6 files changed, 41 insertions, 3 deletions
diff --git a/chromeos-dbus-bindings/adaptor_generator.cc b/chromeos-dbus-bindings/adaptor_generator.cc index de3e41c..ad5af85 100644 --- a/chromeos-dbus-bindings/adaptor_generator.cc +++ b/chromeos-dbus-bindings/adaptor_generator.cc @@ -160,10 +160,16 @@ void AdaptorGenerator::RegisterInterface(const string& itf_name, add_handler_name = "AddSimpleMethodHandler"; break; case Interface::Method::Kind::kNormal: - add_handler_name = "AddSimpleMethodHandlerWithError"; + if (method.include_dbus_message) + add_handler_name = "AddSimpleMethodHandlerWithErrorAndMessage"; + else + add_handler_name = "AddSimpleMethodHandlerWithError"; break; case Interface::Method::Kind::kAsync: - add_handler_name = "AddMethodHandler"; + if (method.include_dbus_message) + add_handler_name = "AddMethodHandlerWithMessage"; + else + add_handler_name = "AddMethodHandler"; break; case Interface::Method::Kind::kRaw: add_handler_name = "AddRawMethodHandler"; @@ -253,6 +259,8 @@ void AdaptorGenerator::AddInterfaceMethods(const Interface& interface, break; case Interface::Method::Kind::kNormal: method_params.push_back("chromeos::ErrorPtr* error"); + if (method.include_dbus_message) + method_params.push_back("dbus::Message* message"); return_type = "bool"; break; case Interface::Method::Kind::kAsync: { @@ -265,6 +273,8 @@ void AdaptorGenerator::AddInterfaceMethods(const Interface& interface, method_params.push_back(base::StringPrintf( "scoped_ptr<chromeos::dbus_utils::DBusMethodResponse<%s>> response", chromeos::string_utils::Join(", ", out_types).c_str())); + if (method.include_dbus_message) + method_params.push_back("dbus::Message* message"); output_arguments_copy.clear(); break; } diff --git a/chromeos-dbus-bindings/adaptor_generator_unittest.cc b/chromeos-dbus-bindings/adaptor_generator_unittest.cc index c18b346..c03b39d 100644 --- a/chromeos-dbus-bindings/adaptor_generator_unittest.cc +++ b/chromeos-dbus-bindings/adaptor_generator_unittest.cc @@ -52,6 +52,8 @@ const char kInterfaceName[] = "org.chromium.Test"; const char kInterfaceName2[] = "org.chromium.Test2"; const char kMethod0Name2[] = "Kaneda2"; const char kMethod1Name2[] = "Tetsuo2"; +const char kMethod2Name2[] = "Kei2"; +const char kMethod2Return[] = "b"; const char kExpectedContent[] = R"literal_string( #include <memory> #include <string> @@ -75,6 +77,7 @@ class TestInterface { virtual bool Kaneda( chromeos::ErrorPtr* error, + dbus::Message* message, const std::string& in_iwata, const std::vector<dbus::ObjectPath>& in_clarke, std::string* out_3) = 0; @@ -99,7 +102,7 @@ class TestAdaptor { chromeos::dbus_utils::DBusInterface* itf = object->AddOrGetInterface("org.chromium.Test"); - itf->AddSimpleMethodHandlerWithError( + itf->AddSimpleMethodHandlerWithErrorAndMessage( "Kaneda", base::Unretained(interface_), &TestInterface::Kaneda); @@ -196,6 +199,9 @@ class Test2Interface { virtual void Tetsuo2( scoped_ptr<chromeos::dbus_utils::DBusMethodResponse<int64_t>> response, int32_t in_1) = 0; + virtual void Kei2( + scoped_ptr<chromeos::dbus_utils::DBusMethodResponse<bool>> response, + dbus::Message* message) = 0; }; // Interface adaptor for org::chromium::Test2. @@ -215,6 +221,10 @@ class Test2Adaptor { "Tetsuo2", base::Unretained(interface_), &Test2Interface::Tetsuo2); + itf->AddMethodHandlerWithMessage( + "Kei2", + base::Unretained(interface_), + &Test2Interface::Kei2); } private: @@ -256,6 +266,7 @@ TEST_F(AdaptorGeneratorTest, GenerateAdaptors) { {kMethod0ArgumentName0, kMethod0Argument0}, {kMethod0ArgumentName1, kMethod0Argument1}}, vector<Interface::Argument>{{"", kMethod0Return}}); + interface.methods.back().include_dbus_message = true; interface.methods.emplace_back( kMethod1Name, vector<Interface::Argument>{{"", kMethod1Argument1}}, @@ -300,6 +311,12 @@ TEST_F(AdaptorGeneratorTest, GenerateAdaptors) { vector<Interface::Argument>{{"", kMethod1Argument1}}, vector<Interface::Argument>{{"", kMethod1Return}}); interface2.methods.back().kind = Interface::Method::Kind::kAsync; + interface2.methods.emplace_back( + kMethod2Name2, + vector<Interface::Argument>{}, + vector<Interface::Argument>{{"", kMethod2Return}}); + interface2.methods.back().kind = Interface::Method::Kind::kAsync; + interface2.methods.back().include_dbus_message = true; base::FilePath output_path = temp_dir_.path().Append("output.h"); EXPECT_TRUE(AdaptorGenerator::GenerateAdaptors({interface, interface2}, diff --git a/chromeos-dbus-bindings/interface.h b/chromeos-dbus-bindings/interface.h index db1c8b1..73b1481 100644 --- a/chromeos-dbus-bindings/interface.h +++ b/chromeos-dbus-bindings/interface.h @@ -41,6 +41,7 @@ struct Interface { std::string doc_string; Kind kind{Kind::kNormal}; bool is_const{false}; + bool include_dbus_message{false}; }; struct Signal { Signal(const std::string& name_in, diff --git a/chromeos-dbus-bindings/xml_interface_parser.cc b/chromeos-dbus-bindings/xml_interface_parser.cc index 8866662..3fb71a3 100644 --- a/chromeos-dbus-bindings/xml_interface_parser.cc +++ b/chromeos-dbus-bindings/xml_interface_parser.cc @@ -41,6 +41,8 @@ const char XmlInterfaceParser::kMethodConst[] = "org.chromium.DBus.Method.Const"; const char XmlInterfaceParser::kMethodAsync[] = "org.freedesktop.DBus.GLib.Async"; +const char XmlInterfaceParser::kMethodIncludeDBusMessage[] = + "org.chromium.DBus.Method.IncludeDBusMessage"; const char XmlInterfaceParser::kMethodKind[] = "org.chromium.DBus.Method.Kind"; const char XmlInterfaceParser::kMethodKindSimple[] = "simple"; @@ -155,6 +157,9 @@ void XmlInterfaceParser::OnOpenElement( if (name == kMethodConst) { CHECK(value == kTrue || value == kFalse); method.is_const = (value == kTrue); + } else if (name == kMethodIncludeDBusMessage) { + CHECK(value == kTrue || value == kFalse); + method.include_dbus_message = (value == kTrue); } else if (name == kMethodAsync) { // Support GLib.Async annotation as well. method.kind = Interface::Method::Kind::kAsync; diff --git a/chromeos-dbus-bindings/xml_interface_parser.h b/chromeos-dbus-bindings/xml_interface_parser.h index 219ea0d..15ad857 100644 --- a/chromeos-dbus-bindings/xml_interface_parser.h +++ b/chromeos-dbus-bindings/xml_interface_parser.h @@ -64,6 +64,7 @@ class XmlInterfaceParser { static const char kMethodConst[]; static const char kMethodAsync[]; + static const char kMethodIncludeDBusMessage[]; static const char kMethodKind[]; static const char kMethodKindSimple[]; diff --git a/chromeos-dbus-bindings/xml_interface_parser_unittest.cc b/chromeos-dbus-bindings/xml_interface_parser_unittest.cc index e81cb4f..8876b16 100644 --- a/chromeos-dbus-bindings/xml_interface_parser_unittest.cc +++ b/chromeos-dbus-bindings/xml_interface_parser_unittest.cc @@ -27,6 +27,8 @@ const char kGoodInterfaceFileContents[] = R"literal_string( <method name="Scan"> <arg name="args" type="a{sv}" direction="in"/> <annotation name="org.chromium.DBus.Method.Kind" value="async"/> + <annotation name="org.chromium.DBus.Method.IncludeDBusMessage" + value="true"/> </method> <method name="GetBlob"> <arg name="name" type="s"/> @@ -85,6 +87,7 @@ TEST_F(XmlInterfaceParserTest, GoodInputFile) { EXPECT_EQ(kScanMethod, interface.methods[0].name); EXPECT_EQ(Interface::Method::Kind::kAsync, interface.methods[0].kind); EXPECT_FALSE(interface.methods[0].is_const); + EXPECT_TRUE(interface.methods[0].include_dbus_message); ASSERT_EQ(1, interface.methods[0].input_arguments.size()); // <arg name="args" type="a{sv}" direction="in"/> @@ -97,6 +100,7 @@ TEST_F(XmlInterfaceParserTest, GoodInputFile) { EXPECT_EQ(kGetBlobMethod, interface.methods[1].name); EXPECT_EQ(Interface::Method::Kind::kNormal, interface.methods[1].kind); EXPECT_TRUE(interface.methods[1].is_const); + EXPECT_FALSE(interface.methods[1].include_dbus_message); EXPECT_EQ(1, interface.methods[1].input_arguments.size()); EXPECT_EQ(1, interface.methods[1].output_arguments.size()); |