On Thu, 2014-09-04 at 22:04 -0400, Mathieu Trudel-Lapierre wrote:
Signed-off-by: Mathieu Trudel-Lapierre <mathieu trudel-lapierre canonical com> --- introspection/nm-access-point.xml | 3 +++ libnm-glib/libnm-glib.ver | 1 + libnm-glib/nm-access-point.c | 35 +++++++++++++++++++++++++++++++++++ libnm-glib/nm-access-point.h | 2 ++ src/devices/wifi/nm-wifi-ap.c | 23 ++++++++++++++++++++++- src/devices/wifi/nm-wifi-ap.h | 1 + 6 files changed, 64 insertions(+), 1 deletion(-) diff --git a/introspection/nm-access-point.xml b/introspection/nm-access-point.xml index 21f238f..a2ab2f4 100644 --- a/introspection/nm-access-point.xml +++ b/introspection/nm-access-point.xml @@ -30,6 +30,9 @@ <property name="Strength" type="y" access="read"> <tp:docstring>The current signal quality of the access point, in percent.</tp:docstring> </property> + <property name="LastSeen" type="i" access="read"> + <tp:docstring>The current signal quality of the access point, in percent.</tp:docstring> + </property> <signal name="PropertiesChanged"> <arg name="properties" type="a{sv}" tp:type="String_Variant_Map"> diff --git a/libnm-glib/libnm-glib.ver b/libnm-glib/libnm-glib.ver index c0f1bba..20722e8 100644 --- a/libnm-glib/libnm-glib.ver +++ b/libnm-glib/libnm-glib.ver @@ -11,6 +11,7 @@ global: nm_access_point_get_flags; nm_access_point_get_frequency; nm_access_point_get_hw_address; + nm_access_point_get_last_seen; nm_access_point_get_max_bitrate; nm_access_point_get_mode; nm_access_point_get_rsn_flags; diff --git a/libnm-glib/nm-access-point.c b/libnm-glib/nm-access-point.c index b462a6b..b971190 100644 --- a/libnm-glib/nm-access-point.c +++ b/libnm-glib/nm-access-point.c @@ -52,6 +52,7 @@ typedef struct { NM80211Mode mode; guint32 max_bitrate; guint8 strength; + gint32 last_seen; } NMAccessPointPrivate; enum { @@ -66,6 +67,7 @@ enum { PROP_MAX_BITRATE, PROP_STRENGTH, PROP_BSSID, + PROP_LAST_SEEN, LAST_PROP }; @@ -265,6 +267,23 @@ nm_access_point_get_strength (NMAccessPoint *ap) } /** + * nm_access_point_get_last_seen: + * @ap: a #NMAccessPoint + * + * Gets the last seen timestamp for the access point. + * + * Returns: the last seen time in seconds + **/ +gint32 +nm_access_point_get_last_seen (NMAccessPoint *ap) +{ + g_return_val_if_fail (NM_IS_ACCESS_POINT (ap), 0); + + _nm_object_ensure_inited (NM_OBJECT (ap)); + return NM_ACCESS_POINT_GET_PRIVATE (ap)->last_seen; +} + +/** * nm_access_point_connection_valid: * @ap: an #NMAccessPoint to validate @connection against * @connection: an #NMConnection to validate against @ap @@ -481,6 +500,9 @@ get_property (GObject *object, case PROP_STRENGTH: g_value_set_uchar (value, nm_access_point_get_strength (ap)); break; + case PROP_LAST_SEEN: + g_value_set_int (value, nm_access_point_get_last_seen (ap)); + break;
the value priv->last_seen (together with nm_access_point_get_last_seen() and nm_ap_set_last_seen()) are time stamps as returned by nm_utils_get_monotonic_timestamp_s(). Exposing these absolute values (without a reference point) to another process is meaningless. Options: 1) expose the timestamps to absolute times in seconds since 1970 (posix time). Note that gint (with 32bit) is to short to represent that property. Downside: timestamps are all wrong in case of resetting the clock. 2) expose time stamps to clock_gettime(CLOCK_BOOTTIME) or clock_gettime(CLOCK_MONOTONIC). Downside: timestamps are only meaningful on the very same host. Its quite uncommon to expose DBUS over the network, but I think we don't want to restrict that. CLOCK_MONOTONIC is more commonly known then CLOCK_BOOTTIME, but has the additional downside of being wrong after hibernate. 3) Expose both 1) *and* 2) via DBUS. The client knows whether it is running on the same host and can either use the more accurate value of 2), or fallback to 1) on a remote host. libnm can nicely abstract that. Downside: over-engineered. Also note that priv->last_seen==0 means "never seen". Both for 1) and 2) above, 0 can represent a valid value. Arguably for 1), We could define that 0 (1970-01-01T00:00:00) means "never seen". But maybe it would be better to map "never seen" to -1 -- thinking of booting up a machine with drained CMOS battery that forgot the time stamp and starts ticking at posix-time 0.
default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -511,6 +533,7 @@ register_properties (NMAccessPoint *ap) { NM_ACCESS_POINT_MODE, &priv->mode }, { NM_ACCESS_POINT_MAX_BITRATE, &priv->max_bitrate }, { NM_ACCESS_POINT_STRENGTH, &priv->strength }, + { NM_ACCESS_POINT_LAST_SEEN, &priv->last_seen }, { NULL }, }; @@ -670,4 +693,16 @@ nm_access_point_class_init (NMAccessPointClass *ap_class) 0, G_MAXUINT8, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * NMAccessPoint:last-seen: + * + * The last seen timestamp of the access point. + **/ + g_object_class_install_property + (object_class, PROP_LAST_SEEN, + g_param_spec_int (NM_ACCESS_POINT_LAST_SEEN, "", "", + 0, G_MAXINT32, 0, + G_PARAM_READABLE | + G_PARAM_STATIC_STRINGS)); } diff --git a/libnm-glib/nm-access-point.h b/libnm-glib/nm-access-point.h index d3150f8..d8efad1 100644 --- a/libnm-glib/nm-access-point.h +++ b/libnm-glib/nm-access-point.h @@ -46,6 +46,7 @@ G_BEGIN_DECLS #define NM_ACCESS_POINT_MODE "mode" #define NM_ACCESS_POINT_MAX_BITRATE "max-bitrate" #define NM_ACCESS_POINT_STRENGTH "strength" +#define NM_ACCESS_POINT_LAST_SEEN "last-seen" /* DEPRECATED */ #define NM_ACCESS_POINT_HW_ADDRESS "hw-address" @@ -80,6 +81,7 @@ guint32 nm_access_point_get_frequency (NMAccessPoint *ap); NM80211Mode nm_access_point_get_mode (NMAccessPoint *ap); guint32 nm_access_point_get_max_bitrate (NMAccessPoint *ap); guint8 nm_access_point_get_strength (NMAccessPoint *ap); +gint32 nm_access_point_get_last_seen (NMAccessPoint *ap); GSList * nm_access_point_filter_connections (NMAccessPoint *ap, const GSList *connections); diff --git a/src/devices/wifi/nm-wifi-ap.c b/src/devices/wifi/nm-wifi-ap.c index 0c25221..362ef58 100644 --- a/src/devices/wifi/nm-wifi-ap.c +++ b/src/devices/wifi/nm-wifi-ap.c @@ -76,6 +76,7 @@ enum { PROP_MODE, PROP_MAX_BITRATE, PROP_STRENGTH, + PROP_LAST_SEEN, LAST_PROP }; @@ -89,6 +90,7 @@ nm_ap_init (NMAccessPoint *ap) priv->flags = NM_802_11_AP_FLAGS_NONE; priv->wpa_flags = NM_802_11_AP_SEC_NONE; priv->rsn_flags = NM_802_11_AP_SEC_NONE; + priv->last_seen = 0; priv->broadcast = TRUE; } @@ -144,6 +146,9 @@ set_property (GObject *object, guint prop_id, break; case PROP_HW_ADDRESS: break; + case PROP_LAST_SEEN: + nm_ap_set_last_seen (ap, g_value_get_int (value)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -192,6 +197,9 @@ get_property (GObject *object, guint prop_id, case PROP_STRENGTH: g_value_set_schar (value, priv->strength); break; + case PROP_LAST_SEEN: + g_value_set_int (value, priv->last_seen); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -291,6 +299,13 @@ nm_ap_class_init (NMAccessPointClass *ap_class) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property + (object_class, PROP_LAST_SEEN, + g_param_spec_int (NM_AP_LAST_SEEN, "", "", + 0, G_MAXINT32, 0, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS)); + nm_dbus_manager_register_exported_type (nm_dbus_manager_get (), G_TYPE_FROM_CLASS (ap_class), &dbus_glib_nm_access_point_object_info); @@ -1090,9 +1105,15 @@ nm_ap_get_last_seen (const NMAccessPoint *ap) void nm_ap_set_last_seen (NMAccessPoint *ap, gint32 last_seen) { + NMAccessPointPrivate *priv; g_return_if_fail (NM_IS_AP (ap)); - NM_AP_GET_PRIVATE (ap)->last_seen = last_seen; + priv = NM_AP_GET_PRIVATE (ap); + + if (priv->last_seen != last_seen) { + priv->last_seen = last_seen; + g_object_notify (G_OBJECT (ap), NM_AP_LAST_SEEN); + } } gboolean diff --git a/src/devices/wifi/nm-wifi-ap.h b/src/devices/wifi/nm-wifi-ap.h index 0abb28f..d09d357 100644 --- a/src/devices/wifi/nm-wifi-ap.h +++ b/src/devices/wifi/nm-wifi-ap.h @@ -43,6 +43,7 @@ #define NM_AP_MODE "mode" #define NM_AP_MAX_BITRATE "max-bitrate" #define NM_AP_STRENGTH "strength" +#define NM_AP_LAST_SEEN "last-seen" typedef struct { GObject parent;
Attachment:
signature.asc
Description: This is a digitally signed message part