/*
 * 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 _ExtendedGDBusMethodInfo _fru_method_info_init =
{
  {
    -1,
    (gchar *) "init",
    NULL,
    NULL,
    NULL
  },
  "handle-init",
  FALSE
};

static const _ExtendedGDBusMethodInfo * const _fru_method_info_pointers[] =
{
  &_fru_method_info_init,
  NULL
};

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 _ExtendedGDBusArgInfo _fru_signal_info_cache_me_ARG_busname =
{
  {
    -1,
    (gchar *) "busname",
    (gchar *) "s",
    NULL
  },
  FALSE
};

static const _ExtendedGDBusArgInfo * const _fru_signal_info_cache_me_ARG_pointers[] =
{
  &_fru_signal_info_cache_me_ARG_busname,
  NULL
};

static const _ExtendedGDBusSignalInfo _fru_signal_info_cache_me =
{
  {
    -1,
    (gchar *) "CacheMe",
    (GDBusArgInfo **) &_fru_signal_info_cache_me_ARG_pointers,
    NULL
  },
  "cache-me"
};

static const _ExtendedGDBusSignalInfo * const _fru_signal_info_pointers[] =
{
  &_fru_signal_info_state_changed,
  &_fru_signal_info_unrecoverable_error,
  &_fru_signal_info_recoverable_error,
  &_fru_signal_info_cache_me,
  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",
    (GDBusMethodInfo **) &_fru_method_info_pointers,
    (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.
 * @handle_init: Handler for the #Fru::handle-init signal.
 * @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.
 * @cache_me: Handler for the #Fru::cache-me signal.
 * @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 incoming D-Bus method calls: */
  /**
   * Fru::handle-init:
   * @object: A #Fru.
   * @invocation: A #GDBusMethodInvocation.
   *
   * Signal emitted when a remote caller is invoking the <link linkend="gdbus-method-org-openbmc-Fru.init">init()</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_complete_init() 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-init",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruIface, handle_init),
    g_signal_accumulator_true_handled,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_BOOLEAN,
    1,
    G_TYPE_DBUS_METHOD_INVOCATION);

  /* 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);

  /**
   * Fru::cache-me:
   * @object: A #Fru.
   * @arg_busname: Argument.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru.CacheMe">"CacheMe"</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 ("cache-me",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruIface, cache_me),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    1, G_TYPE_STRING);

  /* 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");
}

/**
 * fru_emit_cache_me:
 * @object: A #Fru.
 * @arg_busname: Argument to pass with the signal.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru.CacheMe">"CacheMe"</link> D-Bus signal.
 */
void
fru_emit_cache_me (
    Fru *object,
    const gchar *arg_busname)
{
  g_signal_emit_by_name (object, "cache-me", arg_busname);
}

/**
 * fru_call_init:
 * @proxy: A #FruProxy.
 * @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.init">init()</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_call_init_finish() to get the result of the operation.
 *
 * See fru_call_init_sync() for the synchronous, blocking version of this method.
 */
void
fru_call_init (
    Fru *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data)
{
  g_dbus_proxy_call (G_DBUS_PROXY (proxy),
    "init",
    g_variant_new ("()"),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    cancellable,
    callback,
    user_data);
}

/**
 * fru_call_init_finish:
 * @proxy: A #FruProxy.
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_call_init().
 * @error: Return location for error or %NULL.
 *
 * Finishes an operation started with fru_call_init().
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_call_init_finish (
    Fru *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_call_init_sync:
 * @proxy: A #FruProxy.
 * @cancellable: (allow-none): A #GCancellable or %NULL.
 * @error: Return location for error or %NULL.
 *
 * Synchronously invokes the <link linkend="gdbus-method-org-openbmc-Fru.init">init()</link> D-Bus method on @proxy. The calling thread is blocked until a reply is received.
 *
 * See fru_call_init() for the asynchronous version of this method.
 *
 * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
 */
