diff options
-rw-r--r-- | ChangeLog | 40 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | docs/NetworkManager DBUS API.txt | 10 | ||||
-rw-r--r-- | panel-applet/NMWirelessApplet.c | 23 | ||||
-rw-r--r-- | panel-applet/NMWirelessApplet.h | 61 | ||||
-rw-r--r-- | panel-applet/NMWirelessAppletDbus.c | 221 | ||||
-rw-r--r-- | src/NetworkManagerAP.c | 14 | ||||
-rw-r--r-- | src/NetworkManagerAP.h | 36 | ||||
-rw-r--r-- | src/NetworkManagerAPList.c | 4 | ||||
-rw-r--r-- | src/NetworkManagerDbus.c | 12 | ||||
-rw-r--r-- | src/NetworkManagerDevice.c | 110 | ||||
-rw-r--r-- | src/NetworkManagerDevice.h | 4 | ||||
-rw-r--r-- | src/NetworkManagerWireless.c | 57 | ||||
-rw-r--r-- | src/NetworkManagerWireless.h | 3 | ||||
-rw-r--r-- | test/nmclienttest.c | 153 |
15 files changed, 567 insertions, 183 deletions
@@ -1,3 +1,43 @@ +2004-09-13 Dan Williams <dcbw@redhat.com> + + * TODO: fix typo + + * docs/NetworkManager DBUS API.txt + - Update for new signal strength changes + + * panel-applet/NMWirelessApplet.c + - Make panel icon show strength of the current connection + - Cleanups and memleak fixes + + * panel-applet/NMWirelessApplet.h + - Add data members for signal strength on devices and networks + + * panel-applet/NMWirelessAppletDbus.c + - Free more DBusErrors + - Update for new signal strength changes + - Make devices and networks more like real objects, use ref/unref methods + - Actually unlock the mutex when updating the active device + + * src/NetworkManagerAP.c + - Change AP functions and data members from "quality"->"strength" + + * src/NetworkManagerDbus.c + - Kill "getMaxQuality" and "getQuality" methods + - Add "getStrength" methods for Networks and Devices + + * src/NetworkManagerDevice.[ch] + - Add accessors for device strength + - Add functions to update strength for a device. Note that not all drivers + actually support signal strength for scanned access points (Atmel drivers + being one) + - Calculate signal strength for each AP during scan + + * src/NetworkManagerWireless.[ch] + - Add function to return signal strength % from a device and a raw quality struct + + * test/nmclienttest.c + - Update for new signal strength changes + 2004-09-11 Dan Williams <dcbw@redhat.com> * src/NetworkManager.c @@ -10,7 +10,7 @@ Currently, after each scan the list of access points is diffed against the previ - Access Point link checking thresholds -Wireless link checking could be enhanced to check the signal strength of an access point and switch of the current access point a wireless card is associated with has dropped below say, 20%. +Wireless link checking could be enhanced to check the signal strength of an access point and switch if the current access point a wireless card is associated with has dropped below say, 20%. - Gracefully recover from dbus and hal dropouts diff --git a/docs/NetworkManager DBUS API.txt b/docs/NetworkManager DBUS API.txt index f2e3900333..1081166ed2 100644 --- a/docs/NetworkManager DBUS API.txt +++ b/docs/NetworkManager DBUS API.txt @@ -122,11 +122,9 @@ Methods: Wired: no cable plugged in Wireless: no base station, or bad encryption key - Name: getMaxQuality (Wireless only) Returns the maximum quality level of the wireless device, from - which a program may calculate a signal strength percentage based on this - number and the quality of an individual Network object + Name: getStrength (Wireless only) Return the strength percentage of the current wireless network Args: (none) - Returns: DBUS_TYPE_UINT32 The maximum quality any wireless network can have + Returns: DBUS_TYPE_INT32 The strength percentage of the current wireless network Name: getActiveNetwork (Wireless only) Returns the Network object indentifier of the wireless network @@ -164,9 +162,9 @@ Methods: Returns: DBUS_TYPE_STRING - Name: getQuality Returns the quality of this wirless network + Name: getStrength Return the strength percentage of the current wireless network Args: (none) - Returns: DBUS_TYPE_INT32 A number between 0 and the device's Maximum Quality + Returns: DBUS_TYPE_INT32 The strength percentage of the current wireless network Name: getFrequency Returns the frequency/channel this wireless network diff --git a/panel-applet/NMWirelessApplet.c b/panel-applet/NMWirelessApplet.c index 85d6ace79b..8f8348279a 100644 --- a/panel-applet/NMWirelessApplet.c +++ b/panel-applet/NMWirelessApplet.c @@ -141,7 +141,21 @@ static void nmwa_update_state (NMWirelessApplet *applet) break; case (APPLET_STATE_WIRELESS): - applet->pix_state = PIX_WIRELESS_SIGNAL_4; + g_mutex_lock (applet->data_mutex); + if (applet->active_device) + { + if (applet->active_device->strength > 75) + applet->pix_state = PIX_WIRELESS_SIGNAL_4; + else if (applet->active_device->strength > 50) + applet->pix_state = PIX_WIRELESS_SIGNAL_3; + else if (applet->active_device->strength > 25) + applet->pix_state = PIX_WIRELESS_SIGNAL_2; + else if (applet->active_device->strength > 0) + applet->pix_state = PIX_WIRELESS_SIGNAL_1; + else + applet->pix_state = PIX_WIRELESS_NO_LINK; + } + g_mutex_unlock (applet->data_mutex); break; case (APPLET_STATE_WIRELESS_CONNECTING): @@ -302,7 +316,7 @@ static void nmwa_about_cb (BonoboUIComponent *uic, NMWirelessApplet *applet) static void nmwa_destroy (NMWirelessApplet *applet, gpointer user_data) { int i; - + if (applet->menu) nmwa_dispose_menu_items (applet); @@ -636,7 +650,7 @@ static void nmwa_menu_add_network (GtkWidget *menu, GdkPixbuf *key, NetworkDevic gtk_widget_show (label); progress = gtk_progress_bar_new (); - percent = ((float)net->quality / (float)0x100); + percent = ((float)net->strength / (float)100); percent = (percent < 0 ? 0 : (percent > 1.0 ? 1.0 : percent)); gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (progress), percent); gtk_box_pack_start (GTK_BOX (hbox), progress, TRUE, TRUE, 0); @@ -722,11 +736,12 @@ static void nmwa_menu_add_devices (GtkWidget *menu, NMWirelessApplet *applet) { GdkPixbuf *icon = (dev->type == DEVICE_TYPE_WIRED_ETHERNET) ? applet->wired_icon : applet->wireless_icon; char *name_string; - gboolean current = applet->active_device ? (strcmp (applet->active_device, dev->nm_device) == 0) : FALSE; + gboolean current = (dev == applet->active_device); name_string = g_strdup_printf ("%s (%s)", (dev->hal_name ? dev->hal_name : dev->nm_name), (dev->type == DEVICE_TYPE_WIRED_ETHERNET) ? "wired" : "wireless"); nmwa_menu_add_device_item (menu, icon, name_string, dev->nm_device, current, applet); + g_free (name_string); nmwa_menu_device_add_networks (menu, dev, applet); nmwa_menu_add_separator_item (menu); } diff --git a/panel-applet/NMWirelessApplet.h b/panel-applet/NMWirelessApplet.h index 25b71e433d..90887130d5 100644 --- a/panel-applet/NMWirelessApplet.h +++ b/panel-applet/NMWirelessApplet.h @@ -60,6 +60,37 @@ typedef enum /* + * Representation of a wireless network + * + */ +typedef struct +{ + int refcount; + char *nm_name; + char *essid; + gboolean encrypted; + gboolean active; + gint8 strength; +} WirelessNetwork; + +/* + * Representation of network device + * + */ +typedef struct +{ + int refcount; + char *nm_device; + int type; + char *nm_name; + char *hal_name; + char *udi; + gint strength; + GSList *networks; +} NetworkDevice; + + +/* * Applet instance data * */ @@ -84,7 +115,7 @@ typedef struct /* Data model elements */ GMutex *data_mutex; GSList *devices; - char *active_device; + NetworkDevice *active_device; AppletState applet_state; /* Direct UI elements */ @@ -96,34 +127,6 @@ typedef struct } NMWirelessApplet; -/* - * Representation of a wireless network - * - */ -typedef struct -{ - char *nm_name; - char *essid; - gboolean encrypted; - gboolean active; - guint8 quality; -} WirelessNetwork; - -/* - * Representation of network device - * - */ -typedef struct -{ - char *nm_device; - int type; - char *nm_name; - char *hal_name; - char *udi; - GSList *networks; -} NetworkDevice; - - NetworkDevice *nmwa_get_device_for_nm_device (NMWirelessApplet *applet, const char *nm_dev); #endif diff --git a/panel-applet/NMWirelessAppletDbus.c b/panel-applet/NMWirelessAppletDbus.c index 7223d4473a..a51cba544d 100644 --- a/panel-applet/NMWirelessAppletDbus.c +++ b/panel-applet/NMWirelessAppletDbus.c @@ -100,6 +100,8 @@ static int nmwa_dbus_get_string (DBusConnection *connection, const char *path, c if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &dbus_string, DBUS_TYPE_INVALID)) { fprintf (stderr, "nmwa_dbus_get_string(): error while getting args: name='%s' message='%s'\n", error.name, error.message); + if (dbus_error_is_set (&error)) + dbus_error_free (&error); dbus_message_unref (reply); return (RETURN_FAILURE); } @@ -160,6 +162,8 @@ static int nmwa_dbus_get_int (DBusConnection *connection, const char *path, cons dbus_error_init (&error); if (!dbus_message_get_args (reply, &error, DBUS_TYPE_INT32, &dbus_num, DBUS_TYPE_INVALID)) { + if (dbus_error_is_set (&error)) + dbus_error_free (&error); dbus_message_unref (reply); return (RETURN_FAILURE); } @@ -213,13 +217,14 @@ static int nmwa_dbus_get_bool (DBusConnection *connection, const char *path, con if (reply == NULL) { fprintf( stderr, "nmwa_dbus_get_bool(): dbus reply message was NULL\n" ); - dbus_message_unref (message); return (RETURN_FAILURE); } dbus_error_init (&error); if (!dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, val, DBUS_TYPE_INVALID)) { + if (dbus_error_is_set (&error)) + dbus_error_free (&error); dbus_message_unref (reply); return (RETURN_FAILURE); } @@ -252,6 +257,7 @@ static double nmwa_dbus_get_double (DBusConnection *connection, const char *path dbus_error_init (&error); reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + dbus_message_unref (message); if (dbus_error_is_set (&error)) { fprintf (stderr, "nmwa_dbus_get_double(): %s raised:\n %s\n\n", error.name, error.message); @@ -263,16 +269,18 @@ static double nmwa_dbus_get_double (DBusConnection *connection, const char *path if (reply == NULL) { fprintf( stderr, "nmwa_dbus_get_double(): dbus reply message was NULL\n" ); - dbus_message_unref (message); return (0); } dbus_error_init (&error); if (!dbus_message_get_args (reply, &error, DBUS_TYPE_DOUBLE, &num, DBUS_TYPE_INVALID)) + { + if (dbus_error_is_set (&error)) + dbus_error_free (&error); num = 0; + } dbus_message_unref (reply); - dbus_message_unref (message); return (num); } @@ -439,16 +447,16 @@ static int nmwa_dbus_get_device_type (NMWirelessApplet *applet, char *path, Appl /* - * nmwa_dbus_get_network_quality + * nmwa_dbus_get_object_strength * - * Returns the quality of a given wireless network + * Returns the strength of a given object (device or wireless network) * */ -static guint8 nmwa_dbus_get_network_quality (NMWirelessApplet *applet, char *path) +static gint8 nmwa_dbus_get_object_strength (NMWirelessApplet *applet, char *path) { - int qual = 0; + int strength = -1; - switch (nmwa_dbus_get_int (applet->connection, path, "getQuality", &qual)) + switch (nmwa_dbus_get_int (applet->connection, path, "getStrength", &strength)) { case (RETURN_NO_NM): applet->applet_state = APPLET_STATE_NO_NM; @@ -458,7 +466,7 @@ static guint8 nmwa_dbus_get_network_quality (NMWirelessApplet *applet, char *pat break; } - return (qual); + return (strength); } @@ -646,6 +654,7 @@ static char *nmwa_dbus_get_hal_device_string_property (DBusConnection *connectio if (dbus_error_is_set (&error)) { fprintf (stderr, "nmwa_dbus_get_hal_device_string_property(): %s raised:\n %s\n\n", error.name, error.message); + dbus_error_free (&error); return (NULL); } @@ -657,7 +666,11 @@ static char *nmwa_dbus_get_hal_device_string_property (DBusConnection *connectio dbus_error_init (&error); if (!dbus_message_get_args (reply, &error, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) + { + if (dbus_error_is_set (&error)) + dbus_error_free (&error); property = NULL; + } dbus_message_unref (reply); return (property); @@ -692,6 +705,7 @@ static char *nmwa_dbus_get_hal_device_info (DBusConnection *connection, const ch if (dbus_error_is_set (&error)) { fprintf (stderr, "nmwa_dbus_get_hal_device_info(): %s raised:\n %s\n\n", error.name, error.message); + dbus_error_free (&error); return (NULL); } @@ -703,7 +717,11 @@ static char *nmwa_dbus_get_hal_device_info (DBusConnection *connection, const ch dbus_error_init (&error); if (dbus_message_get_args (reply, &error, DBUS_TYPE_BOOLEAN, &exists, DBUS_TYPE_INVALID)) + { + if (dbus_error_is_set (&error)) + dbus_error_free (&error); info = nmwa_dbus_get_hal_device_string_property (connection, udi, "info.product"); + } dbus_message_unref (reply); @@ -746,24 +764,39 @@ fprintf( stderr, "Forcing device '%s'\n", dev->nm_device); /* - * wireless_network_free + * wireless_network_ref * - * Frees the representation of a wireless network + * Increment the reference count of the wireless network * */ -static void wireless_network_free (void *element, void *user_data) +static void wireless_network_ref (WirelessNetwork *net) { - WirelessNetwork *net = (WirelessNetwork *)(element); - g_return_if_fail (net != NULL); - g_free (net->nm_name); - g_free (net->essid); - g_free (net); + net->refcount++; } /* + * wireless_network_unref + * + * Unrefs (and possibly frees) the representation of a wireless network + * + */ +static void wireless_network_unref (WirelessNetwork *net) +{ + g_return_if_fail (net != NULL); + + net->refcount--; + if (net->refcount < 1) + { + g_free (net->nm_name); + g_free (net->essid); + g_free (net); + } +} + +/* * network_device_free_wireless_network_list * */ @@ -771,30 +804,46 @@ static void network_device_free_wireless_network_list (NetworkDevice *dev) { g_return_if_fail (dev != NULL); - g_slist_foreach (dev->networks, wireless_network_free, NULL); + g_slist_foreach (dev->networks, wireless_network_unref, NULL); g_slist_free (dev->networks); dev->networks = NULL; } /* - * network_device_free + * network_device_ref * - * Frees the representation of a network device + * Increment the reference count of the network device * */ -static void network_device_free (void *element, void *user_data) +static void network_device_ref (NetworkDevice *dev) { - NetworkDevice *dev = (NetworkDevice *)(element); + g_return_if_fail (dev != NULL); + dev->refcount++; +} + + +/* + * network_device_unref + * + * Unrefs (and possibly frees) the representation of a network device + * + */ +static void network_device_unref (NetworkDevice *dev) +{ g_return_if_fail (dev != NULL); - network_device_free_wireless_network_list (dev); - g_free (dev->nm_device); - g_free (dev->nm_name); - dbus_free (dev->udi); - dbus_free (dev->hal_name); - g_free (dev); + dev->refcount--; + if (dev->refcount < 1) + { + network_device_free_wireless_network_list (dev); + g_free (dev->nm_device); + g_free (dev->nm_name); + dbus_free (dev->udi); + dbus_free (dev->hal_name); + g_free (dev); + } } @@ -814,15 +863,13 @@ static void nmwa_dbus_update_device_wireless_networks (NetworkDevice *dev, NMWir char **networks = NULL; int num_items = 0; int i; - g_return_if_fail (dev != NULL); /* Clear out existing entries in the list */ if (dev->networks) network_device_free_wireless_network_list (dev); - if ( ((dev_type = nmwa_dbus_get_device_type (applet, dev->nm_device, APPLET_STATE_NO_CONNECTION)) == -1) - || (dev_type != DEVICE_TYPE_WIRELESS_ETHERNET)) + if (dev->type != DEVICE_TYPE_WIRELESS_ETHERNET) goto out; active_network = nmwa_dbus_get_active_network (applet, dev->nm_device, APPLET_STATE_IGNORE); @@ -858,18 +905,17 @@ static void nmwa_dbus_update_device_wireless_networks (NetworkDevice *dev, NMWir continue; net = g_new0 (WirelessNetwork, 1); + wireless_network_ref (net); net->nm_name = g_strdup (networks[i]); net->essid = g_strdup (name); net->active = active_network ? (strcmp (net->nm_name, active_network) == 0) : FALSE; net->encrypted = nmwa_dbus_get_network_encrypted (applet, net->nm_name); - net->quality = nmwa_dbus_get_network_quality (applet, net->nm_name); + net->strength = nmwa_dbus_get_object_strength (applet, net->nm_name); - fprintf( stderr, "Adding '%s' active (%d), enc (%d)\n", name, net->active, net->encrypted); dev->networks = g_slist_append (dev->networks, net); } dbus_free (name); } - g_mutex_unlock (applet->data_mutex); out: dbus_free (active_network); @@ -887,7 +933,6 @@ static void nmwa_dbus_update_network_state (NMWirelessApplet *applet) { char *active_device = NULL; char *nm_status = NULL; - int dev_type = -1; g_return_if_fail (applet != NULL); @@ -901,26 +946,27 @@ static void nmwa_dbus_update_network_state (NMWirelessApplet *applet) goto out; } - if (!(active_device = nmwa_dbus_get_active_device (applet, APPLET_STATE_NO_CONNECTION))) - goto out; - - if ((dev_type = nmwa_dbus_get_device_type (applet, active_device, APPLET_STATE_NO_CONNECTION)) == -1) + if (!applet->active_device) + { + applet->applet_state = APPLET_STATE_NO_CONNECTION; goto out; + } /* If the device is not 802.x, we don't show state for it (yet) */ - if ((dev_type != DEVICE_TYPE_WIRED_ETHERNET) && (dev_type != DEVICE_TYPE_WIRELESS_ETHERNET)) + if ( (applet->active_device->type != DEVICE_TYPE_WIRED_ETHERNET) + && (applet->active_device->type != DEVICE_TYPE_WIRELESS_ETHERNET)) { applet->applet_state = APPLET_STATE_NO_CONNECTION; goto out; } - else if (dev_type == DEVICE_TYPE_WIRED_ETHERNET) + else if (applet->active_device->type == DEVICE_TYPE_WIRED_ETHERNET) { if (strcmp (nm_status, "connecting") == 0) applet->applet_state = APPLET_STATE_WIRED_CONNECTING; else if (strcmp (nm_status, "connected") == 0) applet->applet_state = APPLET_STATE_WIRED; } - else if (dev_type == DEVICE_TYPE_WIRELESS_ETHERNET) + else if (applet->active_device->type == DEVICE_TYPE_WIRELESS_ETHERNET) { if (strcmp (nm_status, "connecting") == 0) applet->applet_state = APPLET_STATE_WIRELESS_CONNECTING; @@ -930,7 +976,6 @@ static void nmwa_dbus_update_network_state (NMWirelessApplet *applet) out: dbus_free (nm_status); - dbus_free (active_device); } @@ -942,12 +987,62 @@ out: */ static void nmwa_dbus_update_active_device (NMWirelessApplet *applet) { + GSList *element; + char *nm_act_dev; + g_return_if_fail (applet != NULL); + nm_act_dev = nmwa_dbus_get_active_device (applet, APPLET_STATE_IGNORE); + g_mutex_lock (applet->data_mutex); if (applet->active_device) - dbus_free (applet->active_device); - applet->active_device = nmwa_dbus_get_active_device (applet, APPLET_STATE_IGNORE); + network_device_unref (applet->active_device); + applet->active_device = NULL; + + if (nm_act_dev) + { + element = applet->devices; + while (element) + { + NetworkDevice *dev = (NetworkDevice *)(element->data); + if (dev) + { + if (strcmp (dev->nm_device, nm_act_dev) == 0) + { + applet->active_device = dev; + network_device_ref (applet->active_device); + break; + } + } + element = g_slist_next (element); + } + } + + g_mutex_unlock (applet->data_mutex); + dbus_free (nm_act_dev); +} + + +/* + * nmwa_dbus_update_active_device_strength + * + * Update the active device's current wireless network strength + * + */ +void nmwa_dbus_update_active_device_strength (NMWirelessApplet *applet) +{ + g_return_if_fail (applet != NULL); + + g_mutex_lock (applet->data_mutex); + if (!applet->active_device) + { + g_mutex_unlock (applet->data_mutex); + return; + } + + if (applet->active_device->type == DEVICE_TYPE_WIRELESS_ETHERNET) + applet->active_device->strength = nmwa_dbus_get_object_strength (applet, applet->active_device->nm_device); + g_mutex_unlock (applet->data_mutex); } @@ -981,8 +1076,11 @@ static void nmwa_dbus_update_devices (NMWirelessApplet *applet) /* Clear out existing device list */ g_mutex_lock (applet->data_mutex); - g_slist_foreach (applet->devices, network_device_free, NULL); + g_slist_foreach (applet->devices, network_device_unref, NULL); g_slist_free (applet->devices); + if (applet->active_device) + network_device_unref (applet->active_device); + applet->active_device = NULL; applet->devices = NULL; for (i = 0; i < num_items; i++) @@ -995,6 +1093,7 @@ static void nmwa_dbus_update_devices (NMWirelessApplet *applet) if ((dev = g_new0 (NetworkDevice, 1))) { + network_device_ref (dev); dev->nm_device = g_strdup (devices[i]); dev->type = nmwa_dbus_get_device_type (applet, devices[i], APPLET_STATE_NO_CONNECTION); dev->nm_name = g_strdup (name); @@ -1003,11 +1102,10 @@ static void nmwa_dbus_update_devices (NMWirelessApplet *applet) /* Ensure valid device information */ if (!dev->nm_device || !dev->nm_name || !dev->udi || (dev->type == -1)) - network_device_free (dev, NULL); + network_device_unref (dev); else { applet->devices = g_slist_append (applet->devices, dev); - fprintf( stderr, "Got device '%s', udi '%s'\n", dev->nm_name, dev->udi); nmwa_dbus_update_device_wireless_networks (dev, applet); } } @@ -1042,6 +1140,8 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa if ( dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service, DBUS_TYPE_INVALID) && (strcmp (service, NM_DBUS_SERVICE) == 0) && (applet->applet_state == APPLET_STATE_NO_NM)) applet->applet_state = APPLET_STATE_NO_CONNECTION; + if (dbus_error_is_set (&error)) + dbus_error_free (&error); } else if (dbus_message_is_signal (message, DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS, "ServiceDeleted")) { @@ -1052,6 +1152,8 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa if ( dbus_message_get_args (message, &error, DBUS_TYPE_STRING, &service, DBUS_TYPE_INVALID) && (strcmp (service, NM_DBUS_SERVICE) == 0)) applet->applet_state = APPLET_STATE_NO_NM; + if (dbus_error_is_set (&error)) + dbus_error_free (&error); } else if ( dbus_message_is_signal (message, NM_DBUS_INTERFACE, "WirelessNetworkAppeared") || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "WirelessNetworkDisappeared")) @@ -1084,9 +1186,9 @@ static DBusHandlerResult nmwa_dbus_filter (DBusConnection *connection, DBusMessa || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceNoLongerActive") || dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DeviceActivating")) { - nmwa_dbus_update_network_state (applet); nmwa_dbus_update_devices (applet); nmwa_dbus_update_active_device (applet); + nmwa_dbus_update_network_state (applet); } else if (dbus_message_is_signal (message, NM_DBUS_INTERFACE, "DevicesChanged")) { @@ -1115,6 +1217,8 @@ static gboolean nmwa_dbus_nm_is_running (DBusConnection *connection) dbus_error_init (&error); exists = dbus_bus_service_exists (connection, NM_DBUS_SERVICE, &error); + if (dbus_error_is_set (&error)) + dbus_error_free (&error); return (exists); } @@ -1138,6 +1242,7 @@ static DBusConnection * nmwa_dbus_init (NMWirelessApplet *applet, GMainContext * if (dbus_error_is_set (&error)) { fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + dbus_error_free (&error); return (NULL); } @@ -1152,6 +1257,8 @@ static DBusConnection * nmwa_dbus_init (NMWirelessApplet *applet, GMainContext * "interface='" DBUS_INTERFACE_ORG_FREEDESKTOP_DBUS "'," "sender='" DBUS_SERVICE_ORG_FREEDESKTOP_DBUS "'", &error); + if (dbus_error_is_set (&error)) + dbus_error_free (&error); dbus_bus_add_match(connection, "type='signal'," @@ -1159,8 +1266,9 @@ static DBusConnection * nmwa_dbus_init (NMWirelessApplet *applet, GMainContext * "path='" NM_DBUS_PATH "'," "sender='" NM_DBUS_SERVICE "'", &error); + if (dbus_error_is_set (&error)) + dbus_error_free (&error); -fprintf( stderr, "returning good DBUS connection\n"); return (connection); } @@ -1183,7 +1291,17 @@ static gboolean nmwa_dbus_timeout_worker (gpointer user_data) * for signals from NetworkManager to trigger state updates. */ if ((applet->connection = nmwa_dbus_init (applet, applet->thread_context))) + { + applet->applet_state = APPLET_STATE_NO_CONNECTION; + nmwa_dbus_update_devices (applet); + nmwa_dbus_update_active_device (applet); nmwa_dbus_update_network_state (applet); + } + } + else + { + nmwa_dbus_update_active_device_strength (applet); + /* FIXME: update wireless networks strength in real-time */ } return (TRUE); @@ -1219,9 +1337,10 @@ gpointer nmwa_dbus_worker (gpointer user_data) if (applet->connection && nmwa_dbus_nm_is_running (applet->connection)) { - nmwa_dbus_update_network_state (applet); + applet->applet_state = APPLET_STATE_NO_CONNECTION; nmwa_dbus_update_devices (applet); nmwa_dbus_update_active_device (applet); + nmwa_dbus_update_network_state (applet); } else applet->applet_state = APPLET_STATE_NO_NM; diff --git a/src/NetworkManagerAP.c b/src/NetworkManagerAP.c index 727d47a433..ed17a7fcba 100644 --- a/src/NetworkManagerAP.c +++ b/src/NetworkManagerAP.c @@ -32,7 +32,7 @@ struct NMAccessPoint guint refcount; char *essid; struct ether_addr *address; - guint8 quality; + gint8 strength; double freq; guint16 rate; gboolean encrypted; @@ -97,7 +97,7 @@ NMAccessPoint * nm_ap_new_from_ap (NMAccessPoint *src_ap) memcpy (new_addr, src_ap->address, sizeof (struct ether_addr)); new_ap->address = new_addr; } - new_ap->quality = src_ap->quality; + new_ap->strength = src_ap->strength; new_ap->freq = src_ap->freq; new_ap->rate = src_ap->rate; new_ap->encrypted = src_ap->encrypted; @@ -278,21 +278,21 @@ void nm_ap_set_address (NMAccessPoint *ap, const struct ether_addr * addr) /* - * Get/set functions for quality + * Get/set functions for strength * */ -guint8 nm_ap_get_quality (NMAccessPoint *ap) +gint8 nm_ap_get_strength (NMAccessPoint *ap) { g_return_val_if_fail (ap != NULL, 0); - return (ap->quality); + return (ap->strength); } -void nm_ap_set_quality (NMAccessPoint *ap, guint8 quality) +void nm_ap_set_strength (NMAccessPoint *ap, gint8 strength) { g_return_if_fail (ap != NULL); - ap->quality = quality; + ap->strength = strength; } diff --git a/src/NetworkManagerAP.h b/src/NetworkManagerAP.h index d8a7a1209e..c80e908a92 100644 --- a/src/NetworkManagerAP.h +++ b/src/NetworkManagerAP.h @@ -38,16 +38,16 @@ typedef enum NMAPEncMethod NMAccessPoint * nm_ap_new (void); -NMAccessPoint * nm_ap_new_from_ap (NMAccessPoint *ap); +NMAccessPoint * nm_ap_new_from_ap (NMAccessPoint *ap); -void nm_ap_unref (NMAccessPoint *ap); +void nm_ap_unref (NMAccessPoint *ap); void nm_ap_ref (NMAccessPoint *ap); const GTimeVal * nm_ap_get_timestamp (NMAccessPoint *ap); void nm_ap_set_timestamp (NMAccessPoint *ap, const GTimeVal *timestamp); -gchar * nm_ap_get_essid (NMAccessPoint *ap); -void nm_ap_set_essid (NMAccessPoint *ap, gchar *essid); +gchar * nm_ap_get_essid (NMAccessPoint *ap); +void nm_ap_set_essid (NMAccessPoint *ap, gchar *essid); gchar * nm_ap_get_enc_key_source (NMAccessPoint *ap); gchar * nm_ap_get_enc_key_hashed (NMAccessPoint *ap, NMAPEncMethod method); @@ -56,11 +56,11 @@ void nm_ap_set_enc_key_source (NMAccessPoint *ap, gchar *key); gboolean nm_ap_get_encrypted (NMAccessPoint *ap); void nm_ap_set_encrypted (NMAccessPoint *ap, gboolean encrypted); -struct ether_addr * nm_ap_get_address (NMAccessPoint *ap); -void nm_ap_set_address (NMAccessPoint *ap, const struct ether_addr *addr); +struct ether_addr * nm_ap_get_address (NMAccessPoint *ap); +void nm_ap_set_address (NMAccessPoint *ap, const struct ether_addr *addr); -guint8 nm_ap_get_quality (NMAccessPoint *ap); -void nm_ap_set_quality (NMAccessPoint *ap, guint8 quality); +gint8 nm_ap_get_strength (NMAccessPoint *ap); +void nm_ap_set_strength (NMAccessPoint *ap, gint8 strength); double nm_ap_get_freq (NMAccessPoint *ap); void nm_ap_set_freq (NMAccessPoint *ap, double freq); @@ -68,19 +68,19 @@ void nm_ap_set_freq (NMAccessPoint *ap, double freq); guint16 nm_ap_get_rate (NMAccessPoint *ap); void nm_ap_set_rate (NMAccessPoint *ap, guint16 rate); -gboolean nm_ap_get_invalid (NMAccessPoint *ap); -void nm_ap_set_invalid (NMAccessPoint *ap, gboolean invalid); +gboolean nm_ap_get_invalid (NMAccessPoint *ap); +void nm_ap_set_invalid (NMAccessPoint *ap, gboolean invalid); -gboolean nm_ap_get_matched (NMAccessPoint *ap); -void nm_ap_set_matched (NMAccessPoint *ap, gboolean matched); +gboolean nm_ap_get_matched (NMAccessPoint *ap); +void nm_ap_set_matched (NMAccessPoint *ap, gboolean matched); -NMAPEncMethod nm_ap_get_enc_method (NMAccessPoint *ap); -void nm_ap_set_enc_method (NMAccessPoint *ap, NMAPEncMethod enc_method); +NMAPEncMethod nm_ap_get_enc_method (NMAccessPoint *ap); +void nm_ap_set_enc_method (NMAccessPoint *ap, NMAPEncMethod enc_method); -gboolean nm_ap_get_enc_method_good (NMAccessPoint *ap); -void nm_ap_set_enc_method_good (NMAccessPoint *ap, gboolean good); +gboolean nm_ap_get_enc_method_good(NMAccessPoint *ap); +void nm_ap_set_enc_method_good(NMAccessPoint *ap, gboolean good); -gboolean nm_ap_get_trusted (NMAccessPoint *ap); -void nm_ap_set_trusted (NMAccessPoint *ap, gboolean trusted); +gboolean nm_ap_get_trusted (NMAccessPoint *ap); +void nm_ap_set_trusted (NMAccessPoint *ap, gboolean trusted); #endif diff --git a/src/NetworkManagerAPList.c b/src/NetworkManagerAPList.c index 6801d64e2c..b00bbca2bd 100644 --- a/src/NetworkManagerAPList.c +++ b/src/NetworkManagerAPList.c @@ -469,9 +469,9 @@ void nm_ap_list_print_members (NMAccessPointList *list, const char *name) while ((ap = nm_ap_list_iter_next (iter))) { const GTimeVal *timestamp = nm_ap_get_timestamp (ap); - syslog (LOG_DEBUG, "\t%d)\tessid='%s', timestamp=%ld, key='%s', enc=%d, addr=%p, qual=%d, freq=%f, rate=%d, inval=%d", + syslog (LOG_DEBUG, "\t%d)\tessid='%s', timestamp=%ld, key='%s', enc=%d, addr=%p, strength=%d, freq=%f, rate=%d, inval=%d", i, nm_ap_get_essid (ap), timestamp->tv_sec, nm_ap_get_enc_key_source (ap), nm_ap_get_encrypted (ap), - nm_ap_get_address (ap), nm_ap_get_quality (ap), nm_ap_get_freq (ap), nm_ap_get_rate (ap), + nm_ap_get_address (ap), nm_ap_get_strength (ap), nm_ap_get_freq (ap), nm_ap_get_rate (ap), nm_ap_get_invalid (ap)); i++; } diff --git a/src/NetworkManagerDbus.c b/src/NetworkManagerDbus.c index 5576878ef9..1d7f8ebd6d 100644 --- a/src/NetworkManagerDbus.c +++ b/src/NetworkManagerDbus.c @@ -995,8 +995,8 @@ static DBusMessage *nm_dbus_devices_handle_networks_request (DBusConnection *con iw_ether_ntop((const struct ether_addr *) (nm_ap_get_address (ap)), &buf[0]); dbus_message_append_args (reply_message, DBUS_TYPE_STRING, &buf[0], DBUS_TYPE_INVALID); } - else if (strcmp ("getQuality", request) == 0) - dbus_message_append_args (reply_message, DBUS_TYPE_INT32, nm_ap_get_quality (ap), DBUS_TYPE_INVALID); + else if (strcmp ("getStrength", request) == 0) + dbus_message_append_args (reply_message, DBUS_TYPE_INT32, nm_ap_get_strength (ap), DBUS_TYPE_INVALID); else if (strcmp ("getFrequency", request) == 0) dbus_message_append_args (reply_message, DBUS_TYPE_DOUBLE, nm_ap_get_freq (ap), DBUS_TYPE_INVALID); else if (strcmp ("getRate", request) == 0) @@ -1063,18 +1063,18 @@ static DBusMessage *nm_dbus_devices_handle_request (DBusConnection *connection, dbus_message_append_args (reply_message, DBUS_TYPE_STRING, nm_device_get_udi (dev), DBUS_TYPE_INVALID); else if (strcmp ("getIP4Address", request) == 0) dbus_message_append_args (reply_message, DBUS_TYPE_UINT32, nm_device_get_ip4_address (dev), DBUS_TYPE_INVALID); - else if (strcmp ("getMaxQuality", request) == 0) + else if (strcmp ("getStrength", request) == 0) { - /* Only wireless devices have an active network */ + /* Only wireless devices have signal strength */ if (!nm_device_is_wireless (dev)) { dbus_message_unref (reply_message); reply_message = nm_dbus_create_error_message (message, NM_DBUS_INTERFACE, "DeviceNotWireless", - "Wired devices cannot have wireless networks."); + "Wired devices cannot have signal strength."); return (reply_message); } - dbus_message_append_args (reply_message, DBUS_TYPE_UINT32, nm_device_get_max_quality (dev), DBUS_TYPE_INVALID); + dbus_message_append_args (reply_message, DBUS_TYPE_INT32, nm_device_get_signal_strength (dev), DBUS_TYPE_INVALID); } else if (strcmp ("getActiveNetwork", request) == 0) { diff --git a/src/NetworkManagerDevice.c b/src/NetworkManagerDevice.c index 318de1a490..9b44ab0751 100644 --- a/src/NetworkManagerDevice.c +++ b/src/NetworkManagerDevice.c @@ -51,6 +51,8 @@ typedef struct NMDeviceWirelessOptions gchar *cur_essid; gboolean supports_wireless_scan; guint8 max_quality; + guint8 noise; + gint8 strength; GMutex *scan_mutex; NMAccessPointList *ap_list; @@ -548,6 +550,8 @@ void nm_device_update_link_active (NMDevice *dev, gboolean check_mii) { case DEVICE_TYPE_WIRELESS_ETHERNET: link = nm_device_wireless_link_active (dev); + /* Update our current signal strength too */ + nm_device_update_signal_strength (dev); break; case DEVICE_TYPE_WIRED_ETHERNET: @@ -786,9 +790,102 @@ void nm_device_set_enc_key (NMDevice *dev, const char *key) /* + * nm_device_get_signal_strength + * + * Get the current signal strength of a wireless device. This only works when + * the card is associated with an access point, so will only work for the + * active device. + * + * Returns: -1 on error + * 0 - 100 strength percentage of the connection to the current access point + * + */ +gint8 nm_device_get_signal_strength (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, -1); + g_return_val_if_fail (nm_device_is_wireless (dev), -1); + + return (dev->options.wireless.strength); +} + + +/* + * nm_device_update_signal_strength + * + * Update the device's idea of the strength of its connection to the + * current access point. + * + */ +void nm_device_update_signal_strength (NMDevice *dev) +{ + gboolean has_range; + int iwlib_socket; + iwrange range; + iwstats stats; + int percent = -1; + + g_return_if_fail (dev != NULL); + g_return_if_fail (nm_device_is_wireless (dev)); + g_return_if_fail (dev->app_data != NULL); + + /* If we aren't the active device, we don't really have a signal strength + * that would mean anything. + */ +#if 0 + if (dev != dev->app_data->active_device) + { + dev->options.wireless.strength = -1; + return; + } +#endif + + /* Fake a value for test devices */ + if (dev->test_device) + { + dev->options.wireless.strength = 75; + return; + } + + iwlib_socket = iw_sockets_open (); + has_range = (iw_get_range_info (iwlib_socket, nm_device_get_iface (dev), &range) >= 0); + if (iw_get_stats (iwlib_socket, nm_device_get_iface (dev), &stats, &range, has_range) == 0) + { + /* Update our max quality while we're at it */ + dev->options.wireless.max_quality = range.max_qual.level; + dev->options.wireless.noise = stats.qual.noise; + percent = nm_wireless_qual_to_percent (dev, &(stats.qual)); + } + else + { + dev->options.wireless.max_quality = -1; + dev->options.wireless.noise = -1; + percent = -1; + } + close (iwlib_socket); + + dev->options.wireless.strength = percent; +} + + +/* + * nm_device_get_noise + * + * Get the current noise level of a wireless device. + * + */ +guint8 nm_device_get_noise (NMDevice *dev) +{ + g_return_val_if_fail (dev != NULL, 0); + g_return_val_if_fail (nm_device_is_wireless (dev), 0); + + return (dev->options.wireless.noise); +} + + +/* * nm_device_get_max_quality * - * Get the quality baseline of a wireless device. + * Get the quality maximum of a wireless device. * */ guint8 nm_device_get_max_quality (NMDevice *dev) @@ -1762,13 +1859,6 @@ static void nm_device_do_normal_scan (NMDevice *dev) wireless_scan *tmp_ap; int err; NMAccessPointList *old_ap_list = nm_device_ap_list_get (dev); - gboolean has_range; - iwrange range; - iwstats stats; - - has_range = (iw_get_range_info (iwlib_socket, nm_device_get_iface (dev), &range) < 0) ? FALSE : TRUE; - if (!iw_get_stats (iwlib_socket, nm_device_get_iface (dev), &stats, &range, has_range)) - dev->options.wireless.max_quality = range.max_qual.qual; err = iw_scan (iwlib_socket, nm_device_get_iface (dev), WIRELESS_EXT, &scan_results); if ((err == -1) && (errno == ENODATA)) @@ -1825,7 +1915,7 @@ static void nm_device_do_normal_scan (NMDevice *dev) if (tmp_ap->has_ap_addr) nm_ap_set_address (nm_ap, (const struct ether_addr *)(tmp_ap->ap_addr.sa_data)); - nm_ap_set_quality (nm_ap, tmp_ap->stats.qual.qual); + nm_ap_set_strength (nm_ap, nm_wireless_qual_to_percent (dev, &(tmp_ap->stats.qual))); if (tmp_ap->b.has_freq) nm_ap_set_freq (nm_ap, tmp_ap->b.freq); @@ -1985,7 +2075,7 @@ static void nm_device_fake_ap_list (NMDevice *dev) } nm_ap_set_address (nm_ap, (const struct ether_addr *)(&fake_addrs[i])); - nm_ap_set_quality (nm_ap, fake_qualities[i]); + nm_ap_set_strength (nm_ap, fake_qualities[i]); nm_ap_set_freq (nm_ap, fake_freqs[i]); /* Merge settings from wireless networks, mainly Keys */ diff --git a/src/NetworkManagerDevice.h b/src/NetworkManagerDevice.h index eeb029a147..650a96684e 100644 --- a/src/NetworkManagerDevice.h +++ b/src/NetworkManagerDevice.h @@ -59,6 +59,10 @@ void nm_device_get_ip6_address (NMDevice *dev); gboolean nm_device_get_supports_wireless_scan (NMDevice *dev); void nm_device_do_wireless_scan (NMDevice *dev); + +gint8 nm_device_get_signal_strength (NMDevice *dev); +void nm_device_update_signal_strength (NMDevice *dev); +guint8 nm_device_get_noise (NMDevice *dev); guint8 nm_device_get_max_quality (NMDevice *dev); NMAccessPoint *nm_device_get_best_ap (NMDevice *dev); diff --git a/src/NetworkManagerWireless.c b/src/NetworkManagerWireless.c index 9a49282483..7d77f65f4a 100644 --- a/src/NetworkManagerWireless.c +++ b/src/NetworkManagerWireless.c @@ -101,6 +101,63 @@ char *nm_wireless_128bit_key_from_passphrase (char *passphrase) /* + * nm_wireless_stats_to_percent + * + * Convert an iw_stats structure from a scan or the card into + * a magical signal strength percentage. + * + */ +int nm_wireless_qual_to_percent (NMDevice *dev, const struct iw_quality *qual) +{ + int percent = -1; + + g_return_val_if_fail (dev != NULL, -1); + g_return_val_if_fail (qual != NULL, -1); + + /* Try using the card's idea of the signal quality first */ + if (qual->qual >= 1) + { + percent = (int)rint ((log (qual->qual) / log (94)) * 100.0); + percent = CLAMP (percent, 0, 100); + } + + /* If that failed, try to calculate the signal quality based on other + * values, like Signal-to-Noise ratio. + */ + if (((percent == -1) || (percent == 0))) + { + /* If the statistics are in dBm or relative */ + if(qual->level > nm_device_get_max_quality (dev)) + { + #define BEST_SIGNAL 85 /* In dBm, stuck card next to AP, this is what I got :) */ + + /* Values in dBm (absolute power measurement) */ + if (qual->level > 0) + percent = (int)rint ((double)(((256 - qual->level) / (double)BEST_SIGNAL) * 100)); + } + else + { +/* FIXME + * Not quite sure what to do here... Above we have a "100% strength" number + * empirically derived, but I don't have any cards that trigger this code below... + */ +#if 0 + /* Relative values (0 -> max) */ + qual_rel = qual->level; + qual_max_rel = range->max_qual.level; + noise_rel = qual->noise; + noise_max_rel = range->max_qual.noise; +#else + percent = -1; +#endif + } + } + + return (percent); +} + + +/* * nm_wireless_scan_monitor * * Called every 10s to get a list of access points. diff --git a/src/NetworkManagerWireless.h b/src/NetworkManagerWireless.h index 7e43fcc1a5..b8347252c9 100644 --- a/src/NetworkManagerWireless.h +++ b/src/NetworkManagerWireless.h @@ -22,6 +22,7 @@ #ifndef NETWORK_MANAGER_WIRELESS_H #define NETWORK_MANAGER_WIRELESS_H +#include <iwlib.h> #include "NetworkManager.h" #include "NetworkManagerDevice.h" #include "NetworkManagerAPList.h" @@ -30,4 +31,6 @@ char * nm_wireless_128bit_key_from_passphrase (char *passphrase); gboolean nm_wireless_scan_monitor (gpointer user_data); +int nm_wireless_qual_to_percent (NMDevice *dev, const struct iw_quality *qual); + #endif diff --git a/test/nmclienttest.c b/test/nmclienttest.c index d0bd292d2a..952e584379 100644 --- a/test/nmclienttest.c +++ b/test/nmclienttest.c @@ -128,6 +128,49 @@ void get_device_name (DBusConnection *connection, char *path) dbus_message_unref (message); } + +int get_object_signal_strength (DBusConnection *connection, char *path) +{ + DBusMessage *message; + DBusMessage *reply; + DBusMessageIter iter; + DBusError error; + + message = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + path, + "org.freedesktop.NetworkManager.Devices", + "getStrength"); + if (message == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return (0); + } + + dbus_error_init (&error); + reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); + dbus_message_unref (message); + if (dbus_error_is_set (&error)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error.name, error.message); + return (0); + } + + if (reply == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + return (0); + } + + /* now analyze reply */ + dbus_message_iter_init (reply, &iter); + int qual = dbus_message_iter_get_int32 (&iter); + + dbus_message_unref (reply); + + return (qual); +} + + void get_nm_status (DBusConnection *connection) { DBusMessage *message; @@ -305,10 +348,7 @@ int get_device_type (DBusConnection *connection, char *path) /* now analyze reply */ dbus_message_iter_init (reply, &iter); - int type; - type = dbus_message_iter_get_int32 (&iter); - - fprintf (stderr, " Device type: '%d'\n", type ); + int type = dbus_message_iter_get_int32 (&iter); dbus_message_unref (reply); dbus_message_unref (message); @@ -317,6 +357,53 @@ int get_device_type (DBusConnection *connection, char *path) } +const char * get_network_name (DBusConnection *connection, const char *path) +{ + DBusMessage *message2; + DBusMessage *reply2; + DBusMessageIter iter2; + DBusError error2; + + message2 = dbus_message_new_method_call ("org.freedesktop.NetworkManager", + path, + "org.freedesktop.NetworkManager", + "getName"); + if (message2 == NULL) + { + fprintf (stderr, "Couldn't allocate the dbus message\n"); + return (NULL); + } + + dbus_error_init (&error2); + reply2 = dbus_connection_send_with_reply_and_block (connection, message2, -1, &error2); + dbus_message_unref (message2); + if (dbus_error_is_set (&error2)) + { + fprintf (stderr, "%s raised:\n %s\n\n", error2.name, error2.message); + return (NULL); + } + + if (reply2 == NULL) + { + fprintf( stderr, "dbus reply message was NULL\n" ); + return (NULL); + } + + /* now analyze reply */ + dbus_message_iter_init (reply2, &iter2); + const char *string2 = dbus_message_iter_get_string (&iter2); + if (!string2) + { + fprintf (stderr, "NetworkManager returned a NULL network name" ); + return (NULL); + } + + dbus_message_unref (reply2); + + return (string2); +} + + void get_device_networks (DBusConnection *connection, const char *path) { DBusMessage *message; @@ -368,50 +455,11 @@ void get_device_networks (DBusConnection *connection, const char *path) fprintf( stderr, " Networks:\n" ); for (i = 0; i < num_networks; i++) { - DBusMessage *message2; - DBusMessage *reply2; - DBusMessageIter iter2; - DBusError error2; - - message2 = dbus_message_new_method_call ("org.freedesktop.NetworkManager", - networks[i], - "org.freedesktop.NetworkManager", - "getName"); - if (message2 == NULL) - { - fprintf (stderr, "Couldn't allocate the dbus message\n"); - return; - } - - dbus_error_init (&error2); - reply2 = dbus_connection_send_with_reply_and_block (connection, message2, -1, &error2); - if (dbus_error_is_set (&error2)) - { - fprintf (stderr, "%s raised:\n %s\n\n", error2.name, error2.message); - dbus_message_unref (message2); - return; - } - - if (reply2 == NULL) - { - fprintf( stderr, "dbus reply message was NULL\n" ); - dbus_message_unref (message2); - return; - } - - /* now analyze reply */ - dbus_message_iter_init (reply2, &iter2); - const char *string2 = dbus_message_iter_get_string (&iter2); - if (!string2) - { - fprintf (stderr, "NetworkManager returned a NULL active device object path" ); - return; - } - - dbus_message_unref (reply2); - dbus_message_unref (message2); + const char *name = get_network_name (connection, networks[i]); - fprintf( stderr, " %s (%s)\n", networks[i], string2 ); + fprintf( stderr, " %s (%s) Strength: %d%%\n", networks[i], name, + get_object_signal_strength (connection, networks[i]) ); + dbus_free (name); } dbus_free_string_array (networks); @@ -471,13 +519,20 @@ void get_devices (DBusConnection *connection) { int type; - fprintf (stderr, " %s\n", devices[i]); + fprintf (stderr, " %s", devices[i]); if ((type = get_device_type (connection, devices[i])) == 2) { + fprintf (stderr, " Strength: %d%%\n", get_object_signal_strength (connection, devices[i])); + fprintf (stderr, " Device type: '%d'\n", type ); get_device_active_network (connection, devices[i]); get_device_networks (connection, devices[i]); + fprintf (stderr, "\n"); + } + else + { + fprintf (stderr, "\n Device type: '%d'\n", type ); + fprintf (stderr, "\n"); } - fprintf (stderr, "\n"); } dbus_free_string_array (devices); |