APPLINK-5452, D-bus message factories generation
authorIgor Kozyrenko <ikozyrenko@luxoft.com>
Fri, 14 Mar 2014 17:20:40 +0000 (19:20 +0200)
committerJustin Dickow <jjdickow@gmail.com>
Tue, 8 Jul 2014 21:40:53 +0000 (17:40 -0400)
tools/intergen/cppgen/include/cppgen/message_factory_function.h
tools/intergen/cppgen/src/cppgen/cpp_interface_code_generator.cc
tools/intergen/cppgen/src/cppgen/message_factory_function.cc

index 9377593..da63b44 100644 (file)
@@ -45,11 +45,17 @@ class Interface;
  */
 class MessageFactoryFunction: public CppFunction {
  public:
+  enum SerializationType {
+    kJson,
+    kDbus
+  };
+
   // Methods
   // Creates function code generation object that produces
   // declaration and definition of a factory for messages of type
   // |factory_type| that belong to given |interface|
   MessageFactoryFunction(const Interface* interface,
+                         SerializationType serialization_type,
                          FunctionMessage::MessageType factory_type);
  private:
   // Types
index 38b4540..49bd758 100644 (file)
@@ -178,17 +178,29 @@ void CppInterfaceCodeGenerator::GenerateMessageFactories() {
   CppFile& factories_header = module_manager_->HeaderForInterface();
   CppFile& factories_source = module_manager_->SourceForInterface();
 
+  MessageFactoryFunction::SerializationType ser_types[2];
+  size_t ser_types_count = 0;
   if (preferences_->generate_json) {
+    ser_types[ser_types_count++] = MessageFactoryFunction::kJson;
+  }
+  if (preferences_->generate_dbus) {
+    ser_types[ser_types_count++] = MessageFactoryFunction::kDbus;
+  }
+
+  for (size_t i = 0; i < ser_types_count; ++i) {
     MessageFactoryFunction request_factory(interface_,
+                                           ser_types[i],
                                            FunctionMessage::kRequest);
     request_factory.Declare(&factories_header.requests_ns().os(), true);
     request_factory.Define(&factories_source.requests_ns().os(), true);
     MessageFactoryFunction response_factory(interface_,
+                                            ser_types[i],
                                             FunctionMessage::kResponse);
     response_factory.Declare(&factories_header.responses_ns().os(), true);
     response_factory.Define(&factories_source.responses_ns().os(), true);
     MessageFactoryFunction notification_factory(
           interface_,
+          ser_types[i],
           FunctionMessage::kNotification);
     notification_factory.Declare(&factories_header.notifications_ns().os(),
                                  true);
index f34c9f0..675a51b 100644 (file)
@@ -44,15 +44,18 @@ namespace codegen {
 
 MessageFactoryFunction::MessageFactoryFunction(
     const Interface* interface,
+    SerializationType serialization_type,
     FunctionMessage::MessageType factory_type)
     : CppFunction("",
-                  "NewFromJson",
+                  serialization_type == kJson ? "NewFromJson" : "NewFromDbus",
                   Capitalize(
                     FunctionMessage::MessageTypeToString(
                       factory_type)) + "*"),
       interface_(interface),
       factory_type_(factory_type) {
-  Add(MessageFactoryFunction::Parameter("json", "const Json::Value&"));
+  Add(MessageFactoryFunction::Parameter(
+        serialization_type == kJson ? "json" : "reader",
+        serialization_type == kJson ? "const Json::Value&": "dbus::MessageReader*"));
   Add(MessageFactoryFunction::Parameter("function_id", "FunctionID"));
 }
 
@@ -84,9 +87,10 @@ void MessageFactoryFunction::DefineCases(
   for (MessageList::const_iterator i = functions.begin(),
        end = functions.end(); i != end; ++i) {
     const FunctionMessage* message = *i;
-    strmfmt(*os, "case {0}: return new {1}(json);\n",
+    strmfmt(*os, "case {0}: return new {1}({2});\n",
             LiteralGenerator(*message->id()).result(),
-            message->name());
+            message->name(),
+            parameters_[0].name);
   }
   *os << "default: return NULL;\n";
 }