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

#ifndef __INTERFACES_SENSOR_H__
#define __INTERFACES_SENSOR_H__

#include <gio/gio.h>

G_BEGIN_DECLS


/* ------------------------------------------------------------------------ */
/* Declarations for org.openbmc.SensorInteger */

#define TYPE_SENSOR_INTEGER (sensor_integer_get_type ())
#define SENSOR_INTEGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER, SensorInteger))
#define IS_SENSOR_INTEGER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER))
#define SENSOR_INTEGER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_INTEGER, SensorIntegerIface))

struct _SensorInteger;
typedef struct _SensorInteger SensorInteger;
typedef struct _SensorIntegerIface SensorIntegerIface;

struct _SensorIntegerIface
{
  GTypeInterface parent_iface;



  gboolean (*handle_get_threshold_state) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_get_units) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_get_value) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_set_config_data) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    const gchar *const *arg_config);

  gboolean (*handle_set_poll_interval) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    gint arg_poll_interval);

  gboolean (*handle_set_thresholds) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    gint arg_lower_critical,
    gint arg_lower_warning,
    gint arg_upper_warning,
    gint arg_upper_critical);

  gint  (*get_changed_tolerance) (SensorInteger *object);

  const gchar *const * (*get_config_data) (SensorInteger *object);

  gint  (*get_poll_interval) (SensorInteger *object);

  gint  (*get_threshold_lower_critical) (SensorInteger *object);

  gint  (*get_threshold_lower_warning) (SensorInteger *object);

  gint  (*get_threshold_state) (SensorInteger *object);

  gint  (*get_threshold_upper_critical) (SensorInteger *object);

  gint  (*get_threshold_upper_warning) (SensorInteger *object);

  const gchar * (*get_units) (SensorInteger *object);

  gint  (*get_value) (SensorInteger *object);

  void (*changed) (
    SensorInteger *object,
    gint arg_value);

  void (*critical) (
    SensorInteger *object);

  void (*warning) (
    SensorInteger *object);

};

GType sensor_integer_get_type (void) G_GNUC_CONST;

GDBusInterfaceInfo *sensor_integer_interface_info (void);
guint sensor_integer_override_properties (GObjectClass *klass, guint property_id_begin);


/* D-Bus method call completion functions: */
void sensor_integer_complete_get_value (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    gint value);

void sensor_integer_complete_get_units (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    const gchar *units);

