Merge 2.55.2 into tizen
authorAdrian Szyndela <adrian.s@samsung.com>
Fri, 17 Jan 2020 11:42:04 +0000 (12:42 +0100)
committerAdrian Szyndela <adrian.s@samsung.com>
Tue, 28 Jan 2020 12:22:21 +0000 (13:22 +0100)
Change-Id: I8e4b6ea831dc08217caf040ac620e9b9448e5643

17 files changed:
1  2 
NEWS
configure.ac
docs/reference/glib/glib-sections.txt
gio/Makefile.am
gio/gdbus-2.0/codegen/codegen.py
gio/gdbusaddress.c
gio/gdbusconnection.c
gio/gdbusconnection.h
gio/gdbusmessage.c
gio/gdbusmethodinvocation.c
gio/gdbusproxy.c
gio/gfile.c
gio/gioenums.h
glib/gbytes.c
glib/gmessages.h
glib/gvariant.c
glib/tests/bytes.c

diff --cc NEWS
Simple merge
diff --cc configure.ac
Simple merge
Simple merge
diff --cc gio/Makefile.am
Simple merge
@@@ -1003,16 -1029,16 +1029,16 @@@ class CodeGenerator
                      ' *\n'
                      ' * Returns: The last property id.\n'
                      %(i.name_lower, i.camel_name), False))
-             self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0)
-             self.c.write('guint\n'
-                          '%s_override_properties (GObjectClass *klass G_GNUC_UNUSED, guint property_id_begin)\n'
-                          '{\n'%(i.name_lower))
+             self.write_gtkdoc_deprecated_and_since_and_close(i, self.outfile, 0)
+             self.outfile.write('guint\n'
 -                               '%s_override_properties (GObjectClass *klass, guint property_id_begin)\n'
++                               '%s_override_properties (GObjectClass *klass G_GNUC_UNUSED, guint property_id_begin)\n'
+                                '{\n'%(i.name_lower))
              for p in i.properties:
-                 self.c.write ('  g_object_class_override_property (klass, property_id_begin++, "%s");\n'%(p.name_hyphen))
-             self.c.write('  return property_id_begin - 1;\n'
-                          '}\n'
-                          '\n')
-             self.c.write('\n')
+                 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')
  
      # ----------------------------------------------------------------------------------------------------
  
                      ' *\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.c, 0)
