comparison libpurple/core.c @ 17123: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
comparison
equal deleted inserted replaced
17122:9f5c9df30287 17123:176d0fc8bc16
46 #include "status.h" 46 #include "status.h"
47 #include "stun.h" 47 #include "stun.h"
48 #include "util.h" 48 #include "util.h"
49 49
50 #ifdef HAVE_DBUS 50 #ifdef HAVE_DBUS
51 # define DBUS_API_SUBJECT_TO_CHANGE
52 # include <dbus/dbus.h>
53 # include "dbus-purple.h"
51 # include "dbus-server.h" 54 # include "dbus-server.h"
55 # include "dbus-bindings.h"
52 #endif 56 #endif
53 57
54 struct PurpleCore 58 struct PurpleCore
55 { 59 {
56 char *ui; 60 char *ui;
274 purple_core_get_ui_ops(void) 278 purple_core_get_ui_ops(void)
275 { 279 {
276 return _ops; 280 return _ops;
277 } 281 }
278 282
283 #ifdef HAVE_DBUS
284 static char *purple_dbus_owner_user_dir(void)
285 {
286 DBusMessage *msg = NULL, *reply = NULL;
287 DBusConnection *dbus_connection = NULL;
288 DBusError dbus_error;
289 char *remote_user_dir = NULL;
290
291 if (NULL == (dbus_connection = purple_dbus_get_connection()))
292 return NULL;
293
294 if (NULL == (msg = dbus_message_new_method_call(DBUS_SERVICE_PURPLE, DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "PurpleUserDir")))
295 return NULL;
296
297 dbus_error_init(&dbus_error);
298 reply = dbus_connection_send_with_reply_and_block(dbus_connection, msg, 5000, &dbus_error);
299 dbus_message_unref(msg);
300 dbus_error_free(&dbus_error);
301
302 if (NULL != reply)
303 {
304 dbus_error_init(&dbus_error);
305 dbus_message_get_args(reply, &dbus_error, DBUS_TYPE_STRING, &remote_user_dir, DBUS_TYPE_INVALID);
306 if (NULL != remote_user_dir)
307 remote_user_dir = g_strdup(remote_user_dir);
308 dbus_error_free(&dbus_error);
309 dbus_message_unref(reply);
310 }
311
312 return remote_user_dir;
313 }
314
315 static void purple_dbus_owner_show_buddy_list(void)
316 {
317 DBusError dbus_error;
318 DBusMessage *msg = NULL, *reply = NULL;
319 DBusConnection *dbus_connection = purple_dbus_get_connection();
320
321 if (NULL == dbus_connection) return;
322
323 if (NULL == (msg = dbus_message_new_method_call(DBUS_SERVICE_PURPLE, DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "PurpleBlistShow")))
324 return ;
325
326 dbus_error_init(&dbus_error);
327 if (NULL != (reply = dbus_connection_send_with_reply_and_block(dbus_connection, msg, 5000, &dbus_error)))
328 dbus_message_unref(msg);
329 dbus_error_free(&dbus_error);
330 }
331 #endif /* HAVE_DBUS */
332
333 gboolean purple_core_ensure_single_instance()
334 {
335 gboolean is_single_instance = TRUE;
336 #ifdef HAVE_DBUS
337 if (is_single_instance) /* in the future, other mechanisms might have already set this to FALSE */
338 if (!purple_dbus_is_owner()) {
339 const char *user_dir = purple_user_dir();
340 char *dbus_owner_user_dir = purple_dbus_owner_user_dir();
341
342 if (NULL == user_dir && NULL != dbus_owner_user_dir)
343 is_single_instance = TRUE;
344 else
345 if (NULL != user_dir && NULL == dbus_owner_user_dir)
346 is_single_instance = TRUE;
347 else
348 if (NULL == user_dir && NULL == dbus_owner_user_dir)
349 is_single_instance = FALSE;
350 else
351 is_single_instance = strcmp(dbus_owner_user_dir, user_dir);
352
353 if (!is_single_instance)
354 purple_dbus_owner_show_buddy_list();
355
356 g_free(dbus_owner_user_dir);
357 }
358 #endif /* HAVE_DBUS */
359 return is_single_instance;
360 }
361
279 static gboolean 362 static gboolean
280 move_and_symlink_dir(const char *path, const char *basename, const char *old_base, const char *new_base, const char *relative) 363 move_and_symlink_dir(const char *path, const char *basename, const char *old_base, const char *new_base, const char *relative)
281 { 364 {
282 char *new_name = g_build_filename(new_base, basename, NULL); 365 char *new_name = g_build_filename(new_base, basename, NULL);
283 #ifndef _WIN32 366 #ifndef _WIN32