gboolean
fru_call_init_sync (
    Fru *proxy,
    GCancellable *cancellable,
    GError **error)
{
  GVariant *_ret;
  _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
    "init",
    g_variant_new ("()"),
    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_complete_init:
 * @object: A #Fru.
 * @invocation: (transfer full): A #GDBusMethodInvocation.
 *
 * Helper function used in service implementations to finish handling invocations of the <link linkend="gdbus-method-org-openbmc-Fru.init">init()</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_complete_init (
    Fru *object,
    GDBusMethodInvocation *invocation)
{
  g_dbus_method_invocation_return_value (invocation,
    g_variant_new ("()"));
}

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

/**
 * 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_on_signal_cache_me (
    Fru *object,
    const gchar *arg_busname)
{
  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 ("(s)",
                   arg_busname));
  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", "CacheMe",
        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->cache_me = _fru_on_signal_cache_me;
  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 _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,
  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 | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "speed",
  FALSE
};

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

static const _ExtendedGDBusPropertyInfo _fru_fan_property_info_pwm_num =
{
  {
    -1,
    (gchar *) "pwm_num",
    (gchar *) "i",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "pwm-num",
  FALSE
};

static const _ExtendedGDBusPropertyInfo * const _fru_fan_property_info_pointers[] =
{
  &_fru_fan_property_info_speed,
  &_fru_fan_property_info_cooling_zone,
  &_fru_fan_property_info_pwm_num,
  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");
  g_object_class_override_property (klass, property_id_begin++, "pwm-num");
  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_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_pwm_num: Getter for the #FruFan:pwm-num 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);

  /* 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 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_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 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_int ("cooling-zone", "cooling_zone", "cooling_zone", G_MININT32, G_MAXINT32, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * FruFan:pwm-num:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru-Fan.pwm_num">"pwm_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_int ("pwm-num", "pwm_num", "pwm_num", 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 both readable and writable, 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 both readable and writable, it is meaningful to use this function on both the client- and 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 both readable and writable, 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 both readable and writable, it is meaningful to use this function on both the client- and service-side.
 */
void
fru_fan_set_cooling_zone (FruFan *object, gint value)
{
  g_object_set (G_OBJECT (object), "cooling-zone", value, NULL);
}

/**
 * fru_fan_get_pwm_num: (skip)
 * @object: A #FruFan.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru-Fan.pwm_num">"pwm_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.
 */
gint 
fru_fan_get_pwm_num (FruFan *object)
{
  return FRU_FAN_GET_IFACE (object)->get_pwm_num (object);
}

/**
 * fru_fan_set_pwm_num: (skip)
 * @object: A #FruFan.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru-Fan.pwm_num">"pwm_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_fan_set_pwm_num (FruFan *object, gint value)
{
  g_object_set (G_OBJECT (object), "pwm-num", 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_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 ("()"));
}

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

/**
 * 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 < 3);
  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 < 3);
  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 gint 
fru_fan_proxy_get_pwm_num (FruFan *object)
{
  FruFanProxy *proxy = FRU_FAN_PROXY (object);
  GVariant *variant;
  gint value = 0;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "pwm_num");
  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;
  iface->get_pwm_num = fru_fan_proxy_get_pwm_num;
}

/**
 * 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 < 3; 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 < 3);
  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 < 3);
  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, 3);
  g_value_init (&skeleton->priv->properties[0], G_TYPE_INT);
  g_value_init (&skeleton->priv->properties[1], G_TYPE_INT);
  g_value_init (&skeleton->priv->properties[2], 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 gint 
fru_fan_skeleton_get_pwm_num (FruFan *object)
{
  FruFanSkeleton *skeleton = FRU_FAN_SKELETON (object);
  gint value;
  g_mutex_lock (&skeleton->priv->lock);
  value = g_value_get_int (&(skeleton->priv->properties[2]));
  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;
  iface->get_pwm_num = fru_fan_skeleton_get_pwm_num;
}

/**
 * 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 interface org.openbmc.Fru.Eeprom
 * ------------------------------------------------------------------------
 */

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

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

static const _ExtendedGDBusSignalInfo _fru_eeprom_signal_info_read_done =
{
  {
    -1,
    (gchar *) "ReadDone",
    NULL,
    NULL
  },
  "read-done"
};

static const _ExtendedGDBusSignalInfo * const _fru_eeprom_signal_info_pointers[] =
{
  &_fru_eeprom_signal_info_read_done,
  NULL
};

static const _ExtendedGDBusPropertyInfo _fru_eeprom_property_info_i2c_dev_path =
{
  {
    -1,
    (gchar *) "i2c_dev_path",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "i2c-dev-path",
  FALSE
};

static const _ExtendedGDBusPropertyInfo _fru_eeprom_property_info_i2c_address =
{
  {
    -1,
    (gchar *) "i2c_address",
    (gchar *) "s",
    G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE,
    NULL
  },
  "i2c-address",
  FALSE
};

static const _ExtendedGDBusPropertyInfo * const _fru_eeprom_property_info_pointers[] =
{
  &_fru_eeprom_property_info_i2c_dev_path,
  &_fru_eeprom_property_info_i2c_address,
  NULL
};

static const _ExtendedGDBusInterfaceInfo _fru_eeprom_interface_info =
{
  {
    -1,
    (gchar *) "org.openbmc.Fru.Eeprom",
    NULL,
    (GDBusSignalInfo **) &_fru_eeprom_signal_info_pointers,
    (GDBusPropertyInfo **) &_fru_eeprom_property_info_pointers,
    NULL
  },
  "fru-eeprom",
};


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

/**
 * fru_eeprom_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 #FruEeprom interface for a concrete class.
 * The properties are overridden in the order they are defined.
 *
 * Returns: The last property id.
 */
guint
fru_eeprom_override_properties (GObjectClass *klass, guint property_id_begin)
{
  g_object_class_override_property (klass, property_id_begin++, "i2c-dev-path");
  g_object_class_override_property (klass, property_id_begin++, "i2c-address");
  return property_id_begin - 1;
}



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

/**
 * FruEepromIface:
 * @parent_iface: The parent interface.
 * @get_i2c_address: Getter for the #FruEeprom:i2c-address property.
 * @get_i2c_dev_path: Getter for the #FruEeprom:i2c-dev-path property.
 * @read_done: Handler for the #FruEeprom::read-done signal.
 *
 * Virtual table for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</link>.
 */

typedef FruEepromIface FruEepromInterface;
G_DEFINE_INTERFACE (FruEeprom, fru_eeprom, G_TYPE_OBJECT);

static void
fru_eeprom_default_init (FruEepromIface *iface)
{
  /* GObject signals for received D-Bus signals: */
  /**
   * FruEeprom::read-done:
   * @object: A #FruEeprom.
   *
   * On the client-side, this signal is emitted whenever the D-Bus signal <link linkend="gdbus-signal-org-openbmc-Fru-Eeprom.ReadDone">"ReadDone"</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 ("read-done",
    G_TYPE_FROM_INTERFACE (iface),
    G_SIGNAL_RUN_LAST,
    G_STRUCT_OFFSET (FruEepromIface, read_done),
    NULL,
    NULL,
    g_cclosure_marshal_generic,
    G_TYPE_NONE,
    0);

  /* GObject properties for D-Bus properties: */
  /**
   * FruEeprom:i2c-dev-path:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_dev_path">"i2c_dev_path"</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 ("i2c-dev-path", "i2c_dev_path", "i2c_dev_path", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
  /**
   * FruEeprom:i2c-address:
   *
   * Represents the D-Bus property <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_address">"i2c_address"</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 ("i2c-address", "i2c_address", "i2c_address", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}

/**
 * fru_eeprom_get_i2c_dev_path: (skip)
 * @object: A #FruEeprom.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_dev_path">"i2c_dev_path"</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_eeprom_dup_i2c_dev_path() 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_eeprom_get_i2c_dev_path (FruEeprom *object)
{
  return FRU_EEPROM_GET_IFACE (object)->get_i2c_dev_path (object);
}

/**
 * fru_eeprom_dup_i2c_dev_path: (skip)
 * @object: A #FruEeprom.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_dev_path">"i2c_dev_path"</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_eeprom_dup_i2c_dev_path (FruEeprom *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "i2c-dev-path", &value, NULL);
  return value;
}

/**
 * fru_eeprom_set_i2c_dev_path: (skip)
 * @object: A #FruEeprom.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_dev_path">"i2c_dev_path"</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_eeprom_set_i2c_dev_path (FruEeprom *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "i2c-dev-path", value, NULL);
}

/**
 * fru_eeprom_get_i2c_address: (skip)
 * @object: A #FruEeprom.
 *
 * Gets the value of the <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_address">"i2c_address"</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_eeprom_dup_i2c_address() 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_eeprom_get_i2c_address (FruEeprom *object)
{
  return FRU_EEPROM_GET_IFACE (object)->get_i2c_address (object);
}

/**
 * fru_eeprom_dup_i2c_address: (skip)
 * @object: A #FruEeprom.
 *
 * Gets a copy of the <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_address">"i2c_address"</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_eeprom_dup_i2c_address (FruEeprom *object)
{
  gchar *value;
  g_object_get (G_OBJECT (object), "i2c-address", &value, NULL);
  return value;
}

/**
 * fru_eeprom_set_i2c_address: (skip)
 * @object: A #FruEeprom.
 * @value: The value to set.
 *
 * Sets the <link linkend="gdbus-property-org-openbmc-Fru-Eeprom.i2c_address">"i2c_address"</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_eeprom_set_i2c_address (FruEeprom *object, const gchar *value)
{
  g_object_set (G_OBJECT (object), "i2c-address", value, NULL);
}

/**
 * fru_eeprom_emit_read_done:
 * @object: A #FruEeprom.
 *
 * Emits the <link linkend="gdbus-signal-org-openbmc-Fru-Eeprom.ReadDone">"ReadDone"</link> D-Bus signal.
 */
void
fru_eeprom_emit_read_done (
    FruEeprom *object)
{
  g_signal_emit_by_name (object, "read-done");
}

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

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

/**
 * FruEepromProxyClass:
 * @parent_class: The parent class.
 *
 * Class structure for #FruEepromProxy.
 */

struct _FruEepromProxyPrivate
{
  GData *qdata;
};

static void fru_eeprom_proxy_iface_init (FruEepromIface *iface);

#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (FruEepromProxy, fru_eeprom_proxy, G_TYPE_DBUS_PROXY,
                         G_ADD_PRIVATE (FruEepromProxy)
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_EEPROM, fru_eeprom_proxy_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (FruEepromProxy, fru_eeprom_proxy, G_TYPE_DBUS_PROXY,
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_EEPROM, fru_eeprom_proxy_iface_init));

#endif
static void
fru_eeprom_proxy_finalize (GObject *object)
{
  FruEepromProxy *proxy = FRU_EEPROM_PROXY (object);
  g_datalist_clear (&proxy->priv->qdata);
  G_OBJECT_CLASS (fru_eeprom_proxy_parent_class)->finalize (object);
}

static void
fru_eeprom_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_eeprom_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_eeprom_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.Eeprom: %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_eeprom_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_eeprom_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.Eeprom", info->parent_struct.name, variant),
    G_DBUS_CALL_FLAGS_NONE,
    -1,
    NULL, (GAsyncReadyCallback) fru_eeprom_proxy_set_property_cb, (GDBusPropertyInfo *) &info->parent_struct);
  g_variant_unref (variant);
}

