[glib/gdbus-codegen] GDBus: Support Ugly_Case and use org.gtk.GDBus.C.Name since it's C-only



commit febfc45fbeaf9f1df3de2310e32c6bce3ea9bbf3
Author: David Zeuthen <davidz redhat com>
Date:   Fri Apr 15 08:24:40 2011 -0400

    GDBus: Support Ugly_Case and use org.gtk.GDBus.C.Name since it's C-only
    
    Signed-off-by: David Zeuthen <davidz redhat com>

 docs/reference/gio/gdbus-codegen.xml |   60 ++++++++++++++++-------
 gio/gdbus-codegen/dbustypes.py       |   86 +++++++++++++++++++++-------------
 gio/gdbus-codegen/utils.py           |    5 ++
 gio/tests/gdbus-test-codegen.c       |    6 ++
 gio/tests/test-codegen.xml           |   24 ++++++++--
 5 files changed, 125 insertions(+), 56 deletions(-)
---
diff --git a/docs/reference/gio/gdbus-codegen.xml b/docs/reference/gio/gdbus-codegen.xml
index cdfd289..2a389e2 100644
--- a/docs/reference/gio/gdbus-codegen.xml
+++ b/docs/reference/gio/gdbus-codegen.xml
@@ -154,7 +154,7 @@
 gdbus-codegen --c-namespace MyApp                           \
   --generate-c-code myapp-generated                         \
   --annotate "org.project.InterfaceName"                    \
-    --key org.gtk.GDBus.Name --value MyFrobnicator          \
+    --key org.gtk.GDBus.C.Name --value MyFrobnicator        \
   --annotate "org.project.InterfaceName:Property"           \
     --key bar --value bat                                   \
   --annotate "org.project.InterfaceName.Method()"           \
@@ -182,35 +182,57 @@ gdbus-codegen --c-namespace MyApp                           \
   <variablelist>
 
     <varlistentry>
-      <term><literal>org.gtk.GDBus.Name</literal></term>
+      <term><literal>org.gtk.GDBus.C.Name</literal></term>
       <listitem>
         <para>
           Can be used on any <literal>&lt;interface&gt;</literal>,
           <literal>&lt;method&gt;</literal>,
           <literal>&lt;signal&gt;</literal> and
           <literal>&lt;property&gt;</literal> element to specify the
-          name to use.
+          name to use when generating C code. The value is always
+          expected to be in <ulink
+          url="http://en.wikipedia.org/wiki/CamelCase";>CamelCase</ulink>
+          or <emphasis>Ugly_Case</emphasis> (see below).
         </para>
         <para>
-          For interfaces where this annotation is not specified, the
-          name used is the D-Bus interface name stripped with the
-          prefix given with <option>--interface-prefix</option> and with
-          the dots removed and initial characters capitalized. For
-          example the D-Bus interface
-          <literal>com.acme.Coyote</literal> the name used is
-          <type>ComAcmeCoyote</type>. For the D-Bus interface
-          <literal>org.project.Bar.Frobnicator</literal> with
-          <option>--interface-prefix</option>
+          For interfaces, if not specified, the name defaults to the
+          D-Bus interface name stripped with the prefix given with
+          <option>--interface-prefix</option> and with the dots
+          removed and initial characters capitalized. For example, for
+          the D-Bus interface <literal>com.acme.Coyote</literal> the
+          name used is <literal>ComAcmeCoyote</literal>. For the D-Bus
+          interface <literal>org.project.Bar.Frobnicator</literal>
+          with <option>--interface-prefix</option>
           <literal>org.project.</literal>, the name used is
-          <type>BarFrobnicator</type>.
+          <literal>BarFrobnicator</literal>.
         </para>
         <para>
-          For methods, signals and properties the name used is
-          calculated by transforming
-          <literal>NameGivenThisWay</literal> into
-          <literal>name_given_this_way</literal>, e.g. roughly
-          converting from camel-case to lower-case with underscores
-          using certain heuristics.
+          For methods, signals and properties, if not specified, the
+          name defaults to the name of the method, signal or property.
+        </para>
+        <para>
+          Two forms of the name are used - the CamelCase form and
+          the lower-case form. The CamelCase form is used for the #GType
+          and struct name, while lower-case form is used in function
+          names. The lower-case form is calculated by converting from
+          CamelCase to lower-case and inserting underscores at word
+          boundaries (using certain heuristics).
+        </para>
+        <para>
+          If the value given by the annotation contains an underscore
+          (sometimes called <emphasis>Ugly_Case</emphasis>), then the
+          camel-case name is derived by removing all underscores, and
+          the lower-case name is derived by lower-casing the
+          string. This is useful in some situations where
+          abbreviations are used. For example, if the annotation is
+          used on the interface
+          <literal>net.MyCorp.MyApp.iSCSITarget</literal> with the
+          value <literal>iSCSI_Target</literal> the CamelCase form is
+          <literal>iSCSITarget</literal> while the lower-case form is
+          <literal>iscsi_target</literal>. If the annotation is used
+          on the method <literal>EjectTheiPod</literal> with the value
+          <literal>Eject_The_iPod</literal>, the lower-case form is
+          <literal>eject_the_ipod</literal>.
         </para>
       </listitem>
     </varlistentry>
