comparison libpurple/core.c @ 18061:226b9109179c

propagate from branch 'im.pidgin.pidgin' (head 4d9e228029b9b7850d000c2edadc108c40f9e59a) to branch 'im.pidgin.pidgin.2.1.0' (head 50475bfc4ddcde1db8533c1b41c7b4342d773e21)
author Richard Laager <rlaager@wiktel.com>
date Thu, 07 Jun 2007 04:31:02 +0000
parents 1d6007400837
children f160b6e84d0c
comparison
equal deleted inserted replaced
17765:89adae2f1a6e 18061:226b9109179c
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 ((dbus_connection = purple_dbus_get_connection()) == NULL)
292 return NULL;
293
294 if ((msg = dbus_message_new_method_call(DBUS_SERVICE_PURPLE, DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "PurpleUserDir")) == NULL)
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 (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 remote_user_dir = g_strdup(remote_user_dir);
307 dbus_error_free(&dbus_error);
308 dbus_message_unref(reply);
309 }
310
311 return remote_user_dir;
312 }
313
314 static void purple_dbus_owner_show_buddy_list(void)
315 {
316 DBusError dbus_error;
317 DBusMessage *msg = NULL, *reply = NULL;
318 DBusConnection *dbus_connection = NULL;
319
320 if ((dbus_connection = purple_dbus_get_connection()) == NULL)
321 return;
322
323 if ((msg = dbus_message_new_method_call(DBUS_SERVICE_PURPLE, DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "PurpleBlistShow")) == NULL)
324 return;
325
326 dbus_error_init(&dbus_error);
327 if ((reply = dbus_connection_send_with_reply_and_block(dbus_connection, msg, 5000, &dbus_error)) != NULL)
328 {
329 dbus_message_unref(msg);
330 }
331 dbus_error_free(&dbus_error);
332 }
333 #endif /* HAVE_DBUS */
334
335 gboolean
336 purple_core_ensure_single_instance()
337 {
338 gboolean is_single_instance = TRUE;
339 #ifdef HAVE_DBUS
340 /* in the future, other mechanisms might have already set this to FALSE */
341 if (is_single_instance)
342 {
343 if (!purple_dbus_is_owner())
344 {
345 const char *user_dir = purple_user_dir();
346 char *dbus_owner_user_dir = purple_dbus_owner_user_dir();
347
348 if (NULL == user_dir && NULL != dbus_owner_user_dir)
349 is_single_instance = TRUE;
350 else if (NULL != user_dir && NULL == dbus_owner_user_dir)
351 is_single_instance = TRUE;
352 else if (NULL == user_dir && NULL == dbus_owner_user_dir)
353 is_single_instance = FALSE;
354 else
355 is_single_instance = strcmp(dbus_owner_user_dir, user_dir);
356
357 if (!is_single_instance)
358 purple_dbus_owner_show_buddy_list();
359
360 g_free(dbus_owner_user_dir);
361 }
362 }
363 #endif /* HAVE_DBUS */
364
365 return is_single_instance;
366 }
367
279 static gboolean 368 static gboolean
280 move_and_symlink_dir(const char *path, const char *basename, const char *old_base, const char *new_base, const char *relative) 369 move_and_symlink_dir(const char *path, const char *basename, const char *old_base, const char *new_base, const char *relative)
281 { 370 {
282 char *new_name = g_build_filename(new_base, basename, NULL); 371 char *new_name = g_build_filename(new_base, basename, NULL);
283 #ifndef _WIN32 372 #ifndef _WIN32