static void
fru_eeprom_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_eeprom_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_EEPROM);
  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_EEPROM);
  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_eeprom_proxy_g_properties_changed (GDBusProxy *_proxy,
  GVariant *changed_properties,
  const gchar *const *invalidated_properties)
{
  FruEepromProxy *proxy = FRU_EEPROM_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_eeprom_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_eeprom_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_eeprom_proxy_get_i2c_dev_path (FruEeprom *object)
{
  FruEepromProxy *proxy = FRU_EEPROM_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "i2c_dev_path");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static const gchar *
fru_eeprom_proxy_get_i2c_address (FruEeprom *object)
{
  FruEepromProxy *proxy = FRU_EEPROM_PROXY (object);
  GVariant *variant;
  const gchar *value = NULL;
  variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "i2c_address");
  if (variant != NULL)
    {
      value = g_variant_get_string (variant, NULL);
      g_variant_unref (variant);
    }
  return value;
}

static void
fru_eeprom_proxy_init (FruEepromProxy *proxy)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  proxy->priv = fru_eeprom_proxy_get_instance_private (proxy);
#else
  proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, TYPE_FRU_EEPROM_PROXY, FruEepromProxyPrivate);
#endif

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

static void
fru_eeprom_proxy_class_init (FruEepromProxyClass *klass)
{
  GObjectClass *gobject_class;
  GDBusProxyClass *proxy_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize     = fru_eeprom_proxy_finalize;
  gobject_class->get_property = fru_eeprom_proxy_get_property;
  gobject_class->set_property = fru_eeprom_proxy_set_property;

  proxy_class = G_DBUS_PROXY_CLASS (klass);
  proxy_class->g_signal = fru_eeprom_proxy_g_signal;
  proxy_class->g_properties_changed = fru_eeprom_proxy_g_properties_changed;

  fru_eeprom_override_properties (gobject_class, 1);

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

static void
fru_eeprom_proxy_iface_init (FruEepromIface *iface)
{
  iface->get_i2c_dev_path = fru_eeprom_proxy_get_i2c_dev_path;
  iface->get_i2c_address = fru_eeprom_proxy_get_i2c_address;
}

/**
 * fru_eeprom_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-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</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_eeprom_proxy_new_finish() to get the result of the operation.
 *
 * See fru_eeprom_proxy_new_sync() for the synchronous, blocking version of this constructor.
 */
void
fru_eeprom_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_EEPROM_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.Eeprom", NULL);
}

