Blame gio/gdbus-2.0/codegen/dbustypes.py

Packit ae235b
# -*- Mode: Python -*-
Packit ae235b
Packit ae235b
# GDBus - GLib D-Bus Library
Packit ae235b
#
Packit ae235b
# Copyright (C) 2008-2011 Red Hat, Inc.
Packit ae235b
#
Packit ae235b
# This library is free software; you can redistribute it and/or
Packit ae235b
# modify it under the terms of the GNU Lesser General Public
Packit ae235b
# License as published by the Free Software Foundation; either
Packit ae235b
# version 2.1 of the License, or (at your option) any later version.
Packit ae235b
#
Packit ae235b
# This library is distributed in the hope that it will be useful,
Packit ae235b
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit ae235b
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit ae235b
# Lesser General Public License for more details.
Packit ae235b
#
Packit ae235b
# You should have received a copy of the GNU Lesser General
Packit ae235b
# Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
Packit ae235b
#
Packit ae235b
# Author: David Zeuthen <davidz@redhat.com>
Packit ae235b
Packit ae235b
from . import utils
Packit ae235b
from .utils import print_error
Packit ae235b
Packit ae235b
class Annotation:
Packit ae235b
    def __init__(self, key, value):
Packit ae235b
        self.key = key
Packit ae235b
        self.value = value
Packit ae235b
        self.annotations = []
Packit ae235b
Packit ae235b
class Arg:
Packit ae235b
    def __init__(self, name, signature):
Packit ae235b
        self.name = name
Packit ae235b
        self.signature = signature
Packit ae235b
        self.annotations = []
Packit ae235b
        self.doc_string = ''
Packit ae235b
        self.since = ''
Packit ae235b
Packit ae235b
    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, arg_number):
Packit ae235b
        if len(self.doc_string) == 0:
Packit ae235b
            self.doc_string = utils.lookup_docs(self.annotations)
Packit ae235b
        if len(self.since) == 0:
Packit ae235b
            self.since = utils.lookup_since(self.annotations)
Packit ae235b
Packit ae235b
        if self.name == None:
Packit ae235b
            self.name = 'unnamed_arg%d'%arg_number
Packit ae235b
        # default to GVariant
Packit ae235b
        self.ctype_in_g  = 'GVariant *'
Packit ae235b
        self.ctype_in  = 'GVariant *'
Packit ae235b
        self.ctype_in_dup  = 'GVariant *'
Packit ae235b
        self.ctype_out = 'GVariant **'
Packit ae235b
        self.gtype = 'G_TYPE_VARIANT'
Packit ae235b
        self.free_func = 'g_variant_unref'
Packit ae235b
        self.format_in = '@' + self.signature
Packit ae235b
        self.format_out = '@' + self.signature
Packit ae235b
        self.gvariant_get = 'XXX'
Packit ae235b
        self.gvalue_get = 'g_value_get_variant'
Packit ae235b
        self.array_annotation = ''
Packit ae235b
Packit ae235b
        if not utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
Packit ae235b
            if self.signature == 'b':
Packit ae235b
                self.ctype_in_g  = 'gboolean '
Packit ae235b
                self.ctype_in  = 'gboolean '
Packit ae235b
                self.ctype_out = 'gboolean *'
Packit ae235b
                self.gtype = 'G_TYPE_BOOLEAN'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'b'
Packit ae235b
                self.format_out = 'b'
Packit ae235b
                self.gvariant_get = 'g_variant_get_boolean'
Packit ae235b
                self.gvalue_get = 'g_value_get_boolean'
Packit ae235b
            elif self.signature == 'y':
Packit ae235b
                self.ctype_in_g  = 'guchar '
Packit ae235b
                self.ctype_in  = 'guchar '
Packit ae235b
                self.ctype_out = 'guchar *'
Packit ae235b
                self.gtype = 'G_TYPE_UCHAR'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'y'
