Mercurial > pidgin
diff libpurple/core.c @ 17709:176d0fc8bc16
Alternative dbus_uniq implementation
author | Gabriel Schulhof <nix@go-nix.ca> |
---|---|
date | Tue, 15 May 2007 20:41:36 +0000 |
parents | f8f78fa7e774 |
children | 601594a64190 |
line wrap: on
line diff
--- a/libpurple/core.c Sun May 13 19:52:05 2007 +0000 +++ b/libpurple/core.c Tue May 15 20:41:36 2007 +0000 @@ -48,7 +48,11 @@ #include "util.h" #ifdef HAVE_DBUS +# define DBUS_API_SUBJECT_TO_CHANGE +# include <dbus/dbus.h> +# include "dbus-purple.h" # include "dbus-server.h" +# include "dbus-bindings.h" #endif struct PurpleCore @@ -276,6 +280,85 @@ return _ops; } +#ifdef HAVE_DBUS +static char *purple_dbus_owner_user_dir(void) +{ + DBusMessage *msg = NULL, *reply = NULL; + DBusConnection *dbus_connection = NULL; + DBusError dbus_error; + char *remote_user_dir = NULL; + + if (NULL == (dbus_connection = purple_dbus_get_connection())) + return NULL; + + if (NULL == (msg = dbus_message_new_method_call(DBUS_SERVICE_PURPLE, DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "PurpleUserDir"))) + return NULL; + + dbus_error_init(&dbus_error); + reply = dbus_connection_send_with_reply_and_block(dbus_connection, msg, 5000, &dbus_error); + dbus_message_unref(msg); + dbus_error_free(&dbus_error); + + if (NULL != reply) + { + dbus_error_init(&dbus_error); + dbus_message_get_args(reply, &dbus_error, DBUS_TYPE_STRING, &remote_user_dir, DBUS_TYPE_INVALID); + if (NULL != remote_user_dir) + remote_user_dir = g_strdup(remote_user_dir); + dbus_error_free(&dbus_error); + dbus_message_unref(reply); + } + + return remote_user_dir; +} + +static void purple_dbus_owner_show_buddy_list(void) +{ + DBusError dbus_error; + DBusMessage *msg = NULL, *reply = NULL; + DBusConnection *dbus_connection = purple_dbus_get_connection(); + + if (NULL == dbus_connection) return; + + if (NULL == (msg = dbus_message_new_method_call(DBUS_SERVICE_PURPLE, DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "PurpleBlistShow"))) + return ; + + dbus_error_init(&dbus_error); + if (NULL != (reply = dbus_connection_send_with_reply_and_block(dbus_connection, msg, 5000, &dbus_error))) + dbus_message_unref(msg); + dbus_error_free(&dbus_error); +} +#endif /* HAVE_DBUS */ + +gboolean purple_core_ensure_single_instance() +{ +gboolean is_single_instance = TRUE; +#ifdef HAVE_DBUS + if (is_single_instance) /* in the future, other mechanisms might have already set this to FALSE */ + if (!purple_dbus_is_owner()) { + const char *user_dir = purple_user_dir(); + char *dbus_owner_user_dir = purple_dbus_owner_user_dir(); + + if (NULL == user_dir && NULL != dbus_owner_user_dir) + is_single_instance = TRUE; + else + if (NULL != user_dir && NULL == dbus_owner_user_dir) + is_single_instance = TRUE; + else + if (NULL == user_dir && NULL == dbus_owner_user_dir) + is_single_instance = FALSE; + else + is_single_instance = strcmp(dbus_owner_user_dir, user_dir); + + if (!is_single_instance) + purple_dbus_owner_show_buddy_list(); + + g_free(dbus_owner_user_dir); + } +#endif /* HAVE_DBUS */ + return is_single_instance; +} + static gboolean move_and_symlink_dir(const char *path, const char *basename, const char *old_base, const char *new_base, const char *relative) {