/**
 * fru_eeprom_proxy_new_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_eeprom_proxy_new().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with fru_eeprom_proxy_new().
 *
 * Returns: (transfer full) (type FruEepromProxy): The constructed proxy object or %NULL if @error is set.
 */
FruEeprom *
fru_eeprom_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_EEPROM (ret);
  else
    return NULL;
}

/**
 * fru_eeprom_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-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</link>. See g_dbus_proxy_new_sync() for more details.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See fru_eeprom_proxy_new() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type FruEepromProxy): The constructed proxy object or %NULL if @error is set.
 */
FruEeprom *
fru_eeprom_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_EEPROM_PROXY, cancellable, error, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.openbmc.Fru.Eeprom", NULL);
  if (ret != NULL)
    return FRU_EEPROM (ret);
  else
    return NULL;
}


/**
 * fru_eeprom_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_eeprom_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_eeprom_proxy_new_for_bus_finish() to get the result of the operation.
 *
 * See fru_eeprom_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
 */
void
fru_eeprom_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_EEPROM_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.Eeprom", NULL);
}

/**
 * fru_eeprom_proxy_new_for_bus_finish:
 * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to fru_eeprom_proxy_new_for_bus().
 * @error: Return location for error or %NULL
 *
 * Finishes an operation started with fru_eeprom_proxy_new_for_bus().
 *
 * Returns: (transfer full) (type FruEepromProxy): The constructed proxy object or %NULL if @error is set.
 */