Packit ae235b
                self.format_out = 'y'
Packit ae235b
                self.gvariant_get = 'g_variant_get_byte'
Packit ae235b
                self.gvalue_get = 'g_value_get_uchar'
Packit ae235b
            elif self.signature == 'n':
Packit ae235b
                self.ctype_in_g  = 'gint '
Packit ae235b
                self.ctype_in  = 'gint16 '
Packit ae235b
                self.ctype_out = 'gint16 *'
Packit ae235b
                self.gtype = 'G_TYPE_INT'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'n'
Packit ae235b
                self.format_out = 'n'
Packit ae235b
                self.gvariant_get = 'g_variant_get_int16'
Packit ae235b
                self.gvalue_get = 'g_value_get_int'
Packit ae235b
            elif self.signature == 'q':
Packit ae235b
                self.ctype_in_g  = 'guint '
Packit ae235b
                self.ctype_in  = 'guint16 '
Packit ae235b
                self.ctype_out = 'guint16 *'
Packit ae235b
                self.gtype = 'G_TYPE_UINT'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'q'
Packit ae235b
                self.format_out = 'q'
Packit ae235b
                self.gvariant_get = 'g_variant_get_uint16'
Packit ae235b
                self.gvalue_get = 'g_value_get_uint'
Packit ae235b
            elif self.signature == 'i':
Packit ae235b
                self.ctype_in_g  = 'gint '
Packit ae235b
                self.ctype_in  = 'gint '
Packit ae235b
                self.ctype_out = 'gint *'
Packit ae235b
                self.gtype = 'G_TYPE_INT'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'i'
Packit ae235b
                self.format_out = 'i'
Packit ae235b
                self.gvariant_get = 'g_variant_get_int32'
Packit ae235b
                self.gvalue_get = 'g_value_get_int'
Packit ae235b
            elif self.signature == 'u':
Packit ae235b
                self.ctype_in_g  = 'guint '
Packit ae235b
                self.ctype_in  = 'guint '
Packit ae235b
                self.ctype_out = 'guint *'
Packit ae235b
                self.gtype = 'G_TYPE_UINT'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'u'
Packit ae235b
                self.format_out = 'u'
Packit ae235b
                self.gvariant_get = 'g_variant_get_uint32'
Packit ae235b
                self.gvalue_get = 'g_value_get_uint'
Packit ae235b
            elif self.signature == 'x':
Packit ae235b
                self.ctype_in_g  = 'gint64 '
Packit ae235b
                self.ctype_in  = 'gint64 '
Packit ae235b
                self.ctype_out = 'gint64 *'
Packit ae235b
                self.gtype = 'G_TYPE_INT64'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'x'
Packit ae235b
                self.format_out = 'x'
Packit ae235b
                self.gvariant_get = 'g_variant_get_int64'
Packit ae235b
                self.gvalue_get = 'g_value_get_int64'
Packit ae235b
            elif self.signature == 't':
Packit ae235b
                self.ctype_in_g  = 'guint64 '
Packit ae235b
                self.ctype_in  = 'guint64 '
Packit ae235b
                self.ctype_out = 'guint64 *'
Packit ae235b
                self.gtype = 'G_TYPE_UINT64'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 't'
Packit ae235b
                self.format_out = 't'
Packit ae235b
                self.gvariant_get = 'g_variant_get_uint64'
Packit ae235b
                self.gvalue_get = 'g_value_get_uint64'
Packit ae235b
            elif self.signature == 'd':
Packit ae235b
                self.ctype_in_g  = 'gdouble '
Packit ae235b
                self.ctype_in  = 'gdouble '
Packit ae235b
                self.ctype_out = 'gdouble *'
Packit ae235b
                self.gtype = 'G_TYPE_DOUBLE'
Packit ae235b
                self.free_func = None
Packit ae235b
                self.format_in = 'd'
Packit ae235b
                self.format_out = 'd'
