/*
 * Generated by gdbus-codegen 2.40.2. DO NOT EDIT.
 *
 * The license of this code is the same as for the source it was derived from.
 */

#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include "interfaces/fru.h"

#include <string.h>
#ifdef G_OS_UNIX
#  include <gio/gunixfdlist.h>
#endif

typedef struct
{
  GDBusArgInfo parent_struct;
  gboolean use_gvariant;
} _ExtendedGDBusArgInfo;

typedef struct
{
  GDBusMethodInfo parent_struct;
  const gchar *signal_name;
  gboolean pass_fdlist;
} _ExtendedGDBusMethodInfo;

typedef struct
{
  GDBusSignalInfo parent_struct;
  const gchar *signal_name;
} _ExtendedGDBusSignalInfo;

typedef struct
{
  GDBusPropertyInfo parent_struct;
  const gchar *hyphen_name;
  gboolean use_gvariant;
} _ExtendedGDBusPropertyInfo;

typedef struct
{
  GDBusInterfaceInfo parent_struct;
  const gchar *hyphen_name;
} _ExtendedGDBusInterfaceInfo;

typedef struct
{
  const _ExtendedGDBusPropertyInfo *info;
  guint prop_id;
  GValue orig_value; /* the value before the change */
} ChangedProperty;

static void
_changed_property_free (ChangedProperty *data)
{
  g_value_unset (&data->orig_value);
  g_free (data);
}

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

static gboolean
_g_variant_equal0 (GVariant *a, GVariant *b)
{
  gboolean ret = FALSE;
  if (a == NULL && b == NULL)
    {
      ret = TRUE;
      goto out;
    }
  if (a == NULL || b == NULL)
    goto out;
  ret = g_variant_equal (a, b);
out:
  return ret;
}

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

/* ------------------------------------------------------------------------
 * Code for interface org.openbmc.Fru
 * ------------------------------------------------------------------------
 */

/**
 * SECTION:Fru
 * @title: Fru
 * @short_description: Generated C code for the org.openbmc.Fru D-Bus interface
 *
 * This section contains code for working with the <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link> D-Bus interface in C.
 */

/* ---- Introspection data for org.openbmc.Fru ---- */

static const _ExtendedGDBusSignalInfo _fru_signal_info_state_changed =
{
  {
    -1,
    (gchar *) "StateChanged",
    NULL,
    NULL
  },
  "state-changed"
};

static const _ExtendedGDBusSignalInfo _fru_signal_info_unrecoverable_error =
{
  {
    -1,
    (gchar *) "UnrecoverableError",
    NULL,
    NULL
  },
  "unrecoverable-error"
};

static const _ExtendedGDBusSignalInfo _fru_signal_info_recoverable_error =
{
  {
    -1,
    (gchar *) "RecoverableError",
    NULL,
    NULL
  },
  "recoverable-error"
};

