aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am50
-rw-r--r--src/Makefile.in75
-rw-r--r--src/accounts-service-client.h215
-rw-r--r--src/accounts-service-user-client.h507
-rw-r--r--src/accounts-service-user.xml689
-rw-r--r--src/accounts-service.xml194
-rw-r--r--src/display-manager.xml17
-rw-r--r--src/gdm-local-display-factory.xml20
-rw-r--r--src/session-service.c67
-rw-r--r--src/users-service-client.h220
-rw-r--r--src/users-service-dbus.c564
-rw-r--r--src/users-service-dbus.h15
-rw-r--r--src/users-service-marshal.c86
-rw-r--r--src/users-service.list1
-rw-r--r--src/users-service.xml56
15 files changed, 1821 insertions, 955 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 0317de7..df0ec0f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -14,7 +14,8 @@ libsession_la_SOURCES = \
gen-session-dbus.xml.h \
dbus-shared-names.h \
dbusmenu-shared.h \
- users-service-client.h
+ accounts-service-client.h \
+ accounts-service-user-client.h
libsession_la_CFLAGS = \
$(APPLET_CFLAGS) \
-Wall -Werror \
@@ -36,19 +37,26 @@ consolekit-session-client.h: $(srcdir)/consolekit-session.xml
--output=consolekit-session-client.h \
$(srcdir)/consolekit-session.xml
-gdm-local-display-factory-client.h: $(srcdir)/gdm-local-display-factory.xml
+display-manager-client.h: $(srcdir)/display-manager.xml
dbus-binding-tool \
--prefix=_gdm_local_display_factory_client \
--mode=glib-client \
- --output=gdm-local-display-factory-client.h \
- $(srcdir)/gdm-local-display-factory.xml
+ --output=display-manager-client.h \
+ $(srcdir)/display-manager.xml
-users-service-client.h: $(srcdir)/users-service.xml
+accounts-service-client.h: $(srcdir)/accounts-service.xml
dbus-binding-tool \
- --prefix=_users_service_client \
+ --prefix=_accounts_service_client \
--mode=glib-client \
- --output=users-service-client.h \
- $(srcdir)/users-service.xml
+ --output=accounts-service-client.h \
+ $(srcdir)/accounts-service.xml
+
+accounts-service-user-client.h: $(srcdir)/accounts-service-user.xml
+ dbus-binding-tool \
+ --prefix=_accounts_service_user_client \
+ --mode=glib-client \
+ --output=accounts-service-user-client.h \
+ $(srcdir)/accounts-service-user.xml
upower-client.h: $(srcdir)/upower.xml
dbus-binding-tool \
@@ -57,16 +65,6 @@ upower-client.h: $(srcdir)/upower.xml
--output=upower-client.h \
$(srcdir)/upower.xml
-users-service-marshal.h: $(srcdir)/users-service.list
- glib-genmarshal --header \
- --prefix=_users_service_marshal $(srcdir)/users-service.list \
- > users-service-marshal.h
-
-users-service-marshal.c: $(srcdir)/users-service.list
- glib-genmarshal --body \
- --prefix=_users_service_marshal $(srcdir)/users-service.list \
- > users-service-marshal.c
-
gen-%.xml.c: %.xml
@echo "Building $@ from $<"
@echo "const char * _$(subst -,_,$(subst .,_,$(basename $(notdir $<)))) = " > $@
@@ -91,8 +89,7 @@ indicator_session_service_SOURCES = \
dbusmenu-shared.h \
gconf-helper.c \
users-service-dbus.h \
- users-service-dbus.c \
- users-service-marshal.c
+ users-service-dbus.c
indicator_session_service_CFLAGS = \
$(SESSIONSERVICE_CFLAGS) \
$(GCONF_CFLAGS) \
@@ -134,22 +131,21 @@ gtk_logout_helper_LDADD = \
BUILT_SOURCES = \
consolekit-manager-client.h \
consolekit-session-client.h \
- gdm-local-display-factory-client.h \
+ display-manager-client.h \
gen-session-dbus.xml.c \
gen-session-dbus.xml.h \
upower-client.h \
- users-service-client.h \
- users-service-marshal.h \
- users-service-marshal.c
+ accounts-service-client.h \
+ accounts-service-user-client.h
EXTRA_DIST = \
consolekit-manager.xml \
consolekit-session.xml \
- gdm-local-display-factory.xml \
+ display-manager.xml \
session-dbus.xml \
upower.xml \
- users-service.xml \
- users-service.list
+ accounts-service.xml \
+ accounts-service-user.xml
CLEANFILES = \
$(BUILT_SOURCES)
diff --git a/src/Makefile.in b/src/Makefile.in
index a79ce6c..4baae5f 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -40,10 +40,7 @@ libexec_PROGRAMS = indicator-session-service$(EXEEXT) \
subdir = src
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/m4/intltool.m4 \
- $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
- $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
- $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
@@ -102,8 +99,7 @@ am_indicator_session_service_OBJECTS = \
indicator_session_service-session-dbus.$(OBJEXT) \
indicator_session_service-gen-session-dbus.xml.$(OBJEXT) \
indicator_session_service-gconf-helper.$(OBJEXT) \
- indicator_session_service-users-service-dbus.$(OBJEXT) \
- indicator_session_service-users-service-marshal.$(OBJEXT)
+ indicator_session_service-users-service-dbus.$(OBJEXT)
indicator_session_service_OBJECTS = \
$(am_indicator_session_service_OBJECTS)
indicator_session_service_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@@ -314,7 +310,8 @@ libsession_la_SOURCES = \
gen-session-dbus.xml.h \
dbus-shared-names.h \
dbusmenu-shared.h \
- users-service-client.h
+ accounts-service-client.h \
+ accounts-service-user-client.h
libsession_la_CFLAGS = \
$(APPLET_CFLAGS) \
@@ -337,8 +334,7 @@ indicator_session_service_SOURCES = \
dbusmenu-shared.h \
gconf-helper.c \
users-service-dbus.h \
- users-service-dbus.c \
- users-service-marshal.c
+ users-service-dbus.c
indicator_session_service_CFLAGS = \
$(SESSIONSERVICE_CFLAGS) \
@@ -381,22 +377,21 @@ gtk_logout_helper_LDADD = \
BUILT_SOURCES = \
consolekit-manager-client.h \
consolekit-session-client.h \
- gdm-local-display-factory-client.h \
+ display-manager-client.h \
gen-session-dbus.xml.c \
gen-session-dbus.xml.h \
upower-client.h \
- users-service-client.h \
- users-service-marshal.h \
- users-service-marshal.c
+ accounts-service-client.h \
+ accounts-service-user-client.h
EXTRA_DIST = \
consolekit-manager.xml \
consolekit-session.xml \
- gdm-local-display-factory.xml \
+ display-manager.xml \
session-dbus.xml \
upower.xml \
- users-service.xml \
- users-service.list
+ accounts-service.xml \
+ accounts-service-user.xml
CLEANFILES = \
$(BUILT_SOURCES)
@@ -534,7 +529,6 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_session_service-session-dbus.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_session_service-session-service.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_session_service-users-service-dbus.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indicator_session_service-users-service-marshal.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsession_la-indicator-session.Plo@am__quote@
.c.o:
@@ -713,22 +707,6 @@ indicator_session_service-users-service-dbus.obj: users-service-dbus.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_session_service_CFLAGS) $(CFLAGS) -c -o indicator_session_service-users-service-dbus.obj `if test -f 'users-service-dbus.c'; then $(CYGPATH_W) 'users-service-dbus.c'; else $(CYGPATH_W) '$(srcdir)/users-service-dbus.c'; fi`
-indicator_session_service-users-service-marshal.o: users-service-marshal.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_session_service_CFLAGS) $(CFLAGS) -MT indicator_session_service-users-service-marshal.o -MD -MP -MF $(DEPDIR)/indicator_session_service-users-service-marshal.Tpo -c -o indicator_session_service-users-service-marshal.o `test -f 'users-service-marshal.c' || echo '$(srcdir)/'`users-service-marshal.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_session_service-users-service-marshal.Tpo $(DEPDIR)/indicator_session_service-users-service-marshal.Po
-@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='users-service-marshal.c' object='indicator_session_service-users-service-marshal.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_session_service_CFLAGS) $(CFLAGS) -c -o indicator_session_service-users-service-marshal.o `test -f 'users-service-marshal.c' || echo '$(srcdir)/'`users-service-marshal.c
-
-indicator_session_service-users-service-marshal.obj: users-service-marshal.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_session_service_CFLAGS) $(CFLAGS) -MT indicator_session_service-users-service-marshal.obj -MD -MP -MF $(DEPDIR)/indicator_session_service-users-service-marshal.Tpo -c -o indicator_session_service-users-service-marshal.obj `if test -f 'users-service-marshal.c'; then $(CYGPATH_W) 'users-service-marshal.c'; else $(CYGPATH_W) '$(srcdir)/users-service-marshal.c'; fi`
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/indicator_session_service-users-service-marshal.Tpo $(DEPDIR)/indicator_session_service-users-service-marshal.Po
-@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='users-service-marshal.c' object='indicator_session_service-users-service-marshal.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(indicator_session_service_CFLAGS) $(CFLAGS) -c -o indicator_session_service-users-service-marshal.obj `if test -f 'users-service-marshal.c'; then $(CYGPATH_W) 'users-service-marshal.c'; else $(CYGPATH_W) '$(srcdir)/users-service-marshal.c'; fi`
-
mostlyclean-libtool:
-rm -f *.lo
@@ -958,19 +936,26 @@ consolekit-session-client.h: $(srcdir)/consolekit-session.xml
--output=consolekit-session-client.h \
$(srcdir)/consolekit-session.xml
-gdm-local-display-factory-client.h: $(srcdir)/gdm-local-display-factory.xml
+display-manager-client.h: $(srcdir)/display-manager.xml
dbus-binding-tool \
--prefix=_gdm_local_display_factory_client \
--mode=glib-client \
- --output=gdm-local-display-factory-client.h \
- $(srcdir)/gdm-local-display-factory.xml
+ --output=display-manager-client.h \
+ $(srcdir)/display-manager.xml
-users-service-client.h: $(srcdir)/users-service.xml
+accounts-service-client.h: $(srcdir)/accounts-service.xml
dbus-binding-tool \
- --prefix=_users_service_client \
+ --prefix=_accounts_service_client \
--mode=glib-client \
- --output=users-service-client.h \
- $(srcdir)/users-service.xml
+ --output=accounts-service-client.h \
+ $(srcdir)/accounts-service.xml
+
+accounts-service-user-client.h: $(srcdir)/accounts-service-user.xml
+ dbus-binding-tool \
+ --prefix=_accounts_service_user_client \
+ --mode=glib-client \
+ --output=accounts-service-user-client.h \
+ $(srcdir)/accounts-service-user.xml
upower-client.h: $(srcdir)/upower.xml
dbus-binding-tool \
@@ -979,16 +964,6 @@ upower-client.h: $(srcdir)/upower.xml
--output=upower-client.h \
$(srcdir)/upower.xml
-users-service-marshal.h: $(srcdir)/users-service.list
- glib-genmarshal --header \
- --prefix=_users_service_marshal $(srcdir)/users-service.list \
- > users-service-marshal.h
-
-users-service-marshal.c: $(srcdir)/users-service.list
- glib-genmarshal --body \
- --prefix=_users_service_marshal $(srcdir)/users-service.list \
- > users-service-marshal.c
-
gen-%.xml.c: %.xml
@echo "Building $@ from $<"
@echo "const char * _$(subst -,_,$(subst .,_,$(basename $(notdir $<)))) = " > $@
diff --git a/src/accounts-service-client.h b/src/accounts-service-client.h
new file mode 100644
index 0000000..c4686b3
--- /dev/null
+++ b/src/accounts-service-client.h
@@ -0,0 +1,215 @@
+/* Generated by dbus-binding-tool; do not edit! */
+
+#include <glib.h>
+#include <dbus/dbus-glib.h>
+
+G_BEGIN_DECLS
+
+#ifndef _DBUS_GLIB_ASYNC_DATA_FREE
+#define _DBUS_GLIB_ASYNC_DATA_FREE
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+void
+_dbus_glib_async_data_free (gpointer stuff)
+{
+ g_slice_free (DBusGAsyncData, stuff);
+}
+#endif
+
+#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Accounts
+#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Accounts
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_list_cached_users (DBusGProxy *proxy, GPtrArray** OUT_users, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "ListCachedUsers", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), OUT_users, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_list_cached_users_reply) (DBusGProxy *proxy, GPtrArray *OUT_users, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_list_cached_users_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ GPtrArray* OUT_users;
+ dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &OUT_users, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_list_cached_users_reply)data->cb) (proxy, OUT_users, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_list_cached_users_async (DBusGProxy *proxy, org_freedesktop_Accounts_list_cached_users_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "ListCachedUsers", org_freedesktop_Accounts_list_cached_users_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_find_user_by_id (DBusGProxy *proxy, const gint64 IN_id, char** OUT_user, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "FindUserById", error, G_TYPE_INT64, IN_id, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_user, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_find_user_by_id_reply) (DBusGProxy *proxy, char *OUT_user, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_find_user_by_id_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ char* OUT_user;
+ dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_user, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_find_user_by_id_reply)data->cb) (proxy, OUT_user, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_find_user_by_id_async (DBusGProxy *proxy, const gint64 IN_id, org_freedesktop_Accounts_find_user_by_id_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "FindUserById", org_freedesktop_Accounts_find_user_by_id_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT64, IN_id, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_find_user_by_name (DBusGProxy *proxy, const char * IN_name, char** OUT_user, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "FindUserByName", error, G_TYPE_STRING, IN_name, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_user, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_find_user_by_name_reply) (DBusGProxy *proxy, char *OUT_user, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_find_user_by_name_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ char* OUT_user;
+ dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_user, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_find_user_by_name_reply)data->cb) (proxy, OUT_user, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_find_user_by_name_async (DBusGProxy *proxy, const char * IN_name, org_freedesktop_Accounts_find_user_by_name_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "FindUserByName", org_freedesktop_Accounts_find_user_by_name_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_name, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_create_user (DBusGProxy *proxy, const char * IN_name, const char * IN_fullname, const gint IN_accountType, char** OUT_user, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "CreateUser", error, G_TYPE_STRING, IN_name, G_TYPE_STRING, IN_fullname, G_TYPE_INT, IN_accountType, G_TYPE_INVALID, DBUS_TYPE_G_OBJECT_PATH, OUT_user, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_create_user_reply) (DBusGProxy *proxy, char *OUT_user, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_create_user_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ char* OUT_user;
+ dbus_g_proxy_end_call (proxy, call, &error, DBUS_TYPE_G_OBJECT_PATH, &OUT_user, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_create_user_reply)data->cb) (proxy, OUT_user, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_create_user_async (DBusGProxy *proxy, const char * IN_name, const char * IN_fullname, const gint IN_accountType, org_freedesktop_Accounts_create_user_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "CreateUser", org_freedesktop_Accounts_create_user_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_name, G_TYPE_STRING, IN_fullname, G_TYPE_INT, IN_accountType, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_delete_user (DBusGProxy *proxy, const gint64 IN_id, const gboolean IN_removeFiles, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "DeleteUser", error, G_TYPE_INT64, IN_id, G_TYPE_BOOLEAN, IN_removeFiles, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_delete_user_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_delete_user_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_delete_user_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_delete_user_async (DBusGProxy *proxy, const gint64 IN_id, const gboolean IN_removeFiles, org_freedesktop_Accounts_delete_user_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "DeleteUser", org_freedesktop_Accounts_delete_user_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT64, IN_id, G_TYPE_BOOLEAN, IN_removeFiles, G_TYPE_INVALID);
+}
+#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Accounts */
+
+G_END_DECLS
diff --git a/src/accounts-service-user-client.h b/src/accounts-service-user-client.h
new file mode 100644
index 0000000..499e9bc
--- /dev/null
+++ b/src/accounts-service-user-client.h
@@ -0,0 +1,507 @@
+/* Generated by dbus-binding-tool; do not edit! */
+
+#include <glib.h>
+#include <dbus/dbus-glib.h>
+
+G_BEGIN_DECLS
+
+#ifndef _DBUS_GLIB_ASYNC_DATA_FREE
+#define _DBUS_GLIB_ASYNC_DATA_FREE
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+void
+_dbus_glib_async_data_free (gpointer stuff)
+{
+ g_slice_free (DBusGAsyncData, stuff);
+}
+#endif
+
+#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Accounts_User
+#define DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Accounts_User
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_user_name (DBusGProxy *proxy, const char * IN_name, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetUserName", error, G_TYPE_STRING, IN_name, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_user_name_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_user_name_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_user_name_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_user_name_async (DBusGProxy *proxy, const char * IN_name, org_freedesktop_Accounts_User_set_user_name_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetUserName", org_freedesktop_Accounts_User_set_user_name_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_name, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_real_name (DBusGProxy *proxy, const char * IN_name, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetRealName", error, G_TYPE_STRING, IN_name, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_real_name_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_real_name_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_real_name_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_real_name_async (DBusGProxy *proxy, const char * IN_name, org_freedesktop_Accounts_User_set_real_name_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetRealName", org_freedesktop_Accounts_User_set_real_name_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_name, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_email (DBusGProxy *proxy, const char * IN_email, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetEmail", error, G_TYPE_STRING, IN_email, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_email_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_email_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_email_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_email_async (DBusGProxy *proxy, const char * IN_email, org_freedesktop_Accounts_User_set_email_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetEmail", org_freedesktop_Accounts_User_set_email_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_email, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_language (DBusGProxy *proxy, const char * IN_language, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetLanguage", error, G_TYPE_STRING, IN_language, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_language_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_language_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_language_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_language_async (DBusGProxy *proxy, const char * IN_language, org_freedesktop_Accounts_User_set_language_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetLanguage", org_freedesktop_Accounts_User_set_language_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_language, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_location (DBusGProxy *proxy, const char * IN_location, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetLocation", error, G_TYPE_STRING, IN_location, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_location_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_location_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_location_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_location_async (DBusGProxy *proxy, const char * IN_location, org_freedesktop_Accounts_User_set_location_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetLocation", org_freedesktop_Accounts_User_set_location_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_location, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_home_directory (DBusGProxy *proxy, const char * IN_homedir, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetHomeDirectory", error, G_TYPE_STRING, IN_homedir, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_home_directory_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_home_directory_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_home_directory_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_home_directory_async (DBusGProxy *proxy, const char * IN_homedir, org_freedesktop_Accounts_User_set_home_directory_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetHomeDirectory", org_freedesktop_Accounts_User_set_home_directory_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_homedir, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_shell (DBusGProxy *proxy, const char * IN_shell, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetShell", error, G_TYPE_STRING, IN_shell, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_shell_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_shell_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_shell_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_shell_async (DBusGProxy *proxy, const char * IN_shell, org_freedesktop_Accounts_User_set_shell_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetShell", org_freedesktop_Accounts_User_set_shell_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_shell, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_icon_file (DBusGProxy *proxy, const char * IN_filename, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetIconFile", error, G_TYPE_STRING, IN_filename, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_icon_file_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_icon_file_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_icon_file_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_icon_file_async (DBusGProxy *proxy, const char * IN_filename, org_freedesktop_Accounts_User_set_icon_file_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetIconFile", org_freedesktop_Accounts_User_set_icon_file_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_filename, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_locked (DBusGProxy *proxy, const gboolean IN_locked, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetLocked", error, G_TYPE_BOOLEAN, IN_locked, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_locked_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_locked_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_locked_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_locked_async (DBusGProxy *proxy, const gboolean IN_locked, org_freedesktop_Accounts_User_set_locked_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetLocked", org_freedesktop_Accounts_User_set_locked_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_BOOLEAN, IN_locked, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_account_type (DBusGProxy *proxy, const gint IN_accountType, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetAccountType", error, G_TYPE_INT, IN_accountType, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_account_type_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_account_type_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_account_type_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_account_type_async (DBusGProxy *proxy, const gint IN_accountType, org_freedesktop_Accounts_User_set_account_type_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetAccountType", org_freedesktop_Accounts_User_set_account_type_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT, IN_accountType, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_password_mode (DBusGProxy *proxy, const gint IN_mode, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetPasswordMode", error, G_TYPE_INT, IN_mode, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_password_mode_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_password_mode_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_password_mode_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_password_mode_async (DBusGProxy *proxy, const gint IN_mode, org_freedesktop_Accounts_User_set_password_mode_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetPasswordMode", org_freedesktop_Accounts_User_set_password_mode_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT, IN_mode, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_password (DBusGProxy *proxy, const char * IN_password, const char * IN_hint, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetPassword", error, G_TYPE_STRING, IN_password, G_TYPE_STRING, IN_hint, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_password_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_password_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_password_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_password_async (DBusGProxy *proxy, const char * IN_password, const char * IN_hint, org_freedesktop_Accounts_User_set_password_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetPassword", org_freedesktop_Accounts_User_set_password_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_password, G_TYPE_STRING, IN_hint, G_TYPE_INVALID);
+}
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+gboolean
+org_freedesktop_Accounts_User_set_automatic_login (DBusGProxy *proxy, const gboolean IN_enabled, GError **error)
+
+{
+ return dbus_g_proxy_call (proxy, "SetAutomaticLogin", error, G_TYPE_BOOLEAN, IN_enabled, G_TYPE_INVALID, G_TYPE_INVALID);
+}
+
+typedef void (*org_freedesktop_Accounts_User_set_automatic_login_reply) (DBusGProxy *proxy, GError *error, gpointer userdata);
+
+static void
+org_freedesktop_Accounts_User_set_automatic_login_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
+{
+ DBusGAsyncData *data = (DBusGAsyncData*) user_data;
+ GError *error = NULL;
+ dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INVALID);
+ (*(org_freedesktop_Accounts_User_set_automatic_login_reply)data->cb) (proxy, error, data->userdata);
+ return;
+}
+
+static
+#ifdef G_HAVE_INLINE
+inline
+#endif
+DBusGProxyCall*
+org_freedesktop_Accounts_User_set_automatic_login_async (DBusGProxy *proxy, const gboolean IN_enabled, org_freedesktop_Accounts_User_set_automatic_login_reply callback, gpointer userdata)
+
+{
+ DBusGAsyncData *stuff;
+ stuff = g_slice_new (DBusGAsyncData);
+ stuff->cb = G_CALLBACK (callback);
+ stuff->userdata = userdata;
+ return dbus_g_proxy_begin_call (proxy, "SetAutomaticLogin", org_freedesktop_Accounts_User_set_automatic_login_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_BOOLEAN, IN_enabled, G_TYPE_INVALID);
+}
+#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_freedesktop_Accounts_User */
+
+G_END_DECLS
diff --git a/src/accounts-service-user.xml b/src/accounts-service-user.xml
new file mode 100644
index 0000000..bd4cb21
--- /dev/null
+++ b/src/accounts-service-user.xml
@@ -0,0 +1,689 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" >
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <interface name="org.freedesktop.Accounts.User">
+
+ <method name="SetUserName">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="name" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new username.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users username. Note that it is usually not allowed
+ to have multiple users with the same username.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the username of any user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetRealName">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="name" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new name, typically in the form "Firstname Lastname".
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users real name.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.change-own-user-data</doc:term>
+ <doc:definition>To change his own name</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the name of another user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetEmail">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="email" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new email address.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users email address.
+ </doc:para>
+ <doc:para>
+ Note that setting an email address in the AccountsService is
+ not the same as configuring a mail client. Mail clients might
+ default to email address that is configured here, though.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.change-own-user-data</doc:term>
+ <doc:definition>To change his own email address</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the email address of another user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetLanguage">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="language" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new language, as a locale specification like "de_DE.UTF-8".
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users language.
+ </doc:para>
+ <doc:language>
+ The expectation is that display managers will start the
+ users session with this locale.
+ </doc:language>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.change-own-user-data</doc:term>
+ <doc:definition>To change his own language</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the language of another user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetLocation">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="location" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new location as a freeform string.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users location.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.change-own-user-data</doc:term>
+ <doc:definition>To change his own location</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the location of another user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetHomeDirectory">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="homedir" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new homedir as an absolute path.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users home directory.
+ </doc:para>
+ <doc:para>
+ Note that changing the users home directory moves all the content
+ from the old location to the new one, and is potentially an
+ expensive operation.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the home directory of a user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetShell">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="shell" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The new user shell.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users shell.
+ </doc:para>
+ <doc:para>
+ Note that setting the shell to a non-allowed program may
+ prevent the user from logging in.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the shell of a user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetIconFile">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="filename" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The absolute filename of a png file to use as the users icon.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets the users icon.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.change-own-user-data</doc:term>
+ <doc:definition>To change his own icon</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the icon of another user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetLocked">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="locked" direction="in" type="b">
+ <doc:doc>
+ <doc:summary>
+ Whether to lock or unlock the users account.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Locks or unlocks a users account.
+ </doc:para>
+ <doc:para>
+ Locking an account prevents the user from logging in.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To lock or unlock user accounts</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetAccountType">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="accountType" direction="in" type="i">
+ <doc:doc>
+ <doc:summary>
+ The new account type, encoded as an integer:
+ <doc:list>
+ <doc:item>
+ <doc:term>0</doc:term>
+ <doc:definition>Standard user</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>1</doc:term>
+ <doc:definition>Administrator</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>2</doc:term>
+ <doc:definition>Supervised user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Changes the users account type.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change an account type</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetPasswordMode">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="mode" direction="in" type="i">
+ <doc:doc>
+ <doc:summary>
+ The new password mode, encoded as an integer:
+ <doc:list>
+ <doc:item>
+ <doc:term>0</doc:term>
+ <doc:definition>Regular password</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>1</doc:term>
+ <doc:definition>Password must be set at next login</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>2</doc:term>
+ <doc:definition>No password</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Changes the users password mode.
+ </doc:para>
+ <doc:para>
+ Note that changing the password mode has the side-effect of
+ unlocking the account.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change a users password mode</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetPassword">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="password" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The crypted password.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <arg name="hint" direction="in" type="s">
+ <doc:doc>
+ <doc:summary>
+ The password hint.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Sets a new password for this user.
+ </doc:para>
+ <doc:para>
+ Note that setting a password has the side-effect of
+ unlocking the account.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.user-administration</doc:term>
+ <doc:definition>To change the password of a user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="SetAutomaticLogin">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="enabled" direction="in" type="b">
+ <doc:doc>
+ <doc:summary>
+ Whether to enable automatic login for this user.
+ </doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Enables or disables automatic login for a user.
+ </doc:para>
+ <doc:para>
+ Note that usually only one user can have automatic login
+ enabled, so turning it on for a user will disable it for
+ the previously configured autologin user.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs one of the following PolicyKit authorizations:
+ <doc:list>
+ <doc:item>
+ <doc:term>org.freedesktop.accounts.set-login-option</doc:term>
+ <doc:definition>To change the login screen configuration</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <property name="Uid" type="t" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The uid of the user.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="UserName" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The username of the user.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="RealName" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The users real name.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="AccountType" type="i" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The users account type, encoded as an integer:
+ <doc:list>
+ <doc:item>
+ <doc:term>0</doc:term>
+ <doc:definition>Standard user</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>1</doc:term>
+ <doc:definition>Administrator</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>2</doc:term>
+ <doc:definition>Supervised user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="HomeDirectory" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The users home directory.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="Shell" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The users shell.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="Email" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The email address.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="Language" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The users language, as a locale specification like "de_DE.UTF-8".
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="Location" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The users location.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="LoginFrequency" type="t" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ How often the user has logged in.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="IconFile" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The filename of a png file containing the users icon.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="Locked" type="b" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Whether the users account is locked.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="PasswordMode" type="i" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The password mode for the user account, encoded as an integer:
+ <doc:list>
+ <doc:item>
+ <doc:term>0</doc:term>
+ <doc:definition>Regular password</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>1</doc:term>
+ <doc:definition>Password must be set at next login</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>2</doc:term>
+ <doc:definition>No password</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="PasswordHint" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The password hint for the user.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <property name="AutomaticLogin" type="b" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Whether automatic login is enabled for the user.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ <signal name="Changed">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Emitted when the user is changed.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </signal>
+
+ </interface>
+</node>
diff --git a/src/accounts-service.xml b/src/accounts-service.xml
new file mode 100644
index 0000000..9c19761
--- /dev/null
+++ b/src/accounts-service.xml
@@ -0,0 +1,194 @@
+<!DOCTYPE node PUBLIC
+"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd" >
+<node name="/" xmlns:doc="http://www.freedesktop.org/dbus/1.0/doc.dtd">
+ <interface name="org.freedesktop.Accounts">
+
+ <!-- ************************************************************ -->
+
+ <method name="ListCachedUsers">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="users" direction="out" type="ao">
+ <doc:doc><doc:summary>Object paths of cached users</doc:summary></doc:doc>
+ </arg>
+
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Lists users which have logged into the system locally before.
+ This is not meant to return an exhaustive list of all users.
+ It is possible for <doc:ref type="method" to="Accounts.FindUserByName">FindUserByName()</doc:ref>
+ to return a user that's not on the list.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </method>
+
+ <method name="FindUserById">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="id" direction="in" type="x">
+ <doc:doc><doc:summary>The uid to look up</doc:summary></doc:doc>
+ </arg>
+ <arg name="user" direction="out" type="o">
+ <doc:doc><doc:summary>Object path of user</doc:summary></doc:doc>
+ </arg>
+
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Finds a user by uid.
+ </doc:para>
+ </doc:description>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if no user with the given uid exists</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="FindUserByName">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="name" direction="in" type="s">
+ <doc:doc><doc:summary>The username to look up</doc:summary></doc:doc>
+ </arg>
+ <arg name="user" direction="out" type="o">
+ <doc:doc><doc:summary>Object path of user</doc:summary></doc:doc>
+ </arg>
+
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Finds a user by its username.
+ </doc:para>
+ </doc:description>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if no user with the given username exists</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="CreateUser">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="name" direction="in" type="s">
+ <doc:doc><doc:summary>The username for the new user</doc:summary></doc:doc>
+ </arg>
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="fullname" direction="in" type="s">
+ <doc:doc><doc:summary>The real name for the new user</doc:summary></doc:doc>
+ </arg>
+ <arg name="user" direction="out" type="o">
+ <doc:doc><doc:summary>Object path of the new user</doc:summary></doc:doc>
+ </arg>
+ <arg name="accountType" direction="in" type="i">
+ <doc:doc>
+ <doc:summary>The account type, encoded as an integer</doc:summary>
+ </doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Creates a new user account.
+ </doc:para>
+ <doc:para>
+ The accountType argument can take the following values:
+ </doc:para>
+ <doc:list>
+ <doc:item>
+ <doc:term>0</doc:term>
+ <doc:definition>Standard user</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>1</doc:term>
+ <doc:definition>Administrator</doc:definition>
+ </doc:item>
+ <doc:item>
+ <doc:term>2</doc:term>
+ <doc:definition>Supervised user</doc:definition>
+ </doc:item>
+ </doc:list>
+ </doc:description>
+ <doc:permission>
+ The caller needs the org.freedesktop.accounts.user-administration PolicyKit authorization.
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <method name="DeleteUser">
+ <annotation name="org.freedesktop.DBus.GLib.Async" value=""/>
+ <arg name="id" direction="in" type="x">
+ <doc:doc><doc:summary>The uid to delete</doc:summary></doc:doc>
+ </arg>
+ <arg name="removeFiles" direction="in" type="b">
+ <doc:doc><doc:summary>Whether to remove the users files</doc:summary></doc:doc>
+ </arg>
+
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Deletes a user account.
+ </doc:para>
+ </doc:description>
+ <doc:permission>
+ The caller needs the org.freedesktop.accounts.user-administration PolicyKit authorization.
+ </doc:permission>
+ <doc:errors>
+ <doc:error name="org.freedesktop.Accounts.Error.PermissionDenied">if the caller lacks the appropriate PolicyKit authorization</doc:error>
+ <doc:error name="org.freedesktop.Accounts.Error.Failed">if the operation failed</doc:error>
+ </doc:errors>
+ </doc:doc>
+ </method>
+
+ <signal name="UserAdded">
+ <arg name="user" type="o">
+ <doc:doc><doc:summary>Object path of the user that was added.</doc:summary></doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Emitted when a user is added.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </signal>
+
+ <signal name="UserDeleted">
+ <arg name="user" type="o">
+ <doc:doc><doc:summary>Object path of the user that was deleted.</doc:summary></doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Emitted when a user is deleted.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </signal>
+
+ <signal name="UserChanged">
+ <arg name="user" type="o">
+ <doc:doc><doc:summary>Object path of the user that was changed.</doc:summary></doc:doc>
+ </arg>
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ Emitted when a user is changed.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </signal>
+
+ <property name="DaemonVersion" type="s" access="read">
+ <doc:doc>
+ <doc:description>
+ <doc:para>
+ The version of the running daemon.
+ </doc:para>
+ </doc:description>
+ </doc:doc>
+ </property>
+
+ </interface>
+</node>
diff --git a/src/display-manager.xml b/src/display-manager.xml
new file mode 100644
index 0000000..004eca1
--- /dev/null
+++ b/src/display-manager.xml
@@ -0,0 +1,17 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+ <interface name="org.freedesktop.DisplayManager">
+
+ <!-- Show greeter to allow new login / switch users -->
+ <method name="ShowGreeter"/>
+
+ <!-- Switch to a user, starting a new display if required -->
+ <method name="SwitchToUser">
+ <arg name="username" direction="in" type="s"/>
+ </method>
+
+ <!-- Switch to the guest user -->
+ <method name="SwitchToGuest"/>
+
+ </interface>
+</node>
diff --git a/src/gdm-local-display-factory.xml b/src/gdm-local-display-factory.xml
deleted file mode 100644
index 66fb77c..0000000
--- a/src/gdm-local-display-factory.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node name="/org/gnome/DisplayManager/LocalDisplayFactory">
- <interface name="org.gnome.DisplayManager.LocalDisplayFactory">
- <method name="CreateProductDisplay">
- <arg name="parent_display_id" direction="in" type="o"/>
- <arg name="relay_address" direction="in" type="s"/>
- <arg name="id" direction="out" type="o"/>
- </method>
- <method name="CreateTransientDisplay">
- <arg name="id" direction="out" type="o"/>
- </method>
- <method name="StartGuestSession">
- <arg name="id" direction="out" type="o"/>
- </method>
- <method name="SwitchToUser">
- <arg name="username" direction="in" type="s"/>
- <arg name="id" direction="out" type="o"/>
- </method>
- </interface>
-</node>
diff --git a/src/session-service.c b/src/session-service.c
index ddcb7cb..dfc3805 100644
--- a/src/session-service.c
+++ b/src/session-service.c
@@ -56,8 +56,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define EXTRA_LAUNCHER_DIR "/usr/share/indicators/session/applications"
-#define GUEST_SESSION_LAUNCHER "/usr/share/gdm/guest-session/guest-session-launch"
-
#define LOCKDOWN_DIR "/desktop/gnome/lockdown"
#define LOCKDOWN_KEY_USER LOCKDOWN_DIR "/disable_user_switching"
#define LOCKDOWN_KEY_SCREENSAVER LOCKDOWN_DIR "/disable_lock_screen"
@@ -72,8 +70,6 @@ struct _ActivateData
UserData *user;
};
-static DBusGConnection *system_bus = NULL;
-static DBusGProxy *gdm_proxy = NULL;
static UsersServiceDbus *dbus_interface = NULL;
static SessionDbus *session_dbus = NULL;
@@ -391,7 +387,7 @@ show_dialog (DbusmenuMenuitem * mi, guint timestamp, gchar * type)
return;
}
-/* Checks to see if we should show the guest suession item */
+/* Checks to see if we should show the guest session item */
static gboolean
check_guest_session (void)
{
@@ -400,11 +396,7 @@ check_guest_session (void)
this would be the case of the guest user itself. */
return FALSE;
}
- if (!g_file_test(GUEST_SESSION_LAUNCHER, G_FILE_TEST_IS_EXECUTABLE)) {
- /* It doesn't appear that the Guest session stuff is
- installed. So let's not use it then! */
- return FALSE;
- }
+ // FIXME: Ask DisplayManager
return TRUE;
}
@@ -413,49 +405,18 @@ check_guest_session (void)
static void
activate_guest_session (DbusmenuMenuitem * mi, guint timestamp, gpointer user_data)
{
- GError * error = NULL;
-
lock_if_possible();
- if (dbusmenu_menuitem_property_get_bool(mi, USER_ITEM_PROP_LOGGED_IN)) {
- if (users_service_dbus_activate_guest_session(USERS_SERVICE_DBUS(user_data))) {
- return;
- }
- g_warning("Unable to activate guest session, falling back to command line activation.");
- }
-
- if (!g_spawn_command_line_async(GUEST_SESSION_LAUNCHER " --no-lock", &error)) {
- g_warning("Unable to start guest session: %s", error->message);
- g_error_free(error);
- }
+ if (!users_service_dbus_activate_guest_session(USERS_SERVICE_DBUS(user_data)))
+ g_warning("Unable to activate guest session");
return;
}
-/* Checks to see if we can create sessions and get a proxy
- to the display manager (GDM) */
+/* Checks to see if we can create sessions */
static gboolean
check_new_session (void)
{
- if (system_bus == NULL) {
- system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, NULL);
- }
-
- if (system_bus == NULL) {
- return FALSE;
- }
-
- if (gdm_proxy == NULL) {
- gdm_proxy = dbus_g_proxy_new_for_name(system_bus,
- "org.gnome.DisplayManager",
- "/org/gnome/DisplayManager/LocalDisplayFactory",
- "org.gnome.DisplayManager.LocalDisplayFactory");
- }
-
- if (gdm_proxy == NULL) {
- return FALSE;
- }
-
return TRUE;
}
@@ -463,14 +424,9 @@ check_new_session (void)
static void
activate_new_session (DbusmenuMenuitem * mi, guint timestamp, gpointer user_data)
{
- GError * error = NULL;
-
lock_if_possible();
- if (!g_spawn_command_line_async("gdmflexiserver --startnew", &error)) {
- g_warning("Unable to start new session: %s", error->message);
- g_error_free(error);
- }
+ users_service_dbus_show_greeter (USERS_SERVICE_DBUS(user_data));
return;
}
@@ -614,7 +570,7 @@ rebuild_items (DbusmenuMenuitem *root,
dbusmenu_menuitem_property_set (switch_menuitem, DBUSMENU_MENUITEM_PROP_TYPE, MENU_SWITCH_TYPE);
dbusmenu_menuitem_property_set (switch_menuitem, MENU_SWITCH_USER, g_get_user_name());
dbusmenu_menuitem_child_append (root, switch_menuitem);
- g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), NULL);
+ g_signal_connect (G_OBJECT (switch_menuitem), DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED, G_CALLBACK (activate_new_session), service);
}
GList * users = NULL;
@@ -633,6 +589,7 @@ rebuild_items (DbusmenuMenuitem *root,
/* Hide me from the list */
continue;
}
+ g_debug ("%li %s", user->uid, user->user_name);
if (g_strcmp0(user->user_name, "guest") == 0) {
/* Check to see if the guest has sessions and so therefore should
@@ -659,8 +616,8 @@ rebuild_items (DbusmenuMenuitem *root,
dbusmenu_menuitem_property_set (mi, USER_ITEM_PROP_NAME, user->real_name);
}
dbusmenu_menuitem_property_set_bool (mi, USER_ITEM_PROP_LOGGED_IN, user->sessions != NULL);
- if (user->icon_url != NULL && user->icon_url[0] != '\0' && g_str_has_prefix(user->icon_url, "file://")) {
- dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, user->icon_url + strlen("file://"));
+ if (user->icon_file != NULL && user->icon_file[0] != '\0') {
+ dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, user->icon_file);
} else {
dbusmenu_menuitem_property_set(mi, USER_ITEM_PROP_ICON, USER_ITEM_ICON_DEFAULT);
}
@@ -797,7 +754,7 @@ rebuild_items (DbusmenuMenuitem *root,
rebuilds the menu */
static void
user_change (UsersServiceDbus *service,
- gint64 user,
+ const gchar *user_id,
gpointer user_data)
{
DbusmenuMenuitem *root = (DbusmenuMenuitem *)user_data;
@@ -899,7 +856,7 @@ main (int argc, char ** argv)
G_CALLBACK (user_change),
root_menuitem);
g_signal_connect (G_OBJECT (dbus_interface),
- "user-removed",
+ "user-deleted",
G_CALLBACK (user_change),
root_menuitem);
diff --git a/src/users-service-client.h b/src/users-service-client.h
deleted file mode 100644
index 2bbcde5..0000000
--- a/src/users-service-client.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/* Generated by dbus-binding-tool; do not edit! */
-
-#include <glib.h>
-#include <dbus/dbus-glib.h>
-
-G_BEGIN_DECLS
-
-#ifndef _DBUS_GLIB_ASYNC_DATA_FREE
-#define _DBUS_GLIB_ASYNC_DATA_FREE
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-void
-_dbus_glib_async_data_free (gpointer stuff)
-{
- g_slice_free (DBusGAsyncData, stuff);
-}
-#endif
-
-#ifndef DBUS_GLIB_CLIENT_WRAPPERS_org_gnome_DisplayManager_UserManager
-#define DBUS_GLIB_CLIENT_WRAPPERS_org_gnome_DisplayManager_UserManager
-
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-gboolean
-org_gnome_DisplayManager_UserManager_count_users (DBusGProxy *proxy, gint* OUT_user_count, GError **error)
-
-{
- return dbus_g_proxy_call (proxy, "CountUsers", error, G_TYPE_INVALID, G_TYPE_INT, OUT_user_count, G_TYPE_INVALID);
-}
-
-typedef void (*org_gnome_DisplayManager_UserManager_count_users_reply) (DBusGProxy *proxy, gint OUT_user_count, GError *error, gpointer userdata);
-
-static void
-org_gnome_DisplayManager_UserManager_count_users_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
-{
- DBusGAsyncData *data = (DBusGAsyncData*) user_data;
- GError *error = NULL;
- gint OUT_user_count;
- dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_INT, &OUT_user_count, G_TYPE_INVALID);
- (*(org_gnome_DisplayManager_UserManager_count_users_reply)data->cb) (proxy, OUT_user_count, error, data->userdata);
- return;
-}
-
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-DBusGProxyCall*
-org_gnome_DisplayManager_UserManager_count_users_async (DBusGProxy *proxy, org_gnome_DisplayManager_UserManager_count_users_reply callback, gpointer userdata)
-
-{
- DBusGAsyncData *stuff;
- stuff = g_slice_new (DBusGAsyncData);
- stuff->cb = G_CALLBACK (callback);
- stuff->userdata = userdata;
- return dbus_g_proxy_begin_call (proxy, "CountUsers", org_gnome_DisplayManager_UserManager_count_users_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID);
-}
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-gboolean
-org_gnome_DisplayManager_UserManager_get_user_list (DBusGProxy *proxy, GArray** OUT_uids, GError **error)
-
-{
- return dbus_g_proxy_call (proxy, "GetUserList", error, G_TYPE_INVALID, dbus_g_type_get_collection ("GArray", G_TYPE_INT64), OUT_uids, G_TYPE_INVALID);
-}
-
-typedef void (*org_gnome_DisplayManager_UserManager_get_user_list_reply) (DBusGProxy *proxy, GArray *OUT_uids, GError *error, gpointer userdata);
-
-static void
-org_gnome_DisplayManager_UserManager_get_user_list_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
-{
- DBusGAsyncData *data = (DBusGAsyncData*) user_data;
- GError *error = NULL;
- GArray* OUT_uids;
- dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GArray", G_TYPE_INT64), &OUT_uids, G_TYPE_INVALID);
- (*(org_gnome_DisplayManager_UserManager_get_user_list_reply)data->cb) (proxy, OUT_uids, error, data->userdata);
- return;
-}
-
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-DBusGProxyCall*
-org_gnome_DisplayManager_UserManager_get_user_list_async (DBusGProxy *proxy, org_gnome_DisplayManager_UserManager_get_user_list_reply callback, gpointer userdata)
-
-{
- DBusGAsyncData *stuff;
- stuff = g_slice_new (DBusGAsyncData);
- stuff->cb = G_CALLBACK (callback);
- stuff->userdata = userdata;
- return dbus_g_proxy_begin_call (proxy, "GetUserList", org_gnome_DisplayManager_UserManager_get_user_list_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID);
-}
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-gboolean
-org_gnome_DisplayManager_UserManager_get_user_info (DBusGProxy *proxy, const gint64 IN_uid, char ** OUT_user_name, char ** OUT_real_name, char ** OUT_shell, gint* OUT_login_count, char ** OUT_icon_url, GError **error)
-
-{
- return dbus_g_proxy_call (proxy, "GetUserInfo", error, G_TYPE_INT64, IN_uid, G_TYPE_INVALID, G_TYPE_STRING, OUT_user_name, G_TYPE_STRING, OUT_real_name, G_TYPE_STRING, OUT_shell, G_TYPE_INT, OUT_login_count, G_TYPE_STRING, OUT_icon_url, G_TYPE_INVALID);
-}
-
-typedef void (*org_gnome_DisplayManager_UserManager_get_user_info_reply) (DBusGProxy *proxy, char * OUT_user_name, char * OUT_real_name, char * OUT_shell, gint OUT_login_count, char * OUT_icon_url, GError *error, gpointer userdata);
-
-static void
-org_gnome_DisplayManager_UserManager_get_user_info_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
-{
- DBusGAsyncData *data = (DBusGAsyncData*) user_data;
- GError *error = NULL;
- char * OUT_user_name;
- char * OUT_real_name;
- char * OUT_shell;
- gint OUT_login_count;
- char * OUT_icon_url;
- dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_STRING, &OUT_user_name, G_TYPE_STRING, &OUT_real_name, G_TYPE_STRING, &OUT_shell, G_TYPE_INT, &OUT_login_count, G_TYPE_STRING, &OUT_icon_url, G_TYPE_INVALID);
- (*(org_gnome_DisplayManager_UserManager_get_user_info_reply)data->cb) (proxy, OUT_user_name, OUT_real_name, OUT_shell, OUT_login_count, OUT_icon_url, error, data->userdata);
- return;
-}
-
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-DBusGProxyCall*
-org_gnome_DisplayManager_UserManager_get_user_info_async (DBusGProxy *proxy, const gint64 IN_uid, org_gnome_DisplayManager_UserManager_get_user_info_reply callback, gpointer userdata)
-
-{
- DBusGAsyncData *stuff;
- stuff = g_slice_new (DBusGAsyncData);
- stuff->cb = G_CALLBACK (callback);
- stuff->userdata = userdata;
- return dbus_g_proxy_begin_call (proxy, "GetUserInfo", org_gnome_DisplayManager_UserManager_get_user_info_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INT64, IN_uid, G_TYPE_INVALID);
-}
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-gboolean
-org_gnome_DisplayManager_UserManager_get_users_info (DBusGProxy *proxy, const GArray* IN_uid, GPtrArray** OUT_user_info, GError **error)
-
-{
- return dbus_g_proxy_call (proxy, "GetUsersInfo", error, dbus_g_type_get_collection ("GArray", G_TYPE_INT64), IN_uid, G_TYPE_INVALID, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_INT64, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID)), OUT_user_info, G_TYPE_INVALID);
-}
-
-typedef void (*org_gnome_DisplayManager_UserManager_get_users_info_reply) (DBusGProxy *proxy, GPtrArray *OUT_user_info, GError *error, gpointer userdata);
-
-static void
-org_gnome_DisplayManager_UserManager_get_users_info_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
-{
- DBusGAsyncData *data = (DBusGAsyncData*) user_data;
- GError *error = NULL;
- GPtrArray* OUT_user_info;
- dbus_g_proxy_end_call (proxy, call, &error, dbus_g_type_get_collection ("GPtrArray", dbus_g_type_get_struct ("GValueArray", G_TYPE_INT64, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INVALID)), &OUT_user_info, G_TYPE_INVALID);
- (*(org_gnome_DisplayManager_UserManager_get_users_info_reply)data->cb) (proxy, OUT_user_info, error, data->userdata);
- return;
-}
-
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-DBusGProxyCall*
-org_gnome_DisplayManager_UserManager_get_users_info_async (DBusGProxy *proxy, const GArray* IN_uid, org_gnome_DisplayManager_UserManager_get_users_info_reply callback, gpointer userdata)
-
-{
- DBusGAsyncData *stuff;
- stuff = g_slice_new (DBusGAsyncData);
- stuff->cb = G_CALLBACK (callback);
- stuff->userdata = userdata;
- return dbus_g_proxy_begin_call (proxy, "GetUsersInfo", org_gnome_DisplayManager_UserManager_get_users_info_async_callback, stuff, _dbus_glib_async_data_free, dbus_g_type_get_collection ("GArray", G_TYPE_INT64), IN_uid, G_TYPE_INVALID);
-}
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-gboolean
-org_gnome_DisplayManager_UserManager_get_users_loaded (DBusGProxy *proxy, gboolean* OUT_is_loaded, GError **error)
-
-{
- return dbus_g_proxy_call (proxy, "GetUsersLoaded", error, G_TYPE_INVALID, G_TYPE_BOOLEAN, OUT_is_loaded, G_TYPE_INVALID);
-}
-
-typedef void (*org_gnome_DisplayManager_UserManager_get_users_loaded_reply) (DBusGProxy *proxy, gboolean OUT_is_loaded, GError *error, gpointer userdata);
-
-static void
-org_gnome_DisplayManager_UserManager_get_users_loaded_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
-{
- DBusGAsyncData *data = (DBusGAsyncData*) user_data;
- GError *error = NULL;
- gboolean OUT_is_loaded;
- dbus_g_proxy_end_call (proxy, call, &error, G_TYPE_BOOLEAN, &OUT_is_loaded, G_TYPE_INVALID);
- (*(org_gnome_DisplayManager_UserManager_get_users_loaded_reply)data->cb) (proxy, OUT_is_loaded, error, data->userdata);
- return;
-}
-
-static
-#ifdef G_HAVE_INLINE
-inline
-#endif
-DBusGProxyCall*
-org_gnome_DisplayManager_UserManager_get_users_loaded_async (DBusGProxy *proxy, org_gnome_DisplayManager_UserManager_get_users_loaded_reply callback, gpointer userdata)
-
-{
- DBusGAsyncData *stuff;
- stuff = g_slice_new (DBusGAsyncData);
- stuff->cb = G_CALLBACK (callback);
- stuff->userdata = userdata;
- return dbus_g_proxy_begin_call (proxy, "GetUsersLoaded", org_gnome_DisplayManager_UserManager_get_users_loaded_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_INVALID);
-}
-#endif /* defined DBUS_GLIB_CLIENT_WRAPPERS_org_gnome_DisplayManager_UserManager */
-
-G_END_DECLS
diff --git a/src/users-service-dbus.c b/src/users-service-dbus.c
index 11ee497..087378c 100644
--- a/src/users-service-dbus.c
+++ b/src/users-service-dbus.c
@@ -31,10 +31,9 @@
#include <dbus/dbus-glib-lowlevel.h>
#include "dbus-shared-names.h"
-#include "gdm-local-display-factory-client.h"
+#include "display-manager-client.h"
#include "users-service-dbus.h"
-#include "users-service-client.h"
-#include "users-service-marshal.h"
+#include "accounts-service-client.h"
#include "consolekit-manager-client.h"
#include "consolekit-session-client.h"
@@ -46,21 +45,17 @@ static void users_service_dbus_class_init (UsersServiceDbusClass *kl
static void users_service_dbus_init (UsersServiceDbus *self);
static void users_service_dbus_dispose (GObject *object);
static void users_service_dbus_finalize (GObject *object);
-static void create_gdm_proxy (UsersServiceDbus *self);
+static void create_display_manager_proxy (UsersServiceDbus *self);
+static void create_accounts_service_proxy (UsersServiceDbus *self);
static void create_seat_proxy (UsersServiceDbus *self);
static void create_ck_proxy (UsersServiceDbus *self);
static void create_cksession_proxy (UsersServiceDbus *self);
static gchar *get_seat (UsersServiceDbus *service);
-static void users_loaded (DBusGProxy *proxy,
- gpointer user_data);
static void user_added (DBusGProxy *proxy,
- gint64 uid,
- gpointer user_data);
-static void user_removed (DBusGProxy *proxy,
- gint64 uid,
+ const gchar *user_id,
gpointer user_data);
-static void user_updated (DBusGProxy *proxy,
- guint uid,
+static void user_deleted (DBusGProxy *proxy,
+ const gchar *user_id,
gpointer user_data);
static void seat_proxy_session_added (DBusGProxy *seat_proxy,
const gchar *session_id,
@@ -68,6 +63,7 @@ static void seat_proxy_session_added (DBusGProxy *seat_
static void seat_proxy_session_removed (DBusGProxy *seat_proxy,
const gchar *session_id,
UsersServiceDbus *service);
+static void sync_users (UsersServiceDbus *self);
static gboolean do_add_session (UsersServiceDbus *service,
UserData *user,
const gchar *ssid);
@@ -85,8 +81,8 @@ struct _UsersServiceDbusPrivate
DBusGConnection *system_bus;
- DBusGProxy *gdm_proxy;
- DBusGProxy *gdm_local_proxy;
+ DBusGProxy *accounts_service_proxy;
+ DBusGProxy *display_manager_proxy;
DBusGProxy *ck_proxy;
DBusGProxy *seat_proxy;
DBusGProxy *session_proxy;
@@ -102,10 +98,8 @@ struct _UsersServiceDbusPrivate
/* Signals */
enum {
- USERS_LOADED,
USER_ADDED,
- USER_REMOVED,
- USER_UPDATED,
+ USER_DELETED,
LAST_SIGNAL
};
@@ -124,37 +118,21 @@ users_service_dbus_class_init (UsersServiceDbusClass *klass)
object_class->dispose = users_service_dbus_dispose;
object_class->finalize = users_service_dbus_finalize;
- signals[USERS_LOADED] = g_signal_new ("users-loaded",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (UsersServiceDbusClass, users_loaded),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
-
signals[USER_ADDED] = g_signal_new ("user-added",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (UsersServiceDbusClass, user_added),
NULL, NULL,
- _users_service_marshal_VOID__INT64,
- G_TYPE_NONE, 1, G_TYPE_INT64);
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1, G_TYPE_STRING);
- signals[USER_REMOVED] = g_signal_new ("user-removed",
+ signals[USER_DELETED] = g_signal_new ("user-deleted",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (UsersServiceDbusClass, user_removed),
+ G_STRUCT_OFFSET (UsersServiceDbusClass, user_deleted),
NULL, NULL,
- _users_service_marshal_VOID__INT64,
- G_TYPE_NONE, 1, G_TYPE_INT64);
-
- signals[USER_UPDATED] = g_signal_new ("user-updated",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (UsersServiceDbusClass, user_updated),
- NULL, NULL,
- _users_service_marshal_VOID__INT64,
- G_TYPE_NONE, 1, G_TYPE_INT64);
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1, G_TYPE_STRING);
}
static void
@@ -188,17 +166,10 @@ users_service_dbus_init (UsersServiceDbus *self)
g_free,
NULL);
- dbus_g_object_register_marshaller (_users_service_marshal_VOID__INT64,
- G_TYPE_NONE,
- G_TYPE_INT64,
- G_TYPE_INVALID);
-
- create_gdm_proxy (self);
create_ck_proxy (self);
create_seat_proxy (self);
-
- if (priv->gdm_proxy)
- users_loaded (priv->gdm_proxy, self);
+ create_display_manager_proxy (self);
+ create_accounts_service_proxy (self);
}
static void
@@ -221,75 +192,75 @@ users_service_dbus_finalize (GObject *object)
}
static void
-create_gdm_proxy (UsersServiceDbus *self)
+create_display_manager_proxy (UsersServiceDbus *self)
{
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- GError *error = NULL;
- priv->gdm_proxy = dbus_g_proxy_new_for_name_owner (priv->system_bus,
- "org.gnome.DisplayManager",
- "/org/gnome/DisplayManager/UserManager",
- "org.gnome.DisplayManager.UserManager",
- &error);
+ priv->display_manager_proxy = dbus_g_proxy_new_for_name (priv->system_bus,
+ "org.freedesktop.DisplayManager",
+ "/org/freedesktop/DisplayManager",
+ "org.freedesktop.DisplayManager");
- if (!priv->gdm_proxy)
+ if (!priv->display_manager_proxy)
{
- if (error != NULL)
- {
- g_warning ("Unable to get DisplayManager proxy on system bus: %s", error->message);
- g_error_free (error);
- }
-
+ g_warning ("Failed to get DisplayManager proxy.");
return;
}
+}
- dbus_g_proxy_add_signal (priv->gdm_proxy,
- "UsersLoaded",
- G_TYPE_INVALID);
+static void
+create_accounts_service_proxy (UsersServiceDbus *self)
+{
+ UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
+ GPtrArray *users = g_ptr_array_new ();
+ GError *error = NULL;
+
+ priv->accounts_service_proxy = dbus_g_proxy_new_for_name (priv->system_bus,
+ "org.freedesktop.Accounts",
+ "/org/freedesktop/Accounts",
+ "org.freedesktop.Accounts");
- dbus_g_proxy_add_signal (priv->gdm_proxy,
+ dbus_g_proxy_add_signal (priv->accounts_service_proxy,
"UserAdded",
- G_TYPE_INT64,
+ DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_INVALID);
- dbus_g_proxy_add_signal (priv->gdm_proxy,
- "UserRemoved",
- G_TYPE_INT64,
+ dbus_g_proxy_add_signal (priv->accounts_service_proxy,
+ "UserChanged",
+ DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_INVALID);
- dbus_g_proxy_add_signal (priv->gdm_proxy,
- "UserUpdated",
- G_TYPE_INT64,
+ dbus_g_proxy_add_signal (priv->accounts_service_proxy,
+ "UserDeleted",
+ DBUS_TYPE_G_OBJECT_PATH,
G_TYPE_INVALID);
- dbus_g_proxy_connect_signal (priv->gdm_proxy,
- "UsersLoaded",
- G_CALLBACK (users_loaded),
- self,
- NULL);
-
- dbus_g_proxy_connect_signal (priv->gdm_proxy,
+ dbus_g_proxy_connect_signal (priv->accounts_service_proxy,
"UserAdded",
G_CALLBACK (user_added),
self,
NULL);
- dbus_g_proxy_connect_signal (priv->gdm_proxy,
- "UserRemoved",
- G_CALLBACK (user_removed),
+ dbus_g_proxy_connect_signal (priv->accounts_service_proxy,
+ "UserDeleted",
+ G_CALLBACK (user_deleted),
self,
NULL);
- dbus_g_proxy_connect_signal (priv->gdm_proxy,
- "UserUpdated",
- G_CALLBACK (user_updated),
- self,
- NULL);
+ if (!org_freedesktop_Accounts_list_cached_users (priv->accounts_service_proxy,
+ &users,
+ &error))
+ {
+ g_warning ("failed to retrieve user count: %s", error->message);
+ g_error_free (error);
- priv->gdm_local_proxy = dbus_g_proxy_new_for_name (priv->system_bus,
- "org.gnome.DisplayManager",
- "/org/gnome/DisplayManager/LocalDisplayFactory",
- "org.gnome.DisplayManager.LocalDisplayFactory");
+ return;
+ }
+
+ priv->count = users->len;
+ g_ptr_array_free (users, TRUE);
+
+ sync_users (self);
}
static void
@@ -586,7 +557,6 @@ seat_proxy_session_added (DBusGProxy *seat_proxy,
g_return_if_fail(IS_USERS_SERVICE_DBUS(service));
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service);
uid_t uid;
- gboolean res;
struct passwd *pwent;
UserData *user;
@@ -615,13 +585,11 @@ seat_proxy_session_added (DBusGProxy *seat_proxy,
return;
}
- user = g_hash_table_lookup (priv->users, pwent->pw_name);
+ user = users_service_dbus_get_user_by_username (service, pwent->pw_name);
if (!user)
- {
- return;
- }
+ return;
- res = do_add_session (service, user, session_id);
+ do_add_session (service, user, session_id);
}
static void
@@ -648,7 +616,7 @@ seat_proxy_session_removed (DBusGProxy *seat_proxy,
return;
}
- user = g_hash_table_lookup (priv->users, username);
+ user = users_service_dbus_get_user_by_username (service, username);
if (!user)
return;
@@ -684,16 +652,15 @@ sync_users (UsersServiceDbus *self)
if (priv->count > MINIMUM_USERS && priv->count < MAXIMUM_USERS)
{
- GArray *uids = NULL;
- GPtrArray *users_info = NULL;
+ GPtrArray *users = NULL;
GError *error = NULL;
gint i;
- uids = g_array_new (FALSE, FALSE, sizeof (gint64));
+ users = g_ptr_array_new ();
- if (!org_gnome_DisplayManager_UserManager_get_user_list (priv->gdm_proxy,
- &uids,
- &error))
+ if (!org_freedesktop_Accounts_list_cached_users (priv->accounts_service_proxy,
+ &users,
+ &error))
{
g_warning ("failed to retrieve user list: %s", error->message);
g_error_free (error);
@@ -701,374 +668,101 @@ sync_users (UsersServiceDbus *self)
return;
}
- users_info = g_ptr_array_new ();
-
- if (!org_gnome_DisplayManager_UserManager_get_users_info (priv->gdm_proxy,
- uids,
- &users_info,
- &error))
+ for (i = 0; i < users->len; i++)
{
- g_warning ("failed to retrieve user info: %s", error->message);
- g_error_free (error);
+ gchar *id;
+ DBusGProxy *proxy;
+ UserData *user;
+ GError *error = NULL;
- return;
- }
+ id = g_ptr_array_index (users, i);
- for (i = 0; i < users_info->len; i++)
- {
- GValueArray *values;
- UserData *user;
+ proxy = dbus_g_proxy_new_for_name (priv->system_bus,
+ "org.freedesktop.Accounts",
+ id,
+ "org.freedesktop.DBus.Properties");
- values = g_ptr_array_index (users_info, i);
+ GHashTable *properties;
+ if (!dbus_g_proxy_call (proxy, "GetAll", &error,
+ G_TYPE_STRING, "org.freedesktop.Accounts.User", G_TYPE_INVALID,
+ dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE), &properties, G_TYPE_INVALID))
+ {
+ g_warning ("unable to retrieve user info: %s", error->message);
+ g_error_free (error);
+
+ continue;
+ }
user = g_new0 (UserData, 1);
- user->uid = g_value_get_int64 (g_value_array_get_nth (values, 0));
- user->user_name = g_strdup (g_value_get_string (g_value_array_get_nth (values, 1)));
- user->real_name = g_strdup (g_value_get_string (g_value_array_get_nth (values, 2)));
- user->shell = g_strdup (g_value_get_string (g_value_array_get_nth (values, 3)));
- user->login_count = g_value_get_int (g_value_array_get_nth (values, 4));
- user->icon_url = g_strdup (g_value_get_string (g_value_array_get_nth (values, 5)));
+ user->uid = g_value_get_uint64 (g_hash_table_lookup (properties, "Uid"));
+ user->user_name = g_strdup (g_value_get_string (g_hash_table_lookup (properties, "UserName")));
+ user->real_name = g_strdup (g_value_get_string (g_hash_table_lookup (properties, "RealName")));
+ user->icon_file = g_strdup (g_value_get_string (g_hash_table_lookup (properties, "IconFile")));
user->real_name_conflict = FALSE;
user->menuitem = NULL;
+ g_hash_table_unref (properties);
+
g_hash_table_insert (priv->users,
- g_strdup (user->user_name),
+ g_strdup (id),
user);
add_sessions_for_user (self, user);
}
- }
-}
-
-static void
-users_loaded (DBusGProxy *proxy,
- gpointer user_data)
-{
- UsersServiceDbus *service;
- UsersServiceDbusPrivate *priv;
- GError *error = NULL;
- gint count;
-
- g_return_if_fail (proxy != NULL);
-
- service = (UsersServiceDbus *)user_data;
- priv = USERS_SERVICE_DBUS_GET_PRIVATE (service);
-
- if (!org_gnome_DisplayManager_UserManager_count_users (proxy,
- &count,
- &error))
- {
- g_warning ("failed to retrieve user count: %s", error->message);
- g_error_free (error);
-
- return;
- }
-
- priv->count = count;
-
- sync_users (service);
-}
-
-static gboolean
-session_is_login_window (UsersServiceDbus *self,
- const char *ssid)
-{
- g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), FALSE);
- UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- DBusGProxy *proxy = NULL;
- GError *error = NULL;
- char *type = NULL;
-
- if (!(proxy = dbus_g_proxy_new_for_name (priv->system_bus,
- CK_ADDR,
- ssid,
- CK_SESSION_IFACE)))
- {
- g_warning ("Failed to get ConsoleKit proxy");
-
- return FALSE;
- }
-
- if (!org_freedesktop_ConsoleKit_Session_get_session_type (proxy, &type, &error))
- {
- g_warning ("Can't call GetSessionType: %s", error->message);
- g_error_free (error);
-
- if (proxy)
- g_object_unref (proxy);
-
- return FALSE;
- }
-
- if (proxy)
- g_object_unref (proxy);
-
- return (type && type[0] != '\0' && strcmp (type, "LoginWindow") == 0);
-}
-
-static char *
-get_login_session (UsersServiceDbus *self)
-{
- g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), NULL);
- UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- gboolean can_activate;
- GError *error = NULL;
- GPtrArray *sessions = NULL;
- char *ssid = NULL;
- int i;
-
- if (!priv->seat || priv->seat[0] == '\0')
- {
- return NULL;
- }
-
- if (!dbus_g_proxy_call (priv->seat_proxy,
- "CanActivateSessions",
- &error,
- G_TYPE_INVALID,
- G_TYPE_BOOLEAN, &can_activate,
- G_TYPE_INVALID))
- {
- g_warning ("Failed to call CanActivateSessions: %s", error->message);
- g_error_free (error);
-
- return NULL;
- }
-
- if (!can_activate)
- {
- return NULL;
- }
-
- error = NULL;
- if (!dbus_g_proxy_call (priv->seat_proxy,
- "GetSessions",
- &error,
- G_TYPE_INVALID,
- dbus_g_type_get_collection ("GPtrArray", DBUS_TYPE_G_OBJECT_PATH), &sessions,
- G_TYPE_INVALID))
- {
- g_warning ("Failed to call GetSessions: %s", error->message);
- g_error_free (error);
-
- return NULL;
- }
-
- for (i = 0; i < sessions->len; i++)
- {
- char *s = g_ptr_array_index (sessions, i);
-
- if (session_is_login_window (self, s))
- {
- ssid = g_strdup (s);
- break;
- }
- }
-
- g_ptr_array_foreach (sessions, (GFunc)g_free, NULL);
- g_ptr_array_free (sessions, TRUE);
-
- return ssid;
-}
-
-static gboolean
-activate_user_session (UsersServiceDbus *self,
- const char *seat,
- const char *ssid)
-{
- g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), FALSE);
- UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- DBusMessage *message = NULL;
- DBusMessage *reply = NULL;
- DBusError error;
-
- if (!(message = dbus_message_new_method_call ("org.freedesktop.ConsoleKit",
- seat,
- "org.freedesktop.ConsoleKit.Seat",
- "ActivateSession")))
- {
- return FALSE;
- }
-
- if (!dbus_message_append_args (message,
- DBUS_TYPE_OBJECT_PATH, &ssid,
- DBUS_TYPE_INVALID))
- {
- return FALSE;
- }
-
- dbus_error_init (&error);
- if (!(reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (priv->system_bus),
- message,
- -1,
- &error)))
- {
- if (dbus_error_is_set (&error))
- {
- g_warning ("Can't activate session: %s", error.message);
- dbus_error_free (&error);
-
- return FALSE;
- }
- }
-
- if (message)
- {
- dbus_message_unref (message);
- }
- if (reply)
- {
- dbus_message_unref (reply);
+ g_ptr_array_free (users, TRUE);
}
-
- return TRUE;
-}
-
-gboolean
-start_new_user_session (UsersServiceDbus *self,
- UserData *user)
-{
- g_return_val_if_fail (IS_USERS_SERVICE_DBUS (self), FALSE);
-
- UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- GError *error = NULL;
- char *ssid;
-
- ssid = get_login_session (self);
- if (ssid)
- {
- if (!activate_user_session (self, priv->seat, ssid))
- {
- return FALSE;
- }
- }
-
- if (!g_spawn_command_line_async ("gdmflexiserver -s", &error))
- {
- g_warning ("Failed to start new login session: %s", error->message);
- g_error_free (error);
-
- return FALSE;
- }
-
- return TRUE;
}
static void
-user_added (DBusGProxy *proxy,
- gint64 uid,
- gpointer user_data)
+user_added (DBusGProxy *proxy,
+ const gchar *user_id,
+ gpointer user_data)
{
UsersServiceDbus *service = (UsersServiceDbus *)user_data;
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service);
- UserData *user = g_new0 (UserData, 1);
- GError *error = NULL;
priv->count++;
if (priv->count < MAXIMUM_USERS)
{
- if ((priv->count - g_hash_table_size (priv->users)) > 1)
- {
- sync_users (service);
- }
- else
- {
- if (!org_gnome_DisplayManager_UserManager_get_user_info (proxy,
- uid,
- &user->user_name,
- &user->real_name,
- &user->shell,
- &user->login_count,
- &user->icon_url,
- &error))
- {
- g_warning ("unable to retrieve user info: %s", error->message);
- g_error_free (error);
-
- g_free (user);
-
- return;
- }
-
- user->uid = uid;
-
- g_hash_table_insert (priv->users,
- g_strdup (user->user_name),
- user);
-
- g_signal_emit (G_OBJECT (service), signals[USER_ADDED], 0, user, TRUE);
- }
+ sync_users (service);
}
}
-static gboolean
-compare_users_by_uid (gpointer key,
- gpointer value,
- gpointer user_data)
-{
- return (GPOINTER_TO_UINT (value) == GPOINTER_TO_UINT (user_data));
-}
-
static void
-user_removed (DBusGProxy *proxy,
- gint64 uid,
- gpointer user_data)
+user_deleted (DBusGProxy *proxy,
+ const gchar *user_id,
+ gpointer user_data)
{
UsersServiceDbus *service = (UsersServiceDbus *)user_data;
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service);
- UserData *user;
- gint size;
-
- size = g_hash_table_size (priv->users);
priv->count--;
-
- if (size == 0 || (size - priv->count) > 1)
- {
- sync_users (service);
- }
- else
- {
- user = g_hash_table_find (priv->users,
- compare_users_by_uid,
- GUINT_TO_POINTER ((gint)uid));
-
- if (user != NULL)
- {
- g_hash_table_remove (priv->users,
- user->user_name);
- }
- }
+ g_hash_table_remove (priv->users, user_id);
}
-static void
-user_updated (DBusGProxy *proxy,
- guint uid,
- gpointer user_data)
+UserData *
+users_service_dbus_get_user_by_username (UsersServiceDbus *self,
+ const gchar *username)
{
-#if 0
- // XXX - TODO
- UsersServiceDbus *service = (UsersServiceDbus *)user_data;
- UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (service);
- UserData *user;
+ GHashTableIter iter;
+ gpointer value;
- user = g_hash_table_find (priv->users,
- compare_users_by_uid,
- GUINT_TO_POINTER (uid));
-#endif
-}
-
-gint
-users_service_dbus_get_user_count (UsersServiceDbus *self)
-{
- g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), 0);
+ g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), NULL);
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- return priv->count;
+ g_hash_table_iter_init (&iter, priv->users);
+ while (g_hash_table_iter_next (&iter, NULL, &value))
+ {
+ UserData *user = value;
+ if (strcmp (user->user_name, username) == 0)
+ return user;
+ }
+
+ return NULL;
}
GList *
@@ -1081,13 +775,21 @@ users_service_dbus_get_user_list (UsersServiceDbus *self)
return g_hash_table_get_values (priv->users);
}
+gboolean
+users_service_dbus_show_greeter (UsersServiceDbus *self)
+{
+ g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), FALSE);
+ UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
+ return org_freedesktop_DisplayManager_show_greeter(priv->display_manager_proxy, NULL);
+}
+
/* Activates the guest account if it can. */
gboolean
users_service_dbus_activate_guest_session (UsersServiceDbus *self)
{
g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), FALSE);
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- return org_gnome_DisplayManager_LocalDisplayFactory_switch_to_user(priv->gdm_local_proxy, "guest", NULL, NULL);
+ return org_freedesktop_DisplayManager_switch_to_guest(priv->display_manager_proxy, NULL);
}
/* Activates a specific user */
@@ -1097,7 +799,7 @@ users_service_dbus_activate_user_session (UsersServiceDbus *self,
{
g_return_val_if_fail(IS_USERS_SERVICE_DBUS(self), FALSE);
UsersServiceDbusPrivate *priv = USERS_SERVICE_DBUS_GET_PRIVATE (self);
- return org_gnome_DisplayManager_LocalDisplayFactory_switch_to_user(priv->gdm_local_proxy, user->user_name, NULL, NULL);
+ return org_freedesktop_DisplayManager_switch_to_user(priv->display_manager_proxy, user->user_name, NULL);
}
gboolean
diff --git a/src/users-service-dbus.h b/src/users-service-dbus.h
index 4798d64..c3f0171 100644
--- a/src/users-service-dbus.h
+++ b/src/users-service-dbus.h
@@ -42,9 +42,7 @@ struct _UserData
gint64 uid;
gchar *user_name;
gchar *real_name;
- gchar *shell;
- gint login_count;
- gchar *icon_url;
+ gchar *icon_file;
GList *sessions;
@@ -70,17 +68,16 @@ struct _UsersServiceDbusClass {
GObjectClass parent_class;
/* Signals */
- void (* users_loaded) (UsersServiceDbus *self, gpointer user_data);
-
- void (* user_added) (UsersServiceDbus *self, gint64 uid, gpointer user_data);
- void (* user_removed) (UsersServiceDbus *self, gint64 uid, gpointer user_data);
- void (* user_updated) (UsersServiceDbus *self, gint64 uid, gpointer user_data);
+ void (* user_added) (UsersServiceDbus *self, const gchar *user_id, gpointer user_data);
+ void (* user_deleted) (UsersServiceDbus *self, const gchar *user_id, gpointer user_data);
};
GType users_service_dbus_get_type (void) G_GNUC_CONST;
-gint users_service_dbus_get_user_count (UsersServiceDbus *self);
+UserData *users_service_dbus_get_user_by_username (UsersServiceDbus *self,
+ const gchar *username);
GList *users_service_dbus_get_user_list (UsersServiceDbus *self);
+gboolean users_service_dbus_show_greeter (UsersServiceDbus *self);
gboolean users_service_dbus_can_activate_session (UsersServiceDbus *self);
gboolean users_service_dbus_activate_user_session (UsersServiceDbus *self,
UserData *user);
diff --git a/src/users-service-marshal.c b/src/users-service-marshal.c
deleted file mode 100644
index 0382f3e..0000000
--- a/src/users-service-marshal.c
+++ /dev/null
@@ -1,86 +0,0 @@
-
-#include <glib-object.h>
-
-
-#ifdef G_ENABLE_DEBUG
-#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v)
-#define g_marshal_value_peek_char(v) g_value_get_char (v)
-#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v)
-#define g_marshal_value_peek_int(v) g_value_get_int (v)
-#define g_marshal_value_peek_uint(v) g_value_get_uint (v)
-#define g_marshal_value_peek_long(v) g_value_get_long (v)
-#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v)
-#define g_marshal_value_peek_int64(v) g_value_get_int64 (v)
-#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v)
-#define g_marshal_value_peek_enum(v) g_value_get_enum (v)
-#define g_marshal_value_peek_flags(v) g_value_get_flags (v)
-#define g_marshal_value_peek_float(v) g_value_get_float (v)
-#define g_marshal_value_peek_double(v) g_value_get_double (v)
-#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v)
-#define g_marshal_value_peek_param(v) g_value_get_param (v)
-#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v)
-#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v)
-#define g_marshal_value_peek_object(v) g_value_get_object (v)
-#define g_marshal_value_peek_variant(v) g_value_get_variant (v)
-#else /* !G_ENABLE_DEBUG */
-/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
- * Do not access GValues directly in your code. Instead, use the
- * g_value_get_*() functions
- */
-#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int
-#define g_marshal_value_peek_char(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_int(v) (v)->data[0].v_int
-#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint
-#define g_marshal_value_peek_long(v) (v)->data[0].v_long
-#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64
-#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64
-#define g_marshal_value_peek_enum(v) (v)->data[0].v_long
-#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong
-#define g_marshal_value_peek_float(v) (v)->data[0].v_float
-#define g_marshal_value_peek_double(v) (v)->data[0].v_double
-#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer
-#define g_marshal_value_peek_variant(v) (v)->data[0].v_pointer
-#endif /* !G_ENABLE_DEBUG */
-
-
-/* VOID:INT64 (./users-service.list:1) */
-void
-_users_service_marshal_VOID__INT64 (GClosure *closure,
- GValue *return_value G_GNUC_UNUSED,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint G_GNUC_UNUSED,
- gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__INT64) (gpointer data1,
- gint64 arg_1,
- gpointer data2);
- register GMarshalFunc_VOID__INT64 callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail (n_param_values == 2);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
- callback = (GMarshalFunc_VOID__INT64) (marshal_data ? marshal_data : cc->callback);
-
- callback (data1,
- g_marshal_value_peek_int64 (param_values + 1),
- data2);
-}
-
diff --git a/src/users-service.list b/src/users-service.list
deleted file mode 100644
index 36f34ba..0000000
--- a/src/users-service.list
+++ /dev/null
@@ -1 +0,0 @@
-VOID:INT64
diff --git a/src/users-service.xml b/src/users-service.xml
deleted file mode 100644
index c90f1e8..0000000
--- a/src/users-service.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
-<node name="/org/gnome/DisplayManager/UserManager">
- <interface name="org.gnome.DisplayManager.UserManager">
-
- <!-- Get the number of known users -->
- <method name="CountUsers">
- <arg name="user_count" direction="out" type="i"/>
- </method>
-
- <!-- Get the list of known UIDs -->
- <method name="GetUserList">
- <arg name="uids" direction="out" type="ax"/>
- </method>
-
- <!-- Get user info for a user -->
- <method name="GetUserInfo">
- <arg name="uid" direction="in" type="x"/>
- <arg name="user_name" direction="out" type="s"/>
- <arg name="real_name" direction="out" type="s"/>
- <arg name="shell" direction="out" type="s"/>
- <arg name="login_count" direction="out" type="i"/>
- <arg name="icon_url" direction="out" type="s"/>
- </method>
-
- <!-- Get user info for a list of users -->
- <method name="GetUsersInfo">
- <arg name="uid" direction="in" type="ax"/>
- <!-- (uid, user_name, real_name, shell, icon_url) -->
- <arg name="user_info" direction="out" type="a(xsssis)"/>
- </method>
-
- <!-- Query if the initial user list is loaded -->
- <method name="GetUsersLoaded">
- <arg name="is_loaded" direction="out" type="b"/>
- </method>
-
- <!-- Triggered when the initial user list is loaded -->
- <signal name="UsersLoaded"></signal>
-
- <!-- Triggered when a users are added to/removed from the system.
- Clients should monitor these signals as soon as they connect to
- this object -->
- <signal name="UserAdded">
- <arg name="uid" type="x"/>
- </signal>
- <signal name="UserRemoved">
- <arg name="uid" type="x"/>
- </signal>
-
- <!-- Triggered when a user has updated information -->
- <signal name="UserUpdated">
- <arg name="uid" type="x"/>
- </signal>
-
- </interface>
-</node>