Packit ae235b
                self.gvariant_get = 'g_variant_get_double'
Packit ae235b
                self.gvalue_get = 'g_value_get_double'
Packit ae235b
            elif self.signature == 's':
Packit ae235b
                self.ctype_in_g  = 'const gchar *'
Packit ae235b
                self.ctype_in  = 'const gchar *'
Packit ae235b
                self.ctype_in_dup  = 'gchar *'
Packit ae235b
                self.ctype_out = 'gchar **'
Packit ae235b
                self.gtype = 'G_TYPE_STRING'
Packit ae235b
                self.free_func = 'g_free'
Packit ae235b
                self.format_in = 's'
Packit ae235b
                self.format_out = 's'
Packit ae235b
                self.gvariant_get = 'g_variant_get_string'
Packit ae235b
                self.gvalue_get = 'g_value_get_string'
Packit ae235b
            elif self.signature == 'o':
Packit ae235b
                self.ctype_in_g  = 'const gchar *'
Packit ae235b
                self.ctype_in  = 'const gchar *'
Packit ae235b
                self.ctype_in_dup  = 'gchar *'
Packit ae235b
                self.ctype_out = 'gchar **'
Packit ae235b
                self.gtype = 'G_TYPE_STRING'
Packit ae235b
                self.free_func = 'g_free'
Packit ae235b
                self.format_in = 'o'
Packit ae235b
                self.format_out = 'o'
Packit ae235b
                self.gvariant_get = 'g_variant_get_string'
Packit ae235b
                self.gvalue_get = 'g_value_get_string'
Packit ae235b
            elif self.signature == 'g':
Packit ae235b
                self.ctype_in_g  = 'const gchar *'
Packit ae235b
                self.ctype_in  = 'const gchar *'
Packit ae235b
                self.ctype_in_dup  = 'gchar *'
Packit ae235b
                self.ctype_out = 'gchar **'
Packit ae235b
                self.gtype = 'G_TYPE_STRING'
Packit ae235b
                self.free_func = 'g_free'
Packit ae235b
                self.format_in = 'g'
Packit ae235b
                self.format_out = 'g'
Packit ae235b
                self.gvariant_get = 'g_variant_get_string'
Packit ae235b
                self.gvalue_get = 'g_value_get_string'
Packit ae235b
            elif self.signature == 'ay':
Packit ae235b
                self.ctype_in_g  = 'const gchar *'
Packit ae235b
                self.ctype_in  = 'const gchar *'
Packit ae235b
                self.ctype_in_dup  = 'gchar *'
Packit ae235b
                self.ctype_out = 'gchar **'
Packit ae235b
                self.gtype = 'G_TYPE_STRING'
Packit ae235b
                self.free_func = 'g_free'
Packit ae235b
                self.format_in = '^ay'
Packit ae235b
                self.format_out = '^ay'
Packit ae235b
                self.gvariant_get = 'g_variant_get_bytestring'
Packit ae235b
                self.gvalue_get = 'g_value_get_string'
Packit ae235b
            elif self.signature == 'as':
Packit ae235b
                self.ctype_in_g  = 'const gchar *const *'
Packit ae235b
                self.ctype_in  = 'const gchar *const *'
Packit ae235b
                self.ctype_in_dup  = 'gchar **'
Packit ae235b
                self.ctype_out = 'gchar ***'
Packit ae235b
                self.gtype = 'G_TYPE_STRV'
Packit ae235b
                self.free_func = 'g_strfreev'
Packit ae235b
                self.format_in = '^as'
Packit ae235b
                self.format_out = '^as'
Packit ae235b
                self.gvariant_get = 'g_variant_get_strv'
Packit ae235b
                self.gvalue_get = 'g_value_get_boxed'
Packit ae235b
                self.array_annotation = '(array zero-terminated=1)'
Packit ae235b
            elif self.signature == 'ao':
Packit ae235b
                self.ctype_in_g  = 'const gchar *const *'