static const _ExtendedGDBusSignalInfo * const _fru_signal_info_pointers[] =
{
  &_fru_signal_info_state_changed,
  &_fru_signal_info_unrecoverable_error,
  &_fru_signal_info_recoverable_error,
  NULL
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_label =
{
  {
    -1,
    (gchar *) "label",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "label",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_location =
{
  {
    -1,
    (gchar *) "location",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "location",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_state =
{
  {
    -1,
    (gchar *) "state",
    (gchar *) "y",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "state",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_manufacturer =
{
  {
    -1,
    (gchar *) "manufacturer",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "manufacturer",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_part_num =
{
  {
    -1,
    (gchar *) "part_num",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "part-num",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_serial_num =
{
  {
    -1,
    (gchar *) "serial_num",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "serial-num",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_date_code =
{
  {
    -1,
    (gchar *) "date_code",
    (gchar *) "u",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "date-code",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_version =
{
  {
    -1,
    (gchar *) "version",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "version",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_type_ =
{
  {
    -1,
    (gchar *) "type",
    (gchar *) "y",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "type",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_subtype =
{
  {
    -1,
    (gchar *) "subtype",
    (gchar *) "y",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "subtype",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_property_info_instance_num =
{
  {
    -1,
    (gchar *) "instance_num",
    (gchar *) "y",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "instance-num",
  FALSE
};

static const _ExtendedGDBusPropertyInfo * const _fru_property_info_pointers[] =
{
  &_fru_property_info_label,
  &_fru_property_info_location,
  &_fru_property_info_state,
  &_fru_property_info_manufacturer,
  &_fru_property_info_part_num,
  &_fru_property_info_serial_num,
  &_fru_property_info_date_code,
  &_fru_property_info_version,
  &_fru_property_info_type_,
  &_fru_property_info_subtype,
  &_fru_property_info_instance_num,
  NULL
};

static const _ExtendedGDBusInterfaceInfo _fru_interface_info =
{
  {
    -1,
    (gchar *) "org.openbmc.Fru",
    NULL,
    (GDBusSignalInfo **) &_fru_signal_info_pointers,
    (GDBusPropertyInfo **) &_fru_property_info_pointers,
    NULL
  },
  "fru",
};


/**
 * fru_interface_info:
 *
 * Gets a machine-readable description of the <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link> D-Bus interface.
 *
 * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
 */
GDBusInterfaceInfo *
fru_interface_info (void)
{
  return (GDBusInterfaceInfo *) &_fru_interface_info.parent_struct;
}

/**
 * fru_override_properties:
 * @klass: The class structure for a #GObject<!-- -->-derived class.
 * @property_id_begin: The property id to assign to the first overridden property.
 *
 * Overrides all #GObject properties in the #Fru interface for a concrete class.
 * The properties are overridden in the order they are defined.
 *
 * Returns: The last property id.
 */
guint
fru_override_properties (GObjectClass *klass, guint property_id_begin)
{
  g_object_class_override_property (klass, property_id_begin++, "label");
  g_object_class_override_property (klass, property_id_begin++, "location");
  g_object_class_override_property (klass, property_id_begin++, "state");
  g_object_class_override_property (klass, property_id_begin++, "manufacturer");
  g_object_class_override_property (klass, property_id_begin++, "part-num");
  g_object_class_override_property (klass, property_id_begin++, "serial-num");
  g_object_class_override_property (klass, property_id_begin++, "date-code");
  g_object_class_override_property (klass, property_id_begin++, "version");
  g_object_class_override_property (klass, property_id_begin++, "type");
  g_object_class_override_property (klass, property_id_begin++, "subtype");
  g_object_class_override_property (klass, property_id_begin++, "instance-num");
  return property_id_begin - 1;
}



/**
 * Fru:
 *
 * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link>.
 */

/**
 * FruIface:
 * @parent_iface: The parent interface.
 * @get_date_code: Getter for the #Fru:date-code property.
 * @get_instance_num: Getter for the #Fru:instance-num property.
 * @get_label: Getter for the #Fru:label property.
 * @get_location: Getter for the #Fru:location property.
 * @get_manufacturer: Getter for the #Fru:manufacturer property.
 * @get_part_num: Getter for the #Fru:part-num property.
 * @get_serial_num: Getter for the #Fru:serial-num property.
 * @get_state: Getter for the #Fru:state property.
 * @get_subtype: Getter for the #Fru:subtype property.
 * @get_type_: Getter for the #Fru:type property.
 * @get_version: Getter for the #Fru:version property.
 * @recoverable_error: Handler for the #Fru::recoverable-error signal.
 * @state_changed: Handler for the #Fru::state-changed signal.
 * @unrecoverable_error: Handler for the #Fru::unrecoverable-error signal.
 *
 * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link>.
 */

typedef FruIface FruInterface;
G_DEFINE_INTERFACE (Fru, fru, G_TYPE_OBJECT);

static void
fru_default_init (FruIface *iface)
{
  /* GObject signals for received D-Bus signals: */
  /**
   * Fru::state-changed:
   * @object: A #Fru.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru.StateChanged">"StateChanged"</link> is received.
   *
   * 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.
   */
  g_signal_new ("state-changed",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruIface, state_changed),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    0);

  /**
   * Fru::unrecoverable-error:
   * @object: A #Fru.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru.UnrecoverableError">"UnrecoverableError"</link> is received.
   *
   * 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.
   */
  g_signal_new ("unrecoverable-error",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruIface, unrecoverable_error),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    0);

  /**
   * Fru::recoverable-error:
   * @object: A #Fru.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru.RecoverableError">"RecoverableError"</link> is received.
   *
   * 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.
   */
  g_signal_new ("recoverable-error",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruIface, recoverable_error),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    0);

  /* GObject properties for D-Bus properties: */
  /**
   * Fru:label:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.label">"label"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_string ("label", "label", "label", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:location:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.location">"location"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_string ("location", "location", "location", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:state:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.state">"state"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_uchar ("state", "state", "state", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:manufacturer:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.manufacturer">"manufacturer"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_string ("manufacturer", "manufacturer", "manufacturer", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:part-num:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.part_num">"part_num"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_string ("part-num", "part_num", "part_num", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:serial-num:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.serial_num">"serial_num"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_string ("serial-num", "serial_num", "serial_num", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:date-code:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.date_code">"date_code"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_uint ("date-code", "date_code", "date_code", 0, G_MAXUINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:version:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.version">"version"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_string ("version", "version", "version", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:type:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.type">"type"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_uchar ("type", "type", "type", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:subtype:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.subtype">"subtype"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_uchar ("subtype", "subtype", "subtype", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * Fru:instance-num:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru.instance_num">"instance_num"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_uchar ("instance-num", "instance_num", "instance_num", 0, 255, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

/**
 * fru_get_label: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.label">"label"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use fru_dup_label() if on another thread.</warning>
 *
 * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
 */
const gchar *
fru_get_label (Fru *object)
{
  return FRU_GET_IFACE (object)->get_label (object);
}

/**
 * fru_dup_label: (skip)
 * @object: A #Fru.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru.label">"label"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
 */
gchar *
fru_dup_label (Fru *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "label", &value, NULL);
  return value;
}

/**
 * fru_set_label: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.label">"label"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_label (Fru *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "label", value, NULL);
}

/**
 * fru_get_location: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.location">"location"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use fru_dup_location() if on another thread.</warning>
 *
 * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
 */
const gchar *
fru_get_location (Fru *object)
{
  return FRU_GET_IFACE (object)->get_location (object);
}

/**
 * fru_dup_location: (skip)
 * @object: A #Fru.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru.location">"location"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
 */
gchar *
fru_dup_location (Fru *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "location", &value, NULL);
  return value;
}

/**
 * fru_set_location: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.location">"location"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_location (Fru *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "location", value, NULL);
}

/**
 * fru_get_state: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.state">"state"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
guchar 
fru_get_state (Fru *object)
{
  return FRU_GET_IFACE (object)->get_state (object);
}

/**
 * fru_set_state: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.state">"state"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_state (Fru *object, guchar value)
{
  g_object_set (G_OBJECT (object), "state", value, NULL);
}

/**
 * fru_get_manufacturer: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.manufacturer">"manufacturer"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use fru_dup_manufacturer() if on another thread.</warning>
 *
 * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
 */
const gchar *
fru_get_manufacturer (Fru *object)
{
  return FRU_GET_IFACE (object)->get_manufacturer (object);
}

/**
 * fru_dup_manufacturer: (skip)
 * @object: A #Fru.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru.manufacturer">"manufacturer"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
 */
gchar *
fru_dup_manufacturer (Fru *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "manufacturer", &value, NULL);
  return value;
}

/**
 * fru_set_manufacturer: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.manufacturer">"manufacturer"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_manufacturer (Fru *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "manufacturer", value, NULL);
}

/**
 * fru_get_part_num: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.part_num">"part_num"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use fru_dup_part_num() if on another thread.</warning>
 *
 * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
 */
const gchar *
fru_get_part_num (Fru *object)
{
  return FRU_GET_IFACE (object)->get_part_num (object);
}

/**
 * fru_dup_part_num: (skip)
 * @object: A #Fru.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru.part_num">"part_num"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
 */
gchar *
fru_dup_part_num (Fru *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "part-num", &value, NULL);
  return value;
}

/**
 * fru_set_part_num: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.part_num">"part_num"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_part_num (Fru *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "part-num", value, NULL);
}

/**
 * fru_get_serial_num: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.serial_num">"serial_num"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use fru_dup_serial_num() if on another thread.</warning>
 *
 * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
 */
const gchar *
fru_get_serial_num (Fru *object)
{
  return FRU_GET_IFACE (object)->get_serial_num (object);
}

/**
 * fru_dup_serial_num: (skip)
 * @object: A #Fru.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru.serial_num">"serial_num"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
 */
gchar *
fru_dup_serial_num (Fru *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "serial-num", &value, NULL);
  return value;
}

/**
 * fru_set_serial_num: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.serial_num">"serial_num"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_serial_num (Fru *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "serial-num", value, NULL);
}

/**
 * fru_get_date_code: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.date_code">"date_code"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
guint 
fru_get_date_code (Fru *object)
{
  return FRU_GET_IFACE (object)->get_date_code (object);
}

/**
 * fru_set_date_code: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.date_code">"date_code"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_date_code (Fru *object, guint value)
{
  g_object_set (G_OBJECT (object), "date-code", value, NULL);
}

/**
 * fru_get_version: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.version">"version"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * <warning>The returned value is only valid until the property changes so on the client-side it is only safe to use this function on the thread where @object was constructed. Use fru_dup_version() if on another thread.</warning>
 *
 * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the returned value, it belongs to @object.
 */
const gchar *
fru_get_version (Fru *object)
{
  return FRU_GET_IFACE (object)->get_version (object);
}

/**
 * fru_dup_version: (skip)
 * @object: A #Fru.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru.version">"version"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value should be freed with g_free().
 */
gchar *
fru_dup_version (Fru *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "version", &value, NULL);
  return value;
}

/**
 * fru_set_version: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.version">"version"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_version (Fru *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "version", value, NULL);
}

/**
 * fru_get_type_: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.type">"type"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
guchar 
fru_get_type_ (Fru *object)
{
  return FRU_GET_IFACE (object)->get_type_ (object);
}

/**
 * fru_set_type_: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.type">"type"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_type_ (Fru *object, guchar value)
{
  g_object_set (G_OBJECT (object), "type", value, NULL);
}

/**
 * fru_get_subtype: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.subtype">"subtype"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
guchar 
fru_get_subtype (Fru *object)
{
  return FRU_GET_IFACE (object)->get_subtype (object);
}

/**
 * fru_set_subtype: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.subtype">"subtype"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_subtype (Fru *object, guchar value)
{
  g_object_set (G_OBJECT (object), "subtype", value, NULL);
}

/**
 * fru_get_instance_num: (skip)
 * @object: A #Fru.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru.instance_num">"instance_num"</link> D-Bus property.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
guchar 
fru_get_instance_num (Fru *object)
{
  return FRU_GET_IFACE (object)->get_instance_num (object);
}

/**
 * fru_set_instance_num: (skip)
 * @object: A #Fru.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru.instance_num">"instance_num"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_set_instance_num (Fru *object, guchar value)
{
  g_object_set (G_OBJECT (object), "instance-num", value, NULL);
}

/**
 * fru_emit_state_changed:
 * @object: A #Fru.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru.StateChanged">"StateChanged"</link> D-Bus signal.
 */
void
fru_emit_state_changed (
    Fru *object)
{
  g_signal_emit_by_name (object, "state-changed");
}

/**
 * fru_emit_unrecoverable_error:
 * @object: A #Fru.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru.UnrecoverableError">"UnrecoverableError"</link> D-Bus signal.
 */
void
fru_emit_unrecoverable_error (
    Fru *object)
{
  g_signal_emit_by_name (object, "unrecoverable-error");
}

/**
 * fru_emit_recoverable_error:
 * @object: A #Fru.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru.RecoverableError">"RecoverableError"</link> D-Bus signal.
 */
void
fru_emit_recoverable_error (
    Fru *object)
{
  g_signal_emit_by_name (object, "recoverable-error");
}

/* ------------------------------------------------------------------------ */

/**
 * FruProxy:
 *
 * The #FruProxy structure contains only private data and should only be accessed using the provided API.
 */

/**
 * FruProxyClass:
 * @parent_class: The parent class.
 *
 * Class structure for #FruProxy.
 */

struct _FruProxyPrivate
{
  GData *qdata;
};

static void fru_proxy_iface_init (FruIface *iface);

#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (FruProxy, fru_proxy, G_TYPE_DBUS_PROXY,
                         G_ADD_PRIVATE (FruProxy)
                         G_IMPLEMENT_INTERFACE (TYPE_FRU, fru_proxy_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (FruProxy, fru_proxy, G_TYPE_DBUS_PROXY,
                         G_IMPLEMENT_INTERFACE (TYPE_FRU, fru_proxy_iface_init));

#endif
static void
fru_proxy_finalize (GObject *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  g_datalist_clear (&proxy->priv->qdata);
  G_OBJECT_CLASS (fru_proxy_parent_class)->finalize (object);
}

static void
fru_proxy_get_property (GObject      *object,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  const _ExtendedGDBusPropertyInfo *info;
  GVariant *variant;
  g_assert (prop_id != 0 && prop_id - 1 < 11);
  info = _fru_property_info_pointers[prop_id - 1];
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
  if (info->use_gvariant)
    {
      g_value_set_variant (value, variant);
    }
  else
    {
      if (variant != NULL)
        g_dbus_gvariant_to_gvalue (variant, value);
    }
  if (variant != NULL)
    g_variant_unref (variant);
}

static void
fru_proxy_set_property_cb (GDBusProxy *proxy,
  GAsyncResult *res,
  gpointer      user_data)
{
  const _ExtendedGDBusPropertyInfo *info = user_data;
  GError *error;
  GVariant *_ret;
  error = NULL;
  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
  if (!_ret)
    {
      g_warning ("Error setting property '%s' on interface org.openbmc.Fru: %s (%s, %d)",
                 info->parent_struct.name, 
                 error->message, g_quark_to_string (error->domain), error->code);
      g_error_free (error);
    }
  else
    {
      g_variant_unref (_ret);
    }
}

static void
fru_proxy_set_property (GObject      *object,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  const _ExtendedGDBusPropertyInfo *info;
  GVariant *variant;
  g_assert (prop_id != 0 && prop_id - 1 < 11);
  info = _fru_property_info_pointers[prop_id - 1];
  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
  g_dbus_proxy_call (G_DBUS_PROXY (object),
    "org.freedesktop.DBus.Properties.Set",
    g_variant_new ("(ssv)", "org.openbmc.Fru", info->parent_struct.name, variant),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    NULL, (GAsyncReadyCallback) fru_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
  g_variant_unref (variant);
}

static void
fru_proxy_g_signal (GDBusProxy *proxy,
  const gchar *sender_name G_GNUC_UNUSED,
  const gchar *signal_name,
  GVariant *parameters)
{
  _ExtendedGDBusSignalInfo *info;
  GVariantIter iter;
  GVariant *child;
  GValue *paramv;
  guint num_params;
  guint n;
  guint signal_id;
  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_fru_interface_info.parent_struct, signal_name);
  if (info == NULL)
    return;
  num_params = g_variant_n_children (parameters);
  paramv = g_new0 (GValue, num_params + 1);
  g_value_init (&paramv[0], TYPE_FRU);
  g_value_set_object (&paramv[0], proxy);
  g_variant_iter_init (&iter, parameters);
  n = 1;
  while ((child = g_variant_iter_next_value (&iter)) != NULL)
    {
      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
      if (arg_info->use_gvariant)
        {
          g_value_init (&paramv[n], G_TYPE_VARIANT);
          g_value_set_variant (&paramv[n], child);
          n++;
        }
      else
        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
      g_variant_unref (child);
    }
  signal_id = g_signal_lookup (info->signal_name, TYPE_FRU);
  g_signal_emitv (paramv, signal_id, 0, NULL);
  for (n = 0; n < num_params + 1; n++)
    g_value_unset (&paramv[n]);
  g_free (paramv);
}

static void
fru_proxy_g_properties_changed (GDBusProxy *_proxy,
  GVariant *changed_properties,
  const gchar *const *invalidated_properties)
{
  FruProxy *proxy = FRU_PROXY (_proxy);
  guint n;
  const gchar *key;
  GVariantIter *iter;
  _ExtendedGDBusPropertyInfo *info;
  g_variant_get (changed_properties, "a{sv}", &iter);
  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
    {
      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_interface_info.parent_struct, key);
      g_datalist_remove_data (&proxy->priv->qdata, key);
      if (info != NULL)
        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
    }
  g_variant_iter_free (iter);
  for (n = 0; invalidated_properties[n] != NULL; n++)
    {
      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_interface_info.parent_struct, invalidated_properties[n]);
      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
      if (info != NULL)
        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
    }
}

static const gchar *
fru_proxy_get_label (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "label");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static const gchar *
fru_proxy_get_location (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "location");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static guchar 
fru_proxy_get_state (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  guchar value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "state");
  if (variant != NULL)
    {
      value = g_variant_get_byte (variant);
      g_variant_unref (variant);
    }
  return value;
}

static const gchar *
fru_proxy_get_manufacturer (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "manufacturer");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static const gchar *
fru_proxy_get_part_num (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "part_num");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static const gchar *
fru_proxy_get_serial_num (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "serial_num");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static guint 
fru_proxy_get_date_code (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  guint value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "date_code");
  if (variant != NULL)
    {
      value = g_variant_get_uint32 (variant);
      g_variant_unref (variant);
    }
  return value;
}

static const gchar *
fru_proxy_get_version (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "version");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static guchar 
fru_proxy_get_type_ (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  guchar value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "type");
  if (variant != NULL)
    {
      value = g_variant_get_byte (variant);
      g_variant_unref (variant);
    }
  return value;
}

static guchar 
fru_proxy_get_subtype (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  guchar value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "subtype");
  if (variant != NULL)
    {
      value = g_variant_get_byte (variant);
      g_variant_unref (variant);
    }
  return value;
}

static guchar 
fru_proxy_get_instance_num (Fru *object)
{
  FruProxy *proxy = FRU_PROXY (object);
  GVariant *variant;
  guchar value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "instance_num");
  if (variant != NULL)
    {
      value = g_variant_get_byte (variant);
      g_variant_unref (variant);
    }
  return value;
}

static void
fru_proxy_init (FruProxy *proxy)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  proxy->priv = fru_proxy_get_instance_private (proxy);
#else
  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_FRU_PROXY, FruProxyPrivate);
#endif

  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), fru_interface_info ());
}

static void
fru_proxy_class_init (FruProxyClass *klass)
{
  GObjectClass *gobject_class;
  GDBusProxyClass *proxy_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize     = fru_proxy_finalize;
  gobject_class->get_property = fru_proxy_get_property;
  gobject_class->set_property = fru_proxy_set_property;

  proxy_class = G_DBUS_PROXY_CLASS (klass);
  proxy_class->g_signal = fru_proxy_g_signal;
  proxy_class->g_properties_changed = fru_proxy_g_properties_changed;

  fru_override_properties (gobject_class, 1);

#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
  g_type_class_add_private (klass, sizeof (FruProxyPrivate));
#endif
}

static void
fru_proxy_iface_init (FruIface *iface)
{
  iface->get_label = fru_proxy_get_label;
  iface->get_location = fru_proxy_get_location;
  iface->get_state = fru_proxy_get_state;
  iface->get_manufacturer = fru_proxy_get_manufacturer;
  iface->get_part_num = fru_proxy_get_part_num;
  iface->get_serial_num = fru_proxy_get_serial_num;
  iface->get_date_code = fru_proxy_get_date_code;
  iface->get_version = fru_proxy_get_version;
  iface->get_type_ = fru_proxy_get_type_;
  iface->get_subtype = fru_proxy_get_subtype;
  iface->get_instance_num = fru_proxy_get_instance_num;
}

/**
 * fru_proxy_new:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link>. See g_dbus_proxy_new() for more details.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_proxy_new_finish() to get the result of the operation.
 *
 * See fru_proxy_new_sync() for the synchronous, blocking version of this constructor.
 */
void
fru_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data)
{
  g_async_initable_new_async (TYPE_FRU_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", "org.openbmc.Fru", NULL);
}

/**
 * fru_proxy_new_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_proxy_new().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with fru_proxy_new().
 *
 * Returns: (transfer full) (type FruProxy): The constructed proxy object or %NULL if @error is set.
 */
Fru *
fru_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return FRU (ret);
  else
    return NULL;
}

/**
 * fru_proxy_new_sync:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link>. See g_dbus_proxy_new_sync() for more details.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See fru_proxy_new() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type FruProxy): The constructed proxy object or %NULL if @error is set.
 */
Fru *
fru_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error)
{
  GInitable *ret;
  ret = g_initable_new (TYPE_FRU_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.Fru", NULL);
  if (ret != NULL)
    return FRU (ret);
  else
    return NULL;
}


/**
 * fru_proxy_new_for_bus:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Like fru_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_proxy_new_for_bus_finish() to get the result of the operation.
 *
 * See fru_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
 */
void
fru_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data)
{
  g_async_initable_new_async (TYPE_FRU_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", "org.openbmc.Fru", NULL);
}

/**
 * fru_proxy_new_for_bus_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_proxy_new_for_bus().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with fru_proxy_new_for_bus().
 *
 * Returns: (transfer full) (type FruProxy): The constructed proxy object or %NULL if @error is set.
 */
Fru *
fru_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return FRU (ret);
  else
    return NULL;
}

/**
 * fru_proxy_new_for_bus_sync:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Like fru_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See fru_proxy_new_for_bus() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type FruProxy): The constructed proxy object or %NULL if @error is set.
 */
Fru *
fru_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error)
{
  GInitable *ret;
  ret = g_initable_new (TYPE_FRU_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.Fru", NULL);
  if (ret != NULL)
    return FRU (ret);
  else
    return NULL;
}


/* ------------------------------------------------------------------------ */

/**
 * FruSkeleton:
 *
 * The #FruSkeleton structure contains only private data and should only be accessed using the provided API.
 */

/**
 * FruSkeletonClass:
 * @parent_class: The parent class.
 *
 * Class structure for #FruSkeleton.
 */

struct _FruSkeletonPrivate
{
  GValue *properties;
  GList *changed_properties;
  GSource *changed_properties_idle_source;
  GMainContext *context;
  GMutex lock;
};

static void
_fru_skeleton_handle_method_call (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name,
  const gchar *method_name,
  GVariant *parameters,
  GDBusMethodInvocation *invocation,
  gpointer user_data)
{
  FruSkeleton *skeleton = FRU_SKELETON (user_data);
  _ExtendedGDBusMethodInfo *info;
  GVariantIter iter;
  GVariant *child;
  GValue *paramv;
  guint num_params;
  guint num_extra;
  guint n;
  guint signal_id;
  GValue return_value = G_VALUE_INIT;
  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
  g_assert (info != NULL);
  num_params = g_variant_n_children (parameters);
  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
  n = 0;
  g_value_init (&paramv[n], TYPE_FRU);
  g_value_set_object (&paramv[n++], skeleton);
  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
  g_value_set_object (&paramv[n++], invocation);
  if (info->pass_fdlist)
    {
#ifdef G_OS_UNIX
      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
#else
      g_assert_not_reached ();
#endif
    }
  g_variant_iter_init (&iter, parameters);
  while ((child = g_variant_iter_next_value (&iter)) != NULL)
    {
      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
      if (arg_info->use_gvariant)
        {
          g_value_init (&paramv[n], G_TYPE_VARIANT);
          g_value_set_variant (&paramv[n], child);
          n++;
        }
      else
        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
      g_variant_unref (child);
    }
  signal_id = g_signal_lookup (info->signal_name, TYPE_FRU);
  g_value_init (&return_value, G_TYPE_BOOLEAN);
  g_signal_emitv (paramv, signal_id, 0, &return_value);
  if (!g_value_get_boolean (&return_value))
    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);
  g_value_unset (&return_value);
  for (n = 0; n < num_params + num_extra; n++)
    g_value_unset (&paramv[n]);
  g_free (paramv);
}

static GVariant *
_fru_skeleton_handle_get_property (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name G_GNUC_UNUSED,
  const gchar *property_name,
  GError **error,
  gpointer user_data)
{
  FruSkeleton *skeleton = FRU_SKELETON (user_data);
  GValue value = G_VALUE_INIT;
  GParamSpec *pspec;
  _ExtendedGDBusPropertyInfo *info;
  GVariant *ret;
  ret = NULL;
  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_interface_info.parent_struct, property_name);
  g_assert (info != NULL);
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
  if (pspec == NULL)
    {
      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
    }
  else
    {
      g_value_init (&value, pspec->value_type);
      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
      g_value_unset (&value);
    }
  return ret;
}

