# -*- Mode: Python -*-
# coding=utf-8

# GDBus - GLib D-Bus Library
#
# Copyright (C) 2008-2018 Red Hat, Inc.
# Copyright (C) 2018 Iñigo Martínez <inigomartinez@gmail.com>
#
# 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.1 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

from . import config
from . import utils
from . import dbustypes
from .utils import print_error

LICENSE_STR = '''/*
 * Generated by gdbus-codegen {!s} from {!s}. DO NOT EDIT.
 *
 * The license of this code is the same as for the D-Bus interface description
 * it was derived from.
 */\n'''

def generate_namespace(namespace):
    ns = namespace
    if len(namespace) > 0:
        if utils.is_ugly_case(namespace):
            ns = namespace.replace('_', '')
            ns_upper = namespace.upper() + '_'
            ns_lower = namespace.lower() + '_'
        else:
            ns_upper = utils.camel_case_to_uscore(namespace).upper() + '_'
            ns_lower = utils.camel_case_to_uscore(namespace).lower() + '_'
    else:
        ns_upper = ''
        ns_lower = ''

    return (ns, ns_upper, ns_lower)

class HeaderCodeGenerator:
    def __init__(self, ifaces, namespace, generate_objmanager,
                 generate_autocleanup, header_name, input_files_basenames,
                 use_pragma, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.generate_objmanager = generate_objmanager
        self.generate_autocleanup = generate_autocleanup
        self.header_guard = header_name.upper().replace('.', '_').replace('-', '_').replace('/', '_').replace(':', '_')
        self.input_files_basenames = input_files_basenames
        self.use_pragma = use_pragma
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_header_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')

        if self.use_pragma:
            self.outfile.write('#pragma once\n')
        else:
            self.outfile.write('#ifndef __{!s}__\n'.format(self.header_guard))
            self.outfile.write('#define __{!s}__\n'.format(self.header_guard))

        self.outfile.write('\n')
        self.outfile.write('#include <gio/gio.h>\n')
        self.outfile.write('\n')
        self.outfile.write('G_BEGIN_DECLS\n')
        self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def declare_types(self):
        for i in self.ifaces:
            self.outfile.write('\n')
            self.outfile.write('/* ------------------------------------------------------------------------ */\n')
            self.outfile.write('/* Declarations for %s */\n'%i.name)
            self.outfile.write('\n')

            # First the GInterface
            self.outfile.write('#define %sTYPE_%s (%s_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower))
            self.outfile.write('#define %s%s(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s, %s))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %sIS_%s(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('#define %s%s_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %sTYPE_%s, %sIface))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%s;\n'%(i.camel_name))
            self.outfile.write('typedef struct _%s %s;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sIface %sIface;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%sIface\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  GTypeInterface parent_iface;\n')

            function_pointers = {}

            # vfuncs for methods
            if len(i.methods) > 0:
                self.outfile.write('\n')
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    key = (m.since, '_method_%s'%m.name_lower)
                    value  = '  gboolean (*handle_%s) (\n'%(m.name_lower)
                    value += '    %s *object,\n'%(i.camel_name)
                    value += '    GDBusMethodInvocation *invocation'%()
                    if unix_fd:
                        value += ',\n    GUnixFDList *fd_list'
                    for a in m.in_args:
                        value += ',\n    %sarg_%s'%(a.ctype_in, a.name)
                    value += ');\n\n'
                    function_pointers[key] = value

            # vfuncs for signals
            if len(i.signals) > 0:
                self.outfile.write('\n')
                for s in i.signals:
                    key = (s.since, '_signal_%s'%s.name_lower)
                    value  = '  void (*%s) (\n'%(s.name_lower)
                    value += '    %s *object'%(i.camel_name)
                    for a in s.args:
                        value += ',\n    %sarg_%s'%(a.ctype_in, a.name)
                    value += ');\n\n'
                    function_pointers[key] = value

            # vfuncs for properties
            if len(i.properties) > 0:
                self.outfile.write('\n')
                for p in i.properties:
                    key = (p.since, '_prop_get_%s'%p.name_lower)
                    value = '  %s (*get_%s) (%s *object);\n\n'%(p.arg.ctype_in, p.name_lower, i.camel_name)
                    function_pointers[key] = value

            # Sort according to @since tag, then name.. this ensures
            # that the function pointers don't change order assuming
            # judicious use of @since
            #
            # Also use a proper version comparison function so e.g.
            # 10.0 comes after 2.0.
            #
            # See https://bugzilla.gnome.org/show_bug.cgi?id=647577#c5
            # for discussion
            for key in sorted(function_pointers.keys(), key=utils.version_cmp_key):
                self.outfile.write('%s'%function_pointers[key])

            self.outfile.write('};\n')
            self.outfile.write('\n')
            if self.generate_autocleanup == 'all':
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%s, g_object_unref)\n' % (i.camel_name))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('GType %s_get_type (void) G_GNUC_CONST;\n'%(i.name_lower))
            self.outfile.write('\n')
            self.outfile.write('GDBusInterfaceInfo *%s_interface_info (void);\n'%(i.name_lower))
            self.outfile.write('guint %s_override_properties (GObjectClass *klass, guint property_id_begin);\n'%(i.name_lower))
            self.outfile.write('\n')

            # Then method call completion functions
            if len(i.methods) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus method call completion functions: */\n')
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_complete_%s (\n'
                                       '    %s *object,\n'
                                       '    GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList *fd_list')
                    for a in m.out_args:
                        self.outfile.write(',\n    %s%s'%(a.ctype_in, a.name))
                    self.outfile.write(');\n')
                    self.outfile.write('\n')
                self.outfile.write('\n')

            # Then signal emission functions
            if len(i.signals) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus signal emissions functions: */\n')
                for s in i.signals:
                    if s.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_emit_%s (\n'
                                       '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
                    for a in s.args:
                        self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
                    self.outfile.write(');\n')
                    self.outfile.write('\n')
                self.outfile.write('\n')

            # Then method call declarations
            if len(i.methods) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus method calls: */\n')
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    # async begin
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_call_%s (\n'
                                       '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
                    for a in m.in_args:
                        self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList *fd_list')
                    self.outfile.write(',\n'
                                       '    GCancellable *cancellable,\n'
                                       '    GAsyncReadyCallback callback,\n'
                                       '    gpointer user_data);\n')
                    self.outfile.write('\n')
                    # async finish
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('gboolean %s_call_%s_finish (\n'
                                       '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
                    for a in m.out_args:
                        self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList **out_fd_list')
                    self.outfile.write(',\n'
                                       '    GAsyncResult *res,\n'
                                       '    GError **error);\n')
                    self.outfile.write('\n')
                    # sync
                    if m.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('gboolean %s_call_%s_sync (\n'
                                       '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
                    for a in m.in_args:
                        self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList  *fd_list')
                    for a in m.out_args:
                        self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
                    if unix_fd:
                        self.outfile.write(',\n    GUnixFDList **out_fd_list')
                    self.outfile.write(',\n'
                                       '    GCancellable *cancellable,\n'
                                       '    GError **error);\n')
                    self.outfile.write('\n')
                self.outfile.write('\n')

            # Then the property accessor declarations
            if len(i.properties) > 0:
                self.outfile.write('\n')
                self.outfile.write('/* D-Bus property accessors: */\n')
                for p in i.properties:
                    # getter
                    if p.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('%s%s_get_%s (%s *object);\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name))
                    if p.arg.free_func != None:
                        if p.deprecated:
                            self.outfile.write('G_GNUC_DEPRECATED ')
                        self.outfile.write('%s%s_dup_%s (%s *object);\n'%(p.arg.ctype_in_dup, i.name_lower, p.name_lower, i.camel_name))
                    # setter
                    if p.deprecated:
                        self.outfile.write('G_GNUC_DEPRECATED ')
                    self.outfile.write('void %s_set_%s (%s *object, %svalue);\n'%(i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in, ))
                    self.outfile.write('\n')

            # Then the proxy
            self.outfile.write('\n')
            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_%s_PROXY (%s_proxy_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower))
            self.outfile.write('#define %s%s_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s_PROXY, %sProxy))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_%s_PROXY, %sProxyClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_%s_PROXY, %sProxyClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %sIS_%s_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s_PROXY))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('#define %sIS_%s_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_%s_PROXY))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sProxy %sProxy;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sProxyClass %sProxyClass;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sProxyPrivate %sProxyPrivate;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%sProxy\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusProxy parent_instance;\n')
            self.outfile.write('  %sProxyPrivate *priv;\n'%(i.camel_name))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sProxyClass\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusProxyClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %s_proxy_get_type (void) G_GNUC_CONST;\n'%(i.name_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sProxy, g_object_unref)\n' % (i.camel_name))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('void %s_proxy_new (\n'
                               '    GDBusConnection     *connection,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GAsyncReadyCallback  callback,\n'
                               '    gpointer             user_data);\n'
                               %(i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_sync (\n'
                               '    GDBusConnection     *connection,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            self.outfile.write('\n')
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('void %s_proxy_new_for_bus (\n'
                               '    GBusType             bus_type,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GAsyncReadyCallback  callback,\n'
                               '    gpointer             user_data);\n'
                               %(i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_for_bus_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_proxy_new_for_bus_sync (\n'
                               '    GBusType             bus_type,\n'
                               '    GDBusProxyFlags      flags,\n'
                               '    const gchar         *name,\n'
                               '    const gchar         *object_path,\n'
                               '    GCancellable        *cancellable,\n'
                               '    GError             **error);\n'
                               %(i.camel_name, i.name_lower))
            self.outfile.write('\n')

            # Then the skeleton
            self.outfile.write('\n')
            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_%s_SKELETON (%s_skeleton_get_type ())\n'%(i.ns_upper, i.name_upper, i.name_lower))
            self.outfile.write('#define %s%s_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_%s_SKELETON, %sSkeleton))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_%s_SKELETON, %sSkeletonClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %s%s_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_%s_SKELETON, %sSkeletonClass))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper, i.camel_name))
            self.outfile.write('#define %sIS_%s_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_%s_SKELETON))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('#define %sIS_%s_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_%s_SKELETON))\n'%(i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sSkeleton %sSkeleton;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sSkeletonClass %sSkeletonClass;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('typedef struct _%sSkeletonPrivate %sSkeletonPrivate;\n'%(i.camel_name, i.camel_name))
            self.outfile.write('\n')
            self.outfile.write('struct _%sSkeleton\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusInterfaceSkeleton parent_instance;\n')
            self.outfile.write('  %sSkeletonPrivate *priv;\n'%(i.camel_name))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sSkeletonClass\n'%(i.camel_name))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusInterfaceSkeletonClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %s_skeleton_get_type (void) G_GNUC_CONST;\n'%(i.name_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sSkeleton, g_object_unref)\n' % (i.camel_name))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            if i.deprecated:
                self.outfile.write('G_GNUC_DEPRECATED ')
            self.outfile.write('%s *%s_skeleton_new (void);\n'%(i.camel_name, i.name_lower))

            self.outfile.write('\n')

        # Finally, the Object, ObjectProxy, ObjectSkeleton and ObjectManagerClient
        if self.generate_objmanager:
            self.outfile.write('\n')
            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT (%sobject_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT, %sObject))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sOBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), %sTYPE_OBJECT, %sObject))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObject;\n'%(self.namespace))
            self.outfile.write('typedef struct _%sObject %sObject;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectIface %sObjectIface;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectIface\n'%(self.namespace))
            self.outfile.write('{\n'
                               '  GTypeInterface parent_iface;\n'
                               '};\n'
                               '\n')
            self.outfile.write('GType %sobject_get_type (void) G_GNUC_CONST;\n'
                               '\n'
                               %(self.ns_lower))
            if self.generate_autocleanup == 'all':
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObject, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            for i in self.ifaces:
                if i.deprecated:
                    self.outfile.write('G_GNUC_DEPRECATED ')
                self.outfile.write('%s *%sobject_get_%s (%sObject *object);\n'
                                   %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            for i in self.ifaces:
                if i.deprecated:
                    self.outfile.write('G_GNUC_DEPRECATED ')
                self.outfile.write('%s *%sobject_peek_%s (%sObject *object);\n'
                                   %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT_PROXY (%sobject_proxy_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_PROXY, %sObjectProxy))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_PROXY, %sObjectProxyClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_PROXY, %sObjectProxyClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_PROXY))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sIS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_PROXY))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sObjectProxy %sObjectProxy;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectProxyClass %sObjectProxyClass;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectProxyPrivate %sObjectProxyPrivate;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectProxy\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusObjectProxy parent_instance;\n')
            self.outfile.write('  %sObjectProxyPrivate *priv;\n'%(self.namespace))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectProxyClass\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusObjectProxyClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %sobject_proxy_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObjectProxy, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('%sObjectProxy *%sobject_proxy_new (GDBusConnection *connection, const gchar *object_path);\n'%(self.namespace, self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT_SKELETON (%sobject_skeleton_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_SKELETON, %sObjectSkeleton))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_SKELETON, %sObjectSkeletonClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_SKELETON, %sObjectSkeletonClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_SKELETON))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sIS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_SKELETON))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sObjectSkeleton %sObjectSkeleton;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectSkeletonClass %sObjectSkeletonClass;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectSkeletonPrivate %sObjectSkeletonPrivate;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectSkeleton\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusObjectSkeleton parent_instance;\n')
            self.outfile.write('  %sObjectSkeletonPrivate *priv;\n'%(self.namespace))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectSkeletonClass\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusObjectSkeletonClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('GType %sobject_skeleton_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower))
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObjectSkeleton, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('%sObjectSkeleton *%sobject_skeleton_new (const gchar *object_path);\n'
                               %(self.namespace, self.ns_lower))
            for i in self.ifaces:
                if i.deprecated:
                    self.outfile.write('G_GNUC_DEPRECATED ')
                self.outfile.write('void %sobject_skeleton_set_%s (%sObjectSkeleton *object, %s *interface_);\n'
                                   %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name))
            self.outfile.write('\n')

            self.outfile.write('/* ---- */\n')
            self.outfile.write('\n')
            self.outfile.write('#define %sTYPE_OBJECT_MANAGER_CLIENT (%sobject_manager_client_get_type ())\n'%(self.ns_upper, self.ns_lower))
            self.outfile.write('#define %sOBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClient))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClientClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sOBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), %sTYPE_OBJECT_MANAGER_CLIENT, %sObjectManagerClientClass))\n'%(self.ns_upper, self.ns_upper, self.namespace))
            self.outfile.write('#define %sIS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), %sTYPE_OBJECT_MANAGER_CLIENT))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('#define %sIS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), %sTYPE_OBJECT_MANAGER_CLIENT))\n'%(self.ns_upper, self.ns_upper))
            self.outfile.write('\n')
            self.outfile.write('typedef struct _%sObjectManagerClient %sObjectManagerClient;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectManagerClientClass %sObjectManagerClientClass;\n'%(self.namespace, self.namespace))
            self.outfile.write('typedef struct _%sObjectManagerClientPrivate %sObjectManagerClientPrivate;\n'%(self.namespace, self.namespace))
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectManagerClient\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  /*< private >*/\n')
            self.outfile.write('  GDBusObjectManagerClient parent_instance;\n')
            self.outfile.write('  %sObjectManagerClientPrivate *priv;\n'%(self.namespace))
            self.outfile.write('};\n')
            self.outfile.write('\n')
            self.outfile.write('struct _%sObjectManagerClientClass\n'%(self.namespace))
            self.outfile.write('{\n')
            self.outfile.write('  GDBusObjectManagerClientClass parent_class;\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')
            if self.generate_autocleanup in ('objects', 'all'):
                self.outfile.write('#if GLIB_CHECK_VERSION(2, 44, 0)\n')
                self.outfile.write('G_DEFINE_AUTOPTR_CLEANUP_FUNC (%sObjectManagerClient, g_object_unref)\n' % (self.namespace))
                self.outfile.write('#endif\n')
                self.outfile.write('\n')
            self.outfile.write('GType %sobject_manager_client_get_type (void) G_GNUC_CONST;\n'%(self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('GType %sobject_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);\n'%(self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('void %sobject_manager_client_new (\n'
                               '    GDBusConnection        *connection,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GAsyncReadyCallback     callback,\n'
                               '    gpointer                user_data);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_sync (\n'
                               '    GDBusConnection        *connection,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GError                **error);\n'
                               %(self.ns_lower))
            self.outfile.write('\n')
            self.outfile.write('void %sobject_manager_client_new_for_bus (\n'
                               '    GBusType                bus_type,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GAsyncReadyCallback     callback,\n'
                               '    gpointer                user_data);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_for_bus_finish (\n'
                               '    GAsyncResult        *res,\n'
                               '    GError             **error);\n'
                               %(self.ns_lower))
            self.outfile.write('GDBusObjectManager *%sobject_manager_client_new_for_bus_sync (\n'
                               '    GBusType                bus_type,\n'
                               '    GDBusObjectManagerClientFlags  flags,\n'
                               '    const gchar            *name,\n'
                               '    const gchar            *object_path,\n'
                               '    GCancellable           *cancellable,\n'
                               '    GError                **error);\n'
                               %(self.ns_lower))
            self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_header_postamble(self):
        self.outfile.write('\n')
        self.outfile.write('G_END_DECLS\n')

        if not self.use_pragma:
            self.outfile.write('\n')
            self.outfile.write('#endif /* __{!s}__ */\n'.format(self.header_guard))

    # ----------------------------------------------------------------------------------------------------

    def generate(self):
        self.generate_header_preamble()
        self.declare_types()
        self.generate_header_postamble()

# ----------------------------------------------------------------------------------------------------

class InterfaceInfoHeaderCodeGenerator:
    def __init__(self, ifaces, namespace, header_name, input_files_basenames, use_pragma, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.header_guard = header_name.upper().replace('.', '_').replace('-', '_').replace('/', '_').replace(':', '_')
        self.input_files_basenames = input_files_basenames
        self.use_pragma = use_pragma
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_header_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')

        if self.use_pragma:
            self.outfile.write('#pragma once\n')
        else:
            self.outfile.write('#ifndef __{!s}__\n'.format(self.header_guard))
            self.outfile.write('#define __{!s}__\n'.format(self.header_guard))

        self.outfile.write('\n')
        self.outfile.write('#include <gio/gio.h>\n')
        self.outfile.write('\n')
        self.outfile.write('G_BEGIN_DECLS\n')
        self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def declare_infos(self):
        for i in self.ifaces:
            self.outfile.write('extern const GDBusInterfaceInfo %s_interface;\n' % i.name_lower)

    # ----------------------------------------------------------------------------------------------------

    def generate_header_postamble(self):
        self.outfile.write('\n')
        self.outfile.write('G_END_DECLS\n')

        if not self.use_pragma:
            self.outfile.write('\n')
            self.outfile.write('#endif /* __{!s}__ */\n'.format(self.header_guard))

    # ----------------------------------------------------------------------------------------------------

    def generate(self):
        self.generate_header_preamble()
        self.declare_infos()
        self.generate_header_postamble()

# ----------------------------------------------------------------------------------------------------

class InterfaceInfoBodyCodeGenerator:
    def __init__(self, ifaces, namespace, header_name, input_files_basenames, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.header_name = header_name
        self.input_files_basenames = input_files_basenames
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_body_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')
        self.outfile.write('#ifdef HAVE_CONFIG_H\n'
                           '#  include "config.h"\n'
                           '#endif\n'
                           '\n'
                           '#include "%s"\n'
                           '\n'
                           '#include <string.h>\n'
                           % (self.header_name))
        self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_array(self, array_name_lower, element_type, elements):
        self.outfile.write('const %s * const %s[] =\n' % (element_type, array_name_lower))
        self.outfile.write('{\n')
        for (_, name) in elements:
            self.outfile.write('  &%s,\n' % name)
        self.outfile.write('  NULL,\n')
        self.outfile.write('};\n')
        self.outfile.write('\n')

    def define_annotations(self, array_name_lower, annotations):
        if len(annotations) == 0:
            return

        annotation_pointers = []

        for a in annotations:
            # Skip internal annotations.
            if a.key.startswith('org.gtk.GDBus'):
                continue

            self.define_annotations('%s__%s_annotations' % (array_name_lower, a.key_lower), a.annotations)

            self.outfile.write('const GDBusAnnotationInfo %s__%s_annotation =\n' % (array_name_lower, a.key_lower))
            self.outfile.write('{\n')
            self.outfile.write('  -1,  /* ref count */\n')
            self.outfile.write('  (gchar *) "%s",\n' % a.key)
            self.outfile.write('  (gchar *) "%s",\n' % a.value)
            if len(a.annotations) > 0:
                self.outfile.write('  (GDBusAnnotationInfo **) %s__%s_annotations,\n' % (array_name_lower, a.key_lower))
            else:
                self.outfile.write('  NULL,  /* no annotations */\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')

            key = (a.since, '%s__%s_annotation' % (array_name_lower, a.key_lower))
            annotation_pointers.append(key)

        self.generate_array(array_name_lower, 'GDBusAnnotationInfo',
                            annotation_pointers)

    def define_args(self, array_name_lower, args):
        if len(args) == 0:
            return

        arg_pointers = []

        for a in args:
            self.define_annotations('%s__%s_arg_annotations' % (array_name_lower, a.name), a.annotations)

            self.outfile.write('const GDBusArgInfo %s__%s_arg =\n' % (array_name_lower, a.name))
            self.outfile.write('{\n')
            self.outfile.write('  -1,  /* ref count */\n')
            self.outfile.write('  (gchar *) "%s",\n' % a.name)
            self.outfile.write('  (gchar *) "%s",\n' % a.signature)
            if len(a.annotations) > 0:
                self.outfile.write('  (GDBusAnnotationInfo **) %s__%s_arg_annotations,\n' % (array_name_lower, a.name))
            else:
                self.outfile.write('  NULL,  /* no annotations */\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')

            key = (a.since, '%s__%s_arg' % (array_name_lower, a.name))
            arg_pointers.append(key)

        self.generate_array(array_name_lower, 'GDBusArgInfo', arg_pointers)

    def define_infos(self):
        for i in self.ifaces:
            self.outfile.write('/* ------------------------------------------------------------------------ */\n')
            self.outfile.write('/* Definitions for %s */\n' % i.name)
            self.outfile.write('\n')

            # GDBusMethodInfos.
            if len(i.methods) > 0:
                method_pointers = []

                for m in i.methods:
                    self.define_args('%s_interface__%s_method_in_args' % (i.name_lower, m.name_lower), m.in_args)
                    self.define_args('%s_interface__%s_method_out_args' % (i.name_lower, m.name_lower), m.out_args)
                    self.define_annotations('%s_interface__%s_method_annotations' % (i.name_lower, m.name_lower), m.annotations)

                    self.outfile.write('const GDBusMethodInfo %s_interface__%s_method =\n' % (i.name_lower, m.name_lower))
                    self.outfile.write('{\n')
                    self.outfile.write('  -1,  /* ref count */\n')
                    self.outfile.write('  (gchar *) "%s",\n' % m.name)
                    if len(m.in_args) > 0:
                        self.outfile.write('  (GDBusArgInfo **) %s_interface__%s_method_in_args,\n' % (i.name_lower, m.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no in args */\n')
                    if len(m.out_args) > 0:
                        self.outfile.write('  (GDBusArgInfo **) %s_interface__%s_method_out_args,\n' % (i.name_lower, m.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no out args */\n')
                    if len(m.annotations) > 0:
                        self.outfile.write('  (GDBusAnnotationInfo **) %s_interface__%s_method_annotations,\n' % (i.name_lower, m.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no annotations */\n')
                    self.outfile.write('};\n')
                    self.outfile.write('\n')

                    key = (m.since, '%s_interface__%s_method' % (i.name_lower, m.name_lower))
                    method_pointers.append(key)

                self.generate_array('%s_interface_methods' % i.name_lower,
                                    'GDBusMethodInfo', method_pointers)

            # GDBusSignalInfos.
            if len(i.signals) > 0:
                signal_pointers = []

                for s in i.signals:
                    self.define_args('%s_interface__%s_signal_args' % (i.name_lower, s.name_lower), s.args)
                    self.define_annotations('%s_interface__%s_signal_annotations' % (i.name_lower, s.name_lower), s.annotations)

                    self.outfile.write('const GDBusSignalInfo %s_interface__%s_signal =\n' % (i.name_lower, s.name_lower))
                    self.outfile.write('{\n')
                    self.outfile.write('  -1,  /* ref count */\n')
                    self.outfile.write('  (gchar *) "%s",\n' % s.name)
                    if len(s.args) > 0:
                        self.outfile.write('  (GDBusArgInfo **) %s_interface__%s_signal_args,\n' % (i.name_lower, s.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no args */\n')
                    if len(s.annotations) > 0:
                        self.outfile.write('  (GDBusAnnotationInfo **) %s_interface__%s_signal_annotations,\n' % (i.name_lower, s.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no annotations */\n')
                    self.outfile.write('};\n')
                    self.outfile.write('\n')

                    key = (s.since, '%s_interface__%s_signal' % (i.name_lower, s.name_lower))
                    signal_pointers.append(key)

                self.generate_array('%s_interface_signals' % i.name_lower,
                                    'GDBusSignalInfo', signal_pointers)

            # GDBusPropertyInfos.
            if len(i.properties) > 0:
                property_pointers = []

                for p in i.properties:
                    if p.readable and p.writable:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    elif p.readable:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE'
                    elif p.writable:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    else:
                        flags = 'G_DBUS_PROPERTY_INFO_FLAGS_NONE'

                    self.define_annotations('%s_interface__%s_property_annotations' % (i.name_lower, p.name_lower), p.annotations)

                    self.outfile.write('const GDBusPropertyInfo %s_interface__%s_property =\n' % (i.name_lower, p.name_lower))
                    self.outfile.write('{\n')
                    self.outfile.write('  -1,  /* ref count */\n')
                    self.outfile.write('  (gchar *) "%s",\n' % p.name)
                    self.outfile.write('  (gchar *) "%s",\n' % p.signature)
                    self.outfile.write('  %s,\n' % flags)
                    if len(p.annotations) > 0:
                        self.outfile.write('  (GDBusAnnotationInfo **) %s_interface__%s_property_annotations,\n' % (i.name_lower, p.name_lower))
                    else:
                        self.outfile.write('  NULL,  /* no annotations */\n')
                    self.outfile.write('};\n')
                    self.outfile.write('\n')

                    key = (p.since, '%s_interface__%s_property' % (i.name_lower, p.name_lower))
                    property_pointers.append(key)

                self.generate_array('%s_interface_properties' % i.name_lower,
                                    'GDBusPropertyInfo', property_pointers)

            # Finally the GDBusInterfaceInfo.
            self.define_annotations('%s_interface_annotations' % i.name_lower,
                                    i.annotations)

            self.outfile.write('const GDBusInterfaceInfo %s_interface =\n' % i.name_lower)
            self.outfile.write('{\n')
            self.outfile.write('  -1,  /* ref count */\n')
            self.outfile.write('  (gchar *) "%s",\n' % i.name)
            if len(i.methods) > 0:
                self.outfile.write('  (GDBusMethodInfo **) %s_interface_methods,\n' % i.name_lower)
            else:
                self.outfile.write('  NULL,  /* no methods */\n')
            if len(i.signals) > 0:
                self.outfile.write('  (GDBusSignalInfo **) %s_interface_signals,\n' % i.name_lower)
            else:
                self.outfile.write('  NULL,  /* no signals */\n')
            if len(i.properties) > 0:
                self.outfile.write('  (GDBusPropertyInfo **) %s_interface_properties,\n' % i.name_lower)
            else:
                self.outfile.write(  'NULL,  /* no properties */\n')
            if len(i.annotations) > 0:
                self.outfile.write('  (GDBusAnnotationInfo **) %s_interface_annotations,\n' % i.name_lower)
            else:
                self.outfile.write('  NULL,  /* no annotations */\n')
            self.outfile.write('};\n')
            self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate(self):
        self.generate_body_preamble()
        self.define_infos()

# ----------------------------------------------------------------------------------------------------

class CodeGenerator:
    def __init__(self, ifaces, namespace, generate_objmanager, header_name,
                 input_files_basenames, docbook_gen, outfile):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.generate_objmanager = generate_objmanager
        self.header_name = header_name
        self.input_files_basenames = input_files_basenames
        self.docbook_gen = docbook_gen
        self.outfile = outfile

    # ----------------------------------------------------------------------------------------------------

    def generate_body_preamble(self):
        basenames = ', '.join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        self.outfile.write('\n')
        self.outfile.write('#ifdef HAVE_CONFIG_H\n'
                           '#  include "config.h"\n'
                           '#endif\n'
                           '\n'
                           '#include "%s"\n'
                           '\n'
                           '#include <string.h>\n'
                           %(self.header_name))

        self.outfile.write('#ifdef G_OS_UNIX\n'
                           '#  include <gio/gunixfdlist.h>\n'
                           '#endif\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusArgInfo parent_struct;\n'
                           '  gboolean use_gvariant;\n'
                           '} _ExtendedGDBusArgInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusMethodInfo parent_struct;\n'
                           '  const gchar *signal_name;\n'
                           '  gboolean pass_fdlist;\n'
                           '} _ExtendedGDBusMethodInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusSignalInfo parent_struct;\n'
                           '  const gchar *signal_name;\n'
                           '} _ExtendedGDBusSignalInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusPropertyInfo parent_struct;\n'
                           '  const gchar *hyphen_name;\n'
                           '  guint use_gvariant : 1;\n'
                           '  guint emits_changed_signal : 1;\n'
                           '} _ExtendedGDBusPropertyInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  GDBusInterfaceInfo parent_struct;\n'
                           '  const gchar *hyphen_name;\n'
                           '} _ExtendedGDBusInterfaceInfo;\n'
                           '\n')

        self.outfile.write('typedef struct\n'
                           '{\n'
                           '  const _ExtendedGDBusPropertyInfo *info;\n'
                           '  guint prop_id;\n'
                           '  GValue orig_value; /* the value before the change */\n'
                           '} ChangedProperty;\n'
                           '\n'
                           'static void\n'
                           '_changed_property_free (ChangedProperty *data)\n'
                           '{\n'
                           '  g_value_unset (&data->orig_value);\n'
                           '  g_free (data);\n'
                           '}\n'
                           '\n')

        self.outfile.write('static gboolean\n'
                           '_g_strv_equal0 (gchar **a, gchar **b)\n'
                           '{\n'
                           '  gboolean ret = FALSE;\n'
                           '  guint n;\n'
                           '  if (a == NULL && b == NULL)\n'
                           '    {\n'
                           '      ret = TRUE;\n'
                           '      goto out;\n'
                           '    }\n'
                           '  if (a == NULL || b == NULL)\n'
                           '    goto out;\n'
                           '  if (g_strv_length (a) != g_strv_length (b))\n'
                           '    goto out;\n'
                           '  for (n = 0; a[n] != NULL; n++)\n'
                           '    if (g_strcmp0 (a[n], b[n]) != 0)\n'
                           '      goto out;\n'
                           '  ret = TRUE;\n'
                           'out:\n'
                           '  return ret;\n'
                           '}\n'
                           '\n')

        self.outfile.write('static gboolean\n'
                           '_g_variant_equal0 (GVariant *a, GVariant *b)\n'
                           '{\n'
                           '  gboolean ret = FALSE;\n'
                           '  if (a == NULL && b == NULL)\n'
                           '    {\n'
                           '      ret = TRUE;\n'
                           '      goto out;\n'
                           '    }\n'
                           '  if (a == NULL || b == NULL)\n'
                           '    goto out;\n'
                           '  ret = g_variant_equal (a, b);\n'
                           'out:\n'
                           '  return ret;\n'
                           '}\n'
                           '\n')

        # simplified - only supports the types we use
        self.outfile.write('G_GNUC_UNUSED static gboolean\n'
                           '_g_value_equal (const GValue *a, const GValue *b)\n'
                           '{\n'
                           '  gboolean ret = FALSE;\n'
                           '  g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));\n'
                           '  switch (G_VALUE_TYPE (a))\n'
                           '    {\n'
                           '      case G_TYPE_BOOLEAN:\n'
                           '        ret = (g_value_get_boolean (a) == g_value_get_boolean (b));\n'
                           '        break;\n'
                           '      case G_TYPE_UCHAR:\n'
                           '        ret = (g_value_get_uchar (a) == g_value_get_uchar (b));\n'
                           '        break;\n'
                           '      case G_TYPE_INT:\n'
                           '        ret = (g_value_get_int (a) == g_value_get_int (b));\n'
                           '        break;\n'
                           '      case G_TYPE_UINT:\n'
                           '        ret = (g_value_get_uint (a) == g_value_get_uint (b));\n'
                           '        break;\n'
                           '      case G_TYPE_INT64:\n'
                           '        ret = (g_value_get_int64 (a) == g_value_get_int64 (b));\n'
                           '        break;\n'
                           '      case G_TYPE_UINT64:\n'
                           '        ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));\n'
                           '        break;\n'
                           '      case G_TYPE_DOUBLE:\n'
                           '        {\n'
                           '          /* Avoid -Wfloat-equal warnings by doing a direct bit compare */\n'
                           '          gdouble da = g_value_get_double (a);\n'
                           '          gdouble db = g_value_get_double (b);\n'
                           '          ret = memcmp (&da, &db, sizeof (gdouble)) == 0;\n'
                           '        }\n'
                           '        break;\n'
                           '      case G_TYPE_STRING:\n'
                           '        ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);\n'
                           '        break;\n'
                           '      case G_TYPE_VARIANT:\n'
                           '        ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));\n'
                           '        break;\n'
                           '      default:\n'
                           '        if (G_VALUE_TYPE (a) == G_TYPE_STRV)\n'
                           '          ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));\n'
                           '        else\n'
                           '          g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));\n'
                           '        break;\n'
                           '    }\n'
                           '  return ret;\n'
                           '}\n'
                           '\n')

    def generate_annotations(self, prefix, annotations):
        if annotations is None:
            return

        n = 0
        for a in annotations:
            #self.generate_annotations('%s_%d'%(prefix, n), a.get_annotations())

            # skip internal annotations
            if a.key.startswith('org.gtk.GDBus'):
                continue

            self.outfile.write('static const GDBusAnnotationInfo %s_%d =\n'
                               '{\n'
                               '  -1,\n'
                               '  (gchar *) "%s",\n'
                               '  (gchar *) "%s",\n'%(prefix, n, a.key, a.value))
            if len(a.annotations) == 0:
                self.outfile.write('  NULL\n')
            else:
                self.outfile.write('  (GDBusAnnotationInfo **) &%s_%d_pointers\n'%(prefix, n))
            self.outfile.write('};\n'
                               '\n')
            n += 1

        if n > 0:
            self.outfile.write('static const GDBusAnnotationInfo * const %s_pointers[] =\n'
                               '{\n'%(prefix))
            m = 0;
            for a in annotations:
                if a.key.startswith('org.gtk.GDBus'):
                    continue
                self.outfile.write('  &%s_%d,\n'%(prefix, m))
                m += 1
            self.outfile.write('  NULL\n'
                               '};\n'
                               '\n')
        return n

    def generate_args(self, prefix, args):
        for a in args:
            num_anno = self.generate_annotations('%s_arg_%s_annotation_info'%(prefix, a.name), a.annotations)

            self.outfile.write('static const _ExtendedGDBusArgInfo %s_%s =\n'
                               '{\n'
                               '  {\n'
                               '    -1,\n'
                               '    (gchar *) "%s",\n'
                               '    (gchar *) "%s",\n'%(prefix, a.name, a.name, a.signature))
            if num_anno == 0:
                self.outfile.write('    NULL\n')
            else:
                self.outfile.write('    (GDBusAnnotationInfo **) &%s_arg_%s_annotation_info_pointers\n'%(prefix, a.name))
            self.outfile.write('  },\n')
            if not utils.lookup_annotation(a.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
                self.outfile.write('  FALSE\n')
            else:
                self.outfile.write('  TRUE\n')
            self.outfile.write('};\n'
                               '\n')

        if len(args) > 0:
            self.outfile.write('static const GDBusArgInfo * const %s_pointers[] =\n'
                             '{\n'%(prefix))
            for a in args:
                self.outfile.write('  &%s_%s.parent_struct,\n'%(prefix, a.name))
            self.outfile.write('  NULL\n'
                               '};\n'
                               '\n')

    def generate_introspection_for_interface(self, i):
            self.outfile.write('/* ---- Introspection data for %s ---- */\n'
                               '\n'%(i.name))

            if len(i.methods) > 0:
                for m in i.methods:
                    unix_fd = False
                    if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                        unix_fd = True
                    self.generate_args('_%s_method_info_%s_IN_ARG'%(i.name_lower, m.name_lower), m.in_args)
                    self.generate_args('_%s_method_info_%s_OUT_ARG'%(i.name_lower, m.name_lower), m.out_args)

                    num_anno = self.generate_annotations('_%s_method_%s_annotation_info'%(i.name_lower, m.name_lower), m.annotations)

                    self.outfile.write('static const _ExtendedGDBusMethodInfo _%s_method_info_%s =\n'
                                       '{\n'
                                       '  {\n'
                                       '    -1,\n'
                                       '    (gchar *) "%s",\n'%(i.name_lower, m.name_lower, m.name))
                    if len(m.in_args) == 0:
                        self.outfile.write('    NULL,\n')
                    else:
                        self.outfile.write('    (GDBusArgInfo **) &_%s_method_info_%s_IN_ARG_pointers,\n'%(i.name_lower, m.name_lower))
                    if len(m.out_args) == 0:
                        self.outfile.write('    NULL,\n')
                    else:
                        self.outfile.write('    (GDBusArgInfo **) &_%s_method_info_%s_OUT_ARG_pointers,\n'%(i.name_lower, m.name_lower))
                    if num_anno == 0:
                        self.outfile.write('    NULL\n')
                    else:
                        self.outfile.write('    (GDBusAnnotationInfo **) &_%s_method_%s_annotation_info_pointers\n'%(i.name_lower, m.name_lower))
                    self.outfile.write('  },\n'
                                       '  "handle-%s",\n'
                                       '  %s\n'
                                       %(m.name_hyphen, 'TRUE' if unix_fd else 'FALSE'))
                    self.outfile.write('};\n'
                                       '\n')

                self.outfile.write('static const GDBusMethodInfo * const _%s_method_info_pointers[] =\n'
                                   '{\n'%(i.name_lower))
                for m in i.methods:
                    self.outfile.write('  &_%s_method_info_%s.parent_struct,\n'%(i.name_lower, m.name_lower))
                self.outfile.write('  NULL\n'
                                   '};\n'
                                   '\n')

            # ---

            if len(i.signals) > 0:
                for s in i.signals:
                    self.generate_args('_%s_signal_info_%s_ARG'%(i.name_lower, s.name_lower), s.args)

                    num_anno = self.generate_annotations('_%s_signal_%s_annotation_info'%(i.name_lower, s.name_lower), s.annotations)
                    self.outfile.write('static const _ExtendedGDBusSignalInfo _%s_signal_info_%s =\n'
                                       '{\n'
                                       '  {\n'
                                       '    -1,\n'
                                       '    (gchar *) "%s",\n'%(i.name_lower, s.name_lower, s.name))
                    if len(s.args) == 0:
                        self.outfile.write('    NULL,\n')
                    else:
                        self.outfile.write('    (GDBusArgInfo **) &_%s_signal_info_%s_ARG_pointers,\n'%(i.name_lower, s.name_lower))
                    if num_anno == 0:
                        self.outfile.write('    NULL\n')
                    else:
                        self.outfile.write('    (GDBusAnnotationInfo **) &_%s_signal_%s_annotation_info_pointers\n'%(i.name_lower, s.name_lower))
                    self.outfile.write('  },\n'
                                       '  "%s"\n'
                                       %(s.name_hyphen))
                    self.outfile.write('};\n'
                                       '\n')

                self.outfile.write('static const GDBusSignalInfo * const _%s_signal_info_pointers[] =\n'
                                   '{\n'%(i.name_lower))
                for s in i.signals:
                    self.outfile.write('  &_%s_signal_info_%s.parent_struct,\n'%(i.name_lower, s.name_lower))
                self.outfile.write('  NULL\n'
                                   '};\n'
                                   '\n')

            # ---

            if len(i.properties) > 0:
                for p in i.properties:
                    if p.readable and p.writable:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    elif p.readable:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_READABLE'
                    elif p.writable:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE'
                    else:
                        access = 'G_DBUS_PROPERTY_INFO_FLAGS_NONE'
                    num_anno = self.generate_annotations('_%s_property_%s_annotation_info'%(i.name_lower, p.name_lower), p.annotations)
                    self.outfile.write('static const _ExtendedGDBusPropertyInfo _%s_property_info_%s =\n'
                                       '{\n'
                                       '  {\n'
                                       '    -1,\n'
                                       '    (gchar *) "%s",\n'
                                       '    (gchar *) "%s",\n'
                                       '    %s,\n'%(i.name_lower, p.name_lower, p.name, p.arg.signature, access))
                    if num_anno == 0:
                        self.outfile.write('    NULL\n')
                    else:
                        self.outfile.write('    (GDBusAnnotationInfo **) &_%s_property_%s_annotation_info_pointers\n'%(i.name_lower, p.name_lower))
                    self.outfile.write('  },\n'
                                       '  "%s",\n'
                                       %(p.name_hyphen))
                    if not utils.lookup_annotation(p.annotations, 'org.gtk.GDBus.C.ForceGVariant'):
                        self.outfile.write('  FALSE,\n')
                    else:
                        self.outfile.write('  TRUE,\n')
                    if p.emits_changed_signal:
                        self.outfile.write('  TRUE\n')
                    else:
                        self.outfile.write('  FALSE\n')
                    self.outfile.write('};\n'
                                       '\n')

                self.outfile.write('static const GDBusPropertyInfo * const _%s_property_info_pointers[] =\n'
                                   '{\n'%(i.name_lower))
                for p in i.properties:
                    self.outfile.write('  &_%s_property_info_%s.parent_struct,\n'%(i.name_lower, p.name_lower))
                self.outfile.write('  NULL\n'
                                   '};\n'
                                   '\n')

            num_anno = self.generate_annotations('_%s_annotation_info'%(i.name_lower), i.annotations)
            self.outfile.write('static const _ExtendedGDBusInterfaceInfo _%s_interface_info =\n'
                               '{\n'
                               '  {\n'
                               '    -1,\n'
                               '    (gchar *) "%s",\n'%(i.name_lower, i.name))
            if len(i.methods) == 0:
                self.outfile.write('    NULL,\n')
            else:
                self.outfile.write('    (GDBusMethodInfo **) &_%s_method_info_pointers,\n'%(i.name_lower))
            if len(i.signals) == 0:
                self.outfile.write('    NULL,\n')
            else:
                self.outfile.write('    (GDBusSignalInfo **) &_%s_signal_info_pointers,\n'%(i.name_lower))
            if len(i.properties) == 0:
                self.outfile.write('    NULL,\n')
            else:
                self.outfile.write('    (GDBusPropertyInfo **) &_%s_property_info_pointers,\n'%(i.name_lower))
            if num_anno == 0:
                self.outfile.write('    NULL\n')
            else:
                self.outfile.write('    (GDBusAnnotationInfo **) &_%s_annotation_info_pointers\n'%(i.name_lower))
            self.outfile.write('  },\n'
                               '  "%s",\n'
                               '};\n'
                               '\n'
                               %(i.name_hyphen))
            self.outfile.write('\n')
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_interface_info:\n'
                    ' *\n'
                    ' * Gets a machine-readable description of the #%s D-Bus interface.\n'
                    ' *\n'
                    ' * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.\n'
                    %(i.name_lower, i.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('GDBusInterfaceInfo *\n'
                               '%s_interface_info (void)\n'
                               '{\n'
                               '  return (GDBusInterfaceInfo *) &_%s_interface_info.parent_struct;\n'
                                '}\n'
                                '\n'%(i.name_lower, i.name_lower))

            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_override_properties:\n'
                    ' * @klass: The class structure for a #GObject derived class.\n'
                    ' * @property_id_begin: The property id to assign to the first overridden property.\n'
                    ' *\n'
                    ' * Overrides all #GObject properties in the #%s interface for a concrete class.\n'
                    ' * The properties are overridden in the order they are defined.\n'
                    ' *\n'
                    ' * Returns: The last property id.\n'
                    %(i.name_lower, i.camel_name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('guint\n'
                               '%s_override_properties (GObjectClass *klass, guint property_id_begin)\n'
                               '{\n'%(i.name_lower))
            for p in i.properties:
                self.outfile.write('  g_object_class_override_property (klass, property_id_begin++, "%s");\n'%(p.name_hyphen))
            self.outfile.write('  return property_id_begin - 1;\n'
                               '}\n'
                               '\n')
            self.outfile.write('\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_interface(self, i):
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s:\n'
                ' *\n'
                ' * Abstract interface type for the D-Bus interface #%s.\n'
                %(i.camel_name, i.name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sIface:\n'
                ' * @parent_iface: The parent interface.\n'
                %(i.camel_name), False))

        doc_bits = {}
        if len(i.methods) > 0:
            for m in i.methods:
                key = (m.since, '_method_%s'%m.name_lower)
                value  = '@handle_%s: '%(m.name_lower)
                value += 'Handler for the #%s::handle-%s signal.'%(i.camel_name, m.name_hyphen)
                doc_bits[key] = value
        if len(i.signals) > 0:
            for s in i.signals:
                key = (s.since, '_signal_%s'%s.name_lower)
                value  = '@%s: '%(s.name_lower)
                value += 'Handler for the #%s::%s signal.'%(i.camel_name, s.name_hyphen)
                doc_bits[key] = value
        if len(i.properties) > 0:
            for p in i.properties:
                key = (p.since, '_prop_get_%s'%p.name_lower)
                value  = '@get_%s: '%(p.name_lower)
                value += 'Getter for the #%s:%s property.'%(i.camel_name, p.name_hyphen)
                doc_bits[key] = value
        for key in sorted(doc_bits.keys(), key=utils.version_cmp_key):
            self.outfile.write(' * %s\n'%doc_bits[key])

        self.outfile.write(self.docbook_gen.expand(
                ' *\n'
                ' * Virtual table for the D-Bus interface #%s.\n'
                %(i.name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write('typedef %sIface %sInterface;\n'%(i.camel_name, i.camel_name))
        self.outfile.write('G_DEFINE_INTERFACE (%s, %s, G_TYPE_OBJECT)\n'%(i.camel_name, i.name_lower))
        self.outfile.write('\n')

        self.outfile.write('static void\n'
                           '%s_default_init (%sIface *iface)\n'
                           '{\n'%(i.name_lower, i.camel_name));

        if len(i.methods) > 0:
            self.outfile.write('  /* GObject signals for incoming D-Bus method calls: */\n')
            for m in i.methods:
                unix_fd = False
                if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                    unix_fd = True
                self.outfile.write(self.docbook_gen.expand(
                        '  /**\n'
                        '   * %s::handle-%s:\n'
                        '   * @object: A #%s.\n'
                        '   * @invocation: A #GDBusMethodInvocation.\n'
                        %(i.camel_name, m.name_hyphen, i.camel_name), False))
                if unix_fd:
                    self.outfile.write('   * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
                for a in m.in_args:
                    self.outfile.write('   * @arg_%s: Argument passed by remote caller.\n'%(a.name))
                self.outfile.write(self.docbook_gen.expand(
                        '   *\n'
                        '   * Signal emitted when a remote caller is invoking the %s.%s() D-Bus method.\n'
                        '   *\n'
                        '   * If a signal handler returns %%TRUE, it means the signal handler will handle the invocation (e.g. take a reference to @invocation and eventually call %s_complete_%s() or e.g. g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler handles the invocation, the %%G_DBUS_ERROR_UNKNOWN_METHOD error is returned.\n'
                        '   *\n'
                        '   * Returns: %%TRUE if the invocation was handled, %%FALSE to let other signal handlers run.\n'
                        %(i.name, m.name, i.name_lower, m.name_lower), False))
                self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 2)
                if unix_fd:
                    extra_args = 2
                else:
                    extra_args = 1
                self.outfile.write('  g_signal_new ("handle-%s",\n'
                                   '    G_TYPE_FROM_INTERFACE (iface),\n'
                                   '    G_SIGNAL_RUN_LAST,\n'
                                   '    G_STRUCT_OFFSET (%sIface, handle_%s),\n'
                                   '    g_signal_accumulator_true_handled,\n'
                                   '    NULL,\n' # accu_data
                                   '    g_cclosure_marshal_generic,\n'
                                   '    G_TYPE_BOOLEAN,\n'
                                   '    %d,\n'
                                   '    G_TYPE_DBUS_METHOD_INVOCATION'
                                   %(m.name_hyphen, i.camel_name, m.name_lower, len(m.in_args) + extra_args))
                if unix_fd:
                    self.outfile.write(', G_TYPE_UNIX_FD_LIST')
                for a in m.in_args:
                    self.outfile.write(', %s'%(a.gtype))
                self.outfile.write(');\n')
                self.outfile.write('\n')

        if len(i.signals) > 0:
            self.outfile.write('  /* GObject signals for received D-Bus signals: */\n')
            for s in i.signals:
                self.outfile.write(self.docbook_gen.expand(
                        '  /**\n'
                        '   * %s::%s:\n'
                        '   * @object: A #%s.\n'
                        %(i.camel_name, s.name_hyphen, i.camel_name), False))
                for a in s.args:
                    self.outfile.write('   * @arg_%s: Argument.\n'%(a.name))
                self.outfile.write(self.docbook_gen.expand(
                        '   *\n'
                        '   * On the client-side, this signal is emitted whenever the D-Bus signal #%s::%s is received.\n'
                        '   *\n'
                        '   * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit the D-Bus signal.\n'
                        %(i.name, s.name), False))
                self.write_gtkdoc_deprecated_and_since_and_close(s, self.outfile, 2)
                self.outfile.write('  g_signal_new ("%s",\n'
                                   '    G_TYPE_FROM_INTERFACE (iface),\n'
                                   '    G_SIGNAL_RUN_LAST,\n'
                                   '    G_STRUCT_OFFSET (%sIface, %s),\n'
                                   '    NULL,\n' # accumulator
                                   '    NULL,\n' # accu_data
                                   '    g_cclosure_marshal_generic,\n'
                                   '    G_TYPE_NONE,\n'
                                   '    %d'
                                   %(s.name_hyphen, i.camel_name, s.name_lower, len(s.args)))
                for a in s.args:
                    self.outfile.write(', %s'%(a.gtype))
                self.outfile.write(');\n')
                self.outfile.write('\n')

        if len(i.properties) > 0:
            self.outfile.write('  /* GObject properties for D-Bus properties: */\n')
            for p in i.properties:
                if p.readable and p.writable:
                    hint = 'Since the D-Bus property for this #GObject property is both readable and writable, it is meaningful to both read from it and write to it on both the service- and client-side.'
                elif p.readable:
                    hint = 'Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to read from it on both the client- and service-side. It is only meaningful, however, to write to it on the service-side.'
                elif p.writable:
                    hint = 'Since the D-Bus property for this #GObject property is writable but not readable, it is meaningful to write to it on both the client- and service-side. It is only meaningful, however, to read from it on the service-side.'
                else:
                    print_error('Cannot handle property "{}" that neither readable nor writable'.format(p.name))
                self.outfile.write(self.docbook_gen.expand(
                        '  /**\n'
                        '   * %s:%s:\n'
                        '   *\n'
                        '   * Represents the D-Bus property #%s:%s.\n'
                        '   *\n'
                        '   * %s\n'
                        %(i.camel_name, p.name_hyphen, i.name, p.name, hint), False))
                self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 2)
                self.outfile.write('  g_object_interface_install_property (iface,\n')
                if p.arg.gtype == 'G_TYPE_VARIANT':
                    s = 'g_param_spec_variant ("%s", "%s", "%s", G_VARIANT_TYPE ("%s"), NULL'%(p.name_hyphen, p.name, p.name, p.arg.signature)
                elif p.arg.signature == 'b':
                    s = 'g_param_spec_boolean ("%s", "%s", "%s", FALSE'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'y':
                    s = 'g_param_spec_uchar ("%s", "%s", "%s", 0, 255, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'n':
                    s = 'g_param_spec_int ("%s", "%s", "%s", G_MININT16, G_MAXINT16, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'q':
                    s = 'g_param_spec_uint ("%s", "%s", "%s", 0, G_MAXUINT16, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'i':
                    s = 'g_param_spec_int ("%s", "%s", "%s", G_MININT32, G_MAXINT32, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'u':
                    s = 'g_param_spec_uint ("%s", "%s", "%s", 0, G_MAXUINT32, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'x':
                    s = 'g_param_spec_int64 ("%s", "%s", "%s", G_MININT64, G_MAXINT64, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 't':
                    s = 'g_param_spec_uint64 ("%s", "%s", "%s", 0, G_MAXUINT64, 0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'd':
                    s = 'g_param_spec_double ("%s", "%s", "%s", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 's':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'o':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'g':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'ay':
                    s = 'g_param_spec_string ("%s", "%s", "%s", NULL'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'as':
                    s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'ao':
                    s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name)
                elif p.arg.signature == 'aay':
                    s = 'g_param_spec_boxed ("%s", "%s", "%s", G_TYPE_STRV'%(p.name_hyphen, p.name, p.name)
                else:
                    print_error('Unsupported gtype "{}" for GParamSpec'.format(p.arg.gtype))
                flags = 'G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS'
                if p.deprecated:
                    flags = 'G_PARAM_DEPRECATED | ' + flags
                self.outfile.write('    %s, %s));'%(s, flags));
                self.outfile.write('\n')

        self.outfile.write('}\n'
                           '\n')

    # ----------------------------------------------------------------------------------------------------

    def generate_property_accessors(self, i):
        for p in i.properties:
            # getter
            if p.readable and p.writable:
                hint = 'Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.'
            elif p.readable:
                hint = 'Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.'
            elif p.writable:
                hint = 'Since this D-Bus property is not readable, it is only meaningful to use this function on the service-side.'
            else:
                print_error('Cannot handle property "{}" that neither readable nor writable'.format(p.name))
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_get_%s: (skip)\n'
                    ' * @object: A #%s.\n'
                    ' *\n'
                    ' * Gets the value of the #%s:%s D-Bus property.\n'
                    ' *\n'
                    ' * %s\n'
                    ' *\n'
                    %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint), False))
            if p.arg.free_func != None:
                self.outfile.write(' * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use %s_dup_%s() if on another thread.</warning>\n'
                                   ' *\n'
                                   ' * Returns: (transfer none) (nullable): The property value or %%NULL if the property is not set. Do not free the returned value, it belongs to @object.\n'
                                   %(i.name_lower, p.name_lower))
            else:
                self.outfile.write(' * Returns: The property value.\n')
            self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 0)
            self.outfile.write('%s\n'
                               '%s_get_%s (%s *object)\n'
                               '{\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name))
            self.outfile.write('  return %s%s_GET_IFACE (object)->get_%s (object);\n'%(i.ns_upper, i.name_upper, p.name_lower))
            self.outfile.write('}\n')
            self.outfile.write('\n')
            if p.arg.free_func != None:

                self.outfile.write(self.docbook_gen.expand(
                        '/**\n'
                        ' * %s_dup_%s: (skip)\n'
                        ' * @object: A #%s.\n'
                        ' *\n'
                        ' * Gets a copy of the #%s:%s D-Bus property.\n'
                        ' *\n'
                        ' * %s\n'
                        ' *\n'
                        ' * Returns: (transfer full) (nullable): The property value or %%NULL if the property is not set. The returned value should be freed with %s().\n'
                        %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint, p.arg.free_func), False))
                self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 0)
                self.outfile.write('%s\n'
                                   '%s_dup_%s (%s *object)\n'
                                   '{\n'
                                   '  %svalue;\n'%(p.arg.ctype_in_dup, i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in_dup))
                self.outfile.write('  g_object_get (G_OBJECT (object), "%s", &value, NULL);\n'%(p.name_hyphen))
                self.outfile.write('  return value;\n')
                self.outfile.write('}\n')
                self.outfile.write('\n')

            # setter
            if p.readable and p.writable:
                hint = 'Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.'
            elif p.readable:
                hint = 'Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.'
            elif p.writable:
                hint = 'Since this D-Bus property is writable, it is meaningful to use this function on both the client- and service-side.'
            else:
                print_error('Cannot handle property "{}" that neither readable nor writable'.format(p.name))
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_set_%s: (skip)\n'
                    ' * @object: A #%s.\n'
                    ' * @value: The value to set.\n'
                    ' *\n'
                    ' * Sets the #%s:%s D-Bus property to @value.\n'
                    ' *\n'
                    ' * %s\n'
                    %(i.name_lower, p.name_lower, i.camel_name, i.name, p.name, hint), False))
            self.write_gtkdoc_deprecated_and_since_and_close(p, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_set_%s (%s *object, %svalue)\n'
                               '{\n'%(i.name_lower, p.name_lower, i.camel_name, p.arg.ctype_in, ))
            self.outfile.write('  g_object_set (G_OBJECT (object), "%s", value, NULL);\n'%(p.name_hyphen))
            self.outfile.write('}\n')
            self.outfile.write('\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_signal_emitters(self, i):
        for s in i.signals:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %s_emit_%s:\n'
                    ' * @object: A #%s.\n'
                    %(i.name_lower, s.name_lower, i.camel_name), False))
            for a in s.args:
                self.outfile.write(' * @arg_%s: Argument to pass with the signal.\n'%(a.name))
            self.outfile.write(self.docbook_gen.expand(
                    ' *\n'
                    ' * Emits the #%s::%s D-Bus signal.\n'
                    %(i.name, s.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(s, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_emit_%s (\n'
                               '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
            for a in s.args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            self.outfile.write(')\n'
                               '{\n'
                               '  g_signal_emit_by_name (object, "%s"'%(s.name_hyphen))
            for a in s.args:
                self.outfile.write(', arg_%s'%a.name)
            self.outfile.write(');\n')
            self.outfile.write('}\n'
                               '\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_method_calls(self, i):
        for m in i.methods:
            unix_fd = False
            if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                unix_fd = True
            # async begin
            self.outfile.write('/**\n'
                               ' * %s_call_%s:\n'
                               ' * @proxy: A #%sProxy.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(' * @arg_%s: Argument to pass with the method invocation.\n'%(a.name))
            if unix_fd:
                self.outfile.write(' * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
            self.outfile.write(self.docbook_gen.expand(
                    ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                    ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %%NULL.\n'
                    ' * @user_data: User data to pass to @callback.\n'
                    ' *\n'
                    ' * Asynchronously invokes the %s.%s() D-Bus method on @proxy.\n'
                    ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                    ' * You can then call %s_call_%s_finish() to get the result of the operation.\n'
                    ' *\n'
                    ' * See %s_call_%s_sync() for the synchronous, blocking version of this method.\n'
                    %(i.name, m.name, i.name_lower, m.name_lower, i.name_lower, m.name_lower), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_call_%s (\n'
                               '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList *fd_list')
            self.outfile.write(',\n'
                               '    GCancellable *cancellable,\n'
                               '    GAsyncReadyCallback callback,\n'
                               '    gpointer user_data)\n'
                               '{\n')
            if unix_fd:
                self.outfile.write('  g_dbus_proxy_call_with_unix_fd_list (G_DBUS_PROXY (proxy),\n')
            else:
                self.outfile.write('  g_dbus_proxy_call (G_DBUS_PROXY (proxy),\n')
            self.outfile.write('    "%s",\n'
                               '    g_variant_new ("('%(m.name))
            for a in m.in_args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in m.in_args:
                self.outfile.write(',\n                   arg_%s'%(a.name))
            self.outfile.write('),\n'
                               '    G_DBUS_CALL_FLAGS_NONE,\n'
                               '    -1,\n')
            if unix_fd:
                self.outfile.write('    fd_list,\n')
            self.outfile.write('    cancellable,\n'
                               '    callback,\n'
                               '    user_data);\n')
            self.outfile.write('}\n'
                               '\n')
            # async finish
            self.outfile.write('/**\n'
                               ' * %s_call_%s_finish:\n'
                               ' * @proxy: A #%sProxy.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            for a in m.out_args:
                self.outfile.write(' * @out_%s: (out) (optional)%s: Return location for return parameter or %%NULL to ignore.\n'%(a.name, ' ' + a.array_annotation if a.array_annotation else ''))
            if unix_fd:
                self.outfile.write(' * @out_fd_list: (out) (optional): Return location for a #GUnixFDList or %NULL to ignore.\n')
            self.outfile.write(self.docbook_gen.expand(
                    ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_call_%s().\n'
                    ' * @error: Return location for error or %%NULL.\n'
                    ' *\n'
                    ' * Finishes an operation started with %s_call_%s().\n'
                    ' *\n'
                    ' * Returns: (skip): %%TRUE if the call succeded, %%FALSE if @error is set.\n'
                    %(i.name_lower, m.name_lower, i.name_lower, m.name_lower), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('gboolean\n'
                               '%s_call_%s_finish (\n'
                               '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
            for a in m.out_args:
                self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList **out_fd_list')
            self.outfile.write(',\n'
                               '    GAsyncResult *res,\n'
                               '    GError **error)\n'
                               '{\n'
                               '  GVariant *_ret;\n')
            if unix_fd:
                self.outfile.write('  _ret = g_dbus_proxy_call_with_unix_fd_list_finish (G_DBUS_PROXY (proxy), out_fd_list, res, error);\n')
            else:
                self.outfile.write('  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);\n')
            self.outfile.write('  if (_ret == NULL)\n'
                               '    goto _out;\n')
            self.outfile.write('  g_variant_get (_ret,\n'
                               '                 \"(')
            for a in m.out_args:
                self.outfile.write('%s'%(a.format_out))
            self.outfile.write(')"')
            for a in m.out_args:
                self.outfile.write(',\n                 out_%s'%(a.name))
            self.outfile.write(');\n'
                               '  g_variant_unref (_ret);\n')
            self.outfile.write('_out:\n'
                               '  return _ret != NULL;\n'
                               '}\n'
                               '\n')


            # sync
            self.outfile.write('/**\n'
                               ' * %s_call_%s_sync:\n'
                               ' * @proxy: A #%sProxy.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(' * @arg_%s: Argument to pass with the method invocation.\n'%(a.name))
            if unix_fd:
                self.outfile.write(' * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
            for a in m.out_args:
                self.outfile.write(' * @out_%s: (out) (optional)%s: Return location for return parameter or %%NULL to ignore.\n'%(a.name, ' ' + a.array_annotation if a.array_annotation else ''))
            if unix_fd:
                self.outfile.write(' * @out_fd_list: (out): Return location for a #GUnixFDList or %NULL.\n')
            self.outfile.write(self.docbook_gen.expand(
                    ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                    ' * @error: Return location for error or %%NULL.\n'
                    ' *\n'
                    ' * Synchronously invokes the %s.%s() D-Bus method on @proxy. The calling thread is blocked until a reply is received.\n'
                    ' *\n'
                    ' * See %s_call_%s() for the asynchronous version of this method.\n'
                    ' *\n'
                    ' * Returns: (skip): %%TRUE if the call succeded, %%FALSE if @error is set.\n'
                    %(i.name, m.name, i.name_lower, m.name_lower), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('gboolean\n'
                               '%s_call_%s_sync (\n'
                               '    %s *proxy'%(i.name_lower, m.name_lower, i.camel_name))
            for a in m.in_args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList  *fd_list')
            for a in m.out_args:
                self.outfile.write(',\n    %sout_%s'%(a.ctype_out, a.name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList **out_fd_list')
            self.outfile.write(',\n'
                               '    GCancellable *cancellable,\n'
                               '    GError **error)\n'
                               '{\n'
                               '  GVariant *_ret;\n')
            if unix_fd:
                self.outfile.write('  _ret = g_dbus_proxy_call_with_unix_fd_list_sync (G_DBUS_PROXY (proxy),\n')
            else:
                self.outfile.write('  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),\n')
            self.outfile.write('    "%s",\n'
                               '    g_variant_new ("('%(m.name))
            for a in m.in_args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in m.in_args:
                self.outfile.write(',\n                   arg_%s'%(a.name))
            self.outfile.write('),\n'
                               '    G_DBUS_CALL_FLAGS_NONE,\n'
                               '    -1,\n')
            if unix_fd:
                self.outfile.write('    fd_list,\n'
                                   '    out_fd_list,\n')
            self.outfile.write('    cancellable,\n'
                               '    error);\n'
                               '  if (_ret == NULL)\n'
                               '    goto _out;\n')
            self.outfile.write('  g_variant_get (_ret,\n'
                               '                 \"(')
            for a in m.out_args:
                self.outfile.write('%s'%(a.format_out))
            self.outfile.write(')"')
            for a in m.out_args:
                self.outfile.write(',\n                 out_%s'%(a.name))
            self.outfile.write(');\n'
                               '  g_variant_unref (_ret);\n')
            self.outfile.write('_out:\n'
                               '  return _ret != NULL;\n'
                               '}\n'
                               '\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_method_completers(self, i):
        for m in i.methods:
            unix_fd = False
            if utils.lookup_annotation(m.annotations, 'org.gtk.GDBus.C.UnixFD'):
                unix_fd = True
            self.outfile.write('/**\n'
                               ' * %s_complete_%s:\n'
                               ' * @object: A #%s.\n'
                               ' * @invocation: (transfer full): A #GDBusMethodInvocation.\n'
                               %(i.name_lower, m.name_lower, i.camel_name))
            if unix_fd:
                self.outfile.write(' * @fd_list: (nullable): A #GUnixFDList or %NULL.\n')
            for a in m.out_args:
                self.outfile.write(' * @%s: Parameter to return.\n'%(a.name))
            self.outfile.write(self.docbook_gen.expand(
                    ' *\n'
                    ' * Helper function used in service implementations to finish handling invocations of the %s.%s() D-Bus method. If you instead want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or similar.\n'
                    ' *\n'
                    ' * This method will free @invocation, you cannot use it afterwards.\n'
                    %(i.name, m.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
            self.outfile.write('void\n'
                               '%s_complete_%s (\n'
                               '    %s *object,\n'
                               '    GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name))
            if unix_fd:
                self.outfile.write(',\n    GUnixFDList *fd_list')
            for a in m.out_args:
                self.outfile.write(',\n    %s%s'%(a.ctype_in, a.name))
            self.outfile.write(')\n'
                               '{\n')

            if unix_fd:
                self.outfile.write('  g_dbus_method_invocation_return_value_with_unix_fd_list (invocation,\n'
                                   '    g_variant_new ("(')
            else:
                self.outfile.write('  g_dbus_method_invocation_return_value (invocation,\n'
                                   '    g_variant_new ("(')
            for a in m.out_args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in m.out_args:
                self.outfile.write(',\n                   %s'%(a.name))
            if unix_fd:
                self.outfile.write('),\n    fd_list);\n')
            else:
                self.outfile.write('));\n')
            self.outfile.write('}\n'
                               '\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_proxy(self, i):
        # class boilerplate
        self.outfile.write('/* ------------------------------------------------------------------------ */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sProxy:\n'
                ' *\n'
                ' * The #%sProxy structure contains only private data and should only be accessed using the provided API.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sProxyClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sProxy.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write('struct _%sProxyPrivate\n'
                           '{\n'
                           '  GData *qdata;\n'
                           '};\n'
                           '\n'%i.camel_name)

        self.outfile.write('static void %s_proxy_iface_init (%sIface *iface);\n'
                           '\n'%(i.name_lower, i.camel_name))
        self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sProxy, %s_proxy, G_TYPE_DBUS_PROXY,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_ADD_PRIVATE (%sProxy)\n'%(i.camel_name))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_proxy_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#else\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sProxy, %s_proxy, G_TYPE_DBUS_PROXY,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_proxy_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#endif\n')

        # finalize
        self.outfile.write('static void\n'
                           '%s_proxy_finalize (GObject *object)\n'
                           '{\n'%(i.name_lower))
        self.outfile.write('  %sProxy *proxy = %s%s_PROXY (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  g_datalist_clear (&proxy->priv->qdata);\n')
        self.outfile.write('  G_OBJECT_CLASS (%s_proxy_parent_class)->finalize (object);\n'
                           '}\n'
                           '\n'%(i.name_lower))

        # property accessors
        #
        # Note that we are guaranteed that prop_id starts at 1 and is
        # laid out in the same order as introspection data pointers
        #
        self.outfile.write('static void\n'
                           '%s_proxy_get_property (GObject      *object,\n'
                           '  guint         prop_id,\n'
                           '  GValue       *value,\n'
                           '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
                           '{\n'%(i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
                               '  GVariant *variant;\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
                               '  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);\n'
                               '  if (info->use_gvariant)\n'
                               '    {\n'
                               '      g_value_set_variant (value, variant);\n'
                               '    }\n'
                               '  else\n'
                               '    {\n'
                               # could be that we don't have the value in cache - in that case, we do
                               # nothing and the user gets the default value for the GType
                               '      if (variant != NULL)\n'
                               '        g_dbus_gvariant_to_gvalue (variant, value);\n'
                               '    }\n'
                               '  if (variant != NULL)\n'
                               '    g_variant_unref (variant);\n'
                               %(len(i.properties), i.name_lower))
        self.outfile.write('}\n'
                           '\n')
        if len(i.properties) > 0:
            self.outfile.write('static void\n'
                               '%s_proxy_set_property_cb (GDBusProxy *proxy,\n'
                               '  GAsyncResult *res,\n'
                               '  gpointer      user_data)\n'
                               '{\n'%(i.name_lower))
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info = user_data;\n'
                               '  GError *error;\n'
                               '  GVariant *_ret;\n'
                               '  error = NULL;\n'
                               '  _ret = g_dbus_proxy_call_finish (proxy, res, &error);\n'
                               '  if (!_ret)\n'
                               '    {\n'
                               '      g_warning ("Error setting property \'%%s\' on interface %s: %%s (%%s, %%d)",\n'
                               '                 info->parent_struct.name, \n'
                               '                 error->message, g_quark_to_string (error->domain), error->code);\n'
                               '      g_error_free (error);\n'
                               '    }\n'
                               '  else\n'
                               '    {\n'
                               '      g_variant_unref (_ret);\n'
                               '    }\n'
                               %(i.name))
            self.outfile.write('}\n'
                               '\n')
        self.outfile.write('static void\n'
                           '%s_proxy_set_property (GObject      *object,\n'
                           '  guint         prop_id,\n'
                           '  const GValue *value,\n'
                           '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
                           '{\n'%(i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
                               '  GVariant *variant;\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
                               '  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));\n'
                               '  g_dbus_proxy_call (G_DBUS_PROXY (object),\n'
                               '    "org.freedesktop.DBus.Properties.Set",\n'
                               '    g_variant_new ("(ssv)", "%s", info->parent_struct.name, variant),\n'
                               '    G_DBUS_CALL_FLAGS_NONE,\n'
                               '    -1,\n'
                               '    NULL, (GAsyncReadyCallback) %s_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);\n'
                               '  g_variant_unref (variant);\n'
                               %(len(i.properties), i.name_lower, i.name, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        # signal received
        self.outfile.write('static void\n'
                           '%s_proxy_g_signal (GDBusProxy *proxy,\n'
                           '  const gchar *sender_name G_GNUC_UNUSED,\n'
                           '  const gchar *signal_name,\n'
                           '  GVariant *parameters)\n'
                           '{\n'%(i.name_lower))
        self.outfile.write('  _ExtendedGDBusSignalInfo *info;\n'
                           '  GVariantIter iter;\n'
                           '  GVariant *child;\n'
                           '  GValue *paramv;\n'
                           '  gsize num_params;\n'
                           '  gsize n;\n'
                           '  guint signal_id;\n');
        # Note: info could be NULL if we are talking to a newer version of the interface
        self.outfile.write('  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, signal_name);\n'
                           '  if (info == NULL)\n'
                           '    return;\n'
                           %(i.name_lower))
        self.outfile.write('  num_params = g_variant_n_children (parameters);\n'
                           '  paramv = g_new0 (GValue, num_params + 1);\n'
                           '  g_value_init (&paramv[0], %sTYPE_%s);\n'
                           '  g_value_set_object (&paramv[0], proxy);\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_variant_iter_init (&iter, parameters);\n'
                           '  n = 1;\n'
                           '  while ((child = g_variant_iter_next_value (&iter)) != NULL)\n'
                           '    {\n'
                           '      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];\n'
                           '      if (arg_info->use_gvariant)\n'
                           '        {\n'
                           '          g_value_init (&paramv[n], G_TYPE_VARIANT);\n'
                           '          g_value_set_variant (&paramv[n], child);\n'
                           '          n++;\n'
                           '        }\n'
                           '      else\n'
                           '        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);\n'
                           '      g_variant_unref (child);\n'
                           '    }\n'
                           )
        self.outfile.write('  signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_signal_emitv (paramv, signal_id, 0, NULL);\n')
        self.outfile.write('  for (n = 0; n < num_params + 1; n++)\n'
                           '    g_value_unset (&paramv[n]);\n'
                           '  g_free (paramv);\n')
        self.outfile.write('}\n'
                           '\n')

        # property changed
        self.outfile.write('static void\n'
                           '%s_proxy_g_properties_changed (GDBusProxy *_proxy,\n'
                           '  GVariant *changed_properties,\n'
                           '  const gchar *const *invalidated_properties)\n'
                           '{\n'%(i.name_lower))
        # Note: info could be NULL if we are talking to a newer version of the interface
        self.outfile.write('  %sProxy *proxy = %s%s_PROXY (_proxy);\n'
                           '  guint n;\n'
                           '  const gchar *key;\n'
                           '  GVariantIter *iter;\n'
                           '  _ExtendedGDBusPropertyInfo *info;\n'
                           '  g_variant_get (changed_properties, "a{sv}", &iter);\n'
                           '  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))\n'
                           '    {\n'
                           '      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, key);\n'
                           '      g_datalist_remove_data (&proxy->priv->qdata, key);\n'
                           '      if (info != NULL)\n'
                           '        g_object_notify (G_OBJECT (proxy), info->hyphen_name);\n'
                           '    }\n'
                           '  g_variant_iter_free (iter);\n'
                           '  for (n = 0; invalidated_properties[n] != NULL; n++)\n'
                           '    {\n'
                           '      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, invalidated_properties[n]);\n'
                           '      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);\n'
                           '      if (info != NULL)\n'
                           '        g_object_notify (G_OBJECT (proxy), info->hyphen_name);\n'
                           '    }\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.ns_upper, i.name_upper,
                             i.name_lower, i.name_lower))

        # property vfuncs
        for p in i.properties:
            nul_value = '0'
            if p.arg.free_func != None:
                nul_value = 'NULL'
            self.outfile.write('static %s\n'
                               '%s_proxy_get_%s (%s *object)\n'
                               '{\n'
                               '  %sProxy *proxy = %s%s_PROXY (object);\n'
                               '  GVariant *variant;\n'
                               '  %svalue = %s;\n'%(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name,
                                                    i.camel_name, i.ns_upper, i.name_upper,
                                                    p.arg.ctype_in, nul_value))
            # For some property types, we have to free the returned
            # value (or part of it, e.g. the container) because of how
            # GVariant works.. see https://bugzilla.gnome.org/show_bug.cgi?id=657100
            # for details
            #
            free_container = False;
            if p.arg.gvariant_get == 'g_variant_get_strv' or p.arg.gvariant_get == 'g_variant_get_objv' or p.arg.gvariant_get == 'g_variant_get_bytestring_array':
                free_container = True;
            # If already using an old value for strv, objv, bytestring_array (see below),
            # then just return that... that way the result from multiple consecutive calls
            # to the getter are valid as long as they're freed
            #
            if free_container:
                self.outfile.write('  value = g_datalist_get_data (&proxy->priv->qdata, \"%s\");\n'
                                   '  if (value != NULL)\n'
                                   '    return value;\n'
                                   %(p.name))
            self.outfile.write('  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), \"%s\");\n'%(p.name))
            if p.arg.gtype == 'G_TYPE_VARIANT':
                self.outfile.write('  value = variant;\n')
                self.outfile.write('  if (variant != NULL)\n')
                self.outfile.write('    g_variant_unref (variant);\n')
            else:
                self.outfile.write('  if (variant != NULL)\n'
                                   '    {\n')
                extra_len = ''
                if p.arg.gvariant_get == 'g_variant_get_string' or p.arg.gvariant_get == 'g_variant_get_strv' or p.arg.gvariant_get == 'g_variant_get_objv' or p.arg.gvariant_get == 'g_variant_get_bytestring_array':
                    extra_len = ', NULL'
                self.outfile.write('      value = %s (variant%s);\n'%(p.arg.gvariant_get, extra_len))
                if free_container:
                    self.outfile.write('      g_datalist_set_data_full (&proxy->priv->qdata, \"%s\", (gpointer) value, g_free);\n'
                                       %(p.name))
                self.outfile.write('      g_variant_unref (variant);\n')
                self.outfile.write('    }\n')
            self.outfile.write('  return value;\n')
            self.outfile.write('}\n')
            self.outfile.write('\n')

        # class boilerplate
        self.outfile.write('static void\n'
                           '%s_proxy_init (%sProxy *proxy)\n'
                           '{\n'
                           '#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n'
                           '  proxy->priv = %s_proxy_get_instance_private (proxy);\n'
                           '#else\n'
                           '  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, %sTYPE_%s_PROXY, %sProxyPrivate);\n'
                           '#endif\n\n'
                           '  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), %s_interface_info ());\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.camel_name,
                             i.name_lower,
                             i.ns_upper, i.name_upper, i.camel_name,
                             i.name_lower))
        self.outfile.write('static void\n'
                           '%s_proxy_class_init (%sProxyClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class;\n'
                           '  GDBusProxyClass *proxy_class;\n'
                           '\n'
                           '  gobject_class = G_OBJECT_CLASS (klass);\n'
                           '  gobject_class->finalize     = %s_proxy_finalize;\n'
                           '  gobject_class->get_property = %s_proxy_get_property;\n'
                           '  gobject_class->set_property = %s_proxy_set_property;\n'
                           '\n'
                           '  proxy_class = G_DBUS_PROXY_CLASS (klass);\n'
                           '  proxy_class->g_signal = %s_proxy_g_signal;\n'
                           '  proxy_class->g_properties_changed = %s_proxy_g_properties_changed;\n'
                           '\n'%(i.name_lower, i.camel_name,
                                 i.name_lower, i.name_lower, i.name_lower, i.name_lower, i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  %s_override_properties (gobject_class, 1);\n\n'%(i.name_lower))
        self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38\n'
                           '  g_type_class_add_private (klass, sizeof (%sProxyPrivate));\n'
                           '#endif\n'%(i.camel_name))
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static void\n'
                           '%s_proxy_iface_init (%sIface *iface)\n'
                           '{\n'%(i.name_lower, i.camel_name))
        for p in i.properties:
            self.outfile.write('  iface->get_%s = %s_proxy_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower))
        self.outfile.write('}\n'
                           '\n')

        # constructors
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Asynchronously creates a proxy for the D-Bus interface #%s. See g_dbus_proxy_new() for more details.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %s_proxy_new_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %s_proxy_new_sync() for the synchronous, blocking version of this constructor.\n'
                %(i.name_lower, i.name, i.name_lower, i.name_lower), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('void\n'
                           '%s_proxy_new (\n'
                           '    GDBusConnection     *connection,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GAsyncReadyCallback  callback,\n'
                           '    gpointer             user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_%s_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.ns_upper, i.name_upper, i.name))
        self.outfile.write('/**\n'
                           ' * %s_proxy_new_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_proxy_new().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %s_proxy_new().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                           %(i.name_lower, i.name_lower, i.name_lower, i.camel_name))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new_sync:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Synchronously creates a proxy for the D-Bus interface #%s. See g_dbus_proxy_new_sync() for more details.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %s_proxy_new() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                %(i.name_lower, i.name, i.name_lower, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_sync (\n'
                           '    GDBusConnection     *connection,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_%s_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.name, i.ns_upper, i.name_upper))
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new_for_bus:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Like %s_proxy_new() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %s_proxy_new_for_bus_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %s_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.\n'
                %(i.name_lower, i.name_lower, i.name_lower, i.name_lower), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('void\n'
                           '%s_proxy_new_for_bus (\n'
                           '    GBusType             bus_type,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GAsyncReadyCallback  callback,\n'
                           '    gpointer             user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_%s_PROXY, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.ns_upper, i.name_upper, i.name))
        self.outfile.write('/**\n'
                           ' * %s_proxy_new_for_bus_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %s_proxy_new_for_bus().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %s_proxy_new_for_bus().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                           %(i.name_lower, i.name_lower, i.name_lower, i.camel_name))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_for_bus_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_proxy_new_for_bus_sync:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusProxyFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Like %s_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %s_proxy_new_for_bus() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sProxy): The constructed proxy object or %%NULL if @error is set.\n'
                %(i.name_lower, i.name_lower, i.name_lower, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_proxy_new_for_bus_sync (\n'
                           '    GBusType             bus_type,\n'
                           '    GDBusProxyFlags      flags,\n'
                           '    const gchar         *name,\n'
                           '    const gchar         *object_path,\n'
                           '    GCancellable        *cancellable,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_%s_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "%s", NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return %s%s (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.name, i.ns_upper, i.name_upper))
        self.outfile.write('\n')

    # ---------------------------------------------------------------------------------------------------

    def generate_skeleton(self, i):
        # class boilerplate
        self.outfile.write('/* ------------------------------------------------------------------------ */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sSkeleton:\n'
                ' *\n'
                ' * The #%sSkeleton structure contains only private data and should only be accessed using the provided API.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sSkeletonClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sSkeleton.\n'
                %(i.camel_name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('\n')

        self.outfile.write('struct _%sSkeletonPrivate\n'
                           '{\n'
                           '  GValue *properties;\n'
                           '  GList *changed_properties;\n'
                           '  GSource *changed_properties_idle_source;\n'
                           '  GMainContext *context;\n'
                           '  GMutex lock;\n'
                           '};\n'
                           '\n'%i.camel_name)

        self.outfile.write('static void\n'
                           '_%s_skeleton_handle_method_call (\n'
                           '  GDBusConnection *connection G_GNUC_UNUSED,\n'
                           '  const gchar *sender G_GNUC_UNUSED,\n'
                           '  const gchar *object_path G_GNUC_UNUSED,\n'
                           '  const gchar *interface_name,\n'
                           '  const gchar *method_name,\n'
                           '  GVariant *parameters,\n'
                           '  GDBusMethodInvocation *invocation,\n'
                           '  gpointer user_data)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                           '  _ExtendedGDBusMethodInfo *info;\n'
                           '  GVariantIter iter;\n'
                           '  GVariant *child;\n'
                           '  GValue *paramv;\n'
                           '  gsize num_params;\n'
                           '  guint num_extra;\n'
                           '  gsize n;\n'
                           '  guint signal_id;\n'
                           '  GValue return_value = G_VALUE_INIT;\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);\n'
                           '  g_assert (info != NULL);\n'
                           %())
        self.outfile.write('  num_params = g_variant_n_children (parameters);\n'
                           '  num_extra = info->pass_fdlist ? 3 : 2;'
                           '  paramv = g_new0 (GValue, num_params + num_extra);\n'
                           '  n = 0;\n'
                           '  g_value_init (&paramv[n], %sTYPE_%s);\n'
                           '  g_value_set_object (&paramv[n++], skeleton);\n'
                           '  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);\n'
                           '  g_value_set_object (&paramv[n++], invocation);\n'
                           '  if (info->pass_fdlist)\n'
                           '    {\n'
                           '#ifdef G_OS_UNIX\n'
                           '      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);\n'
                           '      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));\n'
                           '#else\n'
                           '      g_assert_not_reached ();\n'
                           '#endif\n'
                           '    }\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_variant_iter_init (&iter, parameters);\n'
                           '  while ((child = g_variant_iter_next_value (&iter)) != NULL)\n'
                           '    {\n'
                           '      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];\n'
                           '      if (arg_info->use_gvariant)\n'
                           '        {\n'
                           '          g_value_init (&paramv[n], G_TYPE_VARIANT);\n'
                           '          g_value_set_variant (&paramv[n], child);\n'
                           '          n++;\n'
                           '        }\n'
                           '      else\n'
                           '        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);\n'
                           '      g_variant_unref (child);\n'
                           '    }\n')
        self.outfile.write('  signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n'
                           %(i.ns_upper, i.name_upper))
        self.outfile.write('  g_value_init (&return_value, G_TYPE_BOOLEAN);\n'
                           '  g_signal_emitv (paramv, signal_id, 0, &return_value);\n'
                           '  if (!g_value_get_boolean (&return_value))\n'
                           '    g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s is not implemented on interface %s", method_name, interface_name);\n'
                           '  g_value_unset (&return_value);\n')
        self.outfile.write('  for (n = 0; n < num_params + num_extra; n++)\n'
                           '    g_value_unset (&paramv[n]);\n'
                           '  g_free (paramv);\n')
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static GVariant *\n'
                           '_%s_skeleton_handle_get_property (\n'
                           '  GDBusConnection *connection G_GNUC_UNUSED,\n'
                           '  const gchar *sender G_GNUC_UNUSED,\n'
                           '  const gchar *object_path G_GNUC_UNUSED,\n'
                           '  const gchar *interface_name G_GNUC_UNUSED,\n'
                           '  const gchar *property_name,\n'
                           '  GError **error,\n'
                           '  gpointer user_data)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                           '  GValue value = G_VALUE_INIT;\n'
                           '  GParamSpec *pspec;\n'
                           '  _ExtendedGDBusPropertyInfo *info;\n'
                           '  GVariant *ret;\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  ret = NULL;\n'
                           '  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, property_name);\n'
                           '  g_assert (info != NULL);\n'
                           '  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);\n'
                           '  if (pspec == NULL)\n'
                           '    {\n'
                           '      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %%s", property_name);\n'
                           '    }\n'
                           '  else\n'
                           '    {\n'
                           '      g_value_init (&value, pspec->value_type);\n'
                           '      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);\n'
                           '      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));\n'
                           '      g_value_unset (&value);\n'
                           '    }\n'
                           '  return ret;\n'
                           '}\n'
                           '\n'
                           %(i.name_lower))

        self.outfile.write('static gboolean\n'
                           '_%s_skeleton_handle_set_property (\n'
                           '  GDBusConnection *connection G_GNUC_UNUSED,\n'
                           '  const gchar *sender G_GNUC_UNUSED,\n'
                           '  const gchar *object_path G_GNUC_UNUSED,\n'
                           '  const gchar *interface_name G_GNUC_UNUSED,\n'
                           '  const gchar *property_name,\n'
                           '  GVariant *variant,\n'
                           '  GError **error,\n'
                           '  gpointer user_data)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                           '  GValue value = G_VALUE_INIT;\n'
                           '  GParamSpec *pspec;\n'
                           '  _ExtendedGDBusPropertyInfo *info;\n'
                           '  gboolean ret;\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('  ret = FALSE;\n'
                           '  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_%s_interface_info.parent_struct, property_name);\n'
                           '  g_assert (info != NULL);\n'
                           '  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);\n'
                           '  if (pspec == NULL)\n'
                           '    {\n'
                           '      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %%s", property_name);\n'
                           '    }\n'
                           '  else\n'
                           '    {\n'
                           '      if (info->use_gvariant)\n'
                           '        g_value_set_variant (&value, variant);\n'
                           '      else\n'
                           '        g_dbus_gvariant_to_gvalue (variant, &value);\n'
                           '      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);\n'
                           '      g_value_unset (&value);\n'
                           '      ret = TRUE;\n'
                           '    }\n'
                           '  return ret;\n'
                           '}\n'
                           '\n'
                           %(i.name_lower))


        self.outfile.write('static const GDBusInterfaceVTable _%s_skeleton_vtable =\n'
                           '{\n'
                           '  _%s_skeleton_handle_method_call,\n'
                           '  _%s_skeleton_handle_get_property,\n'
                           '  _%s_skeleton_handle_set_property,\n'
                           '  {NULL}\n'
                           '};\n'
                           '\n'%(i.name_lower, i.name_lower, i.name_lower, i.name_lower))

        self.outfile.write('static GDBusInterfaceInfo *\n'
                           '%s_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)\n'
                           '{\n'
                           '  return %s_interface_info ();\n'
                           %(i.name_lower, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static GDBusInterfaceVTable *\n'
                           '%s_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)\n'
                           '{\n'
                           '  return (GDBusInterfaceVTable *) &_%s_skeleton_vtable;\n'
                           %(i.name_lower, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static GVariant *\n'
                           '%s_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)\n'
                           '{\n'
                           '  %sSkeleton *skeleton = %s%s_SKELETON (_skeleton);\n'
                           %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
        self.outfile.write('\n'
                           '  GVariantBuilder builder;\n'
                           '  guint n;\n'
                           '  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));\n'
                           '  if (_%s_interface_info.parent_struct.properties == NULL)\n'
                           '    goto out;\n'
                           '  for (n = 0; _%s_interface_info.parent_struct.properties[n] != NULL; n++)\n'
                           '    {\n'
                           '      GDBusPropertyInfo *info = _%s_interface_info.parent_struct.properties[n];\n'
                           '      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)\n'
                           '        {\n'
                           '          GVariant *value;\n'
                           '          value = _%s_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "%s", info->name, NULL, skeleton);\n'
                           '          if (value != NULL)\n'
                           '            {\n'
                           '              g_variant_take_ref (value);\n'
                           '              g_variant_builder_add (&builder, "{sv}", info->name, value);\n'
                           '              g_variant_unref (value);\n'
                           '            }\n'
                           '        }\n'
                           '    }\n'
                           'out:\n'
                           '  return g_variant_builder_end (&builder);\n'
                           '}\n'
                           '\n'
                           %(i.name_lower, i.name_lower, i.name_lower, i.name_lower, i.name))

        if len(i.properties) > 0:
            self.outfile.write('static gboolean _%s_emit_changed (gpointer user_data);\n'
                               '\n'
                               %(i.name_lower))

        self.outfile.write('static void\n'
                           '%s_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)\n'
                           '{\n'
                           %(i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (_skeleton);\n'
                               '  gboolean emit_changed = FALSE;\n'
                               '\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  if (skeleton->priv->changed_properties_idle_source != NULL)\n'
                               '    {\n'
                               '      g_source_destroy (skeleton->priv->changed_properties_idle_source);\n'
                               '      skeleton->priv->changed_properties_idle_source = NULL;\n'
                               '      emit_changed = TRUE;\n'
                               '    }\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               '\n'
                               '  if (emit_changed)\n'
                               '    _%s_emit_changed (skeleton);\n'
                               %(i.camel_name, i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('}\n'
                           '\n')

        for s in i.signals:
            self.outfile.write('static void\n'
                               '_%s_on_signal_%s (\n'
                               '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
            for a in s.args:
                self.outfile.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
            self.outfile.write(')\n'
                               '{\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (object);\n\n'
                               '  GList      *connections, *l;\n'
                               '  GVariant   *signal_variant;\n'
                               '  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));\n'
                               %(i.camel_name, i.ns_upper, i.name_upper))
            self.outfile.write('\n'
                               '  signal_variant = g_variant_ref_sink (g_variant_new ("(')
            for a in s.args:
                self.outfile.write('%s'%(a.format_in))
            self.outfile.write(')"')
            for a in s.args:
                self.outfile.write(',\n                   arg_%s'%(a.name))
            self.outfile.write('));\n')

            self.outfile.write('  for (l = connections; l != NULL; l = l->next)\n'
                               '    {\n'
                               '      GDBusConnection *connection = l->data;\n'
                               '      g_dbus_connection_emit_signal (connection,\n'
                               '        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "%s", "%s",\n'
                               '        signal_variant, NULL);\n'
                               '    }\n'
                               %(i.name, s.name))
            self.outfile.write('  g_variant_unref (signal_variant);\n')
            self.outfile.write('  g_list_free_full (connections, g_object_unref);\n')
            self.outfile.write('}\n'
                               '\n')

        self.outfile.write('static void %s_skeleton_iface_init (%sIface *iface);\n'
                           %(i.name_lower, i.camel_name))

        self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_ADD_PRIVATE (%sSkeleton)\n'%(i.camel_name))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#else\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower))
        self.outfile.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
        self.outfile.write('#endif\n')

        # finalize
        self.outfile.write('static void\n'
                           '%s_skeleton_finalize (GObject *object)\n'
                           '{\n'%(i.name_lower))
        self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
        if len(i.properties) > 0:
            self.outfile.write('  guint n;\n'
                               '  for (n = 0; n < %d; n++)\n'
                               '    g_value_unset (&skeleton->priv->properties[n]);\n'%(len(i.properties)))
            self.outfile.write('  g_free (skeleton->priv->properties);\n')
        self.outfile.write('  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n')
        self.outfile.write('  if (skeleton->priv->changed_properties_idle_source != NULL)\n')
        self.outfile.write('    g_source_destroy (skeleton->priv->changed_properties_idle_source);\n')
        self.outfile.write('  g_main_context_unref (skeleton->priv->context);\n')
        self.outfile.write('  g_mutex_clear (&skeleton->priv->lock);\n')
        self.outfile.write('  G_OBJECT_CLASS (%s_skeleton_parent_class)->finalize (object);\n'
                           '}\n'
                           '\n'%(i.name_lower))

        # property accessors (TODO: generate PropertiesChanged signals in setter)
        if len(i.properties) > 0:
            self.outfile.write('static void\n'
                               '%s_skeleton_get_property (GObject      *object,\n'
                               '  guint         prop_id,\n'
                            '  GValue       *value,\n'
                            '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
                            '{\n'%(i.name_lower))
            self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               %(i.camel_name, i.ns_upper, i.name_upper, len(i.properties)))
            self.outfile.write('}\n'
                               '\n')

            # if property is already scheduled then re-use entry.. though it could be
            # that the user did
            #
            #  foo_set_prop_bar (object, "");
            #  foo_set_prop_bar (object, "blah");
            #
            # say, every update... In this case, where nothing happens, we obviously
            # don't want a PropertiesChanged() event. We can easily check for this
            # by comparing against the _original value_ recorded before the first
            # change event. If the latest value is not different from the original
            # one, we can simply ignore the ChangedProperty
            #
            self.outfile.write('static gboolean\n'
                               '_%s_emit_changed (gpointer user_data)\n'
                               '{\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (user_data);\n'
                               %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper))
            self.outfile.write('  GList *l;\n'
                               '  GVariantBuilder builder;\n'
                               '  GVariantBuilder invalidated_builder;\n'
                               '  guint num_changes;\n'
                               '\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));\n'
                               '  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));\n'
                               '  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)\n'
                               '    {\n'
                               '      ChangedProperty *cp = l->data;\n'
                               '      GVariant *variant;\n'
                               '      const GValue *cur_value;\n'
                               '\n'
                               '      cur_value = &skeleton->priv->properties[cp->prop_id - 1];\n'
                               '      if (!_g_value_equal (cur_value, &cp->orig_value))\n'
                               '        {\n'
                               '          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));\n'
                               '          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);\n'
                               '          g_variant_unref (variant);\n'
                               '          num_changes++;\n'
                               '        }\n'
                               '    }\n'
                               '  if (num_changes > 0)\n'
                               '    {\n'
                               '      GList *connections, *ll;\n'
                               '      GVariant *signal_variant;'
                               '\n'
                               '      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "%s",\n'
                               '                                           &builder, &invalidated_builder));\n'
                               '      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));\n'
                               '      for (ll = connections; ll != NULL; ll = ll->next)\n'
                               '        {\n'
                               '          GDBusConnection *connection = ll->data;\n'
                               '\n'
                               '          g_dbus_connection_emit_signal (connection,\n'
                               '                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),\n'
                               '                                         "org.freedesktop.DBus.Properties",\n'
                               '                                         "PropertiesChanged",\n'
                               '                                         signal_variant,\n'
                               '                                         NULL);\n'
                               '        }\n'
                               '      g_variant_unref (signal_variant);\n'
                               '      g_list_free_full (connections, g_object_unref);\n'
                               '    }\n'
                               '  else\n'
                               '    {\n'
                               '      g_variant_builder_clear (&builder);\n'
                               '      g_variant_builder_clear (&invalidated_builder);\n'
                               '    }\n'
                               %(i.name))
            self.outfile.write('  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n')
            self.outfile.write('  skeleton->priv->changed_properties = NULL;\n')
            self.outfile.write('  skeleton->priv->changed_properties_idle_source = NULL;\n')
            self.outfile.write('  g_mutex_unlock (&skeleton->priv->lock);\n')
            self.outfile.write('  return FALSE;\n'
                               '}\n'
                               '\n')
            # holding lock while being called
            self.outfile.write('static void\n'
                               '_%s_schedule_emit_changed (%sSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)\n'
                               '{\n'
                               '  ChangedProperty *cp;\n'
                               '  GList *l;\n'
                               '  cp = NULL;\n'
                               '  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)\n'
                               '    {\n'
                               '      ChangedProperty *i_cp = l->data;\n'
                               '      if (i_cp->info == info)\n'
                               '        {\n'
                               '          cp = i_cp;\n'
                               '          break;\n'
                               '        }\n'
                               '    }\n'
                               %(i.name_lower, i.camel_name))
            self.outfile.write('  if (cp == NULL)\n'
                               '    {\n'
                               '      cp = g_new0 (ChangedProperty, 1);\n'
                               '      cp->prop_id = prop_id;\n'
                               '      cp->info = info;\n'
                               '      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);\n'
                               '      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));\n'
                               '      g_value_copy (orig_value, &cp->orig_value);\n'
                               '    }\n'
                               '}\n'
                               '\n'
                               %())

            # Postpone setting up the refresh source until the ::notify signal is emitted as
            # this allows use of g_object_freeze_notify()/g_object_thaw_notify() ...
            # This is useful when updating several properties from another thread than
            # where the idle will be emitted from
            self.outfile.write('static void\n'
                               '%s_skeleton_notify (GObject      *object,\n'
                               '  GParamSpec *pspec G_GNUC_UNUSED)\n'
                               '{\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  if (skeleton->priv->changed_properties != NULL &&\n'
                               '      skeleton->priv->changed_properties_idle_source == NULL)\n'
                               '    {\n'
                               '      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();\n'
                               '      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);\n'
                               '      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _%s_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);\n'
                               '      g_source_set_name (skeleton->priv->changed_properties_idle_source, "[generated] _%s_emit_changed");\n'
                               '      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);\n'
                               '      g_source_unref (skeleton->priv->changed_properties_idle_source);\n'
                               '    }\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               '}\n'
                               '\n'
                               %(i.name_lower, i.camel_name, i.ns_upper, i.name_upper, i.name_lower, i.name_lower))

            self.outfile.write('static void\n'
                               '%s_skeleton_set_property (GObject      *object,\n'
                               '  guint         prop_id,\n'
                               '  const GValue *value,\n'
                               '  GParamSpec   *pspec)\n'
                               '{\n'%(i.name_lower))
            self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
                               '  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'
                               '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
                               '  info = (const _ExtendedGDBusPropertyInfo *) _%s_property_info_pointers[prop_id - 1];\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  g_object_freeze_notify (object);\n'
                               '  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))\n'
                               '    {\n'
                               '      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL &&\n'
                               '          info->emits_changed_signal)\n'
                               '        _%s_schedule_emit_changed (skeleton, info, prop_id, &skeleton->priv->properties[prop_id - 1]);\n'
                               '      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);\n'
                               '      g_object_notify_by_pspec (object, pspec);\n'
                               '    }\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               '  g_object_thaw_notify (object);\n'
                               %(i.camel_name, i.ns_upper, i.name_upper, len(i.properties), i.name_lower, i.name_lower))
            self.outfile.write('}\n'
                               '\n')

        self.outfile.write('static void\n'
                           '%s_skeleton_init (%sSkeleton *skeleton)\n'
                           '{\n'
                           '#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n'
                           '  skeleton->priv = %s_skeleton_get_instance_private (skeleton);\n'
                           '#else\n'
                           '  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, %sTYPE_%s_SKELETON, %sSkeletonPrivate);\n'
                           '#endif\n\n'
                           %(i.name_lower, i.camel_name,
                             i.name_lower,
                             i.ns_upper, i.name_upper, i.camel_name))
        self.outfile.write('  g_mutex_init (&skeleton->priv->lock);\n')
        self.outfile.write('  skeleton->priv->context = g_main_context_ref_thread_default ();\n')
        if len(i.properties) > 0:
            self.outfile.write('  skeleton->priv->properties = g_new0 (GValue, %d);\n'%(len(i.properties)))
            n = 0
            for p in i.properties:
                self.outfile.write('  g_value_init (&skeleton->priv->properties[%d], %s);\n'%(n, p.arg.gtype))
                n += 1
        self.outfile.write('}\n'
                           '\n')

        # property vfuncs
        n = 0
        for p in i.properties:
            self.outfile.write('static %s\n'
                               '%s_skeleton_get_%s (%s *object)\n'
                               '{\n'
                               %(p.arg.ctype_in, i.name_lower, p.name_lower, i.camel_name))
            self.outfile.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
            self.outfile.write('  %svalue;\n'
                               '  g_mutex_lock (&skeleton->priv->lock);\n'
                               '  value = %s (&(skeleton->priv->properties[%d]));\n'
                               '  g_mutex_unlock (&skeleton->priv->lock);\n'
                               %(p.arg.ctype_in_g, p.arg.gvalue_get, n))
            self.outfile.write('  return value;\n')
            self.outfile.write('}\n')
            self.outfile.write('\n')
            n += 1

        self.outfile.write('static void\n'
                           '%s_skeleton_class_init (%sSkeletonClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class;\n'
                           '  GDBusInterfaceSkeletonClass *skeleton_class;\n'
                           '\n'
                           '  gobject_class = G_OBJECT_CLASS (klass);\n'
                           '  gobject_class->finalize = %s_skeleton_finalize;\n'
                           %(i.name_lower, i.camel_name, i.name_lower))
        if len(i.properties) > 0:
            self.outfile.write('  gobject_class->get_property = %s_skeleton_get_property;\n'
                               '  gobject_class->set_property = %s_skeleton_set_property;\n'
                               '  gobject_class->notify       = %s_skeleton_notify;\n'
                               '\n'%(i.name_lower, i.name_lower, i.name_lower))
            self.outfile.write('\n'
                               '  %s_override_properties (gobject_class, 1);\n'%(i.name_lower))
        self.outfile.write('\n'
                           '  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);\n');
        self.outfile.write('  skeleton_class->get_info = %s_skeleton_dbus_interface_get_info;\n'%(i.name_lower))
        self.outfile.write('  skeleton_class->get_properties = %s_skeleton_dbus_interface_get_properties;\n'%(i.name_lower))
        self.outfile.write('  skeleton_class->flush = %s_skeleton_dbus_interface_flush;\n'%(i.name_lower))
        self.outfile.write('  skeleton_class->get_vtable = %s_skeleton_dbus_interface_get_vtable;\n'%(i.name_lower))

        self.outfile.write('\n'
                           '#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38\n'
                           '  g_type_class_add_private (klass, sizeof (%sSkeletonPrivate));\n'
                           '#endif\n'%(i.camel_name))

        self.outfile.write('}\n'
                           '\n')

        self.outfile.write('static void\n'
                           '%s_skeleton_iface_init (%sIface *iface)\n'
                           '{\n'
                           %(i.name_lower, i.camel_name))
        for s in i.signals:
            self.outfile.write('  iface->%s = _%s_on_signal_%s;\n'
                               %(s.name_lower, i.name_lower, s.name_lower))
        for p in i.properties:
            self.outfile.write('  iface->get_%s = %s_skeleton_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower))
        self.outfile.write('}\n'
                           '\n')

        # constructors
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %s_skeleton_new:\n'
                ' *\n'
                ' * Creates a skeleton object for the D-Bus interface #%s.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sSkeleton): The skeleton object.\n'
                %(i.name_lower, i.name, i.camel_name), False))
        self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
        self.outfile.write('%s *\n'
                           '%s_skeleton_new (void)\n'
                           '{\n'
                           '  return %s%s (g_object_new (%sTYPE_%s_SKELETON, NULL));\n'
                           '}\n'
                           '\n'%(i.camel_name, i.name_lower, i.ns_upper, i.name_upper, i.ns_upper, i.name_upper))

    # ---------------------------------------------------------------------------------------------------

    def generate_object(self):
        self.outfile.write('/* ------------------------------------------------------------------------\n'
                           ' * Code for Object, ObjectProxy and ObjectSkeleton\n'
                           ' * ------------------------------------------------------------------------\n'
                           ' */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * SECTION:%sObject\n'
                ' * @title: %sObject\n'
                ' * @short_description: Specialized GDBusObject types\n'
                ' *\n'
                ' * This section contains the #%sObject, #%sObjectProxy, and #%sObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.\n'
                ' */\n'
                %(self.namespace, self.namespace, self.namespace, self.namespace, self.namespace), False))
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObject:\n'
                ' *\n'
                ' * The #%sObject type is a specialized container of interfaces.\n'
                ' */\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectIface:\n'
                ' * @parent_iface: The parent interface.\n'
                ' *\n'
                ' * Virtual table for the #%sObject interface.\n'
                ' */\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write('\n')

        self.outfile.write('typedef %sObjectIface %sObjectInterface;\n'%(self.namespace, self.namespace))
        self.outfile.write('G_DEFINE_INTERFACE_WITH_CODE (%sObject, %sobject, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT);)\n'%(self.namespace, self.ns_lower))
        self.outfile.write('\n')
        self.outfile.write('static void\n'
                           '%sobject_default_init (%sObjectIface *iface)\n'
                           '{\n'
                           %(self.ns_lower, self.namespace));
        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '  /**\n'
                    '   * %sObject:%s:\n'
                    '   *\n'
                    '   * The #%s instance corresponding to the D-Bus interface #%s, if any.\n'
                    '   *\n'
                    '   * Connect to the #GObject::notify signal to get informed of property changes.\n'
                    %(self.namespace, i.name_hyphen, i.camel_name, i.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 2)
            flags = 'G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS'
            if i.deprecated:
                flags = 'G_PARAM_DEPRECATED | ' + flags
            self.outfile.write('  g_object_interface_install_property (iface, g_param_spec_object ("%s", "%s", "%s", %sTYPE_%s, %s));\n'
                               '\n'
                               %(i.name_hyphen, i.name_hyphen, i.name_hyphen, self.ns_upper, i.name_upper, flags))
        self.outfile.write('}\n'
                           '\n')

        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %sobject_get_%s:\n'
                    ' * @object: A #%sObject.\n'
                    ' *\n'
                    ' * Gets the #%s instance for the D-Bus interface #%s on @object, if any.\n'
                    ' *\n'
                    ' * Returns: (transfer full) (nullable): A #%s that must be freed with g_object_unref() or %%NULL if @object does not implement the interface.\n'
                    %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name, i.name, i.camel_name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('%s *%sobject_get_%s (%sObject *object)\n'
                               %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            self.outfile.write('{\n'
                               '  GDBusInterface *ret;\n'
                               '  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '  if (ret == NULL)\n'
                               '    return NULL;\n'
                               '  return %s%s (ret);\n'
                               '}\n'
                               '\n'
                               %(i.name, self.ns_upper, i.name_upper))
        self.outfile.write('\n')
        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %sobject_peek_%s: (skip)\n'
                    ' * @object: A #%sObject.\n'
                    ' *\n'
                    ' * Like %sobject_get_%s() but doesn\'t increase the reference count on the returned object.\n'
                    ' *\n'
                    ' * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>\n'
                    ' *\n'
                    ' * Returns: (transfer none) (nullable): A #%s or %%NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.\n'
                    %(self.ns_lower, i.name_upper.lower(), self.namespace, self.ns_lower, i.name_upper.lower(), i.camel_name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('%s *%sobject_peek_%s (%sObject *object)\n'
                               %(i.camel_name, self.ns_lower, i.name_upper.lower(), self.namespace))
            self.outfile.write('{\n'
                               '  GDBusInterface *ret;\n'
                               '  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '  if (ret == NULL)\n'
                               '    return NULL;\n'
                               '  g_object_unref (ret);\n'
                               '  return %s%s (ret);\n'
                               '}\n'
                               '\n'
                               %(i.name, self.ns_upper, i.name_upper))
        self.outfile.write('\n')
        # shared by ObjectProxy and ObjectSkeleton classes
        self.outfile.write('static void\n'
                           '%sobject_notify (GDBusObject *object, GDBusInterface *interface)\n'
                           '{\n'
                           '  _ExtendedGDBusInterfaceInfo *info = (_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface);\n'
                           '  /* info can be NULL if the other end is using a D-Bus interface we don\'t know\n'
                           '   * anything about, for example old generated code in this process talking to\n'
                           '   * newer generated code in the other process. */\n'
                           '  if (info != NULL)\n'
                           '    g_object_notify (G_OBJECT (object), info->hyphen_name);\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectProxy:\n'
                ' *\n'
                ' * The #%sObjectProxy structure contains only private data and should only be accessed using the provided API.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectProxyClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sObjectProxy.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_proxy__%sobject_iface_init (%sObjectIface *iface G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)\n'
                           '{\n'
                           '  iface->interface_added = %sobject_notify;\n'
                           '  iface->interface_removed = %sobject_notify;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower))
        self.outfile.write('\n')
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sObjectProxy, %sobject_proxy, G_TYPE_DBUS_OBJECT_PROXY,\n'
                           '                         G_IMPLEMENT_INTERFACE (%sTYPE_OBJECT, %sobject_proxy__%sobject_iface_init)\n'
                           '                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, %sobject_proxy__g_dbus_object_iface_init))\n'
                           '\n'
                           %(self.namespace, self.ns_lower, self.ns_upper, self.ns_lower, self.ns_lower, self.ns_lower))
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_proxy_init (%sObjectProxy *object G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_proxy_set_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  const GValue *value G_GNUC_UNUSED,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                           %(self.ns_lower))
        self.outfile.write('}\n'
                           '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_proxy_get_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  GValue       *value,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  %sObjectProxy *object = %sOBJECT_PROXY (gobject);\n'
                           '  GDBusInterface *interface;\n'
                           '\n'
                           '  switch (prop_id)\n'
                           '    {\n'
                           %(self.ns_lower, self.namespace, self.ns_upper))
        n = 1
        for i in self.ifaces:
            self.outfile.write('    case %d:\n'
                               '      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '      g_value_take_object (value, interface);\n'
                               '      break;\n'
                               '\n'
                               %(n, i.name))
            n += 1
        self.outfile.write('    default:\n'
                           '      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                           '      break;\n'
                           '  }\n'
                           '}\n'
                           '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_proxy_class_init (%sObjectProxyClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);\n'
                           '\n'
                           '  gobject_class->set_property = %sobject_proxy_set_property;\n'
                           '  gobject_class->get_property = %sobject_proxy_get_property;\n'
                           '\n'
                           %(self.ns_lower, self.namespace, self.ns_lower, self.ns_lower))
        n = 1
        for i in self.ifaces:
            self.outfile.write('  g_object_class_override_property (gobject_class, %d, "%s");'
                               '\n'
                               %(n, i.name_hyphen))
            n += 1
        self.outfile.write('}\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_proxy_new:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @object_path: An object path.\n'
                ' *\n'
                ' * Creates a new proxy object.\n'
                ' *\n'
                ' * Returns: (transfer full): The proxy object.\n'
                ' */\n'
                %(self.ns_lower), False))
        self.outfile.write('%sObjectProxy *\n'
                     '%sobject_proxy_new (GDBusConnection *connection,\n'
                     '  const gchar *object_path)\n'
                     '{\n'
                     '  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);\n'
                     '  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);\n'
                     '  return %sOBJECT_PROXY (g_object_new (%sTYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));\n'
                     '}\n'
                     '\n'%(self.namespace, self.ns_lower, self.ns_upper, self.ns_upper))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectSkeleton:\n'
                ' *\n'
                ' * The #%sObjectSkeleton structure contains only private data and should only be accessed using the provided API.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectSkeletonClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sObjectSkeleton.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_skeleton__%sobject_iface_init (%sObjectIface *iface G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write('\n')
        self.outfile.write('static void\n'
                           '%sobject_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)\n'
                           '{\n'
                           '  iface->interface_added = %sobject_notify;\n'
                           '  iface->interface_removed = %sobject_notify;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower))
        self.outfile.write('G_DEFINE_TYPE_WITH_CODE (%sObjectSkeleton, %sobject_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,\n'
                           '                         G_IMPLEMENT_INTERFACE (%sTYPE_OBJECT, %sobject_skeleton__%sobject_iface_init)\n'
                           '                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, %sobject_skeleton__g_dbus_object_iface_init))\n'
                           '\n'
                           %(self.namespace, self.ns_lower, self.ns_upper, self.ns_lower, self.ns_lower, self.ns_lower))
        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_skeleton_init (%sObjectSkeleton *object G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_skeleton_set_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  const GValue *value,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  %sObjectSkeleton *object = %sOBJECT_SKELETON (gobject);\n'
                           '  GDBusInterfaceSkeleton *interface;\n'
                           '\n'
                           '  switch (prop_id)\n'
                           '    {\n'
                           %(self.ns_lower, self.namespace, self.ns_upper))
        n = 1
        for i in self.ifaces:
            self.outfile.write('    case %d:\n'
                               '      interface = g_value_get_object (value);\n'
                               '      if (interface != NULL)\n'
                               '        {\n'
                               '          g_warn_if_fail (%sIS_%s (interface));\n'
                               '          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);\n'
                               '        }\n'
                               '      else\n'
                               '        {\n'
                               '          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "%s");\n'
                               '        }\n'
                               '      break;\n'
                               '\n'
                               %(n, self.ns_upper, i.name_upper, i.name))
            n += 1
        self.outfile.write('    default:\n'
                     '      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                     '      break;\n'
                     '  }\n'
                     '}\n'
                     '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_skeleton_get_property (GObject      *gobject,\n'
                           '  guint         prop_id,\n'
                           '  GValue       *value,\n'
                           '  GParamSpec   *pspec)\n'
                           '{\n'
                           '  %sObjectSkeleton *object = %sOBJECT_SKELETON (gobject);\n'
                           '  GDBusInterface *interface;\n'
                           '\n'
                           '  switch (prop_id)\n'
                           '    {\n'
                           %(self.ns_lower, self.namespace, self.ns_upper))
        n = 1
        for i in self.ifaces:
            self.outfile.write('    case %d:\n'
                               '      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "%s");\n'
                               '      g_value_take_object (value, interface);\n'
                               '      break;\n'
                               '\n'
                               %(n, i.name))
            n += 1
        self.outfile.write('    default:\n'
                           '      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);\n'
                           '      break;\n'
                           '  }\n'
                           '}\n'
                           '\n'%())
        self.outfile.write('static void\n'
                           '%sobject_skeleton_class_init (%sObjectSkeletonClass *klass)\n'
                           '{\n'
                           '  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);\n'
                           '\n'
                           '  gobject_class->set_property = %sobject_skeleton_set_property;\n'
                           '  gobject_class->get_property = %sobject_skeleton_get_property;\n'
                           '\n'
                           %(self.ns_lower, self.namespace, self.ns_lower, self.ns_lower))
        n = 1
        for i in self.ifaces:
            self.outfile.write('  g_object_class_override_property (gobject_class, %d, "%s");'
                               '\n'
                               %(n, i.name_hyphen))
            n += 1
        self.outfile.write('}\n'
                           '\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_skeleton_new:\n'
                ' * @object_path: An object path.\n'
                ' *\n'
                ' * Creates a new skeleton object.\n'
                ' *\n'
                ' * Returns: (transfer full): The skeleton object.\n'
                ' */\n'
                %(self.ns_lower), False))
        self.outfile.write('%sObjectSkeleton *\n'
                           '%sobject_skeleton_new (const gchar *object_path)\n'
                           '{\n'
                           '  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);\n'
                           '  return %sOBJECT_SKELETON (g_object_new (%sTYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));\n'
                           '}\n'
                           '\n'%(self.namespace, self.ns_lower, self.ns_upper, self.ns_upper))
        for i in self.ifaces:
            self.outfile.write(self.docbook_gen.expand(
                    '/**\n'
                    ' * %sobject_skeleton_set_%s:\n'
                    ' * @object: A #%sObjectSkeleton.\n'
                    ' * @interface_: (nullable): A #%s or %%NULL to clear the interface.\n'
                    ' *\n'
                    ' * Sets the #%s instance for the D-Bus interface #%s on @object.\n'
                    %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name, i.camel_name, i.name), False))
            self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
            self.outfile.write('void %sobject_skeleton_set_%s (%sObjectSkeleton *object, %s *interface_)\n'
                               %(self.ns_lower, i.name_upper.lower(), self.namespace, i.camel_name))
            self.outfile.write('{\n'
                               '  g_object_set (G_OBJECT (object), "%s", interface_, NULL);\n'
                               '}\n'
                               '\n'
                               %(i.name_hyphen))
        self.outfile.write('\n')


    def generate_object_manager_client(self):
        self.outfile.write('/* ------------------------------------------------------------------------\n'
                           ' * Code for ObjectManager client\n'
                           ' * ------------------------------------------------------------------------\n'
                           ' */\n'
                           '\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * SECTION:%sObjectManagerClient\n'
                ' * @title: %sObjectManagerClient\n'
                ' * @short_description: Generated GDBusObjectManagerClient type\n'
                ' *\n'
                ' * This section contains a #GDBusObjectManagerClient that uses %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.\n'
                ' */\n'
                %(self.namespace, self.namespace, self.ns_lower), False))
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectManagerClient:\n'
                ' *\n'
                ' * The #%sObjectManagerClient structure contains only private data and should only be accessed using the provided API.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sObjectManagerClientClass:\n'
                ' * @parent_class: The parent class.\n'
                ' *\n'
                ' * Class structure for #%sObjectManagerClient.\n'
                %(self.namespace, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('\n')

        # class boilerplate
        self.outfile.write('G_DEFINE_TYPE (%sObjectManagerClient, %sobject_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT)\n'
                           '\n'
                           %(self.namespace, self.ns_lower))

        # class boilerplate
        self.outfile.write('static void\n'
                           '%sobject_manager_client_init (%sObjectManagerClient *manager G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))
        self.outfile.write('static void\n'
                           '%sobject_manager_client_class_init (%sObjectManagerClientClass *klass G_GNUC_UNUSED)\n'
                           '{\n'
                           '}\n'
                           '\n'%(self.ns_lower, self.namespace))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_get_proxy_type:\n'
                ' * @manager: A #GDBusObjectManagerClient.\n'
                ' * @object_path: The object path of the remote object (unused).\n'
                ' * @interface_name: (nullable): Interface name of the remote object or %%NULL to get the object proxy #GType.\n'
                ' * @user_data: User data (unused).\n'
                ' *\n'
                ' * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy derived and #GDBusProxy derived types.\n'
                ' *\n'
                ' * Returns: A #GDBusProxy derived #GType if @interface_name is not %%NULL, otherwise the #GType for #%sObjectProxy.\n'
                %(self.ns_lower, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('GType\n'
                           '%sobject_manager_client_get_proxy_type (GDBusObjectManagerClient *manager G_GNUC_UNUSED, const gchar *object_path G_GNUC_UNUSED, const gchar *interface_name, gpointer user_data G_GNUC_UNUSED)\n'
                           '{\n'
                           %(self.ns_lower))
        self.outfile.write('  static gsize once_init_value = 0;\n'
                           '  static GHashTable *lookup_hash;\n'
                           '  GType ret;\n'
                           '\n'
                           '  if (interface_name == NULL)\n'
                           '    return %sTYPE_OBJECT_PROXY;\n'
                           '  if (g_once_init_enter (&once_init_value))\n'
                           '    {\n'
                           '      lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);\n'
                           %(self.ns_upper))
        for i in self.ifaces:
            self.outfile.write('      g_hash_table_insert (lookup_hash, (gpointer) "%s", GSIZE_TO_POINTER (%sTYPE_%s_PROXY));\n'
                               %(i.name, i.ns_upper, i.name_upper))
        self.outfile.write('      g_once_init_leave (&once_init_value, 1);\n'
                           '    }\n')
        self.outfile.write('  ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));\n'
                           '  if (ret == (GType) 0)\n'
                           '    ret = G_TYPE_DBUS_PROXY;\n')
        self.outfile.write('  return ret;\n'
                           '}\n'
                           '\n')

        # constructors
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Asynchronously creates #GDBusObjectManagerClient using %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %sobject_manager_client_new_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %sobject_manager_client_new_sync() for the synchronous, blocking version of this constructor.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.ns_lower), False))
        self.outfile.write(' */\n')
        self.outfile.write('void\n'
                           '%sobject_manager_client_new (\n'
                           '    GDBusConnection        *connection,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GAsyncReadyCallback     callback,\n'
                           '    gpointer                user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('/**\n'
                           ' * %sobject_manager_client_new_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %sobject_manager_client_new().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %sobject_manager_client_new().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new_sync:\n'
                ' * @connection: A #GDBusConnection.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: (nullable): A bus name (well-known or unique) or %%NULL if @connection is not a message bus connection.\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Synchronously creates #GDBusObjectManagerClient using %sobject_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %sobject_manager_client_new() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_sync (\n'
                           '    GDBusConnection        *connection,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GError                **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('\n')
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new_for_bus:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @callback: A #GAsyncReadyCallback to call when the request is satisfied.\n'
                ' * @user_data: User data to pass to @callback.\n'
                ' *\n'
                ' * Like %sobject_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.\n'
                ' * You can then call %sobject_manager_client_new_for_bus_finish() to get the result of the operation.\n'
                ' *\n'
                ' * See %sobject_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.ns_lower), False))
        self.outfile.write(' */\n')
        self.outfile.write('void\n'
                           '%sobject_manager_client_new_for_bus (\n'
                           '    GBusType                bus_type,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GAsyncReadyCallback     callback,\n'
                           '    gpointer                user_data)\n'
                           '{\n'
                           '  g_async_initable_new_async (%sTYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('/**\n'
                           ' * %sobject_manager_client_new_for_bus_finish:\n'
                           ' * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to %sobject_manager_client_new_for_bus().\n'
                           ' * @error: Return location for error or %%NULL\n'
                           ' *\n'
                           ' * Finishes an operation started with %sobject_manager_client_new_for_bus().\n'
                           ' *\n'
                           ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                           %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_for_bus_finish (\n'
                           '    GAsyncResult        *res,\n'
                           '    GError             **error)\n'
                           '{\n'
                           '  GObject *ret;\n'
                           '  GObject *source_object;\n'
                           '  source_object = g_async_result_get_source_object (res);\n'
                           '  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);\n'
                           '  g_object_unref (source_object);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower))
        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * %sobject_manager_client_new_for_bus_sync:\n'
                ' * @bus_type: A #GBusType.\n'
                ' * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.\n'
                ' * @name: A bus name (well-known or unique).\n'
                ' * @object_path: An object path.\n'
                ' * @cancellable: (nullable): A #GCancellable or %%NULL.\n'
                ' * @error: Return location for error or %%NULL\n'
                ' *\n'
                ' * Like %sobject_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.\n'
                ' *\n'
                ' * The calling thread is blocked until a reply is received.\n'
                ' *\n'
                ' * See %sobject_manager_client_new_for_bus() for the asynchronous version of this constructor.\n'
                ' *\n'
                ' * Returns: (transfer full) (type %sObjectManagerClient): The constructed object manager client or %%NULL if @error is set.\n'
                %(self.ns_lower, self.ns_lower, self.ns_lower, self.namespace), False))
        self.outfile.write(' */\n')
        self.outfile.write('GDBusObjectManager *\n'
                           '%sobject_manager_client_new_for_bus_sync (\n'
                           '    GBusType                bus_type,\n'
                           '    GDBusObjectManagerClientFlags  flags,\n'
                           '    const gchar            *name,\n'
                           '    const gchar            *object_path,\n'
                           '    GCancellable           *cancellable,\n'
                           '    GError                **error)\n'
                           '{\n'
                           '  GInitable *ret;\n'
                           '  ret = g_initable_new (%sTYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", %sobject_manager_client_get_proxy_type, NULL);\n'
                           '  if (ret != NULL)\n'
                           '    return G_DBUS_OBJECT_MANAGER (ret);\n'
                           '  else\n'
                           '    return NULL;\n'
                           '}\n'
                           '\n'
                           %(self.ns_lower, self.ns_upper, self.ns_lower))
        self.outfile.write('\n')

    # ---------------------------------------------------------------------------------------------------

    def write_gtkdoc_deprecated_and_since_and_close(self, obj, f, indent):
        if len(obj.since) > 0:
            f.write('%*s *\n'
                    '%*s * Since: %s\n'
                    %(indent, '', indent, '', obj.since))
        if obj.deprecated:
            if isinstance(obj, dbustypes.Interface):
                thing = 'The D-Bus interface'
            elif isinstance(obj, dbustypes.Method):
                thing = 'The D-Bus method'
            elif isinstance(obj, dbustypes.Signal):
                thing = 'The D-Bus signal'
            elif isinstance(obj, dbustypes.Property):
                thing = 'The D-Bus property'
            else:
                print_error('Cannot handle object "{}"'.format(obj))
            f.write(self.docbook_gen.expand(
                    '%*s *\n'
                    '%*s * Deprecated: %s has been deprecated.\n'
                    %(indent, '', indent, '', thing), False))
        f.write('%*s */\n'%(indent, ''))

    # ---------------------------------------------------------------------------------------------------

    def generate_interface_intro(self, i):
        self.outfile.write('/* ------------------------------------------------------------------------\n'
                           ' * Code for interface %s\n'
                           ' * ------------------------------------------------------------------------\n'
                           ' */\n'
                           '\n'%(i.name))

        self.outfile.write(self.docbook_gen.expand(
                '/**\n'
                ' * SECTION:%s\n'
                ' * @title: %s\n'
                ' * @short_description: Generated C code for the %s D-Bus interface\n'
                ' *\n'
                ' * This section contains code for working with the #%s D-Bus interface in C.\n'
                ' */\n'
                %(i.camel_name, i.camel_name, i.name, i.name), False))
        self.outfile.write('\n')

    def generate(self):
        self.generate_body_preamble()
        for i in self.ifaces:
            self.generate_interface_intro(i)
            self.generate_introspection_for_interface(i)
            self.generate_interface(i)
            self.generate_property_accessors(i)
            self.generate_signal_emitters(i)
            self.generate_method_calls(i)
            self.generate_method_completers(i)
            self.generate_proxy(i)
            self.generate_skeleton(i)
        if self.generate_objmanager:
            self.generate_object()
            self.generate_object_manager_client()