Packit ae235b
                self.ctype_in  = 'const gchar *const *'
Packit ae235b
                self.ctype_in_dup  = 'gchar **'
Packit ae235b
                self.ctype_out = 'gchar ***'
Packit ae235b
                self.gtype = 'G_TYPE_STRV'
Packit ae235b
                self.free_func = 'g_strfreev'
Packit ae235b
                self.format_in = '^ao'
Packit ae235b
                self.format_out = '^ao'
Packit ae235b
                self.gvariant_get = 'g_variant_get_objv'
Packit ae235b
                self.gvalue_get = 'g_value_get_boxed'
Packit ae235b
                self.array_annotation = '(array zero-terminated=1)'
Packit ae235b
            elif self.signature == 'aay':
Packit ae235b
                self.ctype_in_g  = 'const gchar *const *'
Packit ae235b
                self.ctype_in  = 'const gchar *const *'
Packit ae235b
                self.ctype_in_dup  = 'gchar **'
Packit ae235b
                self.ctype_out = 'gchar ***'
Packit ae235b
                self.gtype = 'G_TYPE_STRV'
Packit ae235b
                self.free_func = 'g_strfreev'
Packit ae235b
                self.format_in = '^aay'
Packit ae235b
                self.format_out = '^aay'
Packit ae235b
                self.gvariant_get = 'g_variant_get_bytestring_array'
Packit ae235b
                self.gvalue_get = 'g_value_get_boxed'
Packit ae235b
                self.array_annotation = '(array zero-terminated=1)'
Packit ae235b
Packit ae235b
Packit ae235b
class Method:
Packit ae235b
    def __init__(self, name):
Packit ae235b
        self.name = name
Packit ae235b
        self.in_args = []
Packit ae235b
        self.out_args = []
Packit ae235b
        self.annotations = []
Packit ae235b
        self.doc_string = ''
Packit ae235b
        self.since = ''
Packit ae235b
        self.deprecated = False
Packit ae235b
Packit ae235b
    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
Packit ae235b
        if len(self.doc_string) == 0:
Packit ae235b
            self.doc_string = utils.lookup_docs(self.annotations)
Packit ae235b
        if len(self.since) == 0:
Packit ae235b
            self.since = utils.lookup_since(self.annotations)
Packit ae235b
            if len(self.since) == 0:
Packit ae235b
                self.since = containing_iface.since
Packit ae235b
Packit ae235b
        name = self.name
Packit ae235b
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
Packit ae235b
        if utils.is_ugly_case(overridden_name):
Packit ae235b
            self.name_lower = overridden_name.lower()
Packit ae235b
        else:
Packit ae235b
            if overridden_name:
Packit ae235b
                name = overridden_name
Packit ae235b
            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
Packit ae235b
        self.name_hyphen = self.name_lower.replace('_', '-')
Packit ae235b
Packit ae235b
        arg_count = 0
Packit ae235b
        for a in self.in_args:
Packit ae235b
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count)
Packit ae235b
            arg_count += 1
Packit ae235b
Packit ae235b
        for a in self.out_args:
Packit ae235b
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count)
Packit ae235b
            arg_count += 1
Packit ae235b
Packit ae235b
        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
Packit ae235b
            self.deprecated = True
Packit ae235b
Packit ae235b
class Signal:
Packit ae235b
    def __init__(self, name):
Packit ae235b
        self.name = name
Packit ae235b
        self.args = []
Packit ae235b
        self.annotations = []
Packit ae235b
        self.doc_string = ''
Packit ae235b
        self.since = ''
Packit ae235b
        self.deprecated = False
Packit ae235b
Packit ae235b
    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
Packit ae235b
        if len(self.doc_string) == 0:
Packit ae235b
            self.doc_string = utils.lookup_docs(self.annotations)
Packit ae235b
        if len(self.since) == 0:
Packit ae235b
            self.since = utils.lookup_since(self.annotations)
