← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~cjcurran/indicator-session/apt-fixes into lp:indicator-session

 

Conor Curran has proposed merging lp:~cjcurran/indicator-session/apt-fixes into lp:indicator-session.

Requested reviews:
  Ted Gould (ted)

For more details, see:
https://code.launchpad.net/~cjcurran/indicator-session/apt-fixes/+merge/73561

restartrequired signal should now be sent when a restart was required. 
-- 
https://code.launchpad.net/~cjcurran/indicator-session/apt-fixes/+merge/73561
Your team ayatana-commits is subscribed to branch lp:indicator-session.
=== modified file 'src/apt-watcher.c'
--- src/apt-watcher.c	2011-08-23 17:17:54 +0000
+++ src/apt-watcher.c	2011-08-31 17:05:11 +0000
@@ -27,6 +27,7 @@
 struct _AptWatcher
 {
 	GObject parent_instance;
+  guint reboot_query;
 	GCancellable * proxy_cancel;
 	GDBusProxy * proxy;  
   SessionDbus* session_dbus_interface;
@@ -55,7 +56,7 @@
                 
 static void apt_watcher_show_apt_dialog (DbusmenuMenuitem* mi,
                                          guint timestamp,
-                                         gchar * type);
+                                         gpointer userdata);
 
 static void apt_watcher_signal_cb (GDBusProxy* proxy,
                                    gchar* sender_name,
@@ -64,6 +65,7 @@
                                    gpointer user_data);
 static void  apt_watcher_manage_transactions (AptWatcher* self,
                                               gchar* transaction_id);
+static gboolean apt_watcher_query_reboot_status (gpointer self);
                                    
 
 
@@ -75,6 +77,7 @@
   self->current_state = UP_TO_DATE;
   self->proxy_cancel = g_cancellable_new();
   self->proxy = NULL;
+  self->reboot_query = 0;
   self->current_transaction = NULL;
   g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
                             G_DBUS_PROXY_FLAGS_NONE,
@@ -141,7 +144,7 @@
 	g_signal_connect (self->proxy,
                     "g-signal",
                     G_CALLBACK(apt_watcher_signal_cb),
-                    self);  
+                    self);   
 }
 
 
@@ -213,14 +216,32 @@
 static void
 apt_watcher_show_apt_dialog (DbusmenuMenuitem * mi,
                              guint timestamp,
-                             gchar * type)
+                             gpointer userdata)
 {
   GError * error = NULL;
-  if (!g_spawn_command_line_async("update-manager", &error))
-  {
-    g_warning("Unable to show update-manager: %s", error->message);
-    g_error_free(error);
-  }  
+  g_return_if_fail (APT_IS_WATCHER (userdata));
+  AptWatcher* self = APT_WATCHER (userdata);
+  const gchar* disposition = NULL;
+  disposition = dbusmenu_menuitem_property_get (self->apt_item,
+                                                DBUSMENU_MENUITEM_PROP_DISPOSITION);
+                                    
+  if (g_strcmp0 (disposition, DBUSMENU_MENUITEM_DISPOSITION_ALERT) == 0){  	
+    gchar * helper = g_build_filename (LIBEXECDIR, "gtk-logout-helper", NULL);
+	  gchar * dialog_line = g_strdup_printf ("%s --%s", helper, "restart");
+  	g_free(helper);
+	  if (!g_spawn_command_line_async(dialog_line, &error)) {
+		  g_warning("Unable to show dialog: %s", error->message);
+		  g_error_free(error);
+	  }
+	  g_free(dialog_line);
+  } 
+  else{
+    if (!g_spawn_command_line_async("update-manager", &error))
+    {
+      g_warning("Unable to show update-manager: %s", error->message);
+      g_error_free(error);
+    }
+  }   
 }
 
 static void