-             self.c.write('void\n'
-                          '%s_complete_%s (\n'
-                          '    %s *object G_GNUC_UNUSED,\n'
-                          '    GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name))
+             self.write_gtkdoc_deprecated_and_since_and_close(m, self.outfile, 0)
+             self.outfile.write('void\n'
+                                '%s_complete_%s (\n'
 -                               '    %s *object,\n'
++                               '    %s *object G_GNUC_UNUSED,\n'
+                                '    GDBusMethodInvocation *invocation'%(i.name_lower, m.name_lower, i.camel_name))
              if unix_fd:
-                 self.c.write(',\n    GUnixFDList *fd_list')
+                 self.outfile.write(',\n    GUnixFDList *fd_list')
              for a in m.out_args:
-                 self.c.write(',\n    %s%s'%(a.ctype_in, a.name))
-             self.c.write(')\n'
-                          '{\n')
+                 self.outfile.write(',\n    %s%s'%(a.ctype_in, a.name))
+             self.outfile.write(')\n'
+                                '{\n')
  
              if unix_fd:
-                 self.c.write('  g_dbus_method_invocation_return_value_with_unix_fd_list (invocation,\n'
-                              '    g_variant_new ("(')
+                 self.outfile.write('  g_dbus_method_invocation_return_value_with_unix_fd_list (invocation,\n'
+                                    '    g_variant_new ("(')
              else:
-                 self.c.write('  g_dbus_method_invocation_return_value (invocation,\n'
-                              '    g_variant_new ("(')
+                 self.outfile.write('  g_dbus_method_invocation_return_value (invocation,\n'
+                                    '    g_variant_new ("(')
              for a in m.out_args:
-                 self.c.write('%s'%(a.format_in))
-             self.c.write(')"')
+                 self.outfile.write('%s'%(a.format_in))
+             self.outfile.write(')"')
              for a in m.out_args:
-                 self.c.write(',\n                   %s'%(a.name))
+                 self.outfile.write(',\n                   %s'%(a.name))
              if unix_fd:
-                 self.c.write('),\n    fd_list);\n')
+                 self.outfile.write('),\n    fd_list);\n')
              else:
-                 self.c.write('));\n')
-             self.c.write('}\n'
-                          '\n')
+                 self.outfile.write('));\n')
+             self.outfile.write('}\n'
+                                '\n')
  
      # ---------------------------------------------------------------------------------------------------
  
          # Note that we are guaranteed that prop_id starts at 1 and is
          # laid out in the same order as introspection data pointers
          #
-         self.c.write('static void\n'
-                      '%s_proxy_get_property (GObject      *object G_GNUC_UNUSED,\n'
-                      '  guint         prop_id G_GNUC_UNUSED,\n'
-                      '  GValue       *value G_GNUC_UNUSED,\n'
-                      '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
-                      '{\n'%(i.name_lower))
+         self.outfile.write('static void\n'
 -                           '%s_proxy_get_property (GObject      *object,\n'
 -                           '  guint         prop_id,\n'
 -                           '  GValue       *value,\n'
++                           '%s_proxy_get_property (GObject      *object G_GNUC_UNUSED,\n'
++                           '  guint         prop_id G_GNUC_UNUSED,\n'
++                           '  GValue       *value G_GNUC_UNUSED,\n'
+                            '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
+                            '{\n'%(i.name_lower))
          if len(i.properties) > 0:
-             self.c.write('  const _ExtendedGDBusPropertyInfo *info;\n'
-                          '  GVariant *variant;\n'
-                          '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
-                          '  info = _%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.c.write('}\n'
-                      '\n')
+             self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
+                                '  GVariant *variant;\n'
+                                '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
+                                '  info = _%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.c.write('static void\n'
-                          '%s_proxy_set_property_cb (GDBusProxy *proxy,\n'
-                          '  GAsyncResult *res,\n'
-                          '  gpointer      user_data)\n'
-                          '{\n'%(i.name_lower))
-             self.c.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.c.write('}\n'
-                          '\n')
-         self.c.write('static void\n'
-                      '%s_proxy_set_property (GObject      *object G_GNUC_UNUSED,\n'
-                      '  guint         prop_id G_GNUC_UNUSED,\n'
-                      '  const GValue *value G_GNUC_UNUSED,\n'
-                      '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
-                      '{\n'%(i.name_lower))
+             self.outfile.write('static void\n'
+                                '%s_proxy_set_property_cb (GDBusProxy *proxy,\n'
+                                '  GAsyncResult *res,\n'
+                                '  gpointer      user_data)\n'
+                                '{\n'%(i.name_lower))
+             self.outfile.write('  const _ExtendedGDBusPropertyInfo *info = user_data;\n'
+                                '  GError *error;\n'
+                                '  GVariant *_ret;\n'
+                                '  error = NULL;\n'
+                                '  _ret = g_dbus_proxy_call_finish (proxy, res, &error);\n'
+                                '  if (!_ret)\n'
+                                '    {\n'
+                                '      g_warning ("Error setting property \'%%s\' on interface %s: %%s (%%s, %%d)",\n'
+                                '                 info->parent_struct.name, \n'
+                                '                 error->message, g_quark_to_string (error->domain), error->code);\n'
+                                '      g_error_free (error);\n'
+                                '    }\n'
+                                '  else\n'
+                                '    {\n'
+                                '      g_variant_unref (_ret);\n'
+                                '    }\n'
+                                %(i.name))
+             self.outfile.write('}\n'
+                                '\n')
+         self.outfile.write('static void\n'
 -                           '%s_proxy_set_property (GObject      *object,\n'
 -                           '  guint         prop_id,\n'
 -                           '  const GValue *value,\n'
++                           '%s_proxy_set_property (GObject      *object G_GNUC_UNUSED,\n'
++                           '  guint         prop_id G_GNUC_UNUSED,\n'
++                           '  const GValue *value G_GNUC_UNUSED,\n'
+                            '  GParamSpec   *pspec G_GNUC_UNUSED)\n'
+                            '{\n'%(i.name_lower))
          if len(i.properties) > 0:
-             self.c.write('  const _ExtendedGDBusPropertyInfo *info;\n'
-                          '  GVariant *variant;\n'
-                          '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
-                          '  info = _%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.c.write('}\n'
-                      '\n')
+             self.outfile.write('  const _ExtendedGDBusPropertyInfo *info;\n'
+                                '  GVariant *variant;\n'
+                                '  g_assert (prop_id != 0 && prop_id - 1 < %d);\n'
+                                '  info = _%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.c.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.c.write('  _ExtendedGDBusSignalInfo *info;\n'
-                      '  GVariantIter iter;\n'
-                      '  GVariant *child;\n'
-                      '  GValue *paramv;\n'
-                      '  gsize num_params;\n'
-                      '  gsize n;\n'
-                      '  guint signal_id;\n');
+         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.c.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.c.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.c.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.c.write('  signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n'
-                      %(i.ns_upper, i.name_upper))
-         self.c.write('  g_signal_emitv (paramv, signal_id, 0, NULL);\n')
-         self.c.write('  for (n = 0; n < num_params + 1; n++)\n'
-                      '    g_value_unset (&paramv[n]);\n'
-                      '  g_free (paramv);\n')
-         self.c.write('}\n'
-                      '\n')
+         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.c.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))
+         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.c.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))
+         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:
                  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.c.write('      value = %s (variant%s);\n'%(p.arg.gvariant_get, extra_len))
+                 self.outfile.write('      value = %s (variant%s);\n'%(p.arg.gvariant_get, extra_len))
                  if free_container:
-                     self.c.write('      g_datalist_set_data_full (&proxy->priv->qdata, \"%s\", (gpointer) value, g_free);\n'
-                                  %(p.name))
-                 self.c.write('      g_variant_unref (variant);\n')
-                 self.c.write('    }\n')
-             self.c.write('  return value;\n')
-             self.c.write('}\n')
-             self.c.write('\n')
+                     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.c.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.c.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))
+         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.c.write('  %s_override_properties (gobject_class, 1);\n\n'%(i.name_lower))
-         self.c.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.c.write('}\n'
-                      '\n')
-         self.c.write('static void\n'
-                      '%s_proxy_iface_init (%sIface *iface G_GNUC_UNUSED)\n'
-                      '{\n'%(i.name_lower, i.camel_name))
+             self.outfile.write('  %s_override_properties (gobject_class, 1);\n\n'%(i.name_lower))
+         self.outfile.write('#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38\n'
+                            '  g_type_class_add_private (klass, sizeof (%sProxyPrivate));\n'
+                            '#endif\n'%(i.camel_name))
+         self.outfile.write('}\n'
+                            '\n')
+         self.outfile.write('static void\n'
 -                           '%s_proxy_iface_init (%sIface *iface)\n'
++                           '%s_proxy_iface_init (%sIface *iface G_GNUC_UNUSED)\n'
+                            '{\n'%(i.name_lower, i.camel_name))
          for p in i.properties:
-             self.c.write('  iface->get_%s = %s_proxy_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower))
-         self.c.write('}\n'
-                      '\n')
+             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.c.write(self.docbook_gen.expand(
+         self.outfile.write(self.docbook_gen.expand(
                  '/**\n'
                  ' * %s_proxy_new:\n'
                  ' * @connection: A #GDBusConnection.\n'
                  ' *\n'
                  ' * Class structure for #%sSkeleton.\n'
                  %(i.camel_name, i.camel_name), False))
-         self.write_gtkdoc_deprecated_and_since_and_close(i, self.c, 0)
-         self.c.write('\n')
-         self.c.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.c.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.c.write('  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);\n'
-                      '  g_assert (info != NULL);\n'
-                      %())
-         self.c.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.c.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.c.write('  signal_id = g_signal_lookup (info->signal_name, %sTYPE_%s);\n'
-                      %(i.ns_upper, i.name_upper))
-         self.c.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.c.write('  for (n = 0; n < num_params + num_extra; n++)\n'
-                      '    g_value_unset (&paramv[n]);\n'
-                      '  g_free (paramv);\n')
-         self.c.write('}\n'
-                      '\n')
-         self.c.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.c.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.c.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.c.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.c.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.c.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.c.write('}\n'
-                      '\n')
-         self.c.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.c.write('}\n'
-                      '\n')
-         self.c.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.c.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))
+         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.c.write('static gboolean _%s_emit_changed (gpointer user_data);\n'
-                          '\n'
-                          %(i.name_lower))
-         self.c.write('static void\n'
-                      '%s_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton G_GNUC_UNUSED)\n'
-                      '{\n'
-                      %(i.name_lower))
+             self.outfile.write('static gboolean _%s_emit_changed (gpointer user_data);\n'
+                                '\n'
+                                %(i.name_lower))
+         self.outfile.write('static void\n'
 -                           '%s_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)\n'
++                           '%s_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton G_GNUC_UNUSED)\n'
+                            '{\n'
+                            %(i.name_lower))
          if len(i.properties) > 0:
-             self.c.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.c.write('}\n'
-                      '\n')
+             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.c.write('static void\n'
-                          '_%s_on_signal_%s (\n'
-                          '    %s *object'%(i.name_lower, s.name_lower, i.camel_name))
+             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.c.write(',\n    %sarg_%s'%(a.ctype_in, a.name))
-             self.c.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.c.write('\n'
-                          '  signal_variant = g_variant_ref_sink (g_variant_new ("(')
+                 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.c.write('%s'%(a.format_in))
-             self.c.write(')"')
+                 self.outfile.write('%s'%(a.format_in))
+             self.outfile.write(')"')
              for a in s.args:
-                 self.c.write(',\n                   arg_%s'%(a.name))
-             self.c.write('));\n')
-             self.c.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.c.write('  g_variant_unref (signal_variant);\n')
-             self.c.write('  g_list_free_full (connections, g_object_unref);\n')
-             self.c.write('}\n'
-                          '\n')
-         self.c.write('static void %s_skeleton_iface_init (%sIface *iface);\n'
-                      %(i.name_lower, i.camel_name))
-         self.c.write('#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38\n')
-         self.c.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower))
-         self.c.write('                         G_ADD_PRIVATE (%sSkeleton)\n'%(i.camel_name))
-         self.c.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
-         self.c.write('#else\n')
-         self.c.write('G_DEFINE_TYPE_WITH_CODE (%sSkeleton, %s_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,\n'%(i.camel_name, i.name_lower))
-         self.c.write('                         G_IMPLEMENT_INTERFACE (%sTYPE_%s, %s_skeleton_iface_init))\n\n'%(i.ns_upper, i.name_upper, i.name_lower))
-         self.c.write('#endif\n')
+                 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.c.write('static void\n'
-                      '%s_skeleton_finalize (GObject *object)\n'
-                      '{\n'%(i.name_lower))
-         self.c.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
+         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.c.write('  guint n;\n'
-                          '  for (n = 0; n < %d; n++)\n'
-                          '    g_value_unset (&skeleton->priv->properties[n]);\n'%(len(i.properties)))
-             self.c.write('  g_free (skeleton->priv->properties);\n')
-         self.c.write('  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);\n')
-         self.c.write('  if (skeleton->priv->changed_properties_idle_source != NULL)\n')
-         self.c.write('    g_source_destroy (skeleton->priv->changed_properties_idle_source);\n')
-         self.c.write('  g_main_context_unref (skeleton->priv->context);\n')
-         self.c.write('  g_mutex_clear (&skeleton->priv->lock);\n')
-         self.c.write('  G_OBJECT_CLASS (%s_skeleton_parent_class)->finalize (object);\n'
-                      '}\n'
-                      '\n'%(i.name_lower))
+             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:
          # property vfuncs
          n = 0
          for p in i.properties:
-             self.c.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.c.write('  %sSkeleton *skeleton = %s%s_SKELETON (object);\n'%(i.camel_name, i.ns_upper, i.name_upper))
-             self.c.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.c.write('  return value;\n')
-             self.c.write('}\n')
-             self.c.write('\n')
+             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.c.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))
+         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.c.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.c.write('\n'
-                          '  %s_override_properties (gobject_class, 1);\n'%(i.name_lower))
-         self.c.write('\n'
-                      '  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);\n');
-         self.c.write('  skeleton_class->get_info = %s_skeleton_dbus_interface_get_info;\n'%(i.name_lower))
-         self.c.write('  skeleton_class->get_properties = %s_skeleton_dbus_interface_get_properties;\n'%(i.name_lower))
-         self.c.write('  skeleton_class->flush = %s_skeleton_dbus_interface_flush;\n'%(i.name_lower))
-         self.c.write('  skeleton_class->get_vtable = %s_skeleton_dbus_interface_get_vtable;\n'%(i.name_lower))
-         self.c.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.c.write('}\n'
-                      '\n')
-         self.c.write('static void\n'
-                      '%s_skeleton_iface_init (%sIface *iface G_GNUC_UNUSED)\n'
-                      '{\n'
-                      %(i.name_lower, i.camel_name))
+             self.outfile.write('  gobject_class->get_property = %s_skeleton_get_property;\n'
+                                '  gobject_class->set_property = %s_skeleton_set_property;\n'
+                                '  gobject_class->notify       = %s_skeleton_notify;\n'
+                                '\n'%(i.name_lower, i.name_lower, i.name_lower))
+             self.outfile.write('\n'
+                                '  %s_override_properties (gobject_class, 1);\n'%(i.name_lower))
+         self.outfile.write('\n'
+                            '  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);\n');
+         self.outfile.write('  skeleton_class->get_info = %s_skeleton_dbus_interface_get_info;\n'%(i.name_lower))
+         self.outfile.write('  skeleton_class->get_properties = %s_skeleton_dbus_interface_get_properties;\n'%(i.name_lower))
+         self.outfile.write('  skeleton_class->flush = %s_skeleton_dbus_interface_flush;\n'%(i.name_lower))
+         self.outfile.write('  skeleton_class->get_vtable = %s_skeleton_dbus_interface_get_vtable;\n'%(i.name_lower))
+         self.outfile.write('\n'
+                            '#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38\n'
+                            '  g_type_class_add_private (klass, sizeof (%sSkeletonPrivate));\n'
+                            '#endif\n'%(i.camel_name))
+         self.outfile.write('}\n'
+                            '\n')
+         self.outfile.write('static void\n'
 -                           '%s_skeleton_iface_init (%sIface *iface)\n'
++                           '%s_skeleton_iface_init (%sIface *iface G_GNUC_UNUSED)\n'
+                            '{\n'
+                            %(i.name_lower, i.camel_name))
          for s in i.signals:
-             self.c.write('  iface->%s = _%s_on_signal_%s;\n'
-                          %(s.name_lower, i.name_lower, s.name_lower))
+             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.c.write('  iface->get_%s = %s_skeleton_get_%s;\n'%(p.name_lower, i.name_lower, p.name_lower))
-         self.c.write('}\n'
-                      '\n')
+             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.c.write(self.docbook_gen.expand(
+         self.outfile.write(self.docbook_gen.expand(
                  '/**\n'
                  ' * %s_skeleton_new:\n'
                  ' *\n'
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc gio/gfile.c
Simple merge
diff --cc gio/gioenums.h
Simple merge
diff --cc glib/gbytes.c
   * Since: 2.32
   **/
  
+ /* Keep in sync with glib/tests/bytes.c */
  struct _GBytes
  {
 -  gconstpointer data;  /* may be NULL iff (size == 0) */
 -  gsize size;  /* may be 0 */
 -  gint ref_count;
 -  GDestroyNotify free_func;
 -  gpointer user_data;
 +  gsize size;
 +  gint  ref_count;
 +  gint  type_or_fd;
  };
  
 +typedef struct
 +{
 +  GBytes bytes;
 +#if GLIB_SIZEOF_SIZE_T == 4
 +  guint pad;
 +#endif
 +
 +  guchar data[1];
 +} GBytesInline;
 +
 +/* important: the ->data field of GBytesInline should always be 'nicely
 + * aligned'.
 + */
 +G_STATIC_ASSERT (G_STRUCT_OFFSET (GBytesInline, data) % (2 * sizeof (gpointer)) == 0);
 +G_STATIC_ASSERT (G_STRUCT_OFFSET (GBytesInline, data) % 8 == 0);
 +
 +
 +typedef struct
 +{
 +  GBytes   bytes;
 +
 +  gpointer data;
 +} GBytesData;
 +
 +typedef struct
 +{
 +  GBytesData     data_bytes;
 +
 +  GDestroyNotify notify;
 +  gpointer       user_data;
 +} GBytesNotify;
 +
 +#define G_BYTES_TYPE_INLINE        (-1)
 +#define G_BYTES_TYPE_STATIC        (-2)
 +#define G_BYTES_TYPE_FREE          (-3)
 +#define G_BYTES_TYPE_NOTIFY        (-4)
 +
 +/* All bytes are either inline or subtypes of GBytesData */
 +#define G_BYTES_IS_INLINE(bytes)   ((bytes)->type_or_fd == G_BYTES_TYPE_INLINE)
 +#define G_BYTES_IS_DATA(bytes)     (!G_BYTES_IS_INLINE(bytes))
 +
 +/* More specific subtypes of GBytesData */
 +#define G_BYTES_IS_STATIC(bytes)   ((bytes)->type_or_fd == G_BYTES_TYPE_STATIC)
 +#define G_BYTES_IS_FREE(bytes)     ((bytes)->type_or_fd == G_BYTES_TYPE_FREE)
 +#define G_BYTES_IS_NOTIFY(bytes)   ((bytes)->type_or_fd == G_BYTES_TYPE_NOTIFY)
 +
 +/* we have a memfd if type_or_fd >= 0 */
 +#define G_BYTES_IS_MEMFD(bytes)    ((bytes)->type_or_fd >= 0)
 +
 +static gpointer
 +g_bytes_allocate (guint struct_size,
 +                  guint type_or_fd,
 +                  gsize data_size)
 +{
 +  GBytes *bytes;
 +
 +  bytes = g_slice_alloc (struct_size);
 +  bytes->size = data_size;
 +  bytes->ref_count = 1;
 +  bytes->type_or_fd = type_or_fd;
 +
 +  return bytes;
 +}
 +
  /**
   * g_bytes_new:
   * @data: (transfer none) (array length=size) (element-type guint8) (nullable):
@@@ -356,12 -219,31 +363,33 @@@ g_bytes_new_from_bytes (GBytes  *bytes
                          gsize    offset,
                          gsize    length)
  {
+   gchar *base;
++  gchar *data;
    /* Note that length may be 0. */
    g_return_val_if_fail (bytes != NULL, NULL);
    g_return_val_if_fail (offset <= bytes->size, NULL);
    g_return_val_if_fail (offset + length <= bytes->size, NULL);
  
-   return g_bytes_new_with_free_func ((gchar *) g_bytes_get_data (bytes, NULL) + offset, length,
+   /* Avoid an extra GBytes if all bytes were requested */
+   if (offset == 0 && length == bytes->size)
+     return g_bytes_ref (bytes);
 -  base = (gchar *)bytes->data + offset;
++  base = (gchar *)g_bytes_get_data (bytes, NULL) + offset;
+   /* Avoid referencing intermediate GBytes. In practice, this should
+    * only loop once.
+    */
 -  while (bytes->free_func == (gpointer)g_bytes_unref)
 -    bytes = bytes->user_data;
++  while (((GBytesNotify*)bytes)->notify == (gpointer)g_bytes_unref)
++    bytes = ((GBytesNotify*)bytes)->user_data;
++  data = (gchar *)g_bytes_get_data (bytes, NULL);
+   g_return_val_if_fail (bytes != NULL, NULL);
 -  g_return_val_if_fail (base >= (gchar *)bytes->data, NULL);
 -  g_return_val_if_fail (base <= (gchar *)bytes->data + bytes->size, NULL);
 -  g_return_val_if_fail (base + length <= (gchar *)bytes->data + bytes->size, NULL);
++  g_return_val_if_fail (base >= data, NULL);
++  g_return_val_if_fail (base <= data + bytes->size, NULL);
++  g_return_val_if_fail (base + length <= data + bytes->size, NULL);
+   return g_bytes_new_with_free_func (base, length,
                                       (GDestroyNotify)g_bytes_unref, g_bytes_ref (bytes));
  }
  
Simple merge
diff --cc glib/gvariant.c
Simple merge
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 +#include <errno.h>
 +#include <unistd.h>
  #include "glib.h"
 +#include "glib-unix.h"
 +
 +#include "glib-linux.h"
  
+ /* Keep in sync with glib/gbytes.c */
+ struct _GBytes
+ {
+   gconstpointer data;
+   gsize size;
+   gint ref_count;
+   GDestroyNotify free_func;
+   gpointer user_data;
+ };
  static const gchar *NYAN = "nyannyan";
  static const gsize N_NYAN = 8;