Packit ae235b
            if len(self.since) == 0:
Packit ae235b
                self.since = containing_iface.since
Packit ae235b
Packit ae235b
        name = self.name
Packit ae235b
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
Packit ae235b
        if utils.is_ugly_case(overridden_name):
Packit ae235b
            self.name_lower = overridden_name.lower()
Packit ae235b
        else:
Packit ae235b
            if overridden_name:
Packit ae235b
                name = overridden_name
Packit ae235b
            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
Packit ae235b
        self.name_hyphen = self.name_lower.replace('_', '-')
Packit ae235b
Packit ae235b
        arg_count = 0
Packit ae235b
        for a in self.args:
Packit ae235b
            a.post_process(interface_prefix, cns, cns_upper, cns_lower, arg_count)
Packit ae235b
            arg_count += 1
Packit ae235b
Packit ae235b
        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
Packit ae235b
            self.deprecated = True
Packit ae235b
Packit ae235b
class Property:
Packit ae235b
    def __init__(self, name, signature, access):
Packit ae235b
        self.name = name
Packit ae235b
        self.signature = signature
Packit ae235b
        self.access = access
Packit ae235b
        self.annotations = []
Packit ae235b
        self.arg = Arg('value', self.signature)
Packit ae235b
        self.arg.annotations = self.annotations
Packit ae235b
        self.readable = False
Packit ae235b
        self.writable = False
Packit ae235b
        if self.access == 'readwrite':
Packit ae235b
            self.readable = True
Packit ae235b
            self.writable = True
Packit ae235b
        elif self.access == 'read':
Packit ae235b
            self.readable = True
Packit ae235b
        elif self.access == 'write':
Packit ae235b
            self.writable = True
Packit ae235b
        else:
Packit ae235b
            print_error('Invalid access type "{}"'.format(self.access))
Packit ae235b
        self.doc_string = ''
Packit ae235b
        self.since = ''
Packit ae235b
        self.deprecated = False
Packit ae235b
Packit ae235b
    def post_process(self, interface_prefix, cns, cns_upper, cns_lower, containing_iface):
Packit ae235b
        if len(self.doc_string) == 0:
Packit ae235b
            self.doc_string = utils.lookup_docs(self.annotations)
Packit ae235b
        if len(self.since) == 0:
Packit ae235b
            self.since = utils.lookup_since(self.annotations)
Packit ae235b
            if len(self.since) == 0:
Packit ae235b
                self.since = containing_iface.since
Packit ae235b
Packit ae235b
        name = self.name
Packit ae235b
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
Packit ae235b
        if utils.is_ugly_case(overridden_name):
Packit ae235b
            self.name_lower = overridden_name.lower()
Packit ae235b
        else:
Packit ae235b
            if overridden_name:
Packit ae235b
                name = overridden_name
Packit ae235b
            self.name_lower = utils.camel_case_to_uscore(name).lower().replace('-', '_')
Packit ae235b
        self.name_hyphen = self.name_lower.replace('_', '-')
Packit ae235b
        # don't clash with the GType getter, e.g.: GType foo_bar_get_type (void); G_GNUC_CONST
Packit ae235b
        if self.name_lower == 'type':
Packit ae235b
            self.name_lower = 'type_'
Packit ae235b
Packit ae235b
        # recalculate arg
Packit ae235b
        self.arg.annotations = self.annotations
Packit ae235b
        self.arg.post_process(interface_prefix, cns, cns_upper, cns_lower, 0)
Packit ae235b
Packit ae235b
        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
Packit ae235b
            self.deprecated = True
Packit ae235b
Packit ae235b
class Interface:
Packit ae235b
    def __init__(self, name):
Packit ae235b
        self.name = name
Packit ae235b
        self.methods = []
Packit ae235b
        self.signals = []
Packit ae235b
        self.properties = []
Packit ae235b
        self.annotations = []
