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;

Reply via email to