FruEeprom *
fru_eeprom_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_EEPROM (ret);
  else
    return NULL;
}

/**
 * fru_eeprom_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_eeprom_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
 *
 * The calling thread is blocked until a reply is received.
 *
 * See fru_eeprom_proxy_new_for_bus() for the asynchronous version of this constructor.
 *
 * Returns: (transfer full) (type FruEepromProxy): The constructed proxy object or %NULL if @error is set.
 */
FruEeprom *
fru_eeprom_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_EEPROM_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.Eeprom", NULL);
  if (ret != NULL)
    return FRU_EEPROM (ret);
  else
    return NULL;
}


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

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

/**
 * FruEepromSkeletonClass:
 * @parent_class: The parent class.
 *
 * Class structure for #FruEepromSkeleton.
 */

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

static void
_fru_eeprom_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)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_EEPROM);
  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_EEPROM);
  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_eeprom_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)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_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_eeprom_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)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_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_eeprom_skeleton_vtable =
{
  _fru_eeprom_skeleton_handle_method_call,
  _fru_eeprom_skeleton_handle_get_property,
  _fru_eeprom_skeleton_handle_set_property,
  {NULL}
};

static GDBusInterfaceInfo *
fru_eeprom_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return fru_eeprom_interface_info ();
}

static GDBusInterfaceVTable *
fru_eeprom_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
{
  return (GDBusInterfaceVTable *) &_fru_eeprom_skeleton_vtable;
}