diff --git a/gio/gdbus-codegen/dbustypes.py b/gio/gdbus-codegen/dbustypes.py
index 5241371..d016cad 100644
--- a/gio/gdbus-codegen/dbustypes.py
+++ b/gio/gdbus-codegen/dbustypes.py
@@ -170,11 +170,13 @@ class Method:
             self.since = utils.lookup_since(self.annotations)
 
         name = self.name
-        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.Name')
-        if overridden_name:
-            name = overridden_name
-
-        self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
+        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
+        if utils.is_ugly_case(overridden_name):
+            self.name_lower = overridden_name.lower()
+        else:
+            if overridden_name:
+                name = overridden_name
+            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
         self.name_hyphen = self.name_lower.replace('_', '-')
 
         arg_count = 0
@@ -201,11 +203,13 @@ class Signal:
             self.since = utils.lookup_since(self.annotations)
 
         name = self.name
-        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.Name')
-        if overridden_name:
-            name = overridden_name
-
-        self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
+        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
+        if utils.is_ugly_case(overridden_name):
+            self.name_lower = overridden_name.lower()
+        else:
+            if overridden_name:
+                name = overridden_name
+            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
         self.name_hyphen = self.name_lower.replace('_', '-')
 
         arg_count = 0
@@ -242,11 +246,13 @@ class Property:
             self.since = utils.lookup_since(self.annotations)
 
         name = self.name
-        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.Name')
-        if overridden_name:
-            name = overridden_name
-
-        self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
+        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
+        if utils.is_ugly_case(overridden_name):
+            self.name_lower = overridden_name.lower()
+        else:
+            if overridden_name:
+                name = overridden_name
+            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
         self.name_hyphen = self.name_lower.replace('_', '-')
 
         # recalculate arg
@@ -272,26 +278,40 @@ class Interface:
         if len(self.since) == 0:
             self.since = utils.lookup_since(self.annotations)
 
-        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.Name')
-        if overridden_name:
-            name = overridden_name
-        else:
-            name = self.name
-            if name.startswith(interface_prefix):
-                name = name[len(interface_prefix):]
-        self.name_without_prefix = name
-        name = utils.strip_dots(name)
-        name_with_ns = utils.strip_dots(c_namespace + '.' + name)
-
+        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
+        if utils.is_ugly_case(overridden_name):
+            name = overridden_name.replace('_', '')
+            name_with_ns = c_namespace + name
+            self.name_without_prefix = name
+            self.camel_name = name_with_ns
+            if len(c_namespace) > 0:
+                self.ns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
+                self.name_lower = utils.camel_case_to_uscore(c_namespace) + '_' + overridden_name.lower()
+            else:
+                self.ns_upper = ''
+                self.name_lower = overridden_name.lower()
+            self.name_upper = overridden_name.upper()
 
-        self.camel_name = name_with_ns
-        if len(c_namespace) > 0:
-            self.ns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
-            self.name_lower = utils.camel_case_to_uscore(c_namespace) + '_' + utils.camel_case_to_uscore(name)
+            #raise RuntimeError('handle Ugly_Case ', overridden_name)
         else:
-            self.ns_upper = ''
-            self.name_lower = utils.camel_case_to_uscore(name_with_ns)
-        self.name_upper = utils.camel_case_to_uscore(name).upper()
+            if overridden_name:
+                name = overridden_name
+            else:
+                name = self.name
+                if name.startswith(interface_prefix):
+                    name = name[len(interface_prefix):]
+            self.name_without_prefix = name
+            name = utils.strip_dots(name)
+            name_with_ns = utils.strip_dots(c_namespace + '.' + name)
+
+            self.camel_name = name_with_ns
+            if len(c_namespace) > 0:
+                self.ns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
+                self.name_lower = utils.camel_case_to_uscore(c_namespace) + '_' + utils.camel_case_to_uscore(name)
+            else:
+                self.ns_upper = ''
+                self.name_lower = utils.camel_case_to_uscore(name_with_ns)
+            self.name_upper = utils.camel_case_to_uscore(name).upper()
 
         for m in self.methods:
             m.post_process(interface_prefix, c_namespace)