@@ -245,7 +266,16 @@
         == SIMULATION){
       g_object_unref (G_OBJECT(self->current_transaction));
       self->current_transaction = NULL;
-    }                                                                   
+    }  
+    if (self->reboot_query != 0){
+      g_source_remove (self->reboot_query);
+      self->reboot_query = 0;
+    }
+    // Wait a sec before querying for reboot status, 
+    // race condition with Apt has been observed.
+    self->reboot_query = g_timeout_add_seconds (1,
+                                                apt_watcher_query_reboot_status,
+                                                self); 
   }
   else if (state == UPDATES_AVAILABLE){
     dbusmenu_menuitem_property_set (self->apt_item,
@@ -266,27 +296,20 @@
                                     _("Updates Installing…"));    
   }  
   else if (state == FINISHED){
-    GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
-                                                               "RebootRequired");
-    gboolean reboot;
-    g_variant_get (reboot_result, "b", &reboot);
-    if (reboot == FALSE){
-      dbusmenu_menuitem_property_set (self->apt_item,
-                                      DBUSMENU_MENUITEM_PROP_LABEL,
-                                      _("Software Up to Date"));
-    }
-    else{
-      dbusmenu_menuitem_property_set (self->apt_item,
-                                      DBUSMENU_MENUITEM_PROP_LABEL,
-                                      _("Reboot Required"));
-      dbusmenu_menuitem_property_set (self->apt_item,
-                                      DBUSMENU_MENUITEM_PROP_DISPOSITION,
-                                      DBUSMENU_MENUITEM_DISPOSITION_ALERT);                                       
-      session_dbus_restart_required (self->session_dbus_interface);
-    }
-    g_debug ("Finished with a reboot value of %i", reboot); 
     g_object_unref (G_OBJECT(self->current_transaction));
-    self->current_transaction = NULL;                                    
+    self->current_transaction = NULL;   
+    if (self->reboot_query != 0){
+      g_source_remove (self->reboot_query);
+      self->reboot_query = 0;
+    }
+    // Wait a sec before querying for reboot status, 
+    // race condition with Apt has been observed.
+    self->reboot_query = g_timeout_add_seconds (1,
+                                                apt_watcher_query_reboot_status,
+                                                self); 
+    dbusmenu_menuitem_property_set (self->apt_item,
+                                    DBUSMENU_MENUITEM_PROP_LABEL,
+                                    _("Finished Updating…"));                                                                            
   }
   self->current_state = state;
 } 
@@ -302,8 +325,38 @@
     }
 }
 
+static gboolean
+apt_watcher_query_reboot_status (gpointer data)
+{
+  g_return_val_if_fail (APT_IS_WATCHER (data), FALSE);
+  AptWatcher* self = APT_WATCHER (data);
+  
+  GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
+                                                             "RebootRequired");
+  gboolean reboot;
+  g_variant_get (reboot_result, "b", &reboot);
+  g_debug ("apt_watcher_query_reboot_status: reboot prop = %i", reboot);
+  
+  if (reboot == FALSE){
+    dbusmenu_menuitem_property_set (self->apt_item,
+                                    DBUSMENU_MENUITEM_PROP_LABEL,
+                                    _("Software Up to Date"));
+  }
+  else{
+    dbusmenu_menuitem_property_set (self->apt_item,
+                                    DBUSMENU_MENUITEM_PROP_LABEL,
+                                    _("Reboot Required"));
+    dbusmenu_menuitem_property_set (self->apt_item,
+                                    DBUSMENU_MENUITEM_PROP_DISPOSITION,
+                                    DBUSMENU_MENUITEM_DISPOSITION_ALERT);
+    session_dbus_restart_required (self->session_dbus_interface);
+  }
+  self->reboot_query = 0;
+  return FALSE;
+}
+
 // TODO - Ask MVO about this.
-// Signal is of type s not sas which is on d-feet !!!
+// Signal is of type s not sas which is on d-feet.
 static void apt_watcher_signal_cb ( GDBusProxy* proxy,
                                     gchar* sender_name,
                                     gchar* signal_name,

=== modified file 'src/device-menu-mgr.c'
--- src/device-menu-mgr.c	2011-08-23 16:14:35 +0000
+++ src/device-menu-mgr.c	2011-08-31 17:05:11 +0000
@@ -61,7 +61,6 @@
 static DbusmenuMenuitem * hibernate_mi = NULL;
 static DbusmenuMenuitem * suspend_mi = NULL;
 static DbusmenuMenuitem * logout_mi = NULL;
-static DbusmenuMenuitem * restart_mi = NULL;
 static DbusmenuMenuitem * shutdown_mi = NULL;
 
 static gboolean can_hibernate = TRUE;
@@ -73,7 +72,6 @@
 static DBusGProxy * up_prop_proxy = NULL;
 
 static void device_menu_mgr_ensure_settings_client (DeviceMenuMgr* self);
-static void setup_restart_watch (DeviceMenuMgr* self);
 static void setup_up (DeviceMenuMgr* self);
 static void device_menu_mgr_rebuild_items (DeviceMenuMgr *self);
 static void lock_if_possible (DeviceMenuMgr* self);
@@ -106,7 +104,6 @@
 {
   self->apt_watcher = NULL;
   self->root_item = dbusmenu_menuitem_new ();  
-  setup_restart_watch(self);
 	setup_up(self);  
 	g_idle_add(lock_screen_setup, NULL);  
 }
@@ -751,62 +748,6 @@
                                        can_suspend && allow_suspend);
 }                                       
 