static GVariant *
fru_eeprom_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_SKELETON (_skeleton);

  GVariantBuilder builder;
  guint n;
  g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
  if (_fru_eeprom_interface_info.parent_struct.properties == NULL)
    goto out;
  for (n = 0; _fru_eeprom_interface_info.parent_struct.properties[n] != NULL; n++)
    {
      GDBusPropertyInfo *info = _fru_eeprom_interface_info.parent_struct.properties[n];
      if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
        {
          GVariant *value;
          value = _fru_eeprom_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.Eeprom", 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_eeprom_emit_changed (gpointer user_data);

static void
fru_eeprom_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_emit_changed (skeleton);
}

static void
_fru_eeprom_on_signal_read_done (
    FruEeprom *object)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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.Eeprom", "ReadDone",
        signal_variant, NULL);
    }
  g_variant_unref (signal_variant);
  g_list_free_full (connections, g_object_unref);
}

static void fru_eeprom_skeleton_iface_init (FruEepromIface *iface);
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
G_DEFINE_TYPE_WITH_CODE (FruEepromSkeleton, fru_eeprom_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_ADD_PRIVATE (FruEepromSkeleton)
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_EEPROM, fru_eeprom_skeleton_iface_init));

#else
G_DEFINE_TYPE_WITH_CODE (FruEepromSkeleton, fru_eeprom_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
                         G_IMPLEMENT_INTERFACE (TYPE_FRU_EEPROM, fru_eeprom_skeleton_iface_init));

#endif
static void
fru_eeprom_skeleton_finalize (GObject *object)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_skeleton_parent_class)->finalize (object);
}

