summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Vakulenko <avakulenko@chromium.org>2015-02-23 13:18:34 -0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2015-02-25 03:32:57 +0000
commit1b4882c32998b6ae9d4e29ea5ac44e36d22e2ae7 (patch)
tree0561ef1bc9c36ff42d470d79e5f0b68a3c786fff
parent008e19dd69bfc8439454a14df159b5a829881956 (diff)
downloaddbus-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.cc14
-rw-r--r--chromeos-dbus-bindings/adaptor_generator_unittest.cc19
-rw-r--r--chromeos-dbus-bindings/interface.h1
-rw-r--r--chromeos-dbus-bindings/xml_interface_parser.cc5
-rw-r--r--chromeos-dbus-bindings/xml_interface_parser.h1
-rw-r--r--chromeos-dbus-bindings/xml_interface_parser_unittest.cc4
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());