Cool, I like this patch.
Are there any plans for GLib 2.43 in Fedora 21?
Jakub
On Wednesday 14 of January 2015 12:06:15 Bastien Nocera wrote:
> GLib 2.44 (and development version 2.43) has support for checking the
> connectivity level. This nicely replaces all the custom code that talked
> to NetworkManager directly.
> ---
> configure.ac | 2 +-
> src/applet/applet.c | 146
> ++++++---------------------------------------------- 2 files changed, 16
> insertions(+), 132 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index d7e0ea5..436cfcd 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -129,7 +129,7 @@ AC_SUBST(py3execdir, $PYTHON3_EXECDIR)
> PKG_CHECK_MODULES([XICE], [ice])
> PKG_CHECK_MODULES([XSMP], [sm])
> PKG_CHECK_MODULES([GTK], [gtk+-3.0])
> -PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.21])
> +PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.43])
> PKG_CHECK_MODULES([DBUS], [dbus-1])
> PKG_CHECK_MODULES([LIBXML], [libxml-2.0])
> PKG_CHECK_MODULES([RPM], [rpm])
> diff --git a/src/applet/applet.c b/src/applet/applet.c
> index 644da60..e5ac02a 100644
> --- a/src/applet/applet.c
> +++ b/src/applet/applet.c
> @@ -38,14 +38,6 @@
> #include "libabrt.h"
> #include "problem_api.h"
>
> -/* NetworkManager DBus configuration */
> -#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"
> -#define NM_DBUS_PATH "/org/freedesktop/NetworkManager"
> -#define NM_DBUS_INTERFACE "org.freedesktop.NetworkManager"
> -#define NM_STATE_CONNECTED_LOCAL 50
> -#define NM_STATE_CONNECTED_SITE 60
> -#define NM_STATE_CONNECTED_GLOBAL 70
> -
> /* libnotify action keys */
> #define A_KNOWN_OPEN_GUI "OPEN"
> #define A_REPORT_REPORT "REPORT"
> @@ -67,7 +59,7 @@ enum
> };
>
>
> -static GDBusConnection *g_system_bus;
> +static GNetworkMonitor *netmon;
> static GtkStatusIcon *ap_status_icon;
> static GtkWidget *ap_menu;
> static char **s_dirs;
> @@ -176,99 +168,11 @@ static bool
> is_notification_of_incomplete_problems_enabled(void) return
> get_configured_bool_or_default("NotifyIncompleteProblems", 0); }
>
> -/*
> - * Converts a NM state value stored in GVariant to boolean.
> - *
> - * Returns true if a state means connected.
> - *
> - * Sinks the args variant.
> - */
> -static bool nm_state_is_connected(GVariant *args)
> -{
> - GVariant *value = g_variant_get_child_value(args, 0);
> -
> - if (g_variant_is_of_type(value, G_VARIANT_TYPE_VARIANT))
> - {
> - GVariant *tmp = g_variant_get_child_value(value, 0);
> - g_variant_unref(value);
> - value = tmp;
> - }
> -
> - int state = g_variant_get_uint32 (value);
> -
> - g_variant_unref(value);
> - g_variant_unref(args);
> -
> - return state == NM_STATE_CONNECTED_GLOBAL
> - || state == NM_STATE_CONNECTED_LOCAL
> - || state == NM_STATE_CONNECTED_SITE;
> -}
> -
> -/*
> - * The function tries to get network state from NetworkManager over DBus
> - * call. If NetworkManager DBus service is not available the function
> returns - * true which means that network is enabled and up.
> - *
> - * Function must return true on any error, otherwise user won't be notified
> - * about new problems. Because if network is not enabled, new problems are
> - * pushed to the deferred queue. The deferred queue is processed
> immediately - * after network becomes enabled. In case where NetworkManager
> is broken or not - * available, notification about network state doesn't
> work thus the deferred - * queue won't be ever processed.
> - */
> static bool is_networking_enabled(void)
> {
> - GError *error = NULL;
> -
> - /* Create a D-Bus proxy to get the object properties from the NM
> Manager - * object.
> - */
> - const int flags = G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES
> - | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS;
> -
> - GDBusProxy *props_proxy = g_dbus_proxy_new_sync(g_system_bus,
> - flags,
> - NULL /* GDBusInterfaceInfo */,
> - NM_DBUS_SERVICE,
> - NM_DBUS_PATH,
> - DBUS_INTERFACE_PROPERTIES,
> - NULL /* GCancellable */,
> - &error);
> -
> - if (!props_proxy)
> - {
> - /* The NetworkManager DBus service is not available. */
> - error_msg (_("Can't connect to NetworkManager over DBus: %s"),
> error->message); - g_error_free (error);
> -
> - /* Consider network state as connected. */
> - return true;
> - }
> -
> - /* Get the State property from the NM Manager object */
> - GVariant *const value = g_dbus_proxy_call_sync (props_proxy,
> - "Get",
> - g_variant_new("(ss)", NM_DBUS_INTERFACE,
> "State"), - G_DBUS_PROXY_FLAGS_NONE,
> - -1 /* timeout: use proxy default */,
> - NULL /* GCancellable */,
> - &error);
> -
> - /* Consider network state as connected if any error occurs */
> - bool ret = true;
> -
> - if (!error)
> - /* Convert the state value and sink the variable */
> - ret = nm_state_is_connected(value);
> - else
> - {
> - error_msg (_("Can't determine network status via NetworkManager:
> %s"), error->message); - g_error_free (error);
> - }
> -
> - g_object_unref(props_proxy);
> -
> - return ret;
> + if (!g_network_monitor_get_network_available(netmon))
> + return FALSE;
> + return g_network_monitor_get_connectivity(netmon) ==
> G_NETWORK_CONNECTIVITY_FULL; }
>
> static void show_problem_list_notification(GList *problems, int flags);
> @@ -282,14 +186,12 @@ static gboolean
> process_deferred_queue_timeout_fn(GList *queue) return FALSE;
> }
>
> -static void on_nm_state_changed(GDBusConnection *connection, const gchar
> *sender_name, - const gchar *object_path,
> const gchar *interface_name, - const gchar
> *signal_name, GVariant *parameters, -
> gpointer user_data)
> +static void connectivity_changed_cb(GObject *gobject,
> + GParamSpec *pspec,
> + gpointer user_data)
> {
> - g_variant_ref(parameters);
> -
> - if (nm_state_is_connected(parameters))
> + if (g_network_monitor_get_network_available(netmon) &&
> + g_network_monitor_get_connectivity(netmon) ==
> G_NETWORK_CONNECTIVITY_FULL) {
> if (g_deferred_timeout)
> g_source_remove(g_deferred_timeout);
> @@ -1610,27 +1512,12 @@ int main(int argc, char** argv)
>
> glib_init();
>
> - /* Monitor 'StateChanged' signal on 'org.freedesktop.NetworkManager'
> interface */ - GError *error = NULL;
> - g_system_bus = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
> -
> - if (g_system_bus == NULL)
> - {
> - error_msg("Error creating D-Bus proxy: %s\n", error->message);
> - g_error_free(error);
> - return -1;
> - }
> -
> - const guint signal_ret =
> g_dbus_connection_signal_subscribe(g_system_bus, -
> NM_DBUS_SERVICE, -
> NM_DBUS_INTERFACE, -
> "StateChanged", -
> NM_DBUS_PATH, -
> /* arg0 */ NULL, -
> G_DBUS_SIGNAL_FLAGS_NONE, -
> on_nm_state_changed, -
> /* user_data */ NULL, -
> /* user_data_free_func */ NULL); + /*
> Monitor NetworkManager state */
> + netmon = g_network_monitor_get_default ();
> + g_signal_connect (G_OBJECT (netmon), "notify::connectivity",
> + G_CALLBACK (connectivity_changed_cb), NULL);
> + g_signal_connect (G_OBJECT (netmon), "notify::network-available",
> + G_CALLBACK (connectivity_changed_cb), NULL);
>
> g_set_prgname("abrt");
> gtk_init(&argc, &argv);
> @@ -1858,9 +1745,6 @@ next:
> * save_user_settings();
> */
>
> - g_dbus_connection_signal_unsubscribe(g_system_bus, signal_ret);
> - g_object_unref(g_system_bus);
> -
> free(g_last_notified_problem_id);
>
> return 0;