static gboolean
_fru_skeleton_handle_set_property (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name G_GNUC_UNUSED,
  const gchar *property_name,
  GVariant *variant,
  GError **error,
  gpointer user_data)
{
  FruSkeleton *skeleton = FRU_SKELETON (user_data);
  GValue value = G_VALUE_INIT;
  GParamSpec *pspec;
  _ExtendedGDBusPropertyInfo *info;
  gboolean ret;
  ret = FALSE;
  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_interface_info.parent_struct, property_name);
  g_assert (info != NULL);
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
  if (pspec == NULL)
    {
      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
    }
  else
    {
      if (info->use_gvariant)
        g_value_set_variant (&value, variant);
      else
        g_dbus_gvariant_to_gvalue (variant, &value);
      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
      g_value_unset (&value);
      ret = TRUE;
    }
  return ret;
}

static const GDBusInterfaceVTable _fru_skeleton_vtable =
{
  _fru_skeleton_handle_method_call,
  _fru_skeleton_handle_get_property,
  _fru_skeleton_handle_set_property,
  {NULL}
};

static GDBusInterfaceInfo *
fru_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return fru_interface_info ();
}

static GDBusInterfaceVTable *
fru_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return (GDBusInterfaceVTable *) &_fru_skeleton_vtable;
}

static GVariant *
fru_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
{
  FruSkeleton *skeleton = FRU_SKELETON (_skeleton);

  GVariantBuilder builder;
  guint n;
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
  if (_fru_interface_info.parent_struct.properties == NULL)
    goto out;
  for (n = 0; _fru_interface_info.parent_struct.properties[n] != NULL; n++)
    {
      GDBusPropertyInfo *info = _fru_interface_info.parent_struct.properties[n];
      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
        {
          GVariant *value;
          value = _fru_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)), "org.openbmc.Fru", info->name, NULL, skeleton);
          if (value != NULL)
            {
              g_variant_take_ref (value);
              g_variant_builder_add (&builder, "{sv}", info->name, value);
              g_variant_unref (value);
            }
        }
    }
out:
  return g_variant_builder_end (&builder);
}

static gboolean _fru_emit_changed (gpointer user_data);

static void
fru_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
{
  FruSkeleton *skeleton = FRU_SKELETON (_skeleton);
  gboolean emit_changed = FALSE;

  g_mutex_lock (&skeleton->priv->lock);
  if (skeleton->priv->changed_properties_idle_source != NULL)
    {
      g_source_destroy (skeleton->priv->changed_properties_idle_source);
      skeleton->priv->changed_properties_idle_source = NULL;
      emit_changed = TRUE;
    }
  g_mutex_unlock (&skeleton->priv->lock);

  if (emit_changed)
    _fru_emit_changed (skeleton);
}

