aboutsummaryrefslogtreecommitdiff
path: root/Release/share/glib-2.0/codegen/codegen_main.py
diff options
context:
space:
mode:
Diffstat (limited to 'Release/share/glib-2.0/codegen/codegen_main.py')
-rw-r--r--Release/share/glib-2.0/codegen/codegen_main.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/Release/share/glib-2.0/codegen/codegen_main.py b/Release/share/glib-2.0/codegen/codegen_main.py
new file mode 100644
index 0000000..cc28c81
--- /dev/null
+++ b/Release/share/glib-2.0/codegen/codegen_main.py
@@ -0,0 +1,204 @@
+# -*- Mode: Python -*-
+
+# GDBus - GLib D-Bus Library
+#
+# Copyright (C) 2008-2011 Red Hat, Inc.
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General
+# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
+#
+# Author: David Zeuthen <davidz@redhat.com>
+
+import sys
+import optparse
+
+from . import config
+from . import utils
+from . import dbustypes
+from . import parser
+from . import codegen
+from . import codegen_docbook
+
+def find_arg(arg_list, arg_name):
+ for a in arg_list:
+ if a.name == arg_name:
+ return a
+ return None
+
+def find_method(iface, method):
+ for m in iface.methods:
+ if m.name == method:
+ return m
+ return None
+
+def find_signal(iface, signal):
+ for m in iface.signals:
+ if m.name == signal:
+ return m
+ return None
+
+def find_prop(iface, prop):
+ for m in iface.properties:
+ if m.name == prop:
+ return m
+ return None
+
+def apply_annotation(iface_list, iface, method, signal, prop, arg, key, value):
+ iface_obj = None
+ for i in iface_list:
+ if i.name == iface:
+ iface_obj = i
+ break
+
+ if iface_obj == None:
+ raise RuntimeError('No interface %s'%iface)
+
+ target_obj = None
+
+ if method:
+ method_obj = find_method(iface_obj, method)
+ if method_obj == None:
+ raise RuntimeError('No method %s on interface %s'%(method, iface))
+ if arg:
+ arg_obj = find_arg(method_obj.in_args, arg)
+ if (arg_obj == None):
+ arg_obj = find_arg(method_obj.out_args, arg)
+ if (arg_obj == None):
+ raise RuntimeError('No arg %s on method %s on interface %s'%(arg, method, iface))
+ target_obj = arg_obj
+ else:
+ target_obj = method_obj
+ elif signal:
+ signal_obj = find_signal(iface_obj, signal)
+ if signal_obj == None:
+ raise RuntimeError('No signal %s on interface %s'%(signal, iface))
+ if arg:
+ arg_obj = find_arg(signal_obj.args, arg)
+ if (arg_obj == None):
+ raise RuntimeError('No arg %s on signal %s on interface %s'%(arg, signal, iface))
+ target_obj = arg_obj
+ else:
+ target_obj = signal_obj
+ elif prop:
+ prop_obj = find_prop(iface_obj, prop)
+ if prop_obj == None:
+ raise RuntimeError('No property %s on interface %s'%(prop, iface))
+ target_obj = prop_obj
+ else:
+ target_obj = iface_obj
+ target_obj.annotations.insert(0, dbustypes.Annotation(key, value))
+
+
+def apply_annotations(iface_list, annotation_list):
+ # apply annotations given on the command line
+ for (what, key, value) in annotation_list:
+ pos = what.find('::')
+ if pos != -1:
+ # signal
+ iface = what[0:pos];
+ signal = what[pos + 2:]
+ pos = signal.find('[')
+ if pos != -1:
+ arg = signal[pos + 1:]
+ signal = signal[0:pos]
+ pos = arg.find(']')
+ arg = arg[0:pos]
+ apply_annotation(iface_list, iface, None, signal, None, arg, key, value)
+ else:
+ apply_annotation(iface_list, iface, None, signal, None, None, key, value)
+ else:
+ pos = what.find(':')
+ if pos != -1:
+ # property
+ iface = what[0:pos];
+ prop = what[pos + 1:]
+ apply_annotation(iface_list, iface, None, None, prop, None, key, value)
+ else:
+ pos = what.find('()')
+ if pos != -1:
+ # method
+ combined = what[0:pos]
+ pos = combined.rfind('.')
+ iface = combined[0:pos]
+ method = combined[pos + 1:]
+ pos = what.find('[')
+ if pos != -1:
+ arg = what[pos + 1:]
+ pos = arg.find(']')
+ arg = arg[0:pos]
+ apply_annotation(iface_list, iface, method, None, None, arg, key, value)
+ else:
+ apply_annotation(iface_list, iface, method, None, None, None, key, value)
+ else:
+ # must be an interface
+ iface = what
+ apply_annotation(iface_list, iface, None, None, None, None, key, value)
+
+def codegen_main():
+ arg_parser = optparse.OptionParser('%prog [options]')
+ arg_parser.add_option('', '--xml-files', metavar='FILE', action='append',
+ help='D-Bus introspection XML file')
+ arg_parser.add_option('', '--interface-prefix', metavar='PREFIX', default='',
+ help='String to strip from D-Bus interface names for code and docs')
+ arg_parser.add_option('', '--c-namespace', metavar='NAMESPACE', default='',
+ help='The namespace to use for generated C code')
+ arg_parser.add_option('', '--c-generate-object-manager', action='store_true',
+ help='Generate a GDBusObjectManagerClient subclass when generating C code')
+ arg_parser.add_option('', '--generate-c-code', metavar='OUTFILES',
+ help='Generate C code in OUTFILES.[ch]')
+ arg_parser.add_option('', '--c-generate-autocleanup', type='choice', choices=['none', 'objects', 'all'], default='objects',
+ help='Generate autocleanup support')
+ arg_parser.add_option('', '--generate-docbook', metavar='OUTFILES',
+ help='Generate Docbook in OUTFILES-org.Project.IFace.xml')
+ arg_parser.add_option('', '--annotate', nargs=3, action='append', metavar='WHAT KEY VALUE',
+ help='Add annotation (may be used several times)')
+ (opts, args) = arg_parser.parse_args();
+
+ all_ifaces = []
+ for fname in args:
+ f = open(fname, 'rb')
+ xml_data = f.read()
+ f.close()
+ parsed_ifaces = parser.parse_dbus_xml(xml_data)
+ all_ifaces.extend(parsed_ifaces)
+
+ if opts.annotate != None:
+ apply_annotations(all_ifaces, opts.annotate)
+
+ for i in all_ifaces:
+ i.post_process(opts.interface_prefix, opts.c_namespace)
+
+ docbook = opts.generate_docbook
+ docbook_gen = codegen_docbook.DocbookCodeGenerator(all_ifaces, docbook);
+ if docbook:
+ ret = docbook_gen.generate()
+
+ c_code = opts.generate_c_code
+ if c_code:
+ h = open(c_code + '.h', 'w')
+ c = open(c_code + '.c', 'w')
+ gen = codegen.CodeGenerator(all_ifaces,
+ opts.c_namespace,
+ opts.interface_prefix,
+ opts.c_generate_object_manager,
+ opts.c_generate_autocleanup,
+ docbook_gen,
+ h, c);
+ ret = gen.generate()
+ h.close()
+ c.close()
+
+ sys.exit(0)
+
+if __name__ == "__main__":
+ codegen_main()