static void
fru_eeprom_skeleton_get_property (GObject      *object,
  guint         prop_id,
  GValue       *value,
  GParamSpec   *pspec G_GNUC_UNUSED)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_emit_changed (gpointer user_data)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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.Eeprom",
                                           &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_eeprom_schedule_emit_changed (FruEepromSkeleton *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_eeprom_skeleton_notify (GObject      *object,
  GParamSpec *pspec G_GNUC_UNUSED)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_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_eeprom_skeleton_set_property (GObject      *object,
  guint         prop_id,
  const GValue *value,
  GParamSpec   *pspec)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_schedule_emit_changed (skeleton, _fru_eeprom_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_eeprom_skeleton_init (FruEepromSkeleton *skeleton)
{
#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
  skeleton->priv = fru_eeprom_skeleton_get_instance_private (skeleton);
#else
  skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, TYPE_FRU_EEPROM_SKELETON, FruEepromSkeletonPrivate);
#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_STRING);
  g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
}

static const gchar *
fru_eeprom_skeleton_get_i2c_dev_path (FruEeprom *object)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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_eeprom_skeleton_get_i2c_address (FruEeprom *object)
{
  FruEepromSkeleton *skeleton = FRU_EEPROM_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 void
fru_eeprom_skeleton_class_init (FruEepromSkeletonClass *klass)
{
  GObjectClass *gobject_class;
  GDBusInterfaceSkeletonClass *skeleton_class;

  gobject_class = G_OBJECT_CLASS (klass);
  gobject_class->finalize = fru_eeprom_skeleton_finalize;
  gobject_class->get_property = fru_eeprom_skeleton_get_property;
  gobject_class->set_property = fru_eeprom_skeleton_set_property;
  gobject_class->notify       = fru_eeprom_skeleton_notify;


  fru_eeprom_override_properties (gobject_class, 1);

  skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
  skeleton_class->get_info = fru_eeprom_skeleton_dbus_interface_get_info;
  skeleton_class->get_properties = fru_eeprom_skeleton_dbus_interface_get_properties;
  skeleton_class->flush = fru_eeprom_skeleton_dbus_interface_flush;
  skeleton_class->get_vtable = fru_eeprom_skeleton_dbus_interface_get_vtable;

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

static void
fru_eeprom_skeleton_iface_init (FruEepromIface *iface)
{
  iface->read_done = _fru_eeprom_on_signal_read_done;
  iface->get_i2c_dev_path = fru_eeprom_skeleton_get_i2c_dev_path;
  iface->get_i2c_address = fru_eeprom_skeleton_get_i2c_address;
}

/**
 * fru_eeprom_skeleton_new:
 *
 * Creates a skeleton object for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</link>.
 *
 * Returns: (transfer full) (type FruEepromSkeleton): The skeleton object.
 */
FruEeprom *
fru_eeprom_skeleton_new (void)
{
  return FRU_EEPROM (g_object_new (TYPE_FRU_EEPROM_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:fru-eeprom:
   *
   * The #FruEeprom instance corresponding to the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</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-eeprom", "fru-eeprom", "fru-eeprom", TYPE_FRU_EEPROM, 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_get_fru_eeprom:
 * @object: A #Object.
 *
 * Gets the #FruEeprom instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</link> on @object, if any.
 *
 * Returns: (transfer full): A #FruEeprom that must be freed with g_object_unref() or %NULL if @object does not implement the interface.
 */
FruEeprom *object_get_fru_eeprom (Object *object)
{
  GDBusInterface *ret;
  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Eeprom");
  if (ret == NULL)
    return NULL;
  return FRU_EEPROM (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);
}

/**
 * object_peek_fru_eeprom: (skip)
 * @object: A #Object.
 *
 * Like object_get_fru_eeprom() 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 #FruEeprom or %NULL if @object does not implement the interface. Do not free the returned object, it is owned by @object.
 */
FruEeprom *object_peek_fru_eeprom (Object *object)
{
  GDBusInterface *ret;
  ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Eeprom");
  if (ret == NULL)
    return NULL;
  g_object_unref (ret);
  return FRU_EEPROM (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;

    case 3:
      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Eeprom");
      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");
  g_object_class_override_property (gobject_class, 3, "fru-eeprom");
}

/**
 * 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;

    case 3:
      interface = g_value_get_object (value);
      if (interface != NULL)
        {
          g_warn_if_fail (IS_FRU_EEPROM (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.Eeprom");
        }
      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;

    case 3:
      interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.openbmc.Fru.Eeprom");
      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");
  g_object_class_override_property (gobject_class, 3, "fru-eeprom");
}

/**
 * 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);
}

/**
 * object_skeleton_set_fru_eeprom:
 * @object: A #ObjectSkeleton.
 * @interface_: (allow-none): A #FruEeprom or %NULL to clear the interface.
 *
 * Sets the #FruEeprom instance for the D-Bus interface <link linkend="gdbus-interface-org-openbmc-Fru-Eeprom.top_of_page">org.openbmc.Fru.Eeprom</link> on @object.
 */
void object_skeleton_set_fru_eeprom (ObjectSkeleton *object, FruEeprom *interface_)
{
  g_object_set (G_OBJECT (object), "fru-eeprom", 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_hash_table_insert (lookup_hash, (gpointer) "org.openbmc.Fru.Eeprom", GSIZE_TO_POINTER (TYPE_FRU_EEPROM_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;
}