void sensor_integer_complete_set_thresholds (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

void sensor_integer_complete_set_poll_interval (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

void sensor_integer_complete_set_config_data (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

void sensor_integer_complete_get_threshold_state (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    gint threshold_state);



/* D-Bus signal emissions functions: */
void sensor_integer_emit_changed (
    SensorInteger *object,
    gint arg_value);

void sensor_integer_emit_warning (
    SensorInteger *object);

void sensor_integer_emit_critical (
    SensorInteger *object);



/* D-Bus method calls: */
void sensor_integer_call_get_value (
    SensorInteger *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_call_get_value_finish (
    SensorInteger *proxy,
    gint *out_value,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_call_get_value_sync (
    SensorInteger *proxy,
    gint *out_value,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_call_get_units (
    SensorInteger *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_call_get_units_finish (
    SensorInteger *proxy,
    gchar **out_units,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_call_get_units_sync (
    SensorInteger *proxy,
    gchar **out_units,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_call_set_thresholds (
    SensorInteger *proxy,
    gint arg_lower_critical,
    gint arg_lower_warning,
    gint arg_upper_warning,
    gint arg_upper_critical,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_call_set_thresholds_finish (
    SensorInteger *proxy,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_call_set_thresholds_sync (
    SensorInteger *proxy,
    gint arg_lower_critical,
    gint arg_lower_warning,
    gint arg_upper_warning,
    gint arg_upper_critical,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_call_set_poll_interval (
    SensorInteger *proxy,
    gint arg_poll_interval,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_call_set_poll_interval_finish (
    SensorInteger *proxy,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_call_set_poll_interval_sync (
    SensorInteger *proxy,
    gint arg_poll_interval,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_call_set_config_data (
    SensorInteger *proxy,
    const gchar *const *arg_config,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_call_set_config_data_finish (
    SensorInteger *proxy,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_call_set_config_data_sync (
    SensorInteger *proxy,
    const gchar *const *arg_config,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_call_get_threshold_state (
    SensorInteger *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_call_get_threshold_state_finish (
    SensorInteger *proxy,
    gint *out_threshold_state,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_call_get_threshold_state_sync (
    SensorInteger *proxy,
    gint *out_threshold_state,
    GCancellable *cancellable,
    GError **error);



/* D-Bus property accessors: */
gint sensor_integer_get_value (SensorInteger *object);
void sensor_integer_set_value (SensorInteger *object, gint value);

const gchar *sensor_integer_get_units (SensorInteger *object);
gchar *sensor_integer_dup_units (SensorInteger *object);
void sensor_integer_set_units (SensorInteger *object, const gchar *value);

gint sensor_integer_get_threshold_lower_critical (SensorInteger *object);
void sensor_integer_set_threshold_lower_critical (SensorInteger *object, gint value);

gint sensor_integer_get_threshold_lower_warning (SensorInteger *object);
void sensor_integer_set_threshold_lower_warning (SensorInteger *object, gint value);

gint sensor_integer_get_threshold_upper_warning (SensorInteger *object);
void sensor_integer_set_threshold_upper_warning (SensorInteger *object, gint value);

gint sensor_integer_get_threshold_upper_critical (SensorInteger *object);
void sensor_integer_set_threshold_upper_critical (SensorInteger *object, gint value);

gint sensor_integer_get_threshold_state (SensorInteger *object);
void sensor_integer_set_threshold_state (SensorInteger *object, gint value);

gint sensor_integer_get_poll_interval (SensorInteger *object);
void sensor_integer_set_poll_interval (SensorInteger *object, gint value);

const gchar *const *sensor_integer_get_config_data (SensorInteger *object);
gchar **sensor_integer_dup_config_data (SensorInteger *object);
void sensor_integer_set_config_data (SensorInteger *object, const gchar *const *value);

gint sensor_integer_get_changed_tolerance (SensorInteger *object);
void sensor_integer_set_changed_tolerance (SensorInteger *object, gint value);


/* ---- */

#define TYPE_SENSOR_INTEGER_PROXY (sensor_integer_proxy_get_type ())
#define SENSOR_INTEGER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_PROXY, SensorIntegerProxy))
#define SENSOR_INTEGER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_PROXY, SensorIntegerProxyClass))
#define SENSOR_INTEGER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_PROXY, SensorIntegerProxyClass))
#define IS_SENSOR_INTEGER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_PROXY))
#define IS_SENSOR_INTEGER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_PROXY))

typedef struct _SensorIntegerProxy SensorIntegerProxy;
typedef struct _SensorIntegerProxyClass SensorIntegerProxyClass;
typedef struct _SensorIntegerProxyPrivate SensorIntegerProxyPrivate;

struct _SensorIntegerProxy
{
  /*< private >*/
  GDBusProxy parent_instance;
  SensorIntegerProxyPrivate *priv;
};

struct _SensorIntegerProxyClass
{
  GDBusProxyClass parent_class;
};

GType sensor_integer_proxy_get_type (void) G_GNUC_CONST;

void sensor_integer_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorInteger *sensor_integer_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error);
SensorInteger *sensor_integer_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);

void sensor_integer_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorInteger *sensor_integer_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
SensorInteger *sensor_integer_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);


/* ---- */

#define TYPE_SENSOR_INTEGER_SKELETON (sensor_integer_skeleton_get_type ())
#define SENSOR_INTEGER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SKELETON, SensorIntegerSkeleton))
#define SENSOR_INTEGER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_SKELETON, SensorIntegerSkeletonClass))
#define SENSOR_INTEGER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_SKELETON, SensorIntegerSkeletonClass))
#define IS_SENSOR_INTEGER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SKELETON))
#define IS_SENSOR_INTEGER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_SKELETON))

typedef struct _SensorIntegerSkeleton SensorIntegerSkeleton;
typedef struct _SensorIntegerSkeletonClass SensorIntegerSkeletonClass;
typedef struct _SensorIntegerSkeletonPrivate SensorIntegerSkeletonPrivate;

struct _SensorIntegerSkeleton
{
  /*< private >*/
  GDBusInterfaceSkeleton parent_instance;
  SensorIntegerSkeletonPrivate *priv;
};

struct _SensorIntegerSkeletonClass
{
  GDBusInterfaceSkeletonClass parent_class;
};

GType sensor_integer_skeleton_get_type (void) G_GNUC_CONST;

SensorInteger *sensor_integer_skeleton_new (void);


/* ------------------------------------------------------------------------ */
/* Declarations for org.openbmc.SensorString */

#define TYPE_SENSOR_STRING (sensor_string_get_type ())
#define SENSOR_STRING(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_STRING, SensorString))
#define IS_SENSOR_STRING(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_STRING))
#define SENSOR_STRING_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_STRING, SensorStringIface))

struct _SensorString;
typedef struct _SensorString SensorString;
typedef struct _SensorStringIface SensorStringIface;

struct _SensorStringIface
{
  GTypeInterface parent_iface;



  gboolean (*handle_get_units) (
    SensorString *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_get_value) (
    SensorString *object,
    GDBusMethodInvocation *invocation);

  const gchar * (*get_units) (SensorString *object);

  gint  (*get_value) (SensorString *object);

  void (*changed) (
    SensorString *object,
    const gchar *arg_value);

};

GType sensor_string_get_type (void) G_GNUC_CONST;

GDBusInterfaceInfo *sensor_string_interface_info (void);
guint sensor_string_override_properties (GObjectClass *klass, guint property_id_begin);


/* D-Bus method call completion functions: */
void sensor_string_complete_get_value (
    SensorString *object,
    GDBusMethodInvocation *invocation,
    const gchar *value);

void sensor_string_complete_get_units (
    SensorString *object,
    GDBusMethodInvocation *invocation,
    const gchar *units);



/* D-Bus signal emissions functions: */
void sensor_string_emit_changed (
    SensorString *object,
    const gchar *arg_value);



/* D-Bus method calls: */
void sensor_string_call_get_value (
    SensorString *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_string_call_get_value_finish (
    SensorString *proxy,
    gchar **out_value,
    GAsyncResult *res,
    GError **error);

gboolean sensor_string_call_get_value_sync (
    SensorString *proxy,
    gchar **out_value,
    GCancellable *cancellable,
    GError **error);

void sensor_string_call_get_units (
    SensorString *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_string_call_get_units_finish (
    SensorString *proxy,
    gchar **out_units,
    GAsyncResult *res,
    GError **error);

gboolean sensor_string_call_get_units_sync (
    SensorString *proxy,
    gchar **out_units,
    GCancellable *cancellable,
    GError **error);



/* D-Bus property accessors: */
gint sensor_string_get_value (SensorString *object);
void sensor_string_set_value (SensorString *object, gint value);

const gchar *sensor_string_get_units (SensorString *object);
gchar *sensor_string_dup_units (SensorString *object);
void sensor_string_set_units (SensorString *object, const gchar *value);


/* ---- */

#define TYPE_SENSOR_STRING_PROXY (sensor_string_proxy_get_type ())
#define SENSOR_STRING_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_STRING_PROXY, SensorStringProxy))
#define SENSOR_STRING_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_STRING_PROXY, SensorStringProxyClass))
#define SENSOR_STRING_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_STRING_PROXY, SensorStringProxyClass))
#define IS_SENSOR_STRING_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_STRING_PROXY))
#define IS_SENSOR_STRING_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_STRING_PROXY))

typedef struct _SensorStringProxy SensorStringProxy;
typedef struct _SensorStringProxyClass SensorStringProxyClass;
typedef struct _SensorStringProxyPrivate SensorStringProxyPrivate;

struct _SensorStringProxy
{
  /*< private >*/
  GDBusProxy parent_instance;
  SensorStringProxyPrivate *priv;
};

struct _SensorStringProxyClass
{
  GDBusProxyClass parent_class;
};

GType sensor_string_proxy_get_type (void) G_GNUC_CONST;

void sensor_string_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorString *sensor_string_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error);
SensorString *sensor_string_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);

void sensor_string_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorString *sensor_string_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
SensorString *sensor_string_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);


/* ---- */

#define TYPE_SENSOR_STRING_SKELETON (sensor_string_skeleton_get_type ())
#define SENSOR_STRING_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_STRING_SKELETON, SensorStringSkeleton))
#define SENSOR_STRING_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_STRING_SKELETON, SensorStringSkeletonClass))
#define SENSOR_STRING_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_STRING_SKELETON, SensorStringSkeletonClass))
#define IS_SENSOR_STRING_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_STRING_SKELETON))
#define IS_SENSOR_STRING_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_STRING_SKELETON))

typedef struct _SensorStringSkeleton SensorStringSkeleton;
typedef struct _SensorStringSkeletonClass SensorStringSkeletonClass;
typedef struct _SensorStringSkeletonPrivate SensorStringSkeletonPrivate;

struct _SensorStringSkeleton
{
  /*< private >*/
  GDBusInterfaceSkeleton parent_instance;
  SensorStringSkeletonPrivate *priv;
};

struct _SensorStringSkeletonClass
{
  GDBusInterfaceSkeletonClass parent_class;
};

GType sensor_string_skeleton_get_type (void) G_GNUC_CONST;

SensorString *sensor_string_skeleton_new (void);


/* ------------------------------------------------------------------------ */
/* Declarations for org.openbmc.SensorIntegerSettable */

#define TYPE_SENSOR_INTEGER_SETTABLE (sensor_integer_settable_get_type ())
#define SENSOR_INTEGER_SETTABLE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SETTABLE, SensorIntegerSettable))
#define IS_SENSOR_INTEGER_SETTABLE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SETTABLE))
#define SENSOR_INTEGER_SETTABLE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_INTEGER_SETTABLE, SensorIntegerSettableIface))

struct _SensorIntegerSettable;
typedef struct _SensorIntegerSettable SensorIntegerSettable;
typedef struct _SensorIntegerSettableIface SensorIntegerSettableIface;

struct _SensorIntegerSettableIface
{
  GTypeInterface parent_iface;



  gboolean (*handle_get_units) (
    SensorIntegerSettable *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_get_value) (
    SensorIntegerSettable *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_set_value) (
    SensorIntegerSettable *object,
    GDBusMethodInvocation *invocation,
    gint arg_value);

  const gchar * (*get_units) (SensorIntegerSettable *object);

  gint  (*get_value) (SensorIntegerSettable *object);

  void (*changed) (
    SensorIntegerSettable *object,
    gint arg_value);

};

GType sensor_integer_settable_get_type (void) G_GNUC_CONST;

GDBusInterfaceInfo *sensor_integer_settable_interface_info (void);
guint sensor_integer_settable_override_properties (GObjectClass *klass, guint property_id_begin);


/* D-Bus method call completion functions: */
void sensor_integer_settable_complete_get_value (
    SensorIntegerSettable *object,
    GDBusMethodInvocation *invocation,
    gint value);

void sensor_integer_settable_complete_set_value (
    SensorIntegerSettable *object,
    GDBusMethodInvocation *invocation);

void sensor_integer_settable_complete_get_units (
    SensorIntegerSettable *object,
    GDBusMethodInvocation *invocation,
    const gchar *units);



/* D-Bus signal emissions functions: */
void sensor_integer_settable_emit_changed (
    SensorIntegerSettable *object,
    gint arg_value);



/* D-Bus method calls: */
void sensor_integer_settable_call_get_value (
    SensorIntegerSettable *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_settable_call_get_value_finish (
    SensorIntegerSettable *proxy,
    gint *out_value,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_settable_call_get_value_sync (
    SensorIntegerSettable *proxy,
    gint *out_value,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_settable_call_set_value (
    SensorIntegerSettable *proxy,
    gint arg_value,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_settable_call_set_value_finish (
    SensorIntegerSettable *proxy,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_settable_call_set_value_sync (
    SensorIntegerSettable *proxy,
    gint arg_value,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_settable_call_get_units (
    SensorIntegerSettable *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_settable_call_get_units_finish (
    SensorIntegerSettable *proxy,
    gchar **out_units,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_settable_call_get_units_sync (
    SensorIntegerSettable *proxy,
    gchar **out_units,
    GCancellable *cancellable,
    GError **error);



/* D-Bus property accessors: */
gint sensor_integer_settable_get_value (SensorIntegerSettable *object);
void sensor_integer_settable_set_value (SensorIntegerSettable *object, gint value);

const gchar *sensor_integer_settable_get_units (SensorIntegerSettable *object);
gchar *sensor_integer_settable_dup_units (SensorIntegerSettable *object);
void sensor_integer_settable_set_units (SensorIntegerSettable *object, const gchar *value);


/* ---- */

#define TYPE_SENSOR_INTEGER_SETTABLE_PROXY (sensor_integer_settable_proxy_get_type ())
#define SENSOR_INTEGER_SETTABLE_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SETTABLE_PROXY, SensorIntegerSettableProxy))
#define SENSOR_INTEGER_SETTABLE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_SETTABLE_PROXY, SensorIntegerSettableProxyClass))
#define SENSOR_INTEGER_SETTABLE_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_SETTABLE_PROXY, SensorIntegerSettableProxyClass))
#define IS_SENSOR_INTEGER_SETTABLE_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SETTABLE_PROXY))
#define IS_SENSOR_INTEGER_SETTABLE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_SETTABLE_PROXY))

typedef struct _SensorIntegerSettableProxy SensorIntegerSettableProxy;
typedef struct _SensorIntegerSettableProxyClass SensorIntegerSettableProxyClass;
typedef struct _SensorIntegerSettableProxyPrivate SensorIntegerSettableProxyPrivate;

struct _SensorIntegerSettableProxy
{
  /*< private >*/
  GDBusProxy parent_instance;
  SensorIntegerSettableProxyPrivate *priv;
};

struct _SensorIntegerSettableProxyClass
{
  GDBusProxyClass parent_class;
};

GType sensor_integer_settable_proxy_get_type (void) G_GNUC_CONST;

void sensor_integer_settable_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorIntegerSettable *sensor_integer_settable_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error);
SensorIntegerSettable *sensor_integer_settable_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);

void sensor_integer_settable_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorIntegerSettable *sensor_integer_settable_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
SensorIntegerSettable *sensor_integer_settable_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);


/* ---- */

#define TYPE_SENSOR_INTEGER_SETTABLE_SKELETON (sensor_integer_settable_skeleton_get_type ())
#define SENSOR_INTEGER_SETTABLE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON, SensorIntegerSettableSkeleton))
#define SENSOR_INTEGER_SETTABLE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON, SensorIntegerSettableSkeletonClass))
#define SENSOR_INTEGER_SETTABLE_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON, SensorIntegerSettableSkeletonClass))
#define IS_SENSOR_INTEGER_SETTABLE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON))
#define IS_SENSOR_INTEGER_SETTABLE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_SETTABLE_SKELETON))

typedef struct _SensorIntegerSettableSkeleton SensorIntegerSettableSkeleton;
typedef struct _SensorIntegerSettableSkeletonClass SensorIntegerSettableSkeletonClass;
typedef struct _SensorIntegerSettableSkeletonPrivate SensorIntegerSettableSkeletonPrivate;

struct _SensorIntegerSettableSkeleton
{
  /*< private >*/
  GDBusInterfaceSkeleton parent_instance;
  SensorIntegerSettableSkeletonPrivate *priv;
};

struct _SensorIntegerSettableSkeletonClass
{
  GDBusInterfaceSkeletonClass parent_class;
};

GType sensor_integer_settable_skeleton_get_type (void) G_GNUC_CONST;

SensorIntegerSettable *sensor_integer_settable_skeleton_new (void);


/* ------------------------------------------------------------------------ */
/* Declarations for org.openbmc.SensorIntegerThreshold */

#define TYPE_SENSOR_INTEGER_THRESHOLD (sensor_integer_threshold_get_type ())
#define SENSOR_INTEGER_THRESHOLD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_THRESHOLD, SensorIntegerThreshold))
#define IS_SENSOR_INTEGER_THRESHOLD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_THRESHOLD))
#define SENSOR_INTEGER_THRESHOLD_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_SENSOR_INTEGER_THRESHOLD, SensorIntegerThresholdIface))

struct _SensorIntegerThreshold;
typedef struct _SensorIntegerThreshold SensorIntegerThreshold;
typedef struct _SensorIntegerThresholdIface SensorIntegerThresholdIface;

struct _SensorIntegerThresholdIface
{
  GTypeInterface parent_iface;



  gboolean (*handle_check) (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation,
    gint arg_value);

  gboolean (*handle_set_thresholds) (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation,
    gint arg_critical_upper,
    gint arg_critical_lower,
    gint arg_warning_upper,
    gint arg_warning_lower);

  gint  (*get_critical_lower) (SensorIntegerThreshold *object);

  gint  (*get_critical_upper) (SensorIntegerThreshold *object);

  gint  (*get_warning_lower) (SensorIntegerThreshold *object);

  gint  (*get_warning_upper) (SensorIntegerThreshold *object);

  void (*critical) (
    SensorIntegerThreshold *object,
    gboolean arg_over);

  void (*warning) (
    SensorIntegerThreshold *object,
    gboolean arg_over);

};

GType sensor_integer_threshold_get_type (void) G_GNUC_CONST;

GDBusInterfaceInfo *sensor_integer_threshold_interface_info (void);
guint sensor_integer_threshold_override_properties (GObjectClass *klass, guint property_id_begin);


/* D-Bus method call completion functions: */
void sensor_integer_threshold_complete_check (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation);

void sensor_integer_threshold_complete_set_thresholds (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation);



/* D-Bus signal emissions functions: */
void sensor_integer_threshold_emit_critical (
    SensorIntegerThreshold *object,
    gboolean arg_over);

void sensor_integer_threshold_emit_warning (
    SensorIntegerThreshold *object,
    gboolean arg_over);



/* D-Bus method calls: */
void sensor_integer_threshold_call_check (
    SensorIntegerThreshold *proxy,
    gint arg_value,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_threshold_call_check_finish (
    SensorIntegerThreshold *proxy,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_threshold_call_check_sync (
    SensorIntegerThreshold *proxy,
    gint arg_value,
    GCancellable *cancellable,
    GError **error);

void sensor_integer_threshold_call_set_thresholds (
    SensorIntegerThreshold *proxy,
    gint arg_critical_upper,
    gint arg_critical_lower,
    gint arg_warning_upper,
    gint arg_warning_lower,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_threshold_call_set_thresholds_finish (
    SensorIntegerThreshold *proxy,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_threshold_call_set_thresholds_sync (
    SensorIntegerThreshold *proxy,
    gint arg_critical_upper,
    gint arg_critical_lower,
    gint arg_warning_upper,
    gint arg_warning_lower,
    GCancellable *cancellable,
    GError **error);



/* D-Bus property accessors: */
gint sensor_integer_threshold_get_critical_upper (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_critical_upper (SensorIntegerThreshold *object, gint value);

gint sensor_integer_threshold_get_critical_lower (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_critical_lower (SensorIntegerThreshold *object, gint value);

gint sensor_integer_threshold_get_warning_upper (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_warning_upper (SensorIntegerThreshold *object, gint value);

gint sensor_integer_threshold_get_warning_lower (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_warning_lower (SensorIntegerThreshold *object, gint value);


/* ---- */

#define TYPE_SENSOR_INTEGER_THRESHOLD_PROXY (sensor_integer_threshold_proxy_get_type ())
#define SENSOR_INTEGER_THRESHOLD_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_THRESHOLD_PROXY, SensorIntegerThresholdProxy))
#define SENSOR_INTEGER_THRESHOLD_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_THRESHOLD_PROXY, SensorIntegerThresholdProxyClass))
#define SENSOR_INTEGER_THRESHOLD_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_THRESHOLD_PROXY, SensorIntegerThresholdProxyClass))
#define IS_SENSOR_INTEGER_THRESHOLD_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_THRESHOLD_PROXY))
#define IS_SENSOR_INTEGER_THRESHOLD_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_THRESHOLD_PROXY))

typedef struct _SensorIntegerThresholdProxy SensorIntegerThresholdProxy;
typedef struct _SensorIntegerThresholdProxyClass SensorIntegerThresholdProxyClass;
typedef struct _SensorIntegerThresholdProxyPrivate SensorIntegerThresholdProxyPrivate;

struct _SensorIntegerThresholdProxy
{
  /*< private >*/
  GDBusProxy parent_instance;
  SensorIntegerThresholdProxyPrivate *priv;
};

struct _SensorIntegerThresholdProxyClass
{
  GDBusProxyClass parent_class;
};

GType sensor_integer_threshold_proxy_get_type (void) G_GNUC_CONST;

void sensor_integer_threshold_proxy_new (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorIntegerThreshold *sensor_integer_threshold_proxy_new_finish (
    GAsyncResult        *res,
    GError             **error);
SensorIntegerThreshold *sensor_integer_threshold_proxy_new_sync (
    GDBusConnection     *connection,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);

void sensor_integer_threshold_proxy_new_for_bus (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GAsyncReadyCallback  callback,
    gpointer             user_data);
SensorIntegerThreshold *sensor_integer_threshold_proxy_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
SensorIntegerThreshold *sensor_integer_threshold_proxy_new_for_bus_sync (
    GBusType             bus_type,
    GDBusProxyFlags      flags,
    const gchar         *name,
    const gchar         *object_path,
    GCancellable        *cancellable,
    GError             **error);


/* ---- */

#define TYPE_SENSOR_INTEGER_THRESHOLD_SKELETON (sensor_integer_threshold_skeleton_get_type ())
#define SENSOR_INTEGER_THRESHOLD_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_SENSOR_INTEGER_THRESHOLD_SKELETON, SensorIntegerThresholdSkeleton))
#define SENSOR_INTEGER_THRESHOLD_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_SENSOR_INTEGER_THRESHOLD_SKELETON, SensorIntegerThresholdSkeletonClass))
#define SENSOR_INTEGER_THRESHOLD_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_SENSOR_INTEGER_THRESHOLD_SKELETON, SensorIntegerThresholdSkeletonClass))
#define IS_SENSOR_INTEGER_THRESHOLD_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_SENSOR_INTEGER_THRESHOLD_SKELETON))
#define IS_SENSOR_INTEGER_THRESHOLD_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_SENSOR_INTEGER_THRESHOLD_SKELETON))

typedef struct _SensorIntegerThresholdSkeleton SensorIntegerThresholdSkeleton;
typedef struct _SensorIntegerThresholdSkeletonClass SensorIntegerThresholdSkeletonClass;
typedef struct _SensorIntegerThresholdSkeletonPrivate SensorIntegerThresholdSkeletonPrivate;

struct _SensorIntegerThresholdSkeleton
{
  /*< private >*/
  GDBusInterfaceSkeleton parent_instance;
  SensorIntegerThresholdSkeletonPrivate *priv;
};

struct _SensorIntegerThresholdSkeletonClass
{
  GDBusInterfaceSkeletonClass parent_class;
};

GType sensor_integer_threshold_skeleton_get_type (void) G_GNUC_CONST;

SensorIntegerThreshold *sensor_integer_threshold_skeleton_new (void);


/* ---- */

#define TYPE_OBJECT (object_get_type ())
#define OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT, Object))
#define IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT))
#define OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), TYPE_OBJECT, Object))

struct _Object;
typedef struct _Object Object;
typedef struct _ObjectIface ObjectIface;

struct _ObjectIface
{
  GTypeInterface parent_iface;
};

GType object_get_type (void) G_GNUC_CONST;

SensorInteger *object_get_sensor_integer (Object *object);
SensorString *object_get_sensor_string (Object *object);
SensorIntegerSettable *object_get_sensor_integer_settable (Object *object);
SensorIntegerThreshold *object_get_sensor_integer_threshold (Object *object);
SensorInteger *object_peek_sensor_integer (Object *object);
SensorString *object_peek_sensor_string (Object *object);
SensorIntegerSettable *object_peek_sensor_integer_settable (Object *object);
SensorIntegerThreshold *object_peek_sensor_integer_threshold (Object *object);

#define TYPE_OBJECT_PROXY (object_proxy_get_type ())
#define OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_PROXY, ObjectProxy))
#define OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_PROXY, ObjectProxyClass))
#define OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_PROXY, ObjectProxyClass))
#define IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_PROXY))
#define IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_PROXY))

typedef struct _ObjectProxy ObjectProxy;
typedef struct _ObjectProxyClass ObjectProxyClass;
typedef struct _ObjectProxyPrivate ObjectProxyPrivate;

struct _ObjectProxy
{
  /*< private >*/
  GDBusObjectProxy parent_instance;
  ObjectProxyPrivate *priv;
};

struct _ObjectProxyClass
{
  GDBusObjectProxyClass parent_class;
};

GType object_proxy_get_type (void) G_GNUC_CONST;
ObjectProxy *object_proxy_new (GDBusConnection *connection, const gchar *object_path);

#define TYPE_OBJECT_SKELETON (object_skeleton_get_type ())
#define OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_SKELETON, ObjectSkeleton))
#define OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
#define OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_SKELETON, ObjectSkeletonClass))
#define IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_SKELETON))
#define IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_SKELETON))

typedef struct _ObjectSkeleton ObjectSkeleton;
typedef struct _ObjectSkeletonClass ObjectSkeletonClass;
typedef struct _ObjectSkeletonPrivate ObjectSkeletonPrivate;

struct _ObjectSkeleton
{
  /*< private >*/
  GDBusObjectSkeleton parent_instance;
  ObjectSkeletonPrivate *priv;
};

struct _ObjectSkeletonClass
{
  GDBusObjectSkeletonClass parent_class;
};

GType object_skeleton_get_type (void) G_GNUC_CONST;
ObjectSkeleton *object_skeleton_new (const gchar *object_path);
void object_skeleton_set_sensor_integer (ObjectSkeleton *object, SensorInteger *interface_);
void object_skeleton_set_sensor_string (ObjectSkeleton *object, SensorString *interface_);
void object_skeleton_set_sensor_integer_settable (ObjectSkeleton *object, SensorIntegerSettable *interface_);
void object_skeleton_set_sensor_integer_threshold (ObjectSkeleton *object, SensorIntegerThreshold *interface_);

/* ---- */

#define TYPE_OBJECT_MANAGER_CLIENT (object_manager_client_get_type ())
#define OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClient))
#define OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
#define OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_OBJECT_MANAGER_CLIENT, ObjectManagerClientClass))
#define IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_OBJECT_MANAGER_CLIENT))
#define IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_OBJECT_MANAGER_CLIENT))

typedef struct _ObjectManagerClient ObjectManagerClient;
typedef struct _ObjectManagerClientClass ObjectManagerClientClass;
typedef struct _ObjectManagerClientPrivate ObjectManagerClientPrivate;

struct _ObjectManagerClient
{
  /*< private >*/
  GDBusObjectManagerClient parent_instance;
  ObjectManagerClientPrivate *priv;
};

struct _ObjectManagerClientClass
{
  GDBusObjectManagerClientClass parent_class;
};

GType object_manager_client_get_type (void) G_GNUC_CONST;

GType object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar *object_path, const gchar *interface_name, gpointer user_data);

void object_manager_client_new (
    GDBusConnection        *connection,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GAsyncReadyCallback     callback,
    gpointer                user_data);
GDBusObjectManager *object_manager_client_new_finish (
    GAsyncResult        *res,
    GError             **error);
GDBusObjectManager *object_manager_client_new_sync (
    GDBusConnection        *connection,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GError                **error);

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);
GDBusObjectManager *object_manager_client_new_for_bus_finish (
    GAsyncResult        *res,
    GError             **error);
GDBusObjectManager *object_manager_client_new_for_bus_sync (
    GBusType                bus_type,
    GDBusObjectManagerClientFlags  flags,
    const gchar            *name,
    const gchar            *object_path,
    GCancellable           *cancellable,
    GError                **error);


G_END_DECLS

#endif /* __INTERFACES_SENSOR_H__ */
