Mercurial > pidgin
comparison libgaim/network.c @ 14696:34083fe39891
[gaim-migrate @ 17448]
From Paul Betts, NetworkManager integration. This will smartly disconnect and reconnect
accounts according to network availability. Probably needs some more tweaking.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Sun, 08 Oct 2006 08:40:09 +0000 |
parents | 645598a4ec04 |
children | 51685370de57 |
comparison
equal
deleted
inserted
replaced
14695:fa0c8fa2b5a7 | 14696:34083fe39891 |
---|---|
40 #include "network.h" | 40 #include "network.h" |
41 #include "prefs.h" | 41 #include "prefs.h" |
42 #include "stun.h" | 42 #include "stun.h" |
43 #include "upnp.h" | 43 #include "upnp.h" |
44 | 44 |
45 #ifdef HAVE_LIBNM | |
46 #include <libnm_glib.h> | |
47 | |
48 libnm_glib_ctx *nm_context = NULL; | |
49 guint nm_callback_idx = 0; | |
50 | |
51 #endif | |
52 | |
45 struct _GaimNetworkListenData { | 53 struct _GaimNetworkListenData { |
46 int listenfd; | 54 int listenfd; |
47 int socket_type; | 55 int socket_type; |
48 gboolean retry; | 56 gboolean retry; |
49 gboolean adding; | 57 gboolean adding; |
50 GaimNetworkListenCallback cb; | 58 GaimNetworkListenCallback cb; |
51 gpointer cb_data; | 59 gpointer cb_data; |
52 }; | 60 }; |
61 | |
62 #ifdef HAVE_LIBNM | |
63 void nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data); | |
64 #endif | |
53 | 65 |
54 const unsigned char * | 66 const unsigned char * |
55 gaim_network_ip_atoi(const char *ip) | 67 gaim_network_ip_atoi(const char *ip) |
56 { | 68 { |
57 static unsigned char ret[4]; | 69 static unsigned char ret[4]; |
358 } | 370 } |
359 | 371 |
360 return ntohs(addr.sin_port); | 372 return ntohs(addr.sin_port); |
361 } | 373 } |
362 | 374 |
375 gboolean | |
376 gaim_network_is_available(void) | |
377 { | |
378 #ifdef HAVE_LIBNM | |
379 /* Try NetworkManager first, maybe we'll get lucky */ | |
380 int libnm_retval = -1; | |
381 | |
382 if (nm_context) | |
383 { | |
384 if ((libnm_retval = libnm_glib_get_network_state(nm_context)) == LIBNM_NO_NETWORK_CONNECTION) | |
385 { | |
386 gaim_debug_warning("network", "NetworkManager not active or reports no connection (retval = %i)\n", libnm_retval); | |
387 return FALSE; | |
388 } | |
389 if (libnm_retval == LIBNM_ACTIVE_NETWORK_CONNECTION) return TRUE; | |
390 } | |
391 #endif | |
392 return TRUE; | |
393 } | |
394 | |
395 #ifdef HAVE_LIBNM | |
396 void | |
397 nm_callback_func(libnm_glib_ctx* ctx, gpointer user_data) | |
398 { | |
399 GList *l; | |
400 GaimAccount *account; | |
401 static libnm_glib_state prev = LIBNM_NO_DBUS; | |
402 libnm_glib_state current; | |
403 GaimConnectionUiOps *ui_ops = gaim_connections_get_ui_ops(); | |
404 | |
405 current = libnm_glib_get_network_state(ctx); | |
406 gaim_debug_info("network","Entering nm_callback_func!\n"); | |
407 | |
408 switch(current) | |
409 { | |
410 case LIBNM_ACTIVE_NETWORK_CONNECTION: | |
411 ui_ops->network_connected(); | |
412 prev = current; | |
413 break; | |
414 case LIBNM_NO_NETWORK_CONNECTION: | |
415 if (prev != LIBNM_ACTIVE_NETWORK_CONNECTION) | |
416 break; | |
417 ui_ops->network_disconnected(); | |
418 prev = current; | |
419 break; | |
420 case LIBNM_NO_DBUS: | |
421 case LIBNM_NO_NETWORKMANAGER: | |
422 case LIBNM_INVALID_CONTEXT: | |
423 default: | |
424 break; | |
425 } | |
426 } | |
427 #endif | |
428 | |
363 void | 429 void |
364 gaim_network_init(void) | 430 gaim_network_init(void) |
365 { | 431 { |
366 gaim_prefs_add_none ("/core/network"); | 432 gaim_prefs_add_none ("/core/network"); |
367 gaim_prefs_add_bool ("/core/network/auto_ip", TRUE); | 433 gaim_prefs_add_bool ("/core/network/auto_ip", TRUE); |
369 gaim_prefs_add_bool ("/core/network/ports_range_use", FALSE); | 435 gaim_prefs_add_bool ("/core/network/ports_range_use", FALSE); |
370 gaim_prefs_add_int ("/core/network/ports_range_start", 1024); | 436 gaim_prefs_add_int ("/core/network/ports_range_start", 1024); |
371 gaim_prefs_add_int ("/core/network/ports_range_end", 2048); | 437 gaim_prefs_add_int ("/core/network/ports_range_end", 2048); |
372 | 438 |
373 gaim_upnp_discover(NULL, NULL); | 439 gaim_upnp_discover(NULL, NULL); |
374 } | 440 |
441 #ifdef HAVE_LIBNM | |
442 nm_context = libnm_glib_init(); | |
443 if(nm_context) | |
444 nm_callback_idx = libnm_glib_register_callback(nm_context, nm_callback_func, NULL, g_main_context_default()); | |
445 #endif | |
446 } | |
447 | |
448 void | |
449 gaim_network_uninit(void) | |
450 { | |
451 #ifdef HAVE_LIBNM | |
452 /* FIXME: If anyone can think of a more clever way to shut down libnm without | |
453 * using a global variable + this function, please do. */ | |
454 if(nm_context && nm_callback_idx) | |
455 libnm_glib_unregister_callback(nm_context, nm_callback_idx); | |
456 | |
457 if(nm_context) | |
458 libnm_glib_shutdown(nm_context); | |
459 #endif | |
460 } |