static void
_fru_on_signal_state_changed (
    Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.Fru", "StateChanged",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void
_fru_on_signal_unrecoverable_error (
    Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.Fru", "UnrecoverableError",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void
_fru_on_signal_recoverable_error (
    Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.Fru", "RecoverableError",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void fru_skeleton_iface_init (FruIface *iface);
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (FruSkeleton, fru_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_ADD_PRIVATE (FruSkeleton)
                         G_IMPLEMENT_INTERFACE (TYPE_FRU, fru_skeleton_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (FruSkeleton, fru_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_IMPLEMENT_INTERFACE (TYPE_FRU, fru_skeleton_iface_init));

#endif
static void
fru_skeleton_finalize (GObject *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  guint n;
  for (n = 0; n < 11; n++)
    g_value_unset (&skeleton->priv->properties[n]);
  g_free (skeleton->priv->properties);
  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
  if (skeleton->priv->changed_properties_idle_source != NULL)
    g_source_destroy (skeleton->priv->changed_properties_idle_source);
  g_main_context_unref (skeleton->priv->context);
  g_mutex_clear (&skeleton->priv->lock);
  G_OBJECT_CLASS (fru_skeleton_parent_class)->finalize (object);
}

static void
fru_skeleton_get_property (GObject      *object,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  g_assert (prop_id != 0 && prop_id - 1 < 11);
  g_mutex_lock (&skeleton->priv->lock);
  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
  g_mutex_unlock (&skeleton->priv->lock);
}

static gboolean
_fru_emit_changed (gpointer user_data)
{
  FruSkeleton *skeleton = FRU_SKELETON (user_data);
  GList *l;
  GVariantBuilder builder;
  GVariantBuilder invalidated_builder;
  guint num_changes;

  g_mutex_lock (&skeleton->priv->lock);
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
    {
      ChangedProperty *cp = l->data;
      GVariant *variant;
      const GValue *cur_value;

      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
      if (!_g_value_equal (cur_value, &cp->orig_value))
        {
          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
          g_variant_unref (variant);
          num_changes++;
        }
    }
  if (num_changes > 0)
    {
      GList *connections, *ll;
      GVariant *signal_variant;
      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.openbmc.Fru",
                                           &builder, &invalidated_builder));
      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
      for (ll = connections; ll != NULL; ll = ll->next)
        {
          GDBusConnection *connection = ll->data;

          g_dbus_connection_emit_signal (connection,
                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
                                         "org.freedesktop.DBus.Properties",
                                         "PropertiesChanged",
                                         signal_variant,
                                         NULL);
        }
      g_variant_unref (signal_variant);
      g_list_free_full (connections, g_object_unref);
    }
  else
    {
      g_variant_builder_clear (&builder);
      g_variant_builder_clear (&invalidated_builder);
    }
  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
  skeleton->priv->changed_properties = NULL;
  skeleton->priv->changed_properties_idle_source = NULL;
  g_mutex_unlock (&skeleton->priv->lock);
  return FALSE;
}

static void
_fru_schedule_emit_changed (FruSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
{
  ChangedProperty *cp;
  GList *l;
  cp = NULL;
  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
    {
      ChangedProperty *i_cp = l->data;
      if (i_cp->info == info)
        {
          cp = i_cp;
          break;
        }
    }
  if (cp == NULL)
    {
      cp = g_new0 (ChangedProperty, 1);
      cp->prop_id = prop_id;
      cp->info = info;
      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
      g_value_copy (orig_value, &cp->orig_value);
    }
}

static void
fru_skeleton_notify (GObject      *object,
  GParamSpec *pspec G_GNUC_UNUSED)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  g_mutex_lock (&skeleton->priv->lock);
  if (skeleton->priv->changed_properties != NULL &&
      skeleton->priv->changed_properties_idle_source == NULL)
    {
      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _fru_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
      g_source_unref (skeleton->priv->changed_properties_idle_source);
    }
  g_mutex_unlock (&skeleton->priv->lock);
}

static void
fru_skeleton_set_property (GObject      *object,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  g_assert (prop_id != 0 && prop_id - 1 < 11);
  g_mutex_lock (&skeleton->priv->lock);
  g_object_freeze_notify (object);
  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
    {
      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
        _fru_schedule_emit_changed (skeleton, _fru_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
      g_object_notify_by_pspec (object, pspec);
    }
  g_mutex_unlock (&skeleton->priv->lock);
  g_object_thaw_notify (object);
}

static void
fru_skeleton_init (FruSkeleton *skeleton)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  skeleton->priv = fru_skeleton_get_instance_private (skeleton);
#else
  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_FRU_SKELETON, FruSkeletonPrivate);
#endif

  g_mutex_init (&skeleton->priv->lock);
  skeleton->priv->context = g_main_context_ref_thread_default ();
  skeleton->priv->properties = g_new0 (GValue, 11);
  g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING);
  g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
  g_value_init (&skeleton->priv->properties[2], G_TYPE_UCHAR);
  g_value_init (&skeleton->priv->properties[3], G_TYPE_STRING);
  g_value_init (&skeleton->priv->properties[4], G_TYPE_STRING);
  g_value_init (&skeleton->priv->properties[5], G_TYPE_STRING);
  g_value_init (&skeleton->priv->properties[6], G_TYPE_UINT);
  g_value_init (&skeleton->priv->properties[7], G_TYPE_STRING);
  g_value_init (&skeleton->priv->properties[8], G_TYPE_UCHAR);
  g_value_init (&skeleton->priv->properties[9], G_TYPE_UCHAR);
  g_value_init (&skeleton->priv->properties[10], G_TYPE_UCHAR);
}

static const gchar *
fru_skeleton_get_label (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  const gchar *value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_string (&(skeleton->priv->properties[0]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static const gchar *
fru_skeleton_get_location (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  const gchar *value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_string (&(skeleton->priv->properties[1]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static guchar 
fru_skeleton_get_state (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  guchar value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_uchar (&(skeleton->priv->properties[2]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static const gchar *
fru_skeleton_get_manufacturer (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  const gchar *value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_string (&(skeleton->priv->properties[3]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static const gchar *
fru_skeleton_get_part_num (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  const gchar *value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_string (&(skeleton->priv->properties[4]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static const gchar *
fru_skeleton_get_serial_num (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  const gchar *value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_string (&(skeleton->priv->properties[5]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static guint 
fru_skeleton_get_date_code (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  guint value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_uint (&(skeleton->priv->properties[6]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static const gchar *
fru_skeleton_get_version (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  const gchar *value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_string (&(skeleton->priv->properties[7]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static guchar 
fru_skeleton_get_type_ (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  guchar value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_uchar (&(skeleton->priv->properties[8]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static guchar 
fru_skeleton_get_subtype (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  guchar value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_uchar (&(skeleton->priv->properties[9]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static guchar 
fru_skeleton_get_instance_num (Fru *object)
{
  FruSkeleton *skeleton = FRU_SKELETON (object);
  guchar value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_uchar (&(skeleton->priv->properties[10]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static void
fru_skeleton_class_init (FruSkeletonClass *klass)
{
  GObjectClass *gobject_class;
  GDBusInterfaceSkeletonClass *skeleton_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize = fru_skeleton_finalize;
  gobject_class->get_property = fru_skeleton_get_property;
  gobject_class->set_property = fru_skeleton_set_property;
  gobject_class->notify       = fru_skeleton_notify;


  fru_override_properties (gobject_class, 1);

  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
  skeleton_class->get_info = fru_skeleton_dbus_interface_get_info;
  skeleton_class->get_properties = fru_skeleton_dbus_interface_get_properties;
  skeleton_class->flush = fru_skeleton_dbus_interface_flush;
  skeleton_class->get_vtable = fru_skeleton_dbus_interface_get_vtable;

#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
  g_type_class_add_private (klass, sizeof (FruSkeletonPrivate));
#endif
}

static void
fru_skeleton_iface_init (FruIface *iface)
{
  iface->state_changed = _fru_on_signal_state_changed;
  iface->unrecoverable_error = _fru_on_signal_unrecoverable_error;
  iface->recoverable_error = _fru_on_signal_recoverable_error;
  iface->get_label = fru_skeleton_get_label;
  iface->get_location = fru_skeleton_get_location;
  iface->get_state = fru_skeleton_get_state;
  iface->get_manufacturer = fru_skeleton_get_manufacturer;
  iface->get_part_num = fru_skeleton_get_part_num;
  iface->get_serial_num = fru_skeleton_get_serial_num;
  iface->get_date_code = fru_skeleton_get_date_code;
  iface->get_version = fru_skeleton_get_version;
  iface->get_type_ = fru_skeleton_get_type_;
  iface->get_subtype = fru_skeleton_get_subtype;
  iface->get_instance_num = fru_skeleton_get_instance_num;
}

/**
 * fru_skeleton_new:
 *
 * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link>.
 *
 * Returns: (transfer full) (type FruSkeleton): The skeleton object.
 */
Fru *
fru_skeleton_new (void)
{
  return FRU (g_object_new (TYPE_FRU_SKELETON, NULL));
}

/* ------------------------------------------------------------------------
 * Code for interface org.openbmc.Fru.Fan
 * ------------------------------------------------------------------------
 */

/**
 * SECTION:FruFan
 * @title: FruFan
 * @short_description: Generated C code for the org.openbmc.Fru.Fan D-Bus interface
 *
 * This section contains code for working with the <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link> D-Bus interface in C.
 */

/* ---- Introspection data for org.openbmc.Fru.Fan ---- */

static const _ExtendedGDBusArgInfo _fru_fan_method_info_set_cooling_zone_IN_ARG_cooling_zone =
{
  {
    -1,
    (gchar *) "cooling_zone",
    (gchar *) "i",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const _fru_fan_method_info_set_cooling_zone_IN_ARG_pointers[] =
{
  &_fru_fan_method_info_set_cooling_zone_IN_ARG_cooling_zone,
  NULL
};

static const _ExtendedGDBusMethodInfo _fru_fan_method_info_set_cooling_zone =
{
  {
    -1,
    (gchar *) "setCoolingZone",
    (GDBusArgInfo **) &_fru_fan_method_info_set_cooling_zone_IN_ARG_pointers,
    NULL,
    NULL
  },
  "handle-set-cooling-zone",
  FALSE
};

static const _ExtendedGDBusArgInfo _fru_fan_method_info_get_speed_OUT_ARG_speed =
{
  {
    -1,
    (gchar *) "speed",
    (gchar *) "i",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const _fru_fan_method_info_get_speed_OUT_ARG_pointers[] =
{
  &_fru_fan_method_info_get_speed_OUT_ARG_speed,
  NULL
};

static const _ExtendedGDBusMethodInfo _fru_fan_method_info_get_speed =
{
  {
    -1,
    (gchar *) "getSpeed",
    NULL,
    (GDBusArgInfo **) &_fru_fan_method_info_get_speed_OUT_ARG_pointers,
    NULL
  },
  "handle-get-speed",
  FALSE
};

static const _ExtendedGDBusArgInfo _fru_fan_method_info_set_speed_IN_ARG_speed =
{
  {
    -1,
    (gchar *) "speed",
    (gchar *) "i",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const _fru_fan_method_info_set_speed_IN_ARG_pointers[] =
{
  &_fru_fan_method_info_set_speed_IN_ARG_speed,
  NULL
};

static const _ExtendedGDBusMethodInfo _fru_fan_method_info_set_speed =
{
  {
    -1,
    (gchar *) "setSpeed",
    (GDBusArgInfo **) &_fru_fan_method_info_set_speed_IN_ARG_pointers,
    NULL,
    NULL
  },
  "handle-set-speed",
  FALSE
};

static const _ExtendedGDBusArgInfo _fru_fan_method_info_set_config_data_IN_ARG_pwm_num =
{
  {
    -1,
    (gchar *) "pwm_num",
    (gchar *) "i",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const _fru_fan_method_info_set_config_data_IN_ARG_pointers[] =
{
  &_fru_fan_method_info_set_config_data_IN_ARG_pwm_num,
  NULL
};

static const _ExtendedGDBusMethodInfo _fru_fan_method_info_set_config_data =
{
  {
    -1,
    (gchar *) "setConfigData",
    (GDBusArgInfo **) &_fru_fan_method_info_set_config_data_IN_ARG_pointers,
    NULL,
    NULL
  },
  "handle-set-config-data",
  FALSE
};

static const _ExtendedGDBusMethodInfo * const _fru_fan_method_info_pointers[] =
{
  &_fru_fan_method_info_set_cooling_zone,
  &_fru_fan_method_info_get_speed,
  &_fru_fan_method_info_set_speed,
  &_fru_fan_method_info_set_config_data,
  NULL
};

static const _ExtendedGDBusArgInfo _fru_fan_signal_info_speed_changed_ARG_speed =
{
  {
    -1,
    (gchar *) "speed",
    (gchar *) "i",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const _fru_fan_signal_info_speed_changed_ARG_pointers[] =
{
  &_fru_fan_signal_info_speed_changed_ARG_speed,
  NULL
};

static const _ExtendedGDBusSignalInfo _fru_fan_signal_info_speed_changed =
{
  {
    -1,
    (gchar *) "SpeedChanged",
    (GDBusArgInfo **) &_fru_fan_signal_info_speed_changed_ARG_pointers,
    NULL
  },
  "speed-changed"
};

static const _ExtendedGDBusSignalInfo _fru_fan_signal_info_tach_error =
{
  {
    -1,
    (gchar *) "TachError",
    NULL,
    NULL
  },
  "tach-error"
};

static const _ExtendedGDBusSignalInfo * const _fru_fan_signal_info_pointers[] =
{
  &_fru_fan_signal_info_speed_changed,
  &_fru_fan_signal_info_tach_error,
  NULL
};

static const _ExtendedGDBusPropertyInfo _fru_fan_property_info_speed =
{
  {
    -1,
    (gchar *) "speed",
    (gchar *) "i",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
    NULL
  },
  "speed",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_fan_property_info_cooling_zone =
{
  {
    -1,
    (gchar *) "cooling_zone",
    (gchar *) "i",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
    NULL
  },
  "cooling-zone",
  FALSE
};

static const _ExtendedGDBusPropertyInfo * const _fru_fan_property_info_pointers[] =
{
  &_fru_fan_property_info_speed,
  &_fru_fan_property_info_cooling_zone,
  NULL
};

static const _ExtendedGDBusInterfaceInfo _fru_fan_interface_info =
{
  {
    -1,
    (gchar *) "org.openbmc.Fru.Fan",
    (GDBusMethodInfo **) &_fru_fan_method_info_pointers,
    (GDBusSignalInfo **) &_fru_fan_signal_info_pointers,
    (GDBusPropertyInfo **) &_fru_fan_property_info_pointers,
    NULL
  },
  "fru-fan",
};


/**
 * fru_fan_interface_info:
 *
 * Gets a machine-readable description of the <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link> D-Bus interface.
 *
 * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
 */
GDBusInterfaceInfo *
fru_fan_interface_info (void)
{
  return (GDBusInterfaceInfo *) &_fru_fan_interface_info.parent_struct;
}

/**
 * fru_fan_override_properties:
 * @klass: The class structure for a #GObject<!-- -->-derived class.
 * @property_id_begin: The property id to assign to the first overridden property.
 *
 * Overrides all #GObject properties in the #FruFan interface for a concrete class.
 * The properties are overridden in the order they are defined.
 *
 * Returns: The last property id.
 */
guint
fru_fan_override_properties (GObjectClass *klass, guint property_id_begin)
{
  g_object_class_override_property (klass, property_id_begin++, "speed");
  g_object_class_override_property (klass, property_id_begin++, "cooling-zone");
  return property_id_begin - 1;
}



/**
 * FruFan:
 *
 * Abstract interface type for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link>.
 */

/**
 * FruFanIface:
 * @parent_iface: The parent interface.
 * @handle_get_speed: Handler for the #FruFan::handle-get-speed signal.
 * @handle_set_config_data: Handler for the #FruFan::handle-set-config-data signal.
 * @handle_set_cooling_zone: Handler for the #FruFan::handle-set-cooling-zone signal.
 * @handle_set_speed: Handler for the #FruFan::handle-set-speed signal.
 * @get_cooling_zone: Getter for the #FruFan:cooling-zone property.
 * @get_speed: Getter for the #FruFan:speed property.
 * @speed_changed: Handler for the #FruFan::speed-changed signal.
 * @tach_error: Handler for the #FruFan::tach-error signal.
 *
 * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link>.
 */

typedef FruFanIface FruFanInterface;
G_DEFINE_INTERFACE (FruFan, fru_fan, G_TYPE_OBJECT);

static void
fru_fan_default_init (FruFanIface *iface)
{
  /* GObject signals for incoming D-Bus method calls: */
  /**
   * FruFan::handle-set-cooling-zone:
   * @object: A #FruFan.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_cooling_zone: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setCoolingZone">setCoolingZone()</link> D-Bus method.
   *
   * 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 fru_fan_complete_set_cooling_zone() 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.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-set-cooling-zone",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruFanIface, handle_set_cooling_zone),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT);

  /**
   * FruFan::handle-get-speed:
   * @object: A #FruFan.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-Fru-Fan.getSpeed">getSpeed()</link> D-Bus method.
   *
   * 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 fru_fan_complete_get_speed() 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.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-get-speed",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruFanIface, handle_get_speed),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /**
   * FruFan::handle-set-speed:
   * @object: A #FruFan.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_speed: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setSpeed">setSpeed()</link> D-Bus method.
   *
   * 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 fru_fan_complete_set_speed() 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.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-set-speed",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruFanIface, handle_set_speed),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT);

  /**
   * FruFan::handle-set-config-data:
   * @object: A #FruFan.
   * @invocation: A #GDBusMethodInvocation.
   * @arg_pwm_num: Argument passed by remote caller.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setConfigData">setConfigData()</link> D-Bus method.
   *
   * 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 fru_fan_complete_set_config_data() 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.
   *
   * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
   */
  g_signal_new ("handle-set-config-data",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruFanIface, handle_set_config_data),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    2,
    G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_INT);

  /* GObject signals for received D-Bus signals: */
  /**
   * FruFan::speed-changed:
   * @object: A #FruFan.
   * @arg_speed: Argument.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru-Fan.SpeedChanged">"SpeedChanged"</link> is received.
   *
   * 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.
   */
  g_signal_new ("speed-changed",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruFanIface, speed_changed),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    1, G_TYPE_INT);

  /**
   * FruFan::tach-error:
   * @object: A #FruFan.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru-Fan.TachError">"TachError"</link> is received.
   *
   * 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.
   */
  g_signal_new ("tach-error",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruFanIface, tach_error),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    0);

  /* GObject properties for D-Bus properties: */
  /**
   * FruFan:speed:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru-Fan.speed">"speed"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_int ("speed", "speed", "speed", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * FruFan:cooling-zone:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru-Fan.cooling_zone">"cooling_zone"</link>.
   *
   * 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.
   */
  g_object_interface_install_property (iface,
    g_param_spec_int ("cooling-zone", "cooling_zone", "cooling_zone", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

/**
 * fru_fan_get_speed: (skip)
 * @object: A #FruFan.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru-Fan.speed">"speed"</link> D-Bus property.
 *
 * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
gint 
fru_fan_get_speed (FruFan *object)
{
  return FRU_FAN_GET_IFACE (object)->get_speed (object);
}

/**
 * fru_fan_set_speed: (skip)
 * @object: A #FruFan.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru-Fan.speed">"speed"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
 */
void
fru_fan_set_speed (FruFan *object, gint value)
{
  g_object_set (G_OBJECT (object), "speed", value, NULL);
}

/**
 * fru_fan_get_cooling_zone: (skip)
 * @object: A #FruFan.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru-Fan.cooling_zone">"cooling_zone"</link> D-Bus property.
 *
 * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and service-side.
 *
 * Returns: The property value.
 */
gint 
fru_fan_get_cooling_zone (FruFan *object)
{
  return FRU_FAN_GET_IFACE (object)->get_cooling_zone (object);
}

/**
 * fru_fan_set_cooling_zone: (skip)
 * @object: A #FruFan.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru-Fan.cooling_zone">"cooling_zone"</link> D-Bus property to @value.
 *
 * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
 */
void
fru_fan_set_cooling_zone (FruFan *object, gint value)
{
  g_object_set (G_OBJECT (object), "cooling-zone", value, NULL);
}

/**
 * fru_fan_emit_speed_changed:
 * @object: A #FruFan.
 * @arg_speed: Argument to pass with the signal.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru-Fan.SpeedChanged">"SpeedChanged"</link> D-Bus signal.
 */
void
fru_fan_emit_speed_changed (
    FruFan *object,
    gint arg_speed)
{
  g_signal_emit_by_name (object, "speed-changed", arg_speed);
}

/**
 * fru_fan_emit_tach_error:
 * @object: A #FruFan.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru-Fan.TachError">"TachError"</link> D-Bus signal.
 */
void
fru_fan_emit_tach_error (
    FruFan *object)
{
  g_signal_emit_by_name (object, "tach-error");
}

/**
 * fru_fan_call_set_cooling_zone:
 * @proxy: A #FruFanProxy.
 * @arg_cooling_zone: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setCoolingZone">setCoolingZone()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_fan_call_set_cooling_zone_finish() to get the result of the operation.
 *
 * See fru_fan_call_set_cooling_zone_sync() for the synchronous, blocking version of this method.
 */
void
fru_fan_call_set_cooling_zone (
    FruFan *proxy,
    gint arg_cooling_zone,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "setCoolingZone",
    g_variant_new ("(i)",
                   arg_cooling_zone),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * fru_fan_call_set_cooling_zone_finish:
 * @proxy: A #FruFanProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_fan_call_set_cooling_zone().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with fru_fan_call_set_cooling_zone().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_set_cooling_zone_finish (
    FruFan *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_set_cooling_zone_sync:
 * @proxy: A #FruFanProxy.
 * @arg_cooling_zone: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setCoolingZone">setCoolingZone()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See fru_fan_call_set_cooling_zone() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_set_cooling_zone_sync (
    FruFan *proxy,
    gint arg_cooling_zone,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "setCoolingZone",
    g_variant_new ("(i)",
                   arg_cooling_zone),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_get_speed:
 * @proxy: A #FruFanProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.getSpeed">getSpeed()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_fan_call_get_speed_finish() to get the result of the operation.
 *
 * See fru_fan_call_get_speed_sync() for the synchronous, blocking version of this method.
 */
void
fru_fan_call_get_speed (
    FruFan *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "getSpeed",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * fru_fan_call_get_speed_finish:
 * @proxy: A #FruFanProxy.
 * @out_speed: (out): Return location for return parameter or %NULL to ignore.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_fan_call_get_speed().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with fru_fan_call_get_speed().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_get_speed_finish (
    FruFan *proxy,
    gint *out_speed,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(i)",
                 out_speed);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_get_speed_sync:
 * @proxy: A #FruFanProxy.
 * @out_speed: (out): Return location for return parameter or %NULL to ignore.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.getSpeed">getSpeed()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See fru_fan_call_get_speed() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_get_speed_sync (
    FruFan *proxy,
    gint *out_speed,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "getSpeed",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "(i)",
                 out_speed);
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_set_speed:
 * @proxy: A #FruFanProxy.
 * @arg_speed: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setSpeed">setSpeed()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_fan_call_set_speed_finish() to get the result of the operation.
 *
 * See fru_fan_call_set_speed_sync() for the synchronous, blocking version of this method.
 */
void
fru_fan_call_set_speed (
    FruFan *proxy,
    gint arg_speed,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "setSpeed",
    g_variant_new ("(i)",
                   arg_speed),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * fru_fan_call_set_speed_finish:
 * @proxy: A #FruFanProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_fan_call_set_speed().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with fru_fan_call_set_speed().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_set_speed_finish (
    FruFan *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_set_speed_sync:
 * @proxy: A #FruFanProxy.
 * @arg_speed: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setSpeed">setSpeed()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See fru_fan_call_set_speed() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_set_speed_sync (
    FruFan *proxy,
    gint arg_speed,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "setSpeed",
    g_variant_new ("(i)",
                   arg_speed),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_set_config_data:
 * @proxy: A #FruFanProxy.
 * @arg_pwm_num: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setConfigData">setConfigData()</link> D-Bus method on @proxy.
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_fan_call_set_config_data_finish() to get the result of the operation.
 *
 * See fru_fan_call_set_config_data_sync() for the synchronous, blocking version of this method.
 */
void
fru_fan_call_set_config_data (
    FruFan *proxy,
    gint arg_pwm_num,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "setConfigData",
    g_variant_new ("(i)",
                   arg_pwm_num),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * fru_fan_call_set_config_data_finish:
 * @proxy: A #FruFanProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_fan_call_set_config_data().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with fru_fan_call_set_config_data().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_set_config_data_finish (
    FruFan *proxy,
    GAsyncResult *res,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_call_set_config_data_sync:
 * @proxy: A #FruFanProxy.
 * @arg_pwm_num: Argument to pass with the method invocation.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setConfigData">setConfigData()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See fru_fan_call_set_config_data() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_fan_call_set_config_data_sync (
    FruFan *proxy,
    gint arg_pwm_num,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "setConfigData",
    g_variant_new ("(i)",
                   arg_pwm_num),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    error);
  if (_ret == NULL)
    goto _out;
  g_variant_get (_ret,
                 "()");
  g_variant_unref (_ret);
_out:
  return _ret != NULL;
}

/**
 * fru_fan_complete_set_cooling_zone:
 * @object: A #FruFan.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setCoolingZone">setCoolingZone()</link> 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.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
fru_fan_complete_set_cooling_zone (
    FruFan *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/**
 * fru_fan_complete_get_speed:
 * @object: A #FruFan.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 * @speed: Parameter to return.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-Fru-Fan.getSpeed">getSpeed()</link> 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.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
fru_fan_complete_get_speed (
    FruFan *object,
    GDBusMethodInvocation *invocation,
    gint speed)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("(i)",
                   speed));
}

/**
 * fru_fan_complete_set_speed:
 * @object: A #FruFan.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setSpeed">setSpeed()</link> 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.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
fru_fan_complete_set_speed (
    FruFan *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/**
 * fru_fan_complete_set_config_data:
 * @object: A #FruFan.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-Fru-Fan.setConfigData">setConfigData()</link> 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.
 *
 * This method will free @invocation, you cannot use it afterwards.
 */
void
fru_fan_complete_set_config_data (
    FruFan *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

/* ------------------------------------------------------------------------ */

/**
 * FruFanProxy:
 *
 * The #FruFanProxy structure contains only private data and should only be accessed using the provided API.
 */

/**
 * FruFanProxyClass:
 * @parent_class: The parent class.
 *
 * Class structure for #FruFanProxy.
 */

struct _FruFanProxyPrivate
{
  GData *qdata;
};

static void fru_fan_proxy_iface_init (FruFanIface *iface);

#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (FruFanProxy, fru_fan_proxy, G_TYPE_DBUS_PROXY,
                         G_ADD_PRIVATE (FruFanProxy)
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_FAN, fru_fan_proxy_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (FruFanProxy, fru_fan_proxy, G_TYPE_DBUS_PROXY,
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_FAN, fru_fan_proxy_iface_init));

#endif
static void
fru_fan_proxy_finalize (GObject *object)
{
  FruFanProxy *proxy = FRU_FAN_PROXY (object);
  g_datalist_clear (&proxy->priv->qdata);
  G_OBJECT_CLASS (fru_fan_proxy_parent_class)->finalize (object);
}

static void
fru_fan_proxy_get_property (GObject      *object,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  const _ExtendedGDBusPropertyInfo *info;
  GVariant *variant;
  g_assert (prop_id != 0 && prop_id - 1 < 2);
  info = _fru_fan_property_info_pointers[prop_id - 1];
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
  if (info->use_gvariant)
    {
      g_value_set_variant (value, variant);
    }
  else
    {
      if (variant != NULL)
        g_dbus_gvariant_to_gvalue (variant, value);
    }
  if (variant != NULL)
    g_variant_unref (variant);
}

static void
fru_fan_proxy_set_property_cb (GDBusProxy *proxy,
  GAsyncResult *res,
  gpointer      user_data)
{
  const _ExtendedGDBusPropertyInfo *info = user_data;
  GError *error;
  GVariant *_ret;
  error = NULL;
  _ret = g_dbus_proxy_call_finish (proxy, res, &error);
  if (!_ret)
    {
      g_warning ("Error setting property '%s' on interface org.openbmc.Fru.Fan: %s (%s, %d)",
                 info->parent_struct.name, 
                 error->message, g_quark_to_string (error->domain), error->code);
      g_error_free (error);
    }
  else
    {
      g_variant_unref (_ret);
    }
}

static void
fru_fan_proxy_set_property (GObject      *object,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  const _ExtendedGDBusPropertyInfo *info;
  GVariant *variant;
  g_assert (prop_id != 0 && prop_id - 1 < 2);
  info = _fru_fan_property_info_pointers[prop_id - 1];
  variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
  g_dbus_proxy_call (G_DBUS_PROXY (object),
    "org.freedesktop.DBus.Properties.Set",
    g_variant_new ("(ssv)", "org.openbmc.Fru.Fan", info->parent_struct.name, variant),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    NULL, (GAsyncReadyCallback) fru_fan_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
  g_variant_unref (variant);
}

static void
fru_fan_proxy_g_signal (GDBusProxy *proxy,
  const gchar *sender_name G_GNUC_UNUSED,
  const gchar *signal_name,
  GVariant *parameters)
{
  _ExtendedGDBusSignalInfo *info;
  GVariantIter iter;
  GVariant *child;
  GValue *paramv;
  guint num_params;
  guint n;
  guint signal_id;
  info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *) &_fru_fan_interface_info.parent_struct, signal_name);
  if (info == NULL)
    return;
  num_params = g_variant_n_children (parameters);
  paramv = g_new0 (GValue, num_params + 1);
  g_value_init (&paramv[0], TYPE_FRU_FAN);
  g_value_set_object (&paramv[0], proxy);
  g_variant_iter_init (&iter, parameters);
  n = 1;
  while ((child = g_variant_iter_next_value (&iter)) != NULL)
    {
      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
      if (arg_info->use_gvariant)
        {
          g_value_init (&paramv[n], G_TYPE_VARIANT);
          g_value_set_variant (&paramv[n], child);
          n++;
        }
      else
        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
      g_variant_unref (child);
    }
  signal_id = g_signal_lookup (info->signal_name, TYPE_FRU_FAN);
  g_signal_emitv (paramv, signal_id, 0, NULL);
  for (n = 0; n < num_params + 1; n++)
    g_value_unset (&paramv[n]);
  g_free (paramv);
}

static void
fru_fan_proxy_g_properties_changed (GDBusProxy *_proxy,
  GVariant *changed_properties,
  const gchar *const *invalidated_properties)
{
  FruFanProxy *proxy = FRU_FAN_PROXY (_proxy);
  guint n;
  const gchar *key;
  GVariantIter *iter;
  _ExtendedGDBusPropertyInfo *info;
  g_variant_get (changed_properties, "a{sv}", &iter);
  while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
    {
      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_fan_interface_info.parent_struct, key);
      g_datalist_remove_data (&proxy->priv->qdata, key);
      if (info != NULL)
        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
    }
  g_variant_iter_free (iter);
  for (n = 0; invalidated_properties[n] != NULL; n++)
    {
      info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_fan_interface_info.parent_struct, invalidated_properties[n]);
      g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
      if (info != NULL)
        g_object_notify (G_OBJECT (proxy), info->hyphen_name);
    }
}

static gint 
fru_fan_proxy_get_speed (FruFan *object)
{
  FruFanProxy *proxy = FRU_FAN_PROXY (object);
  GVariant *variant;
  gint value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "speed");
  if (variant != NULL)
    {
      value = g_variant_get_int32 (variant);
      g_variant_unref (variant);
    }
  return value;
}

static gint 
fru_fan_proxy_get_cooling_zone (FruFan *object)
{
  FruFanProxy *proxy = FRU_FAN_PROXY (object);
  GVariant *variant;
  gint value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "cooling_zone");
  if (variant != NULL)
    {
      value = g_variant_get_int32 (variant);
      g_variant_unref (variant);
    }
  return value;
}

static void
fru_fan_proxy_init (FruFanProxy *proxy)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  proxy->priv = fru_fan_proxy_get_instance_private (proxy);
#else
  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_FRU_FAN_PROXY, FruFanProxyPrivate);
#endif

  g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), fru_fan_interface_info ());
}

static void
fru_fan_proxy_class_init (FruFanProxyClass *klass)
{
  GObjectClass *gobject_class;
  GDBusProxyClass *proxy_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize     = fru_fan_proxy_finalize;
  gobject_class->get_property = fru_fan_proxy_get_property;
  gobject_class->set_property = fru_fan_proxy_set_property;

  proxy_class = G_DBUS_PROXY_CLASS (klass);
  proxy_class->g_signal = fru_fan_proxy_g_signal;
  proxy_class->g_properties_changed = fru_fan_proxy_g_properties_changed;

  fru_fan_override_properties (gobject_class, 1);

#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
  g_type_class_add_private (klass, sizeof (FruFanProxyPrivate));
#endif
}

static void
fru_fan_proxy_iface_init (FruFanIface *iface)
{
  iface->get_speed = fru_fan_proxy_get_speed;
  iface->get_cooling_zone = fru_fan_proxy_get_cooling_zone;
}

/**
 * fru_fan_proxy_new:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link>. See g_dbus_proxy_new() for more details.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_fan_proxy_new_finish() to get the result of the operation.
 *
 * See fru_fan_proxy_new_sync() for the synchronous, blocking version of this constructor.
 */
void
fru_fan_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data)
{
  g_async_initable_new_async (TYPE_FRU_FAN_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", "org.openbmc.Fru.Fan", NULL);
}

/**
 * fru_fan_proxy_new_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_fan_proxy_new().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with fru_fan_proxy_new().
 *
 * Returns: (transfer full) (type FruFanProxy): The constructed proxy object or %NULL if @error is set.
 */
FruFan *
fru_fan_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return FRU_FAN (ret);
  else
    return NULL;
}

/**
 * fru_fan_proxy_new_sync:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Synchronously creates a proxy for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link>. See g_dbus_proxy_new_sync() for more details.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See fru_fan_proxy_new() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type FruFanProxy): The constructed proxy object or %NULL if @error is set.
 */
FruFan *
fru_fan_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error)
{
  GInitable *ret;
  ret = g_initable_new (TYPE_FRU_FAN_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.Fru.Fan", NULL);
  if (ret != NULL)
    return FRU_FAN (ret);
  else
    return NULL;
}


/**
 * fru_fan_proxy_new_for_bus:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Like fru_fan_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call fru_fan_proxy_new_for_bus_finish() to get the result of the operation.
 *
 * See fru_fan_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
 */
void
fru_fan_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data)
{
  g_async_initable_new_async (TYPE_FRU_FAN_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", "org.openbmc.Fru.Fan", NULL);
}

/**
 * fru_fan_proxy_new_for_bus_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_fan_proxy_new_for_bus().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with fru_fan_proxy_new_for_bus().
 *
 * Returns: (transfer full) (type FruFanProxy): The constructed proxy object or %NULL if @error is set.
 */
FruFan *
fru_fan_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return FRU_FAN (ret);
  else
    return NULL;
}

/**
 * fru_fan_proxy_new_for_bus_sync:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusProxyFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Like fru_fan_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See fru_fan_proxy_new_for_bus() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type FruFanProxy): The constructed proxy object or %NULL if @error is set.
 */
FruFan *
fru_fan_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error)
{
  GInitable *ret;
  ret = g_initable_new (TYPE_FRU_FAN_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.openbmc.Fru.Fan", NULL);
  if (ret != NULL)
    return FRU_FAN (ret);
  else
    return NULL;
}


/* ------------------------------------------------------------------------ */

/**
 * FruFanSkeleton:
 *
 * The #FruFanSkeleton structure contains only private data and should only be accessed using the provided API.
 */

/**
 * FruFanSkeletonClass:
 * @parent_class: The parent class.
 *
 * Class structure for #FruFanSkeleton.
 */

struct _FruFanSkeletonPrivate
{
  GValue *properties;
  GList *changed_properties;
  GSource *changed_properties_idle_source;
  GMainContext *context;
  GMutex lock;
};

static void
_fru_fan_skeleton_handle_method_call (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name,
  const gchar *method_name,
  GVariant *parameters,
  GDBusMethodInvocation *invocation,
  gpointer user_data)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (user_data);
  _ExtendedGDBusMethodInfo *info;
  GVariantIter iter;
  GVariant *child;
  GValue *paramv;
  guint num_params;
  guint num_extra;
  guint n;
  guint signal_id;
  GValue return_value = G_VALUE_INIT;
  info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
  g_assert (info != NULL);
  num_params = g_variant_n_children (parameters);
  num_extra = info->pass_fdlist ? 3 : 2;  paramv = g_new0 (GValue, num_params + num_extra);
  n = 0;
  g_value_init (&paramv[n], TYPE_FRU_FAN);
  g_value_set_object (&paramv[n++], skeleton);
  g_value_init (&paramv[n], G_TYPE_DBUS_METHOD_INVOCATION);
  g_value_set_object (&paramv[n++], invocation);
  if (info->pass_fdlist)
    {
#ifdef G_OS_UNIX
      g_value_init (&paramv[n], G_TYPE_UNIX_FD_LIST);
      g_value_set_object (&paramv[n++], g_dbus_message_get_unix_fd_list (g_dbus_method_invocation_get_message (invocation)));
#else
      g_assert_not_reached ();
#endif
    }
  g_variant_iter_init (&iter, parameters);
  while ((child = g_variant_iter_next_value (&iter)) != NULL)
    {
      _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
      if (arg_info->use_gvariant)
        {
          g_value_init (&paramv[n], G_TYPE_VARIANT);
          g_value_set_variant (&paramv[n], child);
          n++;
        }
      else
        g_dbus_gvariant_to_gvalue (child, &paramv[n++]);
      g_variant_unref (child);
    }
  signal_id = g_signal_lookup (info->signal_name, TYPE_FRU_FAN);
  g_value_init (&return_value, G_TYPE_BOOLEAN);
  g_signal_emitv (paramv, signal_id, 0, &return_value);
  if (!g_value_get_boolean (&return_value))
    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);
  g_value_unset (&return_value);
  for (n = 0; n < num_params + num_extra; n++)
    g_value_unset (&paramv[n]);
  g_free (paramv);
}

static GVariant *
_fru_fan_skeleton_handle_get_property (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name G_GNUC_UNUSED,
  const gchar *property_name,
  GError **error,
  gpointer user_data)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (user_data);
  GValue value = G_VALUE_INIT;
  GParamSpec *pspec;
  _ExtendedGDBusPropertyInfo *info;
  GVariant *ret;
  ret = NULL;
  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_fan_interface_info.parent_struct, property_name);
  g_assert (info != NULL);
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
  if (pspec == NULL)
    {
      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
    }
  else
    {
      g_value_init (&value, pspec->value_type);
      g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
      ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
      g_value_unset (&value);
    }
  return ret;
}

static gboolean
_fru_fan_skeleton_handle_set_property (
  GDBusConnection *connection G_GNUC_UNUSED,
  const gchar *sender G_GNUC_UNUSED,
  const gchar *object_path G_GNUC_UNUSED,
  const gchar *interface_name G_GNUC_UNUSED,
  const gchar *property_name,
  GVariant *variant,
  GError **error,
  gpointer user_data)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (user_data);
  GValue value = G_VALUE_INIT;
  GParamSpec *pspec;
  _ExtendedGDBusPropertyInfo *info;
  gboolean ret;
  ret = FALSE;
  info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *) &_fru_fan_interface_info.parent_struct, property_name);
  g_assert (info != NULL);
  pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
  if (pspec == NULL)
    {
      g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s", property_name);
    }
  else
    {
      if (info->use_gvariant)
        g_value_set_variant (&value, variant);
      else
        g_dbus_gvariant_to_gvalue (variant, &value);
      g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
      g_value_unset (&value);
      ret = TRUE;
    }
  return ret;
}

static const GDBusInterfaceVTable _fru_fan_skeleton_vtable =
{
  _fru_fan_skeleton_handle_method_call,
  _fru_fan_skeleton_handle_get_property,
  _fru_fan_skeleton_handle_set_property,
  {NULL}
};

static GDBusInterfaceInfo *
fru_fan_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return fru_fan_interface_info ();
}

static GDBusInterfaceVTable *
fru_fan_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return (GDBusInterfaceVTable *) &_fru_fan_skeleton_vtable;
}

static GVariant *
fru_fan_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (_skeleton);

  GVariantBuilder builder;
  guint n;
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
  if (_fru_fan_interface_info.parent_struct.properties == NULL)
    goto out;
  for (n = 0; _fru_fan_interface_info.parent_struct.properties[n] != NULL; n++)
    {
      GDBusPropertyInfo *info = _fru_fan_interface_info.parent_struct.properties[n];
      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
        {
          GVariant *value;
          value = _fru_fan_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)), "org.openbmc.Fru.Fan", info->name, NULL, skeleton);
          if (value != NULL)
            {
              g_variant_take_ref (value);
              g_variant_builder_add (&builder, "{sv}", info->name, value);
              g_variant_unref (value);
            }
        }
    }
out:
  return g_variant_builder_end (&builder);
}

static gboolean _fru_fan_emit_changed (gpointer user_data);

static void
fru_fan_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (_skeleton);
  gboolean emit_changed = FALSE;

  g_mutex_lock (&skeleton->priv->lock);
  if (skeleton->priv->changed_properties_idle_source != NULL)
    {
      g_source_destroy (skeleton->priv->changed_properties_idle_source);
      skeleton->priv->changed_properties_idle_source = NULL;
      emit_changed = TRUE;
    }
  g_mutex_unlock (&skeleton->priv->lock);

  if (emit_changed)
    _fru_fan_emit_changed (skeleton);
}

static void
_fru_fan_on_signal_speed_changed (
    FruFan *object,
    gint arg_speed)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("(i)",
                   arg_speed));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.Fru.Fan", "SpeedChanged",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void
_fru_fan_on_signal_tach_error (
    FruFan *object)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);

  GList      *connections, *l;
  GVariant   *signal_variant;
  connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));

  signal_variant = g_variant_ref_sink (g_variant_new ("()"));
  for (l = connections; l != NULL; l = l->next)
    {
      GDBusConnection *connection = l->data;
      g_dbus_connection_emit_signal (connection,
        NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)), "org.openbmc.Fru.Fan", "TachError",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void fru_fan_skeleton_iface_init (FruFanIface *iface);
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (FruFanSkeleton, fru_fan_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_ADD_PRIVATE (FruFanSkeleton)
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_FAN, fru_fan_skeleton_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (FruFanSkeleton, fru_fan_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_FAN, fru_fan_skeleton_iface_init));

#endif
static void
fru_fan_skeleton_finalize (GObject *object)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  guint n;
  for (n = 0; n < 2; n++)
    g_value_unset (&skeleton->priv->properties[n]);
  g_free (skeleton->priv->properties);
  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
  if (skeleton->priv->changed_properties_idle_source != NULL)
    g_source_destroy (skeleton->priv->changed_properties_idle_source);
  g_main_context_unref (skeleton->priv->context);
  g_mutex_clear (&skeleton->priv->lock);
  G_OBJECT_CLASS (fru_fan_skeleton_parent_class)->finalize (object);
}

static void
fru_fan_skeleton_get_property (GObject      *object,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  g_assert (prop_id != 0 && prop_id - 1 < 2);
  g_mutex_lock (&skeleton->priv->lock);
  g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
  g_mutex_unlock (&skeleton->priv->lock);
}

static gboolean
_fru_fan_emit_changed (gpointer user_data)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (user_data);
  GList *l;
  GVariantBuilder builder;
  GVariantBuilder invalidated_builder;
  guint num_changes;

  g_mutex_lock (&skeleton->priv->lock);
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
  g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
  for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
    {
      ChangedProperty *cp = l->data;
      GVariant *variant;
      const GValue *cur_value;

      cur_value = &skeleton->priv->properties[cp->prop_id - 1];
      if (!_g_value_equal (cur_value, &cp->orig_value))
        {
          variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE (cp->info->parent_struct.signature));
          g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
          g_variant_unref (variant);
          num_changes++;
        }
    }
  if (num_changes > 0)
    {
      GList *connections, *ll;
      GVariant *signal_variant;
      signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.openbmc.Fru.Fan",
                                           &builder, &invalidated_builder));
      connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
      for (ll = connections; ll != NULL; ll = ll->next)
        {
          GDBusConnection *connection = ll->data;

          g_dbus_connection_emit_signal (connection,
                                         NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
                                         "org.freedesktop.DBus.Properties",
                                         "PropertiesChanged",
                                         signal_variant,
                                         NULL);
        }
      g_variant_unref (signal_variant);
      g_list_free_full (connections, g_object_unref);
    }
  else
    {
      g_variant_builder_clear (&builder);
      g_variant_builder_clear (&invalidated_builder);
    }
  g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
  skeleton->priv->changed_properties = NULL;
  skeleton->priv->changed_properties_idle_source = NULL;
  g_mutex_unlock (&skeleton->priv->lock);
  return FALSE;
}

static void
_fru_fan_schedule_emit_changed (FruFanSkeleton *skeleton, const _ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
{
  ChangedProperty *cp;
  GList *l;
  cp = NULL;
  for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
    {
      ChangedProperty *i_cp = l->data;
      if (i_cp->info == info)
        {
          cp = i_cp;
          break;
        }
    }
  if (cp == NULL)
    {
      cp = g_new0 (ChangedProperty, 1);
      cp->prop_id = prop_id;
      cp->info = info;
      skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
      g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
      g_value_copy (orig_value, &cp->orig_value);
    }
}

static void
fru_fan_skeleton_notify (GObject      *object,
  GParamSpec *pspec G_GNUC_UNUSED)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  g_mutex_lock (&skeleton->priv->lock);
  if (skeleton->priv->changed_properties != NULL &&
      skeleton->priv->changed_properties_idle_source == NULL)
    {
      skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
      g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
      g_source_set_callback (skeleton->priv->changed_properties_idle_source, _fru_fan_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
      g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
      g_source_unref (skeleton->priv->changed_properties_idle_source);
    }
  g_mutex_unlock (&skeleton->priv->lock);
}

static void
fru_fan_skeleton_set_property (GObject      *object,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  g_assert (prop_id != 0 && prop_id - 1 < 2);
  g_mutex_lock (&skeleton->priv->lock);
  g_object_freeze_notify (object);
  if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
    {
      if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
        _fru_fan_schedule_emit_changed (skeleton, _fru_fan_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
      g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
      g_object_notify_by_pspec (object, pspec);
    }
  g_mutex_unlock (&skeleton->priv->lock);
  g_object_thaw_notify (object);
}

static void
fru_fan_skeleton_init (FruFanSkeleton *skeleton)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  skeleton->priv = fru_fan_skeleton_get_instance_private (skeleton);
#else
  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_FRU_FAN_SKELETON, FruFanSkeletonPrivate);
#endif

  g_mutex_init (&skeleton->priv->lock);
  skeleton->priv->context = g_main_context_ref_thread_default ();
  skeleton->priv->properties = g_new0 (GValue, 2);
  g_value_init (&skeleton->priv->properties[0], G_TYPE_INT);
  g_value_init (&skeleton->priv->properties[1], G_TYPE_INT);
}

static gint 
fru_fan_skeleton_get_speed (FruFan *object)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  gint value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_int (&(skeleton->priv->properties[0]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static gint 
fru_fan_skeleton_get_cooling_zone (FruFan *object)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  gint value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_int (&(skeleton->priv->properties[1]));
  g_mutex_unlock (&skeleton->priv->lock);
  return value;
}

static void
fru_fan_skeleton_class_init (FruFanSkeletonClass *klass)
{
  GObjectClass *gobject_class;
  GDBusInterfaceSkeletonClass *skeleton_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize = fru_fan_skeleton_finalize;
  gobject_class->get_property = fru_fan_skeleton_get_property;
  gobject_class->set_property = fru_fan_skeleton_set_property;
  gobject_class->notify       = fru_fan_skeleton_notify;


  fru_fan_override_properties (gobject_class, 1);

  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
  skeleton_class->get_info = fru_fan_skeleton_dbus_interface_get_info;
  skeleton_class->get_properties = fru_fan_skeleton_dbus_interface_get_properties;
  skeleton_class->flush = fru_fan_skeleton_dbus_interface_flush;
  skeleton_class->get_vtable = fru_fan_skeleton_dbus_interface_get_vtable;

#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
  g_type_class_add_private (klass, sizeof (FruFanSkeletonPrivate));
#endif
}

static void
fru_fan_skeleton_iface_init (FruFanIface *iface)
{
  iface->speed_changed = _fru_fan_on_signal_speed_changed;
  iface->tach_error = _fru_fan_on_signal_tach_error;
  iface->get_speed = fru_fan_skeleton_get_speed;
  iface->get_cooling_zone = fru_fan_skeleton_get_cooling_zone;
}

/**
 * fru_fan_skeleton_new:
 *
 * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link>.
 *
 * Returns: (transfer full) (type FruFanSkeleton): The skeleton object.
 */
FruFan *
fru_fan_skeleton_new (void)
{
  return FRU_FAN (g_object_new (TYPE_FRU_FAN_SKELETON, NULL));
}

/* ------------------------------------------------------------------------
 * Code for Object, ObjectProxy and ObjectSkeleton
 * ------------------------------------------------------------------------
 */

/**
 * SECTION:Object
 * @title: Object
 * @short_description: Specialized GDBusObject types
 *
 * This section contains the #Object, #ObjectProxy, and #ObjectSkeleton types which make it easier to work with objects implementing generated types for D-Bus interfaces.
 */

/**
 * Object:
 *
 * The #Object type is a specialized container of interfaces.
 */

/**
 * ObjectIface:
 * @parent_iface: The parent interface.
 *
 * Virtual table for the #Object interface.
 */

typedef ObjectIface ObjectInterface;
G_DEFINE_INTERFACE_WITH_CODE (Object, object, G_TYPE_OBJECT, g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT));

static void
object_default_init (ObjectIface *iface)
{
  /**
   * Object:fru:
   *
   * The #Fru instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link>, if any.
   *
   * Connect to the #GObject::notify signal to get informed of property changes.
   */
  g_object_interface_install_property (iface, g_param_spec_object ("fru", "fru", "fru", TYPE_FRU, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));

  /**
   * Object:fru-fan:
   *
   * The #FruFan instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link>, if any.
   *
   * Connect to the #GObject::notify signal to get informed of property changes.
   */
  g_object_interface_install_property (iface, g_param_spec_object ("fru-fan", "fru-fan", "fru-fan", TYPE_FRU_FAN, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));

}

/**
 * object_get_fru:
 * @object: A #Object.
 *
 * Gets the #Fru instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link> on @object, if any.
 *
 * Returns: (transfer full): A #Fru that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
 */
Fru *object_get_fru (Object *object)
{
  GDBusInterface *ret;
  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru");
  if (ret == NULL)
    return NULL;
  return FRU (ret);
}

/**
 * object_get_fru_fan:
 * @object: A #Object.
 *
 * Gets the #FruFan instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link> on @object, if any.
 *
 * Returns: (transfer full): A #FruFan that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
 */
FruFan *object_get_fru_fan (Object *object)
{
  GDBusInterface *ret;
  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Fan");
  if (ret == NULL)
    return NULL;
  return FRU_FAN (ret);
}


/**
 * object_peek_fru: (skip)
 * @object: A #Object.
 *
 * Like object_get_fru() but doesn't increase the reference count on the returned object.
 *
 * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
 *
 * Returns: (transfer none): A #Fru or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
 */
Fru *object_peek_fru (Object *object)
{
  GDBusInterface *ret;
  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru");
  if (ret == NULL)
    return NULL;
  g_object_unref (ret);
  return FRU (ret);
}

/**
 * object_peek_fru_fan: (skip)
 * @object: A #Object.
 *
 * Like object_get_fru_fan() but doesn't increase the reference count on the returned object.
 *
 * <warning>It is not safe to use the returned object if you are on another thread than the one where the #GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
 *
 * Returns: (transfer none): A #FruFan or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
 */
FruFan *object_peek_fru_fan (Object *object)
{
  GDBusInterface *ret;
  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Fan");
  if (ret == NULL)
    return NULL;
  g_object_unref (ret);
  return FRU_FAN (ret);
}


static void
object_notify (GDBusObject *object, GDBusInterface *interface)
{
  _ExtendedGDBusInterfaceInfo *info = (_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info (interface);
  /* info can be NULL if the other end is using a D-Bus interface we don't know
   * anything about, for example old generated code in this process talking to
   * newer generated code in the other process. */
  if (info != NULL)
    g_object_notify (G_OBJECT (object), info->hyphen_name);
}

/**
 * ObjectProxy:
 *
 * The #ObjectProxy structure contains only private data and should only be accessed using the provided API.
 */

/**
 * ObjectProxyClass:
 * @parent_class: The parent class.
 *
 * Class structure for #ObjectProxy.
 */

static void
object_proxy__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
{
}

static void
object_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)
{
  iface->interface_added = object_notify;
  iface->interface_removed = object_notify;
}


G_DEFINE_TYPE_WITH_CODE (ObjectProxy, object_proxy, G_TYPE_DBUS_OBJECT_PROXY,
                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_proxy__object_iface_init)
                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_proxy__g_dbus_object_iface_init));

static void
object_proxy_init (ObjectProxy *object G_GNUC_UNUSED)
{
}

static void
object_proxy_set_property (GObject      *gobject,
  guint         prop_id,
  const GValue *value G_GNUC_UNUSED,
  GParamSpec   *pspec)
{
  G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
}

static void
object_proxy_get_property (GObject      *gobject,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec)
{
  ObjectProxy *object = OBJECT_PROXY (gobject);
  GDBusInterface *interface;

  switch (prop_id)
    {
    case 1:
      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru");
      g_value_take_object (value, interface);
      break;

    case 2:
      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Fan");
      g_value_take_object (value, interface);
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
      break;
  }
}

static void
object_proxy_class_init (ObjectProxyClass *klass)
{
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);

  gobject_class->set_property = object_proxy_set_property;
  gobject_class->get_property = object_proxy_get_property;

  g_object_class_override_property (gobject_class, 1, "fru");
  g_object_class_override_property (gobject_class, 2, "fru-fan");
}

/**
 * object_proxy_new:
 * @connection: A #GDBusConnection.
 * @object_path: An object path.
 *
 * Creates a new proxy object.
 *
 * Returns: (transfer full): The proxy object.
 */
ObjectProxy *
object_proxy_new (GDBusConnection *connection,
  const gchar *object_path)
{
  g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
  return OBJECT_PROXY (g_object_new (TYPE_OBJECT_PROXY, "g-connection", connection, "g-object-path", object_path, NULL));
}

/**
 * ObjectSkeleton:
 *
 * The #ObjectSkeleton structure contains only private data and should only be accessed using the provided API.
 */

/**
 * ObjectSkeletonClass:
 * @parent_class: The parent class.
 *
 * Class structure for #ObjectSkeleton.
 */

static void
object_skeleton__object_iface_init (ObjectIface *iface G_GNUC_UNUSED)
{
}


static void
object_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)
{
  iface->interface_added = object_notify;
  iface->interface_removed = object_notify;
}

G_DEFINE_TYPE_WITH_CODE (ObjectSkeleton, object_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,
                         G_IMPLEMENT_INTERFACE (TYPE_OBJECT, object_skeleton__object_iface_init)
                         G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT, object_skeleton__g_dbus_object_iface_init));

static void
object_skeleton_init (ObjectSkeleton *object G_GNUC_UNUSED)
{
}

static void
object_skeleton_set_property (GObject      *gobject,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec)
{
  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
  GDBusInterfaceSkeleton *interface;

  switch (prop_id)
    {
    case 1:
      interface = g_value_get_object (value);
      if (interface != NULL)
        {
          g_warn_if_fail (IS_FRU (interface));
          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
        }
      else
        {
          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.openbmc.Fru");
        }
      break;

    case 2:
      interface = g_value_get_object (value);
      if (interface != NULL)
        {
          g_warn_if_fail (IS_FRU_FAN (interface));
          g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
        }
      else
        {
          g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object), "org.openbmc.Fru.Fan");
        }
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
      break;
  }
}

static void
object_skeleton_get_property (GObject      *gobject,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec)
{
  ObjectSkeleton *object = OBJECT_SKELETON (gobject);
  GDBusInterface *interface;

  switch (prop_id)
    {
    case 1:
      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru");
      g_value_take_object (value, interface);
      break;

    case 2:
      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Fan");
      g_value_take_object (value, interface);
      break;

    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
      break;
  }
}

static void
object_skeleton_class_init (ObjectSkeletonClass *klass)
{
  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);

  gobject_class->set_property = object_skeleton_set_property;
  gobject_class->get_property = object_skeleton_get_property;

  g_object_class_override_property (gobject_class, 1, "fru");
  g_object_class_override_property (gobject_class, 2, "fru-fan");
}

/**
 * object_skeleton_new:
 * @object_path: An object path.
 *
 * Creates a new skeleton object.
 *
 * Returns: (transfer full): The skeleton object.
 */
ObjectSkeleton *
object_skeleton_new (const gchar *object_path)
{
  g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
  return OBJECT_SKELETON (g_object_new (TYPE_OBJECT_SKELETON, "g-object-path", object_path, NULL));
}

/**
 * object_skeleton_set_fru:
 * @object: A #ObjectSkeleton.
 * @interface_: (allow-none): A #Fru or %NULL to clear the interface.
 *
 * Sets the #Fru instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru.top_of_page">org.openbmc.Fru</link> on @object.
 */
void object_skeleton_set_fru (ObjectSkeleton *object, Fru *interface_)
{
  g_object_set (G_OBJECT (object), "fru", interface_, NULL);
}

/**
 * object_skeleton_set_fru_fan:
 * @object: A #ObjectSkeleton.
 * @interface_: (allow-none): A #FruFan or %NULL to clear the interface.
 *
 * Sets the #FruFan instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Fan.top_of_page">org.openbmc.Fru.Fan</link> on @object.
 */
void object_skeleton_set_fru_fan (ObjectSkeleton *object, FruFan *interface_)
{
  g_object_set (G_OBJECT (object), "fru-fan", interface_, NULL);
}


/* ------------------------------------------------------------------------
 * Code for ObjectManager client
 * ------------------------------------------------------------------------
 */

/**
 * SECTION:ObjectManagerClient
 * @title: ObjectManagerClient
 * @short_description: Generated GDBusObjectManagerClient type
 *
 * This section contains a #GDBusObjectManagerClient that uses object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.
 */

/**
 * ObjectManagerClient:
 *
 * The #ObjectManagerClient structure contains only private data and should only be accessed using the provided API.
 */

/**
 * ObjectManagerClientClass:
 * @parent_class: The parent class.
 *
 * Class structure for #ObjectManagerClient.
 */

G_DEFINE_TYPE (ObjectManagerClient, object_manager_client, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT);

static void
object_manager_client_init (ObjectManagerClient *manager G_GNUC_UNUSED)
{
}

static void
object_manager_client_class_init (ObjectManagerClientClass *klass G_GNUC_UNUSED)
{
}

/**
 * object_manager_client_get_proxy_type:
 * @manager: A #GDBusObjectManagerClient.
 * @object_path: The object path of the remote object (unused).
 * @interface_name: (allow-none): Interface name of the remote object or %NULL to get the object proxy #GType.
 * @user_data: User data (unused).
 *
 * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy<!-- -->- and #GDBusProxy<!-- -->-derived types.
 *
 * Returns: A #GDBusProxy<!-- -->-derived #GType if @interface_name is not %NULL, otherwise the #GType for #ObjectProxy.
 */
GType
object_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)
{
  static gsize once_init_value = 0;
  static GHashTable *lookup_hash;
  GType ret;

  if (interface_name == NULL)
    return TYPE_OBJECT_PROXY;
  if (g_once_init_enter (&once_init_value))
    {
      lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);
      g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.Fru", GSIZE_TO_POINTER (TYPE_FRU_PROXY));
      g_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.Fru.Fan", GSIZE_TO_POINTER (TYPE_FRU_FAN_PROXY));
      g_once_init_leave (&once_init_value, 1);
    }
  ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));
  if (ret == (GType) 0)
    ret = G_TYPE_DBUS_PROXY;
  return ret;
}

