From febfc45fbeaf9f1df3de2310e32c6bce3ea9bbf3 Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Fri, 15 Apr 2011 08:24:40 -0400 Subject: [PATCH] GDBus: Support Ugly_Case and use org.gtk.GDBus.C.Name since it's C-only Signed-off-by: David Zeuthen --- 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 cdfd28974..2a389e2ec 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 \ - org.gtk.GDBus.Name + org.gtk.GDBus.C.Name Can be used on any <interface>, <method>, <signal> and <property> element to specify the - name to use. + name to use when generating C code. The value is always + expected to be in CamelCase + or Ugly_Case (see below). - For interfaces where this annotation is not specified, the - name used is the D-Bus interface name stripped with the - prefix given with and with - the dots removed and initial characters capitalized. For - example the D-Bus interface - com.acme.Coyote the name used is - ComAcmeCoyote. For the D-Bus interface - org.project.Bar.Frobnicator with - + For interfaces, if not specified, the name defaults to the + D-Bus interface name stripped with the prefix given with + and with the dots + removed and initial characters capitalized. For example, for + the D-Bus interface com.acme.Coyote the + name used is ComAcmeCoyote. For the D-Bus + interface org.project.Bar.Frobnicator + with org.project., the name used is - BarFrobnicator. + BarFrobnicator. - For methods, signals and properties the name used is - calculated by transforming - NameGivenThisWay into - name_given_this_way, 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. + + + 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). + + + If the value given by the annotation contains an underscore + (sometimes called Ugly_Case), 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 + net.MyCorp.MyApp.iSCSITarget with the + value iSCSI_Target the CamelCase form is + iSCSITarget while the lower-case form is + iscsi_target. If the annotation is used + on the method EjectTheiPod with the value + Eject_The_iPod, the lower-case form is + eject_the_ipod. diff --git a/gio/gdbus-codegen/dbustypes.py b/gio/gdbus-codegen/dbustypes.py index 524137165..d016cad27 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 0cb8d6164..6c3fb8566 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 d0f0f990c..de3d3b071 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 236d5fd3d..ae8333c20 100644 --- a/gio/tests/test-codegen.xml +++ b/gio/tests/test-codegen.xml @@ -135,21 +135,21 @@ - + - + - + - + @@ -398,4 +398,20 @@ + + + + + + + + + + + + + + + +