Mercurial > pidgin
comparison 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 |
comparison
equal
deleted
inserted
replaced
17708:9f5c9df30287 | 17709: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 |