/**
 * object_manager_client_new:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Asynchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call object_manager_client_new_finish() to get the result of the operation.
 *
 * See object_manager_client_new_sync() for the synchronous, blocking version of this constructor.
 */
void
object_manager_client_new (
    GDBusConnection        *connection,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GAsyncReadyCallback     callback,
    gpointer                user_data)
{
  g_async_initable_new_async (TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable, callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
}

/**
 * object_manager_client_new_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with object_manager_client_new().
 *
 * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
 */
GDBusObjectManager *
object_manager_client_new_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return G_DBUS_OBJECT_MANAGER (ret);
  else
    return NULL;
}

/**
 * object_manager_client_new_sync:
 * @connection: A #GDBusConnection.
 * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
 * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus connection.
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Synchronously creates #GDBusObjectManagerClient using object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See object_manager_client_new() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
 */
GDBusObjectManager *
object_manager_client_new_sync (
    GDBusConnection        *connection,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GError                **error)
{
  GInitable *ret;
  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "connection", connection, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
  if (ret != NULL)
    return G_DBUS_OBJECT_MANAGER (ret);
  else
    return NULL;
}


/**
 * object_manager_client_new_for_bus:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
 * @user_data: User data to pass to @callback.
 *
 * Like object_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.
 *
 * When the operation is finished, @callback will be invoked in the <link linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling this method from.
 * You can then call object_manager_client_new_for_bus_finish() to get the result of the operation.
 *
 * See object_manager_client_new_for_bus_sync() for the synchronous, blocking version of this constructor.
 */
