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 }