Mercurial > pidgin.yaz
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 |