void
object_manager_client_new_for_bus (
    GBusType                bus_type,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GAsyncReadyCallback     callback,
    gpointer                user_data)
{
  g_async_initable_new_async (TYPE_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", object_manager_client_get_proxy_type, NULL);
}

/**
 * object_manager_client_new_for_bus_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to object_manager_client_new_for_bus().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with object_manager_client_new_for_bus().
 *
 * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
 */
GDBusObjectManager *
object_manager_client_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error)
{
  GObject *ret;
  GObject *source_object;
  source_object = g_async_result_get_source_object (res);
  ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
  g_object_unref (source_object);
  if (ret != NULL)
    return G_DBUS_OBJECT_MANAGER (ret);
  else
    return NULL;
}

/**
 * object_manager_client_new_for_bus_sync:
 * @bus_type: A #GBusType.
 * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
 * @name: A bus name (well-known or unique).
 * @object_path: An object path.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL
 *
 * Like object_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See object_manager_client_new_for_bus() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type ObjectManagerClient): The constructed object manager client or %NULL if @error is set.
 */
GDBusObjectManager *
object_manager_client_new_for_bus_sync (
    GBusType                bus_type,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GError                **error)
{
  GInitable *ret;
  ret = g_initable_new (TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func", object_manager_client_get_proxy_type, NULL);
  if (ret != NULL)
    return G_DBUS_OBJECT_MANAGER (ret);
  else
    return NULL;
}


