edbus codegen: Properly handle autoclosed tags
authorJosé Roberto de Souza <zehortigoza@profusion.mobi>
Thu, 3 Jan 2013 14:06:02 +0000 (14:06 +0000)
committerLucas De Marchi <lucas.demarchi@profusion.mobi>
Thu, 3 Jan 2013 14:06:02 +0000 (14:06 +0000)
Patch by: José Roberto de Souza  <zehortigoza@profusion.mobi>

SVN revision: 82074

src/bin/edbus/parser.c

index 36b1810..7ddd1a5 100644 (file)
@@ -135,6 +135,15 @@ open_object(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_
    return r;
 }
 
+static void
+interface_close(void)
+{
+   //its not necessary generate code to FreeDesktop interfaces
+   if (!strncmp(iface->name, DBUS_INTERFACE, strlen(DBUS_INTERFACE)))
+     interface_free(iface);
+   iface = NULL;
+}
+
 static Eina_Bool
 open_interface(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_Object *obj)
 {
@@ -156,9 +165,27 @@ open_interface(const char *content, unsigned length, Eina_Bool is_open_empty, DB
    iface->c_name = dbus_name_to_c(tmp_name);
    free(tmp_name);
 
+   if (is_open_empty)
+     interface_close();
+
    return r;
 }
 
+static void
+signal_close(void)
+{
+   DBus_Arg *arg;
+   EINA_INLIST_FOREACH(d_signal->args, arg)
+     {
+        if ((arg->type[1]) || (arg->type[0] == 'v'))
+          {
+             d_signal->complex = EINA_TRUE;
+             break;
+          }
+     }
+   d_signal = NULL;
+}
+
 static Eina_Bool
 open_signal(const char *content, unsigned length, Eina_Bool is_open_empty)
 {
@@ -204,6 +231,9 @@ open_signal(const char *content, unsigned length, Eina_Bool is_open_empty)
    d_signal->signal_event = eina_strbuf_string_steal(buf);
    eina_strbuf_free(buf);
 
+   if (is_open_empty)
+     signal_close();
+
    return r;
 }
 
@@ -288,8 +318,30 @@ open_arg(const char *content, unsigned length)
    return r;
 }
 
+static void
+method_close(void)
+{
+   DBus_Arg *arg;
+   EINA_INLIST_FOREACH(method->args, arg)
+     {
+        if ((arg->type[1]) || (arg->type[0] == 'v'))
+          {
+             if (arg->direction == 'o')
+               method->out_complex = EINA_TRUE;
+             else
+               method->in_complex = EINA_TRUE;
+          }
+     }
+   if (method->no_reply)
+     {
+        free(method->cb_name);
+        method->cb_name = strdup("NULL");
+     }
+   method = NULL;
+}
+
 static Eina_Bool
-open_method(const char *content, unsigned lenght)
+open_method(const char *content, unsigned lenght, Eina_Bool is_open_empty)
 {
    Eina_Bool r;
    char *tmp;
@@ -319,11 +371,14 @@ open_method(const char *content, unsigned lenght)
            method->function_cb[i+1] = toupper(method->function_cb[i+1]);
      }
 
+   if (is_open_empty)
+     method_close();
+
    return r;
 }
 
 static Eina_Bool
-open_property(const char *content, unsigned length, Eina_Bool is_open_empty)
+open_property(const char *content, unsigned length)
 {
    Eina_Bool r;
    char *tmp;
@@ -363,9 +418,9 @@ open_tag(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_Obj
    else if (!strncmp(content, ANNOTATION_TAG, ANNOTATION_TAG_LENGHT) && iface)
      return open_annotation(content, length);
    else if (!strncmp(content, METHOD_TAG, METHOD_TAG_LENGHT) && iface)
-     return open_method(content, length);
+     return open_method(content, length, is_open_empty);
    else if (!strncmp(content, PROPERTY_TAG, PROPERTY_TAG_LENGHT) && iface)
-     return open_property(content, length, is_open_empty);
+     return open_property(content, length);
    else if (!strncmp(content, ANNOTATION_TAG, ANNOTATION_TAG_LENGHT) && iface)
      return EINA_TRUE;
 
@@ -377,52 +432,6 @@ open_tag(const char *content, unsigned length, Eina_Bool is_open_empty, DBus_Obj
    return EINA_TRUE;
 }
 
-static void
-interface_close(void)
-{
-   //its not necessary generate code to FreeDesktop interfaces
-   if (!strncmp(iface->name, DBUS_INTERFACE, strlen(DBUS_INTERFACE)))
-     interface_free(iface);
-   iface = NULL;
-}
-
-static void
-signal_close(void)
-{
-   DBus_Arg *arg;
-   EINA_INLIST_FOREACH(d_signal->args, arg)
-     {
-        if ((arg->type[1]) || (arg->type[0] == 'v'))
-          {
-             d_signal->complex = EINA_TRUE;
-             break;
-          }
-     }
-   d_signal = NULL;
-}
-
-static void
-method_close(void)
-{
-   DBus_Arg *arg;
-   EINA_INLIST_FOREACH(method->args, arg)
-     {
-        if ((arg->type[1]) || (arg->type[0] == 'v'))
-          {
-             if (arg->direction == 'o')
-               method->out_complex = EINA_TRUE;
-             else
-               method->in_complex = EINA_TRUE;
-          }
-     }
-   if (method->no_reply)
-     {
-        free(method->cb_name);
-        method->cb_name = strdup("NULL");
-     }
-   method = NULL;
-}
-
 static Eina_Bool
 close_tag(const char *content, unsigned length)
 {