-/* When the directory changes we need to figure out how our menu
-   item should look. */
-static void
-restart_dir_changed (gpointer userdata)
-{
-  DeviceMenuMgr* self = DEVICE_MENU_MGR (userdata);
-	gboolean restart_required = g_file_test("/var/run/reboot-required", G_FILE_TEST_EXISTS);
-
-	if (restart_required) {
-		if (supress_confirmations()) {
-			dbusmenu_menuitem_property_set (restart_mi,
-                                      RESTART_ITEM_LABEL,
-                                      _("Restart to Complete Update"));
-		} else {
-			dbusmenu_menuitem_property_set (restart_mi,
-                                      RESTART_ITEM_LABEL,
-                                      _("Restart to Complete Update\342\200\246"));
-		}
-		dbusmenu_menuitem_property_set (restart_mi,
-                                    RESTART_ITEM_ICON,
-                                    "system-restart-panel");
-		if (self->session_dbus_interface != NULL) {
-			session_dbus_set_name (self->session_dbus_interface, ICON_RESTART);
-		}
-	} else {	
-		if (supress_confirmations()) {
-			dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart"));
-		} else {
-			dbusmenu_menuitem_property_set(restart_mi, RESTART_ITEM_LABEL, _("Restart\342\200\246"));
-		}
-		dbusmenu_menuitem_property_remove(restart_mi, RESTART_ITEM_ICON);
-		if (self->session_dbus_interface != NULL) {
-			session_dbus_set_name(self->session_dbus_interface, ICON_DEFAULT);
-		}
-	}
-	return;
-}
-
-/* Buids a file watcher for the directory so that when it
-   changes we can check to see if our reboot-required is
-   there. */
-static void
-setup_restart_watch (DeviceMenuMgr* self)
-{
-	GFile * filedir = g_file_new_for_path("/var/run");
-	GFileMonitor * filemon = g_file_monitor_directory(filedir, G_FILE_MONITOR_NONE, NULL, NULL);
-	if (filemon != NULL) {
-		g_signal_connect (G_OBJECT(filemon),
-                      "changed",
-                      G_CALLBACK(restart_dir_changed),
-                      self);
-	}
-	restart_dir_changed(self);
-	return;
-}
-
 /* Ensures that we have a GConf client and if we build one
    set up the signal handler. */
 static void

=== modified file 'src/indicator-session.c'
--- src/indicator-session.c	2011-08-22 13:05:48 +0000
+++ src/indicator-session.c	2011-08-31 17:05:11 +0000
@@ -497,8 +497,7 @@
                              &self->users);       
     }
   }
-  else if (g_strcmp0(signal_name, "RebootRequired") == 0) {
-    // TODO waiting on design to give me a name.
+  else if (g_strcmp0(signal_name, "RestartRequired") == 0) {
     self->devices.image = indicator_image_helper (ICON_RESTART);        
   }  
 }

=== modified file 'src/session-dbus.c'
--- src/session-dbus.c	2011-08-09 08:59:20 +0000
+++ src/session-dbus.c	2011-08-31 17:05:11 +0000
@@ -300,11 +300,13 @@
 	GError * error = NULL;
     
 	if (priv->bus != NULL) {
+    g_debug("About to send RebootRequired signal");
+
 		g_dbus_connection_emit_signal (priv->bus,
                                    NULL,
                                    INDICATOR_SESSION_SERVICE_DBUS_OBJECT,
                                    INDICATOR_SESSION_SERVICE_DBUS_IFACE,
-                                   "RebootRequired",
+                                   "RestartRequired",
                                    NULL,
                                    &error);
 

=== modified file 'src/session-dbus.xml'
--- src/session-dbus.xml	2011-08-09 08:59:20 +0000
+++ src/session-dbus.xml	2011-08-31 17:05:11 +0000
@@ -8,9 +8,6 @@
     <method name="GetUserMenuVisibility">
       <arg name="update" direction="out" type="b"/>
     </method>
-    <method name="IsUpdateNeeded">
-      <arg name="update" direction="out" type="b"/>
-    </method>
     <signal name="UserRealNameUpdated">
       <arg name="name" type="s"/>
     </signal>


Follow ups