Packit ae235b
        self.doc_string = ''
Packit ae235b
        self.doc_string_brief = ''
Packit ae235b
        self.since = ''
Packit ae235b
        self.deprecated = False
Packit ae235b
Packit ae235b
    def post_process(self, interface_prefix, c_namespace):
Packit ae235b
        if len(self.doc_string) == 0:
Packit ae235b
            self.doc_string = utils.lookup_docs(self.annotations)
Packit ae235b
        if len(self.doc_string_brief) == 0:
Packit ae235b
            self.doc_string_brief = utils.lookup_brief_docs(self.annotations)
Packit ae235b
        if len(self.since) == 0:
Packit ae235b
            self.since = utils.lookup_since(self.annotations)
Packit ae235b
Packit ae235b
        if len(c_namespace) > 0:
Packit ae235b
            if utils.is_ugly_case(c_namespace):
Packit ae235b
                cns = c_namespace.replace('_', '')
Packit ae235b
                cns_upper = c_namespace.upper() + '_'
Packit ae235b
                cns_lower = c_namespace.lower() + '_'
Packit ae235b
            else:
Packit ae235b
                cns = c_namespace
Packit ae235b
                cns_upper = utils.camel_case_to_uscore(c_namespace).upper() + '_'
Packit ae235b
                cns_lower = utils.camel_case_to_uscore(c_namespace).lower() + '_'
Packit ae235b
        else:
Packit ae235b
            cns = ''
Packit ae235b
            cns_upper = ''
Packit ae235b
            cns_lower = ''
Packit ae235b
Packit ae235b
        overridden_name = utils.lookup_annotation(self.annotations, 'org.gtk.GDBus.C.Name')
Packit ae235b
        if utils.is_ugly_case(overridden_name):
Packit ae235b
            name = overridden_name.replace('_', '')
Packit ae235b
            name_with_ns = cns + name
Packit ae235b
            self.name_without_prefix = name
Packit ae235b
            self.camel_name = name_with_ns
Packit ae235b
            self.ns_upper = cns_upper
Packit ae235b
            self.name_lower = cns_lower + overridden_name.lower()
Packit ae235b
            self.name_upper = overridden_name.upper()
Packit ae235b
Packit ae235b
            #print_error('handle Ugly_Case "{}"'.format(overridden_name))
Packit ae235b
        else:
Packit ae235b
            if overridden_name:
Packit ae235b
                name = overridden_name
Packit ae235b
            else:
Packit ae235b
                name = self.name
Packit ae235b
                if name.startswith(interface_prefix):
Packit ae235b
                    name = name[len(interface_prefix):]
Packit ae235b
            self.name_without_prefix = name
Packit ae235b
            name = utils.strip_dots(name)
Packit ae235b
            name_with_ns = utils.strip_dots(cns + '.' + name)
Packit ae235b
            self.camel_name = name_with_ns
Packit ae235b
            self.ns_upper = cns_upper
Packit ae235b
            self.name_lower = cns_lower + utils.camel_case_to_uscore(name)
Packit ae235b
            self.name_upper = utils.camel_case_to_uscore(name).upper()
Packit ae235b
Packit ae235b
        self.name_hyphen = self.name_upper.lower().replace('_', '-')
Packit ae235b
Packit ae235b
        if utils.lookup_annotation(self.annotations, 'org.freedesktop.DBus.Deprecated') == 'true':
Packit ae235b
            self.deprecated = True
Packit ae235b
Packit ae235b
        for m in self.methods:
Packit ae235b
            m.post_process(interface_prefix, cns, cns_upper, cns_lower, self)
Packit ae235b
Packit ae235b
        for s in self.signals:
Packit ae235b
            s.post_process(interface_prefix, cns, cns_upper, cns_lower, self)
Packit ae235b
Packit ae235b
        for p in self.properties:
Packit ae235b
            p.post_process(interface_prefix, cns, cns_upper, cns_lower, self)