# -*- 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>

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

LICENSE_STR = """/*
 * This file is generated by gdbus-codegen, do not modify it.
 *
 * The license of this code is the same as for the D-Bus interface description
 * it was derived from. Note that it links to GLib, so must comply with the
 * LGPL linking clauses.
 */\n"""


# Disable line length warnings as wrapping the C code templates would be hard
# flake8: noqa: E501


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)


def generate_header_guard(header_name):
    # There might be more characters that are safe to use than these, but lets
    # stay conservative.
    safe_valid_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    return "".join(
        map(lambda c: c if c in safe_valid_chars else "_", header_name.upper())
    )


class HeaderCodeGenerator:
    def __init__(
        self,
        ifaces,
        namespace,
        generate_objmanager,
        generate_autocleanup,
        header_name,
        input_files_basenames,
        use_pragma,
        glib_min_required,
        symbol_decorator,
        symbol_decorator_header,
        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 = generate_header_guard(header_name)
        self.input_files_basenames = input_files_basenames
        self.use_pragma = use_pragma
        self.glib_min_required = glib_min_required
        self.symbol_decorator = symbol_decorator
        self.symbol_decorator_header = symbol_decorator_header
        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))

        if self.symbol_decorator_header is not None:
            self.outfile.write("\n")
            self.outfile.write('#include "%s"\n' % self.symbol_decorator_header)

        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:
                    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 m.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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            self.outfile.write(
                "GType %s_get_type (void) G_GNUC_CONST;\n" % (i.name_lower)
            )
            self.outfile.write("\n")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            self.outfile.write(
                "GDBusInterfaceInfo *%s_interface_info (void);\n" % (i.name_lower)
            )
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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:
                    if self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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 m.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 self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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:
                    # async begin
                    if self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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 self.glib_min_required >= (2, 64):
                        self.outfile.write(
                            ",\n    GDBusCallFlags call_flags"
                            ",\n    gint timeout_msec"
                        )
                    if m.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 self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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 m.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 self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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 self.glib_min_required >= (2, 64):
                        self.outfile.write(
                            ",\n    GDBusCallFlags call_flags"
                            ",\n    gint timeout_msec"
                        )
                    if m.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 m.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 self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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 is not None:
                        if self.symbol_decorator is not None:
                            self.outfile.write("%s\n" % self.symbol_decorator)
                        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 self.symbol_decorator is not None:
                        self.outfile.write("%s\n" % self.symbol_decorator)
                    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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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 self.symbol_decorator is not None:
                    self.outfile.write("%s\n" % self.symbol_decorator)
                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 self.symbol_decorator is not None:
                    self.outfile.write("%s\n" % self.symbol_decorator)
                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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            self.outfile.write(
                "%sObjectSkeleton *%sobject_skeleton_new (const gchar *object_path);\n"
                % (self.namespace, self.ns_lower)
            )
            for i in self.ifaces:
                if self.symbol_decorator is not None:
                    self.outfile.write("%s\n" % self.symbol_decorator)
                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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            self.outfile.write(
                "GType %sobject_manager_client_get_type (void) G_GNUC_CONST;\n"
                % (self.ns_lower)
            )
            self.outfile.write("\n")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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)
            )
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            self.outfile.write(
                "GDBusObjectManager *%sobject_manager_client_new_finish (\n"
                "    GAsyncResult        *res,\n"
                "    GError             **error);\n" % (self.ns_lower)
            )
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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")
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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)
            )
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            self.outfile.write(
                "GDBusObjectManager *%sobject_manager_client_new_for_bus_finish (\n"
                "    GAsyncResult        *res,\n"
                "    GError             **error);\n" % (self.ns_lower)
            )
            if self.symbol_decorator is not None:
                self.outfile.write("%s\n" % self.symbol_decorator)
            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,
        glib_min_required,
        symbol_decorator,
        symbol_decorator_header,
        outfile,
    ):
        self.ifaces = ifaces
        self.namespace, self.ns_upper, self.ns_lower = generate_namespace(namespace)
        self.header_guard = generate_header_guard(header_name)
        self.input_files_basenames = input_files_basenames
        self.use_pragma = use_pragma
        self.glib_min_required = glib_min_required
        self.symbol_decorator = symbol_decorator
        if self.symbol_decorator is None:
            self.symbol_decorator = ""
        self.symbol_decorator_header = symbol_decorator_header
        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))

        if self.symbol_decorator_header is not None:
            self.outfile.write("\n")
            self.outfile.write('#include "%s"\n' % self.symbol_decorator_header)

        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 %s const GDBusInterfaceInfo %s_interface;\n"
                % (self.symbol_decorator, 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,
        glib_min_required,
        symbol_decoration_define,
        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.glib_min_required = glib_min_required
        self.symbol_decoration_define = symbol_decoration_define
        self.outfile = outfile

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

    def generate_body_preamble(self):
        basenames = ", ".join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))

        if self.symbol_decoration_define is not None:
            self.outfile.write("\n")
            self.outfile.write("#define %s\n" % self.symbol_decoration_define)

        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,
        glib_min_required,
        symbol_decoration_define,
        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.glib_min_required = glib_min_required
        self.symbol_decoration_define = symbol_decoration_define
        self.outfile = outfile

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

    def generate_body_preamble(self):
        basenames = ", ".join(self.input_files_basenames)
        self.outfile.write(LICENSE_STR.format(config.VERSION, basenames))
        if self.symbol_decoration_define is not None:
            self.outfile.write("\n")
            self.outfile.write("#define %s\n" % self.symbol_decoration_define)
        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:
                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 m.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" % (i.name_lower)
        )
        if len(i.properties) == 0:
            self.outfile.write(" G_GNUC_UNUSED")
        self.outfile.write(", guint property_id_begin)\n" "{\n")
        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" % (i.name_lower, i.camel_name)
        )
        if len(i.methods) == 0 and len(i.signals) == 0 and len(i.properties) == 0:
            self.outfile.write(" G_GNUC_UNUSED)\n")
        else:
            self.outfile.write(")\n")
        self.outfile.write("{\n")
        if len(i.methods) > 0:
            self.outfile.write(
                "  /* GObject signals for incoming D-Bus method calls: */\n"
            )
            for m in i.methods:
                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 m.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: %%G_DBUS_METHOD_INVOCATION_HANDLED or %%TRUE if the invocation was handled, %%G_DBUS_METHOD_INVOCATION_UNHANDLED or %%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 m.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 m.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 is not None:
                self.outfile.write(
                    " * 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.\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 is not 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:
            # 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 self.glib_min_required >= (2, 64):
                self.outfile.write(
                    " * @call_flags: Flags from the #GDBusCallFlags enumeration. If you want to allow interactive\n"
                    "       authorization be sure to set %G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION.\n"
                    ' * @timeout_msec: The timeout in milliseconds (with %G_MAXINT meaning "infinite") or\n'
                    "       -1 to use the proxy default timeout.\n"
                )
            if m.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 thread-default main loop of the thread you are calling this method from (see g_main_context_push_thread_default()).\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 self.glib_min_required >= (2, 64):
                self.outfile.write(
                    ",\n    GDBusCallFlags call_flags" ",\n    gint timeout_msec"
                )
            if m.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 m.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")
            if self.glib_min_required >= (2, 64):
                self.outfile.write("    call_flags,\n" "    timeout_msec,\n")
            else:
                self.outfile.write("    G_DBUS_CALL_FLAGS_NONE,\n" "    -1,\n")
            if m.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 m.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 succeeded, %%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 m.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 m.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 self.glib_min_required >= (2, 64):
                self.outfile.write(
                    " * @call_flags: Flags from the #GDBusCallFlags enumeration. If you want to allow interactive\n"
                    "       authorization be sure to set %G_DBUS_CALL_FLAGS_ALLOW_INTERACTIVE_AUTHORIZATION.\n"
                    ' * @timeout_msec: The timeout in milliseconds (with %G_MAXINT meaning "infinite") or\n'
                    "       -1 to use the proxy default timeout.\n"
                )
            if m.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 m.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 succeeded, %%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 self.glib_min_required >= (2, 64):
                self.outfile.write(
                    ",\n    GDBusCallFlags call_flags" ",\n    gint timeout_msec"
                )
            if m.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 m.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 m.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")
            if self.glib_min_required >= (2, 64):
                self.outfile.write("    call_flags,\n" "    timeout_msec,\n")
            else:
                self.outfile.write("    G_DBUS_CALL_FLAGS_NONE,\n" "    -1,\n")
            if m.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:
            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 m.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 G_GNUC_UNUSED,\n"
                "    GDBusMethodInvocation *invocation"
                % (i.name_lower, m.name_lower, i.camel_name)
            )
            if m.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 m.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 m.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" % (i.name_lower)
        )
        if len(i.properties) == 0:
            self.outfile.write(
                " G_GNUC_UNUSED,\n"
                "  guint         prop_id G_GNUC_UNUSED,\n"
                "  GValue       *value G_GNUC_UNUSED,\n"
            )
        else:
            self.outfile.write(
                ",\n" "  guint         prop_id,\n" "  GValue       *value,\n"
            )
        self.outfile.write("  GParamSpec   *pspec G_GNUC_UNUSED)\n" "{\n")
        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 (" % (i.name_lower))
        if len(i.properties) == 0:
            self.outfile.write(
                "GObject      *object G_GNUC_UNUSED,\n"
                "  guint         prop_id G_GNUC_UNUSED,\n"
                "  const GValue *value G_GNUC_UNUSED,\n"
            )
        else:
            self.outfile.write(
                "GObject      *object,\n"
                "  guint         prop_id,\n"
                "  const GValue *value,\n"
            )
        self.outfile.write("  GParamSpec   *pspec G_GNUC_UNUSED)\n" "{\n")
        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 is not 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" % (i.name_lower, i.camel_name)
        )
        if len(i.properties) == 0:
            self.outfile.write(" G_GNUC_UNUSED)\n")
        else:
            self.outfile.write(")\n")
        self.outfile.write("{\n")
        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 thread-default main loop of the thread you are calling this method from (see g_main_context_push_thread_default()).\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 thread-default main loop of the thread you are calling this method from (see g_main_context_push_thread_default()).\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"
            % (i.name_lower)
        )
        if len(i.properties) == 0:
            self.outfile.write(" G_GNUC_UNUSED)\n")
        else:
            self.outfile.write(")\n")
        self.outfile.write("{\n")
        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" % (i.name_lower, i.camel_name)
        )
        if len(i.signals) == 0 and len(i.properties) == 0:
            self.outfile.write(" G_GNUC_UNUSED)\n")
        else:
            self.outfile.write(")\n")
        self.outfile.write("{\n")
        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"
                    " * 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.\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 thread-default main loop of the thread you are calling this method from (see g_main_context_push_thread_default()).\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 thread-default main loop of the thread you are calling this method from (see g_main_context_push_thread_default()).\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()
