mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-12-25 23:16:14 +01:00
af69d438ed
G_GNUC_UNUSED does perfectly its job with gcc compiler but the warning still remains with msvc compiler. Once the unused variable removed, the finalize vfunc can be removed as it's doing the same job as the parent function.
349 lines
12 KiB
C
349 lines
12 KiB
C
|
|
#include <gio/gio.h>
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
/* The D-Bus interface definition we want to create a GDBusProxy-derived type for: */
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
static const gchar introspection_xml[] =
|
|
"<node>"
|
|
" <interface name='org.freedesktop.Accounts.User'>"
|
|
" <method name='Frobnicate'>"
|
|
" <arg name='flux' type='s' direction='in'/>"
|
|
" <arg name='baz' type='s' direction='in'/>"
|
|
" <arg name='result' type='s' direction='out'/>"
|
|
" </method>"
|
|
" <signal name='Changed'/>"
|
|
" <property name='AutomaticLogin' type='b' access='readwrite'/>"
|
|
" <property name='RealName' type='s' access='read'/>"
|
|
" <property name='UserName' type='s' access='read'/>"
|
|
" </interface>"
|
|
"</node>";
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
/* Definition of the AccountsUser type */
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
#define ACCOUNTS_TYPE_USER (accounts_user_get_type ())
|
|
#define ACCOUNTS_USER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), ACCOUNTS_TYPE_USER, AccountsUser))
|
|
#define ACCOUNTS_USER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), ACCOUNTS_TYPE_USER, AccountsUserClass))
|
|
#define ACCOUNTS_USER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), ACCOUNTS_TYPE_USER, AccountsUserClass))
|
|
#define ACCOUNTS_IS_USER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), ACCOUNTS_TYPE_USER))
|
|
#define ACCOUNTS_IS_USER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), ACCOUNTS_TYPE_USER))
|
|
|
|
typedef struct _AccountsUser AccountsUser;
|
|
typedef struct _AccountsUserClass AccountsUserClass;
|
|
typedef struct _AccountsUserPrivate AccountsUserPrivate;
|
|
|
|
struct _AccountsUser
|
|
{
|
|
/*< private >*/
|
|
GDBusProxy parent_instance;
|
|
AccountsUserPrivate *priv;
|
|
};
|
|
|
|
struct _AccountsUserClass
|
|
{
|
|
/*< private >*/
|
|
GDBusProxyClass parent_class;
|
|
void (*changed) (AccountsUser *user);
|
|
};
|
|
|
|
GType accounts_user_get_type (void) G_GNUC_CONST;
|
|
|
|
const gchar *accounts_user_get_user_name (AccountsUser *user);
|
|
const gchar *accounts_user_get_real_name (AccountsUser *user);
|
|
gboolean accounts_user_get_automatic_login (AccountsUser *user);
|
|
|
|
void accounts_user_frobnicate (AccountsUser *user,
|
|
const gchar *flux,
|
|
gint baz,
|
|
GCancellable *cancellable,
|
|
GAsyncReadyCallback callback,
|
|
gpointer user_data);
|
|
gchar *accounts_user_frobnicate_finish (AccountsUser *user,
|
|
GAsyncResult *res,
|
|
GError **error);
|
|
gchar *accounts_user_frobnicate_sync (AccountsUser *user,
|
|
const gchar *flux,
|
|
gint baz,
|
|
GCancellable *cancellable,
|
|
GError **error);
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
/* Implementation of the AccountsUser type */
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
/* A more efficient approach than parsing XML is to use const static
|
|
* GDBusInterfaceInfo, GDBusMethodInfo, ... structures
|
|
*/
|
|
static GDBusInterfaceInfo *
|
|
accounts_user_get_interface_info (void)
|
|
{
|
|
static gsize has_info = 0;
|
|
static GDBusInterfaceInfo *info = NULL;
|
|
if (g_once_init_enter (&has_info))
|
|
{
|
|
GDBusNodeInfo *introspection_data;
|
|
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
|
|
info = introspection_data->interfaces[0];
|
|
g_once_init_leave (&has_info, 1);
|
|
}
|
|
return info;
|
|
}
|
|
|
|
enum
|
|
{
|
|
PROP_0,
|
|
PROP_USER_NAME,
|
|
PROP_REAL_NAME,
|
|
PROP_AUTOMATIC_LOGIN,
|
|
};
|
|
|
|
enum
|
|
{
|
|
CHANGED_SIGNAL,
|
|
LAST_SIGNAL
|
|
};
|
|
|
|
static guint signals[LAST_SIGNAL] = {0};
|
|
|
|
G_DEFINE_TYPE (AccountsUser, accounts_user, G_TYPE_DBUS_PROXY)
|
|
|
|
static void
|
|
accounts_user_init (AccountsUser *user)
|
|
{
|
|
/* Sets the expected interface */
|
|
g_dbus_proxy_set_interface_info (G_DBUS_PROXY (user), accounts_user_get_interface_info ());
|
|
}
|
|
|
|
static void
|
|
accounts_user_get_property (GObject *object,
|
|
guint prop_id,
|
|
GValue *value,
|
|
GParamSpec *pspec)
|
|
{
|
|
AccountsUser *user = ACCOUNTS_USER (object);
|
|
|
|
switch (prop_id)
|
|
{
|
|
case PROP_USER_NAME:
|
|
g_value_set_string (value, accounts_user_get_user_name (user));
|
|
break;
|
|
|
|
case PROP_REAL_NAME:
|
|
g_value_set_string (value, accounts_user_get_real_name (user));
|
|
break;
|
|
|
|
case PROP_AUTOMATIC_LOGIN:
|
|
g_value_set_boolean (value, accounts_user_get_automatic_login (user));
|
|
break;
|
|
|
|
default:
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
break;
|
|
}
|
|
}
|
|
|
|
const gchar *
|
|
accounts_user_get_user_name (AccountsUser *user)
|
|
{
|
|
GVariant *value;
|
|
const gchar *ret;
|
|
g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
|
|
value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "UserName");
|
|
ret = g_variant_get_string (value, NULL);
|
|
g_variant_unref (value);
|
|
return ret;
|
|
}
|
|
|
|
const gchar *
|
|
accounts_user_get_real_name (AccountsUser *user)
|
|
{
|
|
GVariant *value;
|
|
const gchar *ret;
|
|
g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
|
|
value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "RealName");
|
|
ret = g_variant_get_string (value, NULL);
|
|
g_variant_unref (value);
|
|
return ret;
|
|
}
|
|
|
|
gboolean
|
|
accounts_user_get_automatic_login (AccountsUser *user)
|
|
{
|
|
GVariant *value;
|
|
gboolean ret;
|
|
g_return_val_if_fail (ACCOUNTS_IS_USER (user), FALSE);
|
|
value = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (user), "AutomaticLogin");
|
|
ret = g_variant_get_boolean (value);
|
|
g_variant_unref (value);
|
|
return ret;
|
|
}
|
|
|
|
static void
|
|
accounts_user_g_signal (GDBusProxy *proxy,
|
|
const gchar *sender_name,
|
|
const gchar *signal_name,
|
|
GVariant *parameters)
|
|
{
|
|
AccountsUser *user = ACCOUNTS_USER (proxy);
|
|
if (g_strcmp0 (signal_name, "Changed") == 0)
|
|
g_signal_emit (user, signals[CHANGED_SIGNAL], 0);
|
|
}
|
|
|
|
static void
|
|
accounts_user_g_properties_changed (GDBusProxy *proxy,
|
|
GVariant *changed_properties,
|
|
const gchar* const *invalidated_properties)
|
|
{
|
|
AccountsUser *user = ACCOUNTS_USER (proxy);
|
|
GVariantIter *iter;
|
|
const gchar *key;
|
|
|
|
if (changed_properties != NULL)
|
|
{
|
|
g_variant_get (changed_properties, "a{sv}", &iter);
|
|
while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
|
|
{
|
|
if (g_strcmp0 (key, "AutomaticLogin") == 0)
|
|
g_object_notify (G_OBJECT (user), "automatic-login");
|
|
else if (g_strcmp0 (key, "RealName") == 0)
|
|
g_object_notify (G_OBJECT (user), "real-name");
|
|
else if (g_strcmp0 (key, "UserName") == 0)
|
|
g_object_notify (G_OBJECT (user), "user-name");
|
|
}
|
|
g_variant_iter_free (iter);
|
|
}
|
|
}
|
|
|
|
static void
|
|
accounts_user_class_init (AccountsUserClass *klass)
|
|
{
|
|
GObjectClass *gobject_class;
|
|
GDBusProxyClass *proxy_class;
|
|
|
|
gobject_class = G_OBJECT_CLASS (klass);
|
|
gobject_class->get_property = accounts_user_get_property;
|
|
|
|
proxy_class = G_DBUS_PROXY_CLASS (klass);
|
|
proxy_class->g_signal = accounts_user_g_signal;
|
|
proxy_class->g_properties_changed = accounts_user_g_properties_changed;
|
|
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_USER_NAME,
|
|
g_param_spec_string ("user-name",
|
|
"User Name",
|
|
"The user name of the user",
|
|
NULL,
|
|
G_PARAM_READABLE |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_REAL_NAME,
|
|
g_param_spec_string ("real-name",
|
|
"Real Name",
|
|
"The real name of the user",
|
|
NULL,
|
|
G_PARAM_READABLE |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
g_object_class_install_property (gobject_class,
|
|
PROP_AUTOMATIC_LOGIN,
|
|
g_param_spec_boolean ("automatic-login",
|
|
"Automatic Login",
|
|
"Whether the user is automatically logged in",
|
|
FALSE,
|
|
G_PARAM_READABLE |
|
|
G_PARAM_STATIC_STRINGS));
|
|
|
|
signals[CHANGED_SIGNAL] = g_signal_new ("changed",
|
|
ACCOUNTS_TYPE_USER,
|
|
G_SIGNAL_RUN_LAST,
|
|
G_STRUCT_OFFSET (AccountsUserClass, changed),
|
|
NULL,
|
|
NULL,
|
|
g_cclosure_marshal_VOID__VOID,
|
|
G_TYPE_NONE,
|
|
0);
|
|
}
|
|
|
|
gchar *
|
|
accounts_user_frobnicate_sync (AccountsUser *user,
|
|
const gchar *flux,
|
|
gint baz,
|
|
GCancellable *cancellable,
|
|
GError **error)
|
|
{
|
|
gchar *ret;
|
|
GVariant *value;
|
|
|
|
g_return_val_if_fail (ACCOUNTS_IS_USER (user), NULL);
|
|
|
|
ret = NULL;
|
|
|
|
value = g_dbus_proxy_call_sync (G_DBUS_PROXY (user),
|
|
"Frobnicate",
|
|
g_variant_new ("(si)",
|
|
flux,
|
|
baz),
|
|
G_DBUS_CALL_FLAGS_NONE,
|
|
-1,
|
|
cancellable,
|
|
error);
|
|
if (value != NULL)
|
|
{
|
|
g_variant_get (value, "(s)", &ret);
|
|
g_variant_unref (value);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void
|
|
accounts_user_frobnicate (AccountsUser *user,
|
|
const gchar *flux,
|
|
gint baz,
|
|
GCancellable *cancellable,
|
|
GAsyncReadyCallback callback,
|
|
gpointer user_data)
|
|
{
|
|
g_return_if_fail (ACCOUNTS_IS_USER (user));
|
|
g_dbus_proxy_call (G_DBUS_PROXY (user),
|
|
"Frobnicate",
|
|
g_variant_new ("(si)",
|
|
flux,
|
|
baz),
|
|
G_DBUS_CALL_FLAGS_NONE,
|
|
-1,
|
|
cancellable,
|
|
callback,
|
|
user_data);
|
|
}
|
|
|
|
|
|
gchar *
|
|
accounts_user_frobnicate_finish (AccountsUser *user,
|
|
GAsyncResult *res,
|
|
GError **error)
|
|
{
|
|
gchar *ret;
|
|
GVariant *value;
|
|
|
|
ret = NULL;
|
|
value = g_dbus_proxy_call_finish (G_DBUS_PROXY (user), res, error);
|
|
if (value != NULL)
|
|
{
|
|
g_variant_get (value, "(s)", &ret);
|
|
g_variant_unref (value);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
gint
|
|
main (gint argc, gchar *argv[])
|
|
{
|
|
return 0;
|
|
}
|