diff --git a/gio/gdbus-codegen/utils.py b/gio/gdbus-codegen/utils.py
index 0cb8d61..6c3fb85 100644
--- a/gio/gdbus-codegen/utils.py
+++ b/gio/gdbus-codegen/utils.py
@@ -34,6 +34,11 @@ def camel_case_to_uscore(s):
         insert_uscore = False
     return ret
 
+def is_ugly_case(s):
+    if s and s.find('_') > 0:
+        return True
+    return False
+
 def lookup_annotation(annotations, key):
     if annotations:
         for a in annotations:
diff --git a/gio/tests/gdbus-test-codegen.c b/gio/tests/gdbus-test-codegen.c
index d0f0f99..de3d3b0 100644
--- a/gio/tests/gdbus-test-codegen.c
+++ b/gio/tests/gdbus-test-codegen.c
@@ -2137,10 +2137,16 @@ extern gpointer name_forcing_1;
 extern gpointer name_forcing_2;
 extern gpointer name_forcing_3;
 extern gpointer name_forcing_4;
+extern gpointer name_forcing_5;
+extern gpointer name_forcing_6;
+extern gpointer name_forcing_7;
 gpointer name_forcing_1 = foo_rocket123_get_gtype;
 gpointer name_forcing_2 = foo_rocket123_call_ignite_xyz;
 gpointer name_forcing_3 = foo_rocket123_emit_exploded_xyz;
 gpointer name_forcing_4 = foo_rocket123_get_speed_xyz;
+gpointer name_forcing_5 = foo_test_ugly_case_interface_call_get_iscsi_servers;
+gpointer name_forcing_6 = foo_test_ugly_case_interface_emit_servers_updated_now;
+gpointer name_forcing_7 = foo_test_ugly_case_interface_get_ugly_name;
 
 /* ---------------------------------------------------------------------------------------------------- */
 
diff --git a/gio/tests/test-codegen.xml b/gio/tests/test-codegen.xml
index 236d5fd..ae8333c 100644
--- a/gio/tests/test-codegen.xml
+++ b/gio/tests/test-codegen.xml
@@ -135,21 +135,21 @@
   <!-- force various names -->
   <interface name="com.acme.Rocket">
     <!-- Forcing the typename via an annotation -->
-    <annotation name="org.gtk.GDBus.Name" value="Rocket123"/>
+    <annotation name="org.gtk.GDBus.C.Name" value="Rocket123"/>
 
     <!-- ditto method -->
     <method name="Ignite">
-      <annotation name="org.gtk.GDBus.Name" value="ignite_xyz"/>
+      <annotation name="org.gtk.GDBus.C.Name" value="ignite_xyz"/>
     </method>
 
     <!-- ditto signal -->
     <signal name="Exploded">
-      <annotation name="org.gtk.GDBus.Name" value="exploded-xyz"/>
+      <annotation name="org.gtk.GDBus.C.Name" value="exploded-xyz"/>
     </signal>
 
     <!-- ditto property -->
     <property name="Speed" type="d" access="read">
-      <annotation name="org.gtk.GDBus.Name" value="speed-xyz"/>
+      <annotation name="org.gtk.GDBus.C.Name" value="speed-xyz"/>
     </property>
 
     <property name="Direction" type="(ddd)" access="read"/>
@@ -398,4 +398,20 @@
     <method name="FooMethod"/>
   </interface>
 
+  <interface name="TestUglyCaseInterface">
+    <annotation name="org.gtk.GDBus.C.Name" value="TesT_ugly_CASE_Interface"/>
+
+    <method name="GetiSCSIServers">
+      <annotation name="org.gtk.GDBus.C.Name" value="Get_iSCSI_Servers"/>
+    </method>
+
+    <signal name="serversUPDATEDNOW">
+      <annotation name="org.gtk.GDBus.C.Name" value="Servers_UPDATED_NOW"/>
+    </signal>
+
+    <property name="UGLYNAME" type="i" access="readwrite">
+      <annotation name="org.gtk.GDBus.C.Name" value="UGLY_NAME"/>
+    </property>
+  </interface>
+
 </node>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]