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

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

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

  gint  (*get_value) (SensorInteger *object);

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

};

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



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



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



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


/* ---- */

#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);


/* ---- */

#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);
SensorInteger *object_peek_sensor_integer (Object *object);
SensorString *object_peek_sensor_string (Object *object);
SensorIntegerSettable *object_peek_sensor_integer_settable (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_);

/* ---- */

#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__ */
