/*
 * 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_SENSOR2_H__
#define __INTERFACES_SENSOR2_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_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_value) (
    SensorInteger *object,
    GDBusMethodInvocation *invocation,
    gint arg_value);

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

  gint  (*get_heatbeat) (SensorInteger *object);

  gint  (*get_poll_interval) (SensorInteger *object);

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

  gint  (*get_value) (SensorInteger *object);

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

  void (*heartbeat) (
    SensorInteger *object,
    const gchar *arg_bus_name);

};

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_set_value (
    SensorInteger *object,
    GDBusMethodInvocation *invocation);

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

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

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



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

void sensor_integer_emit_heartbeat (
    SensorInteger *object,
    const gchar *arg_bus_name);



/* 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_set_value (
    SensorInteger *proxy,
    gint arg_value,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

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

gboolean sensor_integer_call_set_value_sync (
    SensorInteger *proxy,
    gint arg_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_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);



/* 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_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_heatbeat (SensorInteger *object);
void sensor_integer_set_heatbeat (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.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_get_state) (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation);

  gboolean (*handle_set) (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation,
    gint arg_lower_critical,
    gint arg_lower_warning,
    gint arg_upper_warning,
    gint arg_upper_critical);

  gint  (*get_lower_critical) (SensorIntegerThreshold *object);

  gint  (*get_lower_warning) (SensorIntegerThreshold *object);

  gint  (*get_state) (SensorIntegerThreshold *object);

  gint  (*get_upper_critical) (SensorIntegerThreshold *object);

  gint  (*get_upper_warning) (SensorIntegerThreshold *object);

  void (*critical) (
    SensorIntegerThreshold *object);

  void (*warning) (
    SensorIntegerThreshold *object);

};

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_set (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation);

void sensor_integer_threshold_complete_get_state (
    SensorIntegerThreshold *object,
    GDBusMethodInvocation *invocation,
    gint state);



/* D-Bus signal emissions functions: */
void sensor_integer_threshold_emit_warning (
    SensorIntegerThreshold *object);

void sensor_integer_threshold_emit_critical (
    SensorIntegerThreshold *object);



/* D-Bus method calls: */
void sensor_integer_threshold_call_set (
    SensorIntegerThreshold *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_threshold_call_set_finish (
    SensorIntegerThreshold *proxy,
    GAsyncResult *res,
    GError **error);

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

void sensor_integer_threshold_call_get_state (
    SensorIntegerThreshold *proxy,
    GCancellable *cancellable,
    GAsyncReadyCallback callback,
    gpointer user_data);

gboolean sensor_integer_threshold_call_get_state_finish (
    SensorIntegerThreshold *proxy,
    gint *out_state,
    GAsyncResult *res,
    GError **error);

gboolean sensor_integer_threshold_call_get_state_sync (
    SensorIntegerThreshold *proxy,
    gint *out_state,
    GCancellable *cancellable,
    GError **error);



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

gint sensor_integer_threshold_get_lower_warning (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_lower_warning (SensorIntegerThreshold *object, gint value);

gint sensor_integer_threshold_get_upper_warning (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_upper_warning (SensorIntegerThreshold *object, gint value);

gint sensor_integer_threshold_get_upper_critical (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_upper_critical (SensorIntegerThreshold *object, gint value);

gint sensor_integer_threshold_get_state (SensorIntegerThreshold *object);
void sensor_integer_threshold_set_state (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);
SensorIntegerThreshold *object_get_sensor_integer_threshold (Object *object);
SensorInteger *object_peek_sensor_integer (Object *object);
SensorString *object_peek_sensor_string (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_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_SENSOR2_H__ */
