gnome-packagekit r166 - in trunk: data libpackagekit-gnome po src



Author: rhughes
Date: Sun Apr 13 04:42:14 2008
New Revision: 166
URL: http://svn.gnome.org/viewvc/gnome-packagekit?rev=166&view=rev

Log:
from git

Modified:
   trunk/data/Makefile.am
   trunk/data/gpk-application.glade
   trunk/data/gpk-signature.glade
   trunk/libpackagekit-gnome/Makefile.am
   trunk/libpackagekit-gnome/gpk-client.c
   trunk/libpackagekit-gnome/gpk-common.c
   trunk/libpackagekit-gnome/gpk-common.h
   trunk/po/POTFILES.in
   trunk/src/gpk-application.c
   trunk/src/gpk-consolekit.c
   trunk/src/gpk-install-local-file.c
   trunk/src/gpk-install-package-name.c
   trunk/src/gpk-install-provide-file.c
   trunk/src/gpk-repo.c
   trunk/src/gpk-update-viewer.c

Modified: trunk/data/Makefile.am
==============================================================================
--- trunk/data/Makefile.am	(original)
+++ trunk/data/Makefile.am	Sun Apr 13 04:42:14 2008
@@ -32,6 +32,7 @@
 	gpk-progress.glade				\
 	gpk-prefs.glade					\
 	gpk-signature.glade				\
+	gpk-error.glade					\
 	gpk-log.glade					\
 	gpk-backend-status.glade			\
 	gpk-install-file.glade				\

Modified: trunk/data/gpk-application.glade
==============================================================================
--- trunk/data/gpk-application.glade	(original)
+++ trunk/data/gpk-application.glade	Sun Apr 13 04:42:14 2008
@@ -332,97 +332,125 @@
                           </widget>
                         </child>
                         <child>
-                          <widget class="GtkButton" id="button_find">
+                          <widget class="GtkNotebook" id="notebook_search_cancel">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
-                            <property name="response_id">0</property>
+                            <property name="show_tabs">False</property>
+                            <property name="show_border">False</property>
+                            <property name="tab_border">0</property>
+                            <property name="tab_hborder">0</property>
+                            <property name="tab_vborder">0</property>
                             <child>
-                              <widget class="GtkAlignment" id="alignment5">
+                              <widget class="GtkButton" id="button_find">
                                 <property name="visible">True</property>
-                                <property name="xscale">0</property>
-                                <property name="yscale">0</property>
+                                <property name="can_focus">True</property>
+                                <property name="response_id">0</property>
                                 <child>
-                                  <widget class="GtkHBox" id="hbox6">
+                                  <widget class="GtkAlignment" id="alignment5">
                                     <property name="visible">True</property>
-                                    <property name="spacing">2</property>
+                                    <property name="xscale">0</property>
+                                    <property name="yscale">0</property>
                                     <child>
-                                      <widget class="GtkImage" id="image4">
+                                      <widget class="GtkHBox" id="hbox6">
                                         <property name="visible">True</property>
-                                        <property name="stock">gtk-find</property>
+                                        <property name="spacing">2</property>
+                                        <child>
+                                          <widget class="GtkImage" id="image4">
+                                            <property name="visible">True</property>
+                                            <property name="stock">gtk-find</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label_button_find">
+                                            <property name="visible">True</property>
+                                            <property name="label">_Find</property>
+                                            <property name="use_underline">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
                                       </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <widget class="GtkLabel" id="label_button_find">
-                                        <property name="visible">True</property>
-                                        <property name="label">_Find</property>
-                                        <property name="use_underline">True</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
                                     </child>
                                   </widget>
                                 </child>
                               </widget>
                             </child>
-                          </widget>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkButton" id="button_cancel">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="response_id">0</property>
                             <child>
-                              <widget class="GtkAlignment" id="alignment2">
+                              <widget class="GtkLabel" id="label_find">
                                 <property name="visible">True</property>
-                                <property name="xscale">0</property>
-                                <property name="yscale">0</property>
+                                <property name="label">find</property>
+                              </widget>
+                              <packing>
+                                <property name="type">tab</property>
+                                <property name="tab_fill">False</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkButton" id="button_cancel">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="response_id">0</property>
                                 <child>
-                                  <widget class="GtkHBox" id="hbox3">
+                                  <widget class="GtkAlignment" id="alignment2">
                                     <property name="visible">True</property>
-                                    <property name="spacing">2</property>
+                                    <property name="xscale">0</property>
+                                    <property name="yscale">0</property>
                                     <child>
-                                      <widget class="GtkImage" id="image2">
+                                      <widget class="GtkHBox" id="hbox3">
                                         <property name="visible">True</property>
-                                        <property name="stock">gtk-dialog-error</property>
+                                        <property name="spacing">2</property>
+                                        <child>
+                                          <widget class="GtkImage" id="image2">
+                                            <property name="visible">True</property>
+                                            <property name="stock">gtk-dialog-error</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                          </packing>
+                                        </child>
+                                        <child>
+                                          <widget class="GtkLabel" id="label_button_cancel">
+                                            <property name="visible">True</property>
+                                            <property name="label">_Cancel</property>
+                                            <property name="use_underline">True</property>
+                                          </widget>
+                                          <packing>
+                                            <property name="expand">False</property>
+                                            <property name="fill">False</property>
+                                            <property name="position">1</property>
+                                          </packing>
+                                        </child>
                                       </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                      </packing>
-                                    </child>
-                                    <child>
-                                      <widget class="GtkLabel" id="label_button_cancel">
-                                        <property name="visible">True</property>
-                                        <property name="label">_Cancel</property>
-                                        <property name="use_underline">True</property>
-                                      </widget>
-                                      <packing>
-                                        <property name="expand">False</property>
-                                        <property name="fill">False</property>
-                                        <property name="position">1</property>
-                                      </packing>
                                     </child>
                                   </widget>
                                 </child>
                               </widget>
+                              <packing>
+                                <property name="position">1</property>
+                              </packing>
+                            </child>
+                            <child>
+                              <widget class="GtkLabel" id="label_cancel">
+                                <property name="visible">True</property>
+                                <property name="label">cancel</property>
+                              </widget>
+                              <packing>
+                                <property name="type">tab</property>
+                                <property name="position">1</property>
+                                <property name="tab_fill">False</property>
+                              </packing>
                             </child>
                           </widget>
                           <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">2</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
                       </widget>

Modified: trunk/data/gpk-signature.glade
==============================================================================
--- trunk/data/gpk-signature.glade	(original)
+++ trunk/data/gpk-signature.glade	Sun Apr 13 04:42:14 2008
@@ -6,6 +6,10 @@
     <property name="visible">True</property>
     <property name="title" translatable="yes">Software signature is required</property>
     <property name="resizable">False</property>
+    <property name="modal">True</property>
+    <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+    <property name="destroy_with_parent">True</property>
+    <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
     <child>
       <widget class="GtkVBox" id="vbox1">
         <property name="visible">True</property>
@@ -14,13 +18,11 @@
         <child>
           <widget class="GtkVBox" id="vbox2">
             <property name="visible">True</property>
-            <property name="spacing">7</property>
+            <property name="spacing">12</property>
             <child>
               <widget class="GtkLabel" id="label1">
                 <property name="visible">True</property>
-                <property name="label" translatable="yes">This signature is intended to ensure that software installed
-on your system is from a trusted source, and has not been tampered with.
-Before this software can be installed, you must indicate that you trust
+                <property name="label" translatable="yes">Before this software can be installed, you must indicate that you trust
 the source of the packages.</property>
               </widget>
               <packing>
@@ -31,63 +33,56 @@
             <child>
               <widget class="GtkTable" id="table1">
                 <property name="visible">True</property>
-                <property name="n_rows">5</property>
+                <property name="n_rows">4</property>
                 <property name="n_columns">2</property>
-                <property name="column_spacing">11</property>
+                <property name="column_spacing">12</property>
                 <property name="row_spacing">6</property>
                 <child>
-                  <widget class="GtkLabel" id="label_name">
+                  <widget class="GtkLabel" id="label3">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label">Livna.org Freeworld Repo</property>
+                    <property name="label" translatable="yes">Repository name:</property>
                   </widget>
                   <packing>
-                    <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
+                    <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkLabel" id="label_timestamp">
+                  <widget class="GtkLabel" id="label4">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label">2007-10-04</property>
+                    <property name="label" translatable="yes">Signature URL:</property>
                   </widget>
                   <packing>
-                    <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="top_attach">4</property>
-                    <property name="bottom_attach">5</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkLabel" id="label_id">
+                  <widget class="GtkLabel" id="label5">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label">BB7576AC</property>
+                    <property name="label" translatable="yes">Signature user identifier:</property>
                   </widget>
                   <packing>
-                    <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="top_attach">3</property>
-                    <property name="bottom_attach">4</property>
+                    <property name="top_attach">2</property>
+                    <property name="bottom_attach">3</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkLabel" id="label_user">
+                  <widget class="GtkLabel" id="label6">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label">Livna.org &lt;rpm livna org&gt;</property>
+                    <property name="label" translatable="yes">Signature identifier:</property>
                   </widget>
                   <packing>
-                    <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="top_attach">2</property>
-                    <property name="bottom_attach">3</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
@@ -108,38 +103,14 @@
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkLabel" id="label7">
-                    <property name="visible">True</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Signature time stamp:</property>
-                  </widget>
-                  <packing>
-                    <property name="top_attach">4</property>
-                    <property name="bottom_attach">5</property>
-                    <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkLabel" id="label6">
-                    <property name="visible">True</property>
-                    <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Signature identifier:</property>
-                  </widget>
-                  <packing>
-                    <property name="top_attach">3</property>
-                    <property name="bottom_attach">4</property>
-                    <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
-                  </packing>
-                </child>
-                <child>
-                  <widget class="GtkLabel" id="label5">
+                  <widget class="GtkLabel" id="label_user">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Signature user identifier:</property>
+                    <property name="label">Livna.org &lt;rpm livna org&gt;</property>
                   </widget>
                   <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
                     <property name="top_attach">2</property>
                     <property name="bottom_attach">3</property>
                     <property name="x_options">GTK_FILL</property>
@@ -147,31 +118,35 @@
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkLabel" id="label4">
+                  <widget class="GtkLabel" id="label_id">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Signature URL:</property>
+                    <property name="label">BB7576AC</property>
                   </widget>
                   <packing>
-                    <property name="top_attach">1</property>
-                    <property name="bottom_attach">2</property>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
                 </child>
                 <child>
-                  <widget class="GtkLabel" id="label3">
+                  <widget class="GtkLabel" id="label_name">
                     <property name="visible">True</property>
                     <property name="xalign">0</property>
-                    <property name="label" translatable="yes">Repository name:</property>
+                    <property name="label">Livna.org Freeworld Repo</property>
                   </widget>
                   <packing>
-                    <property name="x_options">GTK_FILL</property>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
                     <property name="y_options"></property>
                   </packing>
                 </child>
               </widget>
               <packing>
+                <property name="expand">False</property>
                 <property name="position">1</property>
               </packing>
             </child>
@@ -187,19 +162,27 @@
               </packing>
             </child>
           </widget>
+          <packing>
+            <property name="expand">False</property>
+          </packing>
         </child>
         <child>
-          <widget class="GtkHButtonBox" id="hbuttonbox1">
+          <widget class="GtkHButtonBox" id="hbuttonbox2">
             <property name="visible">True</property>
+            <property name="spacing">6</property>
+            <property name="layout_style">GTK_BUTTONBOX_END</property>
             <child>
-              <widget class="GtkButton" id="button_no">
+              <widget class="GtkButton" id="button_help">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-no</property>
+                <property name="label">gtk-help</property>
                 <property name="use_stock">True</property>
                 <property name="response_id">0</property>
               </widget>
+              <packing>
+                <property name="secondary">True</property>
+              </packing>
             </child>
             <child>
               <widget class="GtkButton" id="button_yes">
@@ -211,26 +194,28 @@
                 <property name="response_id">0</property>
               </widget>
               <packing>
-                <property name="position">1</property>
+                <property name="pack_type">GTK_PACK_END</property>
+                <property name="position">2</property>
               </packing>
             </child>
             <child>
-              <widget class="GtkButton" id="button_help">
+              <widget class="GtkButton" id="button_no">
                 <property name="visible">True</property>
                 <property name="can_focus">True</property>
                 <property name="can_default">True</property>
-                <property name="label">gtk-help</property>
+                <property name="label">gtk-cancel</property>
                 <property name="use_stock">True</property>
                 <property name="response_id">0</property>
               </widget>
               <packing>
-                <property name="position">2</property>
+                <property name="pack_type">GTK_PACK_END</property>
+                <property name="position">1</property>
               </packing>
             </child>
           </widget>
           <packing>
             <property name="expand">False</property>
-            <property name="fill">False</property>
+            <property name="pack_type">GTK_PACK_END</property>
             <property name="position">1</property>
           </packing>
         </child>

Modified: trunk/libpackagekit-gnome/Makefile.am
==============================================================================
--- trunk/libpackagekit-gnome/Makefile.am	(original)
+++ trunk/libpackagekit-gnome/Makefile.am	Sun Apr 13 04:42:14 2008
@@ -28,6 +28,7 @@
 libpackagekit_gnome_include_HEADERS =				\
 	gpk-client.h						\
 	gpk-common.h						\
+	gpk-error.h						\
 	$(NULL)
 
 libpackagekit_gnome_la_SOURCES =				\
@@ -37,6 +38,8 @@
 	gpk-client.h						\
 	gpk-gnome.c						\
 	gpk-gnome.h						\
+	gpk-error.c						\
+	gpk-error.h						\
 	$(NULL)
 
 libpackagekit_gnome_la_LIBADD =					\

Modified: trunk/libpackagekit-gnome/gpk-client.c
==============================================================================
--- trunk/libpackagekit-gnome/gpk-client.c	(original)
+++ trunk/libpackagekit-gnome/gpk-client.c	Sun Apr 13 04:42:14 2008
@@ -37,9 +37,10 @@
 #include <pk-package-id.h>
 #include <pk-control.h>
 
-#include "gpk-client.h"
-#include "gpk-common.h"
-#include "gpk-gnome.h"
+#include <gpk-client.h>
+#include <gpk-common.h>
+#include <gpk-gnome.h>
+#include <gpk-error.h>
 
 static void     gpk_client_class_init	(GpkClientClass *klass);
 static void     gpk_client_init		(GpkClient      *gclient);
@@ -56,10 +57,12 @@
 {
 	PkClient		*client_action;
 	PkClient		*client_resolve;
+	PkClient		*client_signature;
 	GladeXML		*glade_xml;
 	gint			 pulse_timeout;
 	PkControl		*control;
 	PkRoleEnum		 roles;
+	gboolean		 do_key_auth;
 };
 
 typedef enum {
@@ -238,6 +241,15 @@
 
 	g_return_if_fail (GPK_IS_CLIENT (gclient));
 
+	/* have we handled? */
+	if (code == PK_ERROR_ENUM_GPG_FAILURE) {
+		if (gclient->priv->do_key_auth) {
+			pk_debug ("ignoring GPG error as handled");
+			return;
+		}
+		pk_warning ("did not auth");
+	}
+
 	gpk_client_set_page (gclient, GPK_CLIENT_PAGE_ERROR);
 
 	/* set bold title */
@@ -257,10 +269,10 @@
 }
 
 /**
- * pk_client_package_cb:
+ * gpk_client_package_cb:
  **/
 static void
-pk_client_package_cb (PkClient *client, PkInfoEnum info, const gchar *package_id,
+gpk_client_package_cb (PkClient *client, PkInfoEnum info, const gchar *package_id,
 		      const gchar *summary, GpkClient *gclient)
 {
 	gchar *text;
@@ -275,10 +287,10 @@
 }
 
 /**
- * pk_client_allow_cancel_cb:
+ * gpk_client_allow_cancel_cb:
  **/
 static void
-pk_client_allow_cancel_cb (PkClient *client, gboolean allow_cancel, GpkClient *gclient)
+gpk_client_allow_cancel_cb (PkClient *client, gboolean allow_cancel, GpkClient *gclient)
 {
 	GtkWidget *widget;
 
@@ -531,7 +543,7 @@
 	/* did we click no or exit the window? */
 	if (button != GTK_RESPONSE_OK) {
 		gpk_client_error_msg (gclient, _("Failed to install package"), _("Additional packages were not downloaded"));
-		gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, error_local->message);
+		gpk_client_error_set (error, GPK_CLIENT_ERROR_FAILED, "user did not agree to additional deps");
 		ret = FALSE;
 		goto out;
 	}
@@ -731,6 +743,146 @@
 }
 
 /**
+ * gpk_client_sig_button_yes:
+ **/
+static void
+gpk_client_sig_button_yes (GtkWidget *widget, GpkClient *gclient)
+{
+	g_return_if_fail (GPK_IS_CLIENT (gclient));
+	gclient->priv->do_key_auth = TRUE;
+	gtk_main_quit ();
+}
+
+/**
+ * gpk_client_sig_button_no:
+ **/
+static void
+gpk_client_sig_button_no (GtkWidget *widget, GpkClient *gclient)
+{
+	g_return_if_fail (GPK_IS_CLIENT (gclient));
+	gtk_main_quit ();
+}
+
+/**
+ * gpk_client_sig_button_help:
+ **/
+static void
+gpk_client_sig_button_help (GtkWidget *widget, GpkClient *gclient)
+{
+	g_return_if_fail (GPK_IS_CLIENT (gclient));
+	/* TODO: need a whole section on this! */
+	gpk_gnome_help (NULL);
+}
+
+/**
+ * gpk_client_sig_delete_event_cb:
+ * @event: The event type, unused.
+ **/
+static gboolean
+gpk_client_sig_delete_event_cb (GtkWidget *widget, GdkEvent *event, GpkClient *gclient)
+{
+	g_return_val_if_fail (GPK_IS_CLIENT (gclient), FALSE);
+	gtk_main_quit ();
+	return FALSE;
+}
+
+/**
+ * gpk_client_repo_signature_required_cb:
+ **/
+static void
+gpk_client_repo_signature_required_cb (PkClient *client, const gchar *package_id, const gchar *repository_name,
+				       const gchar *key_url, const gchar *key_userid, const gchar *key_id,
+				       const gchar *key_fingerprint, const gchar *key_timestamp,
+				       PkSigTypeEnum type, GpkClient *gclient)
+{
+	gboolean ret;
+	GError *error = NULL;
+	GtkWidget *widget;
+	GladeXML *glade_xml;
+
+	g_return_if_fail (GPK_IS_CLIENT (gclient));
+
+	glade_xml = glade_xml_new (PK_DATA "/gpk-signature.glade", NULL, NULL);
+	widget = glade_xml_get_widget (glade_xml, "window_gpg");
+	g_signal_connect (widget, "delete_event",
+			  G_CALLBACK (gpk_client_sig_delete_event_cb), gclient);
+
+	/* connect up buttons */
+	widget = glade_xml_get_widget (glade_xml, "button_yes");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_client_sig_button_yes), gclient);
+	widget = glade_xml_get_widget (glade_xml, "button_no");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_client_sig_button_no), gclient);
+	widget = glade_xml_get_widget (glade_xml, "button_help");
+	g_signal_connect (widget, "clicked",
+			  G_CALLBACK (gpk_client_sig_button_help), gclient);
+
+	/* show correct text */
+	widget = glade_xml_get_widget (glade_xml, "label_name");
+	gtk_label_set_label (GTK_LABEL (widget), repository_name);
+	widget = glade_xml_get_widget (glade_xml, "label_url");
+	gtk_label_set_label (GTK_LABEL (widget), key_url);
+	widget = glade_xml_get_widget (glade_xml, "label_user");
+	gtk_label_set_label (GTK_LABEL (widget), key_userid);
+	widget = glade_xml_get_widget (glade_xml, "label_id");
+	gtk_label_set_label (GTK_LABEL (widget), key_id);
+
+	/* show window */
+	widget = glade_xml_get_widget (glade_xml, "window_gpg");
+	gtk_widget_show (widget);
+
+	/* wait for button press */
+	gclient->priv->do_key_auth = FALSE;
+	gtk_main ();
+
+	/* hide window */
+	gtk_widget_hide (widget);
+	g_object_unref (glade_xml);
+
+	/* disagreed with auth */
+	if (!gclient->priv->do_key_auth) {
+		return;
+	}
+
+	/* install signature */
+	pk_debug ("install signature %s", key_id);
+	ret = pk_client_reset (gclient->priv->client_signature, &error);
+	if (ret == FALSE) {
+		gpk_error_dialog (_("Failed to install signature"), _("The client could not be reset"), error->message);
+		g_error_free (error);
+		return;
+	}
+	/* this is asynchronous, else we get into livelock */
+	ret = pk_client_install_signature (gclient->priv->client_signature, PK_SIGTYPE_ENUM_GPG,
+					   key_id, package_id, &error);
+	if (!ret) {
+		gpk_error_dialog (_("Failed to install signature"), _("The method failed"), error->message);
+		g_error_free (error);
+		gclient->priv->do_key_auth = FALSE;
+	}
+}
+
+/**
+ * gpk_client_signature_finished_cb:
+ **/
+static void
+gpk_client_signature_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, GpkClient *gclient)
+{
+	gboolean ret;
+	GError *error = NULL;
+
+	g_return_if_fail (GPK_IS_CLIENT (gclient));
+
+	pk_debug ("trying to requeue install");
+	ret = pk_client_requeue (gclient->priv->client_action, &error);
+	if (!ret) {
+		gpk_error_dialog (_("Failed to install"), _("The install task could not be requeued"), error->message);
+		g_error_free (error);
+	}
+}
+
+/**
  * gpk_client_class_init:
  * @klass: The #GpkClientClass
  **/
@@ -755,6 +907,7 @@
 
 	gclient->priv->glade_xml = NULL;
 	gclient->priv->pulse_timeout = 0;
+	gclient->priv->do_key_auth = FALSE;
 
 	/* add application specific icons to search path */
 	gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
@@ -774,9 +927,11 @@
 	g_signal_connect (gclient->priv->client_action, "error-code",
 			  G_CALLBACK (gpk_client_error_code_cb), gclient);
 	g_signal_connect (gclient->priv->client_action, "package",
-			  G_CALLBACK (pk_client_package_cb), gclient);
+			  G_CALLBACK (gpk_client_package_cb), gclient);
 	g_signal_connect (gclient->priv->client_action, "allow-cancel",
-			  G_CALLBACK (pk_client_allow_cancel_cb), gclient);
+			  G_CALLBACK (gpk_client_allow_cancel_cb), gclient);
+	g_signal_connect (gclient->priv->client_action, "repo-signature-required",
+			  G_CALLBACK (gpk_client_repo_signature_required_cb), gclient);
 
 	gclient->priv->client_resolve = pk_client_new ();
 	g_signal_connect (gclient->priv->client_resolve, "status-changed",
@@ -784,6 +939,11 @@
 	pk_client_set_use_buffer (gclient->priv->client_resolve, TRUE, NULL);
 	pk_client_set_synchronous (gclient->priv->client_resolve, TRUE, NULL);
 
+	/* this is asynchronous, else we get into livelock */
+	gclient->priv->client_signature = pk_client_new ();
+	g_signal_connect (gclient->priv->client_signature, "finished",
+			  G_CALLBACK (gpk_client_signature_finished_cb), gclient);
+
 	gclient->priv->glade_xml = glade_xml_new (PK_DATA "/gpk-install-file.glade", NULL, NULL);
 	widget = glade_xml_get_widget (gclient->priv->glade_xml, "window_updates");
 
@@ -838,6 +998,7 @@
 	g_return_if_fail (gclient->priv != NULL);
 	g_object_unref (gclient->priv->client_action);
 	g_object_unref (gclient->priv->client_resolve);
+	g_object_unref (gclient->priv->client_signature);
 	g_object_unref (gclient->priv->control);
 
 	G_OBJECT_CLASS (gpk_client_parent_class)->finalize (object);

Modified: trunk/libpackagekit-gnome/gpk-common.c
==============================================================================
--- trunk/libpackagekit-gnome/gpk-common.c	(original)
+++ trunk/libpackagekit-gnome/gpk-common.c	Sun Apr 13 04:42:14 2008
@@ -310,23 +310,6 @@
 }
 
 /**
- * gpk_error_modal_dialog:
- *
- * Shows a modal error, and blocks until the user clicks close
- **/
-gboolean
-gpk_error_modal_dialog (const gchar *title, const gchar *message)
-{
-	GtkWidget *dialog;
-	dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_DESTROY_WITH_PARENT,
-					 GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, "%s", title);
-	gtk_message_dialog_format_secondary_markup (GTK_MESSAGE_DIALOG (dialog), "%s", message);
-	gtk_dialog_run (GTK_DIALOG (dialog));
-	gtk_widget_destroy (dialog);
-	return TRUE;
-}
-
-/**
  * gpk_error_enum_to_localised_text:
  **/
 const gchar *

Modified: trunk/libpackagekit-gnome/gpk-common.h
==============================================================================
--- trunk/libpackagekit-gnome/gpk-common.h	(original)
+++ trunk/libpackagekit-gnome/gpk-common.h	Sun Apr 13 04:42:14 2008
@@ -52,8 +52,6 @@
 gchar		*gpk_package_id_pretty_oneline		(const gchar	*package_id,
 							 const gchar	*summary);
 gchar		*gpk_package_id_name_version		(const gchar	*package_id);
-gboolean	 gpk_error_modal_dialog			(const gchar	*title,
-							 const gchar	*message);
 
 const gchar	*gpk_role_enum_to_localised_past	(PkRoleEnum	 role)
 							 G_GNUC_CONST;

Modified: trunk/po/POTFILES.in
==============================================================================
--- trunk/po/POTFILES.in	(original)
+++ trunk/po/POTFILES.in	Sun Apr 13 04:42:14 2008
@@ -18,6 +18,8 @@
 data/gpk-update-icon.desktop.in
 data/gpk-update-viewer.desktop.in
 data/gpk-update-viewer.glade
+data/gpk-error.glade
+libpackagekit-gnome/gpk-error.c
 libpackagekit-gnome/gpk-common.c
 libpackagekit-gnome/gpk-client.c
 src/gpk-application.c

Modified: trunk/src/gpk-application.c
==============================================================================
--- trunk/src/gpk-application.c	(original)
+++ trunk/src/gpk-application.c	Sun Apr 13 04:42:14 2008
@@ -149,6 +149,29 @@
 }
 
 /**
+ * gpk_application_set_find_cancel_buttons:
+ **/
+static void
+gpk_application_set_find_cancel_buttons (GpkApplication *application, gboolean find)
+{
+	GtkWidget *widget;
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_search_cancel");
+
+	/* if we can't do it, then just make the button insensitive */
+	if (!pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_CANCEL)) {
+		widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
+		gtk_widget_set_sensitive (widget, FALSE);
+	}
+
+	/* which tab to enable? */
+	if (find) {
+		gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 0);
+	} else {
+		gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 1);
+	}
+}
+
+/**
  * gpk_application_error_message:
  **/
 static void
@@ -695,10 +718,7 @@
 	    role == PK_ROLE_ENUM_SEARCH_GROUP) {
 
 		/* switch round buttons */
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
-		gtk_widget_show (widget);
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
-		gtk_widget_hide (widget);
+		gpk_application_set_find_cancel_buttons (application, TRUE);
 
 		/* were there no entries found? */
 		if (exit == PK_EXIT_ENUM_SUCCESS && !application->priv->has_package) {
@@ -710,6 +730,10 @@
 					    PACKAGES_COLUMN_IMAGE, "search",
 					    -1);
 		}
+
+		/* focus back to the text extry */
+		widget = glade_xml_get_widget (application->priv->glade_xml, "entry_text");
+		gtk_widget_grab_focus (widget);
 	}
 
 	/* hide widget */
@@ -744,7 +768,6 @@
 static void
 gpk_application_cancel_cb (GtkWidget *button_widget, GpkApplication *application)
 {
-	GtkWidget *widget;
 	gboolean ret;
 
 	g_return_if_fail (PK_IS_APPLICATION (application));
@@ -754,10 +777,7 @@
 
 	/* switch buttons around */
 	if (ret) {
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
-		gtk_widget_show (widget);
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
-		gtk_widget_hide (widget);
+		gpk_application_set_find_cancel_buttons (application, TRUE);
 		application->priv->search_mode = PK_MODE_UNKNOWN;
 	}
 }
@@ -828,12 +848,11 @@
 	gtk_widget_hide (widget);
 
 	/* switch around buttons */
-	widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
-	gtk_widget_hide (widget);
-	if (pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_CANCEL)) {
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
-		gtk_widget_show (widget);
-	}
+	gpk_application_set_find_cancel_buttons (application, FALSE);
+
+	widget = glade_xml_get_widget (application->priv->glade_xml, "notebook_search_cancel");
+	gtk_notebook_set_current_page (GTK_NOTEBOOK (widget), 1);
+
 
 	return TRUE;
 }
@@ -844,7 +863,6 @@
 static gboolean
 gpk_application_perform_search_others (GpkApplication *application)
 {
-	GtkWidget *widget;
 	gboolean ret;
 	GError *error = NULL;
 
@@ -870,15 +888,9 @@
 		ret = pk_client_get_packages (application->priv->client_search,
 					      application->priv->filters_current, &error);
 	}
-	/* ick, we failed so pretend we didn't do the action */
 	if (ret) {
 		/* switch around buttons */
-		widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
-		gtk_widget_hide (widget);
-		if (pk_enums_contain (application->priv->roles, PK_ROLE_ENUM_CANCEL)) {
-			widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel");
-			gtk_widget_show (widget);
-		}
+		gpk_application_set_find_cancel_buttons (application, FALSE);
 	} else {
 		gpk_application_error_message (application,
 					      _("The group could not be queried"), error->message);
@@ -2270,7 +2282,6 @@
 	g_signal_connect (widget, "clicked",
 			  G_CALLBACK (gpk_application_cancel_cb), application);
 	gtk_widget_set_tooltip_text (widget, _("Cancel search"));
-	gtk_widget_hide (widget);
 
 	/* cancel button */
 	widget = glade_xml_get_widget (application->priv->glade_xml, "button_cancel2");

Modified: trunk/src/gpk-consolekit.c
==============================================================================
--- trunk/src/gpk-consolekit.c	(original)
+++ trunk/src/gpk-consolekit.c	Sun Apr 13 04:42:14 2008
@@ -30,6 +30,7 @@
 
 #include <pk-debug.h>
 #include <gpk-common.h>
+#include <gpk-error.h>
 
 /**
  * gpk_consolekit_try_system_restart:
@@ -172,9 +173,9 @@
 				polkit_action_set_action_id (action2,
 							     "org.freedesktop.consolekit.system.restart-multiple-users");
 				if (polkit_action_equal (action, action2)) {
-					gpk_error_modal_dialog (_("Failed to restart"),
-								_("You are not allowed to restart the computer "
-								  "because multiple users are logged in"));
+					gpk_error_dialog (_("Failed to restart"),
+							  _("You are not allowed to restart the computer "
+							    "because multiple users are logged in"), NULL);
 				}
 
 				g_error_free (error);

Modified: trunk/src/gpk-install-local-file.c
==============================================================================
--- trunk/src/gpk-install-local-file.c	(original)
+++ trunk/src/gpk-install-local-file.c	Sun Apr 13 04:42:14 2008
@@ -27,9 +27,9 @@
 #include <locale.h>
 
 #include <pk-debug.h>
-
-#include "gpk-common.h"
-#include "gpk-client.h"
+#include <gpk-common.h>
+#include <gpk-client.h>
+#include <gpk-error.h>
 
 /**
  * main:
@@ -71,11 +71,13 @@
 	gtk_init (&argc, &argv);
 
 	if (argc < 2) {
-		gpk_error_modal_dialog (_("Failed to install local file"), _("You need to specify a file to install"));
+		gpk_error_dialog (_("Failed to install local file"),
+				  _("You need to specify a file to install"), NULL);
 		return 1;
 	}
 	if (argc > 2) {
-		gpk_error_modal_dialog (_("Failed to install local files"), _("You can only specify one file to install"));
+		gpk_error_dialog (_("Failed to install local files"),
+				  _("You can only specify one file to install"), NULL);
 		return 1;
 	}
 

Modified: trunk/src/gpk-install-package-name.c
==============================================================================
--- trunk/src/gpk-install-package-name.c	(original)
+++ trunk/src/gpk-install-package-name.c	Sun Apr 13 04:42:14 2008
@@ -27,9 +27,9 @@
 #include <locale.h>
 
 #include <pk-debug.h>
-
-#include "gpk-common.h"
-#include "gpk-client.h"
+#include <gpk-common.h>
+#include <gpk-client.h>
+#include <gpk-error.h>
 
 /**
  * main:
@@ -71,11 +71,13 @@
 	gtk_init (&argc, &argv);
 
 	if (argc < 2) {
-		gpk_error_modal_dialog (_("Failed to install package from name"), _("You need to specify a package to install"));
+		gpk_error_dialog (_("Failed to install package from name"),
+				  _("You need to specify a package to install"), NULL);
 		return 1;
 	}
 	if (argc > 2) {
-		gpk_error_modal_dialog (_("Failed to install packages from name"), _("You can only specify one package name to install"));
+		gpk_error_dialog (_("Failed to install packages from name"),
+				  _("You can only specify one package name to install"), NULL);
 		return 1;
 	}
 

Modified: trunk/src/gpk-install-provide-file.c
==============================================================================
--- trunk/src/gpk-install-provide-file.c	(original)
+++ trunk/src/gpk-install-provide-file.c	Sun Apr 13 04:42:14 2008
@@ -27,9 +27,9 @@
 #include <locale.h>
 
 #include <pk-debug.h>
-
-#include "gpk-common.h"
-#include "gpk-client.h"
+#include <gpk-common.h>
+#include <gpk-client.h>
+#include <gpk-error.h>
 
 /**
  * main:
@@ -71,11 +71,13 @@
 	gtk_init (&argc, &argv);
 
 	if (argc < 2) {
-		gpk_error_modal_dialog (_("Failed to install a package to provide a file"), _("You need to specify a filename to install"));
+		gpk_error_dialog (_("Failed to install a package to provide a file"),
+				  _("You need to specify a filename to install"), NULL);
 		return 1;
 	}
 	if (argc > 2) {
-		gpk_error_modal_dialog (_("Failed to install packages to provide files"), _("You can only specify one filename to install"));
+		gpk_error_dialog (_("Failed to install packages to provide files"),
+				  _("You can only specify one filename to install"), NULL);
 		return 1;
 	}
 

Modified: trunk/src/gpk-repo.c
==============================================================================
--- trunk/src/gpk-repo.c	(original)
+++ trunk/src/gpk-repo.c	Sun Apr 13 04:42:14 2008
@@ -39,6 +39,7 @@
 
 #include <gpk-gnome.h>
 #include <gpk-common.h>
+#include <gpk-error.h>
 
 #include "gpk-statusbar.h"
 
@@ -238,7 +239,7 @@
 static void
 pk_repo_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
 {
-	gpk_error_modal_dialog (gpk_error_enum_to_localised_text (code), details);
+	gpk_error_dialog (_("Failed to change status"), gpk_error_enum_to_localised_text (code), details);
 }
 
 /**

Modified: trunk/src/gpk-update-viewer.c
==============================================================================
--- trunk/src/gpk-update-viewer.c	(original)
+++ trunk/src/gpk-update-viewer.c	Sun Apr 13 04:42:14 2008
@@ -39,12 +39,12 @@
 #include <pk-control.h>
 #include <pk-common.h>
 #include <pk-task-list.h>
-#include <pk-connection.h>
 #include <pk-package-id.h>
 #include <pk-package-ids.h>
 
 #include <gpk-common.h>
 #include <gpk-gnome.h>
+#include <gpk-error.h>
 
 #include "gpk-statusbar.h"
 #include "gpk-consolekit.h"
@@ -62,12 +62,12 @@
 
 static PolKitGnomeAction *refresh_action = NULL;
 static PolKitGnomeAction *update_system_action = NULL;
-static PolKitGnomeAction *update_package_action = NULL;
+static PolKitGnomeAction *update_packages_action = NULL;
 static PolKitGnomeAction *restart_action = NULL;
 
 /* for the preview throbber */
-static void pk_updates_add_preview_item (const gchar *icon, const gchar *message, gboolean clear);
-static void pk_updates_description_animation_stop (void);
+static void pk_update_viewer_add_preview_item (const gchar *icon, const gchar *message, gboolean clear);
+static void pk_update_viewer_description_animation_stop (void);
 static int animation_timeout = 0;
 static int frame_counter = 0;
 static int n_frames = 0;
@@ -119,15 +119,14 @@
 pk_button_help_cb (GtkWidget *widget, gpointer data)
 {
 	const char *id = data;
-
 	gpk_gnome_help (id);
 }
 
 /**
- * pk_updates_set_page:
+ * pk_update_viewer_set_page:
  **/
 static void
-pk_updates_set_page (PkPageEnum page)
+pk_update_viewer_set_page (PkPageEnum page)
 {
 	GList *list, *l;
 	GtkWidget *widget;
@@ -160,8 +159,11 @@
 	}
 }
 
+/**
+ * pk_update_viewer_update_system_cb:
+ **/
 static void
-pk_updates_update_system_cb (PolKitGnomeAction *action, gpointer data)
+pk_update_viewer_update_system_cb (PolKitGnomeAction *action, gpointer data)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -173,7 +175,7 @@
 	gtk_widget_hide (widget);
 
 	/* set correct view */
-	pk_updates_set_page (PAGE_PROGRESS);
+	pk_update_viewer_set_page (PAGE_PROGRESS);
 
 	/* reset */
 	ret = pk_client_reset (client_action, &error);
@@ -192,10 +194,10 @@
 }
 
 /**
- * pk_updates_apply_cb:
+ * pk_update_viewer_apply_cb:
  **/
 static void
-pk_updates_apply_cb (PolKitGnomeAction *action, gpointer data)
+pk_update_viewer_apply_cb (PolKitGnomeAction *action, gpointer data)
 {
 	GtkWidget *widget;
 	GtkTreeModel *model;
@@ -209,7 +211,6 @@
 	gchar **package_ids;
 	gboolean ret;
 	GError *error = NULL;
-	gchar *text;
 
 	pk_debug ("Doing the package updates");
 	array = g_ptr_array_new ();
@@ -244,7 +245,7 @@
 
 	/* we have no checkboxes selected */
 	if (!selected_any) {
-		gpk_error_modal_dialog (_("No updates selected"), _("No updates are selected"));
+		gpk_error_dialog (_("No updates selected"), _("No updates are selected"), NULL);
 		return;
 	}
 
@@ -256,7 +257,7 @@
 	}
 
 	/* set correct view */
-	pk_updates_set_page (PAGE_PROGRESS);
+	pk_update_viewer_set_page (PAGE_PROGRESS);
 	package_ids = pk_package_ids_from_array (array);
 
 	/* reset */
@@ -270,9 +271,7 @@
 	/* update a list */
 	ret = pk_client_update_packages_strv (client_action, package_ids, &error);
 	if (!ret) {
-		text = g_markup_escape_text (error->message, -1);
-		gpk_error_modal_dialog ("Individual updates failed", text);
-		g_free (text);
+		gpk_error_dialog (_("Failed to update"), _("Individual updates failed"), error->message);
 		g_error_free (error);
 	}
 	g_strfreev (package_ids);
@@ -282,10 +281,10 @@
 }
 
 /**
- * pk_updates_animation_load_frames:
+ * pk_update_viewer_animation_load_frames:
  **/
 static gboolean
-pk_updates_animation_load_frames (void)
+pk_update_viewer_animation_load_frames (void)
 {
 	GtkWidget *widget;
 	GdkPixbuf *pixbuf;
@@ -324,10 +323,10 @@
 }
 
 /**
- * pk_updates_animation_update:
+ * pk_update_viewer_animation_update:
  **/
 static gboolean
-pk_updates_animation_update (gpointer data)
+pk_update_viewer_animation_update (gpointer data)
 {
 	GtkTreeModel *model = data;
 	GtkTreeIter iter;
@@ -352,10 +351,10 @@
 }
 
 /**
- * pk_updates_preview_animation_start:
+ * pk_update_viewer_preview_animation_start:
  **/
 static void
-pk_updates_preview_animation_start (void)
+pk_update_viewer_preview_animation_start (void)
 {
 	GtkWidget *widget;
 	GtkCellRenderer *renderer;
@@ -368,11 +367,8 @@
 		pk_debug ("don't double start");
 		return;
 	}
-	gtk_list_store_clear (list_store_details);
-
-	pk_updates_animation_load_frames ();
 
-	pk_updates_add_preview_item (NULL, _("Getting information..."), TRUE);
+	pk_update_viewer_animation_load_frames ();
 
 	widget = glade_xml_get_widget (glade_xml, "treeview_preview");
 	column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
@@ -389,15 +385,15 @@
 	g_object_set_data (G_OBJECT (model), "progress-column",
 			   GINT_TO_POINTER (PREVIEW_COLUMN_PROGRESS));
 
-	animation_timeout = g_timeout_add (50, pk_updates_animation_update, model);
-	pk_updates_animation_update (model);
+	animation_timeout = g_timeout_add (50, pk_update_viewer_animation_update, model);
+	pk_update_viewer_animation_update (model);
 }
 
 /**
- * pk_updates_preview_animation_stop:
+ * pk_update_viewer_preview_animation_stop:
  **/
 static void
-pk_updates_preview_animation_stop (void)
+pk_update_viewer_preview_animation_stop (void)
 {
 	GtkWidget *widget;
 	GtkCellRenderer *renderer;
@@ -421,10 +417,10 @@
 }
 
 /**
- * pk_updates_description_animation_start:
+ * pk_update_viewer_description_animation_start:
  **/
 static void
-pk_updates_description_animation_start (void)
+pk_update_viewer_description_animation_start (void)
 {
 	GtkWidget *widget;
 	GtkTreeViewColumn *column;
@@ -441,7 +437,7 @@
 
 	gtk_list_store_clear (list_store_description);
 
-	pk_updates_animation_load_frames ();
+	pk_update_viewer_animation_load_frames ();
 
 	widget = glade_xml_get_widget (glade_xml, "treeview_description");
 	column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), 0);
@@ -454,7 +450,7 @@
 	}
 	g_list_free (list);
 
-	text = g_strdup_printf ("<b>%s</b>", _("Getting Information..."));
+	text = g_strdup_printf ("<b>%s</b>", _("Getting Description..."));
 	gtk_list_store_append (list_store_description, &iter);
 	gtk_list_store_set (list_store_description, &iter,
 			    DESC_COLUMN_TITLE, text,
@@ -465,15 +461,15 @@
 
 	g_object_set_data (G_OBJECT (list_store_description), "progress-column",
 		           GINT_TO_POINTER (DESC_COLUMN_PROGRESS));
-	animation_timeout = g_timeout_add (50, pk_updates_animation_update, list_store_description);
-	pk_updates_animation_update (list_store_description);
+	animation_timeout = g_timeout_add (50, pk_update_viewer_animation_update, list_store_description);
+	pk_update_viewer_animation_update (list_store_description);
 }
 
 /**
- * pk_updates_description_animation_stop:
+ * pk_update_viewer_description_animation_stop:
  **/
 static void
-pk_updates_description_animation_stop (void)
+pk_update_viewer_description_animation_stop (void)
 {
 	GtkWidget *widget;
 	GtkTreeViewColumn *column;
@@ -499,15 +495,13 @@
 }
 
 /**
- * pk_updates_refresh_cb:
+ * pk_update_viewer_refresh_cb:
  **/
 static void
-pk_updates_refresh_cb (PolKitGnomeAction *action, gpointer data)
+pk_update_viewer_refresh_cb (PolKitGnomeAction *action, gpointer data)
 {
 	gboolean ret;
 	GError *error = NULL;
-	GtkWidget *widget;
-	gchar *text;
 
 	/* we can't click this if we havn't finished */
 	ret = pk_client_reset (client_action, &error);
@@ -518,47 +512,32 @@
 	}
 	ret = pk_client_refresh_cache (client_action, TRUE, &error);
 	if (ret == FALSE) {
-		text = g_markup_escape_text (error->message, -1);
-		gpk_error_modal_dialog (_("Failed to refresh"), text);
-		g_free (text);
+		gpk_error_dialog (_("Failed to refresh"), _("Method refused"), error->message);
 		g_error_free (error);
 		return;
 	}
-
-	/* clear existing list */
-	pk_updates_preview_animation_start ();
-
-	/* make the refresh button non-clickable */
-	polkit_gnome_action_set_sensitive (refresh_action, FALSE);
-	polkit_gnome_action_set_sensitive (update_system_action, FALSE);
-
-	/* make the buttons non-clickable until we get completion */
-	widget = glade_xml_get_widget (glade_xml, "button_review");
-	gtk_widget_set_sensitive (widget, FALSE);
-	widget = glade_xml_get_widget (glade_xml, "button_history");
-	gtk_widget_set_sensitive (widget, FALSE);
 }
 
+/**
+ * pk_update_viewer_history_cb:
+ **/
 static void
-pk_updates_history_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_history_cb (GtkWidget *widget, gpointer data)
 {
 	GError *error = NULL;
-	gchar *text;
 
 	/* FIXME: do this in process */
 	if (!g_spawn_command_line_async ("gpk-log", &error)) {
-		text = g_markup_escape_text (error->message, -1);
-		gpk_error_modal_dialog (_("Failed to launch gpk-log"), text);
-		g_free (text);
+		gpk_error_dialog (_("Failed to launch"), _("The file was not found"), error->message);
 		g_error_free (error);			
 	}
 }
 
 /**
- * pk_button_cancel_cb:
+ * pk_update_viewer_button_cancel_cb:
  **/
 static void
-pk_button_cancel_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_button_cancel_cb (GtkWidget *widget, gpointer data)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -578,10 +557,10 @@
 }
 
 /**
- * pk_button_close_and_cancel_cb:
+ * pk_update_viewer_button_close_and_cancel_cb:
  **/
 static void
-pk_button_close_and_cancel_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_button_close_and_cancel_cb (GtkWidget *widget, gpointer data)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -598,8 +577,11 @@
 	g_main_loop_quit (loop);
 }
 
+/**
+ * pk_update_viewer_close_cb:
+ **/
 static void
-pk_button_close_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_close_cb (GtkWidget *widget, gpointer data)
 {
 	GMainLoop *loop = (GMainLoop *) data;
 
@@ -608,10 +590,10 @@
 }
 
 /**
- * pk_button_review_cb:
+ * pk_update_viewer_review_cb:
  **/
 static void
-pk_button_review_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_review_cb (GtkWidget *widget, gpointer data)
 {
 	GtkWidget *treeview;
 	GtkTreeSelection *selection;
@@ -632,14 +614,112 @@
 	gtk_widget_set_size_request (GTK_WIDGET (widget), 500, 200);
 
 	/* set correct view */
-	pk_updates_set_page (PAGE_DETAILS);
+	pk_update_viewer_set_page (PAGE_DETAILS);
+}
+
+
+/**
+ * pk_update_viewer_populate_preview:
+ **/
+static void
+pk_update_viewer_populate_preview (void)
+{
+	GtkWidget *widget;
+	guint length;
+
+	length = pk_client_package_buffer_get_size (client_query);
+	if (length == 0) {
+		pk_update_viewer_add_preview_item ("dialog-information", _("There are no updates available!"), TRUE);
+
+		/* if no updates then hide apply */
+		widget = glade_xml_get_widget (glade_xml, "button_review");
+		gtk_widget_set_sensitive (widget, FALSE);
+		polkit_gnome_action_set_sensitive (update_system_action, FALSE);
+		polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
+	} else {
+
+		PkPackageItem *item;
+		guint i;
+		guint num_low = 0;
+		guint num_normal = 0;
+		guint num_important = 0;
+		guint num_security = 0;
+		guint num_bugfix = 0;
+		guint num_enhancement = 0;
+		const gchar *icon;
+		gchar *text;
+
+		for (i=0;i<length;i++) {
+			item = pk_client_package_buffer_get_item (client_query, i);
+			if (item->info == PK_INFO_ENUM_LOW) {
+				num_low++;
+			} else if (item->info == PK_INFO_ENUM_IMPORTANT) {
+				num_important++;
+			} else if (item->info == PK_INFO_ENUM_SECURITY) {
+				num_security++;
+			} else if (item->info == PK_INFO_ENUM_BUGFIX) {
+				num_bugfix++;
+			} else if (item->info == PK_INFO_ENUM_ENHANCEMENT) {
+				num_enhancement++;
+			} else {
+				num_normal++;
+			}
+		}
+
+		/* clear existing list */
+		gtk_list_store_clear (list_store_preview);
+
+		/* add to preview box in order of priority */
+		if (num_security > 0) {
+			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_SECURITY);
+			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_SECURITY, num_security);
+			pk_update_viewer_add_preview_item (icon, text, FALSE);
+			g_free (text);
+		}
+		if (num_important > 0) {
+			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_IMPORTANT);
+			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_IMPORTANT, num_important);
+			pk_update_viewer_add_preview_item (icon, text, FALSE);
+			g_free (text);
+		}
+		if (num_bugfix > 0) {
+			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_BUGFIX);
+			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_BUGFIX, num_bugfix);
+			pk_update_viewer_add_preview_item (icon, text, FALSE);
+			g_free (text);
+		}
+		if (num_enhancement > 0) {
+			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_ENHANCEMENT);
+			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_ENHANCEMENT, num_enhancement);
+			pk_update_viewer_add_preview_item (icon, text, FALSE);
+			g_free (text);
+		}
+		if (num_low > 0) {
+			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_LOW);
+			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_LOW, num_low);
+			pk_update_viewer_add_preview_item (icon, text, FALSE);
+			g_free (text);
+		}
+		if (num_normal > 0) {
+			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_NORMAL);
+			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_NORMAL, num_normal);
+			pk_update_viewer_add_preview_item (icon, text, FALSE);
+			g_free (text);
+		}
+
+		/* set visible and sensitive */
+		widget = glade_xml_get_widget (glade_xml, "button_review");
+		gtk_widget_set_sensitive (widget, TRUE);
+		polkit_gnome_action_set_sensitive (update_system_action, TRUE);
+		polkit_gnome_action_set_sensitive (update_packages_action, TRUE);
+	}
 }
 
 /**
- * pk_button_overview_cb:
+ * pk_update_viewer_get_new_update_list:
  **/
 static void
-pk_button_overview_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_get_new_update_list (void)
 {
 	gboolean ret;
 	GError *error = NULL;
@@ -647,9 +727,6 @@
 	/* clear existing list */
 	gtk_list_store_clear (list_store_details);
 
-	/* set correct view */
-	pk_updates_set_page (PAGE_PREVIEW);
-
 	/* get the new update list */
 	ret = pk_client_reset (client_query, &error);
 	if (!ret) {
@@ -657,22 +734,34 @@
 		g_error_free (error);
 		return;
 	}
-	/* TODO: we don't actually need to re-request the data, but we've
-	 * nuked the preview window with the spinner */
 	ret = pk_client_get_updates (client_query, PK_FILTER_ENUM_BASENAME, &error);
 	if (!ret) {
 		pk_warning ("failed to get updates: %s", error->message);
 		g_error_free (error);
 		return;
 	}
+	pk_update_viewer_populate_preview ();
 }
 
 /**
- * pk_updates_package_cb:
+ * pk_update_viewer_overview_cb:
  **/
 static void
-pk_updates_package_cb (PkClient *client, PkInfoEnum info, const gchar *package_id,
-		       const gchar *summary, gpointer data)
+pk_update_viewer_overview_cb (GtkWidget *widget, gpointer data)
+{
+	/* set correct view */
+	pk_update_viewer_set_page (PAGE_PREVIEW);
+
+	/* get the new update list */
+	pk_update_viewer_get_new_update_list ();
+}
+
+/**
+ * pk_update_viewer_package_cb:
+ **/
+static void
+pk_update_viewer_package_cb (PkClient *client, PkInfoEnum info, const gchar *package_id,
+			     const gchar *summary, gpointer data)
 {
 	GtkTreeIter iter;
 	gchar *text;
@@ -712,10 +801,10 @@
 }
 
 /**
- * pk_updates_add_description_item:
+ * pk_update_viewer_add_description_item:
  **/
 static void
-pk_updates_add_description_item (const gchar *title, const gchar *text, const gchar *uri)
+pk_update_viewer_add_description_item (const gchar *title, const gchar *text, const gchar *uri)
 {
 	gchar *markup;
 	GtkWidget *tree_view;
@@ -742,10 +831,10 @@
 }
 
 /**
- * pk_updates_add_description_link_item:
+ * pk_update_viewer_add_description_link_item:
  **/
 static void
-pk_updates_add_description_link_item (const gchar *title, const gchar *url_string)
+pk_update_viewer_add_description_link_item (const gchar *title, const gchar *url_string)
 {
 	const gchar *text;
 	const gchar *uri;
@@ -764,10 +853,10 @@
 		}
 		/* no suffix needed */
 		if (length == 2) {
-			pk_updates_add_description_item (title, text, uri);
+			pk_update_viewer_add_description_item (title, text, uri);
 		} else {
 			title_num = g_strdup_printf ("%s (%i)", title, (i/2) + 1);
-			pk_updates_add_description_item (title_num, text, uri);
+			pk_update_viewer_add_description_item (title_num, text, uri);
 			g_free (title_num);
 		}
 	}
@@ -775,14 +864,14 @@
 }
 
 /**
- * pk_updates_update_detail_cb:
+ * pk_update_viewer_update_detail_cb:
  **/
 static void
-pk_updates_update_detail_cb (PkClient *client, const gchar *package_id,
-			     const gchar *updates, const gchar *obsoletes,
-			     const gchar *vendor_url, const gchar *bugzilla_url,
-			     const gchar *cve_url, PkRestartEnum restart,
-			     const gchar *update_text, gpointer data)
+pk_update_viewer_update_detail_cb (PkClient *client, const gchar *package_id,
+				    const gchar *updates, const gchar *obsoletes,
+				    const gchar *vendor_url, const gchar *bugzilla_url,
+				    const gchar *cve_url, PkRestartEnum restart,
+				    const gchar *update_text, gpointer data)
 {
 	GtkWidget *widget;
 	PkPackageId *ident;
@@ -796,7 +885,7 @@
 	PkInfoEnum info;
 
 	/* clear existing list */
-	pk_updates_description_animation_stop ();
+	pk_update_viewer_description_animation_stop ();
 	gtk_list_store_clear (list_store_description);
 
 	/* initially we are hidden */
@@ -815,49 +904,49 @@
 
 	info_text = gpk_info_enum_to_localised_text (info);
 	/* translators: this is the update type, e.g. security */
-	pk_updates_add_description_item (_("Type"), info_text, NULL);
+	pk_update_viewer_add_description_item (_("Type"), info_text, NULL);
 
 	package_pretty = gpk_package_id_name_version (package_id);
 	/* translators: this is the package version */
-	pk_updates_add_description_item (_("Version"), package_pretty, NULL);
+	pk_update_viewer_add_description_item (_("Version"), package_pretty, NULL);
 	g_free (package_pretty);
 
 	if (!pk_strzero (updates)) {
 		updates_pretty = gpk_package_id_name_version (updates);
 		/* translators: this is a list of packages that are updated */
-		pk_updates_add_description_item (_("Updates"), updates_pretty, NULL);
+		pk_update_viewer_add_description_item (_("Updates"), updates_pretty, NULL);
 		g_free (updates_pretty);
 	}
 
 	if (!pk_strzero (obsoletes)) {
 		obsoletes_pretty = gpk_package_id_name_version (obsoletes);
 		/* translators: this is a list of packages that are obsoleted */
-		pk_updates_add_description_item (_("Obsoletes"), obsoletes_pretty, NULL);
+		pk_update_viewer_add_description_item (_("Obsoletes"), obsoletes_pretty, NULL);
 		g_free (obsoletes_pretty);
 	}
 
 	ident = pk_package_id_new_from_string (package_id);
 	/* translators: this is the repository the package has come from */
-	pk_updates_add_description_item (_("Repository"), ident->data, NULL);
+	pk_update_viewer_add_description_item (_("Repository"), ident->data, NULL);
 	pk_package_id_free (ident);
 
 	if (!pk_strzero (update_text)) {
 		/* translators: this is the package description */
-		pk_updates_add_description_item (_("Description"), update_text, NULL);
+		pk_update_viewer_add_description_item (_("Description"), update_text, NULL);
 	}
 
 	/* add all the links */
 	if (!pk_strzero (vendor_url)) {
 		/* translators: this is a list of vendor URLs */
-		pk_updates_add_description_link_item (_("Vendor"), vendor_url);
+		pk_update_viewer_add_description_link_item (_("Vendor"), vendor_url);
 	}
 	if (!pk_strzero (bugzilla_url)) {
 		/* translators: this is a list of bugzilla URLs */
-		pk_updates_add_description_link_item (_("Bugzilla"), bugzilla_url);
+		pk_update_viewer_add_description_link_item (_("Bugzilla"), bugzilla_url);
 	}
 	if (!pk_strzero (cve_url)) {
 		/* translators: this is a list of CVE (security) URLs */
-		pk_updates_add_description_link_item (_("CVE"), cve_url);
+		pk_update_viewer_add_description_link_item (_("CVE"), cve_url);
 	}
 
 	/* reboot */
@@ -872,18 +961,14 @@
 }
 
 /**
- * pk_updates_status_changed_cb:
+ * pk_update_viewer_status_changed_cb:
  **/
 static void
-pk_updates_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
+pk_update_viewer_status_changed_cb (PkClient *client, PkStatusEnum status, gpointer data)
 {
 	GtkWidget *widget;
 	gchar *text;
 
-	if (status == PK_STATUS_ENUM_WAIT) {
-		pk_updates_add_preview_item ("dialog-information", _("Waiting for previous tasks to complete!"), TRUE);
-	}
-
 	widget = glade_xml_get_widget (glade_xml, "progress_part_label");
 	text = g_strdup_printf ("<b>%s</b>", gpk_status_enum_to_localised_text (status));
 	gtk_label_set_markup (GTK_LABEL (widget), text);
@@ -897,25 +982,22 @@
 }
 
 /**
- * pk_window_delete_event_cb:
+ * pk_update_viewer_window_delete_event_cb:
  * @event: The event type, unused.
  **/
 static gboolean
-pk_window_delete_event_cb (GtkWidget	*widget,
-			    GdkEvent	*event,
-			    gpointer    data)
+pk_update_viewer_window_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data)
 {
 	GMainLoop *loop = (GMainLoop *) data;
-
 	g_main_loop_quit (loop);
 	return FALSE;
 }
 
 /**
- * pk_treeview_update_toggled:
+ * pk_update_viewer_treeview_update_toggled:
  **/
 static void
-pk_treeview_update_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
+pk_update_viewer_treeview_update_toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
 {
 	GtkTreeModel *model = (GtkTreeModel *) data;
 	GtkTreeIter iter;
@@ -942,10 +1024,10 @@
 }
 
 /**
- * pk_treeview_add_columns:
+ * pk_update_viewer_treeview_add_columns:
  **/
 static void
-pk_treeview_add_columns (GtkTreeView *treeview)
+pk_update_viewer_treeview_add_columns (GtkTreeView *treeview)
 {
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
@@ -967,20 +1049,20 @@
 }
 
 /**
- * pk_treeview_renderer_clicked:
+ * pk_update_viewer_treeview_renderer_clicked:
  **/
 static void
-pk_treeview_renderer_clicked (GtkCellRendererToggle *cell, gchar *uri, gpointer data)
+pk_update_viewer_treeview_renderer_clicked (GtkCellRendererToggle *cell, gchar *uri, gpointer data)
 {
 	pk_debug ("clicked %s", uri);
 	gpk_gnome_open (uri);
 }
 
 /**
- * pk_treeview_add_columns_description:
+ * pk_update_viewer_treeview_add_columns_description:
  **/
 static void
-pk_treeview_add_columns_description (GtkTreeView *treeview)
+pk_update_viewer_treeview_add_columns_description (GtkTreeView *treeview)
 {
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
@@ -999,7 +1081,7 @@
 
 	/* column for uris */
 	renderer = gpk_cell_renderer_uri_new ();
-	g_signal_connect (renderer, "clicked", G_CALLBACK (pk_treeview_renderer_clicked), NULL);
+	g_signal_connect (renderer, "clicked", G_CALLBACK (pk_update_viewer_treeview_renderer_clicked), NULL);
 	column = gtk_tree_view_column_new_with_attributes (_("Text"), renderer,
 							   "text", DESC_COLUMN_TEXT,
 							   "uri", DESC_COLUMN_URI, NULL);
@@ -1007,10 +1089,10 @@
 }
 
 /**
- * pk_treeview_add_columns_update:
+ * pk_update_viewer_treeview_add_columns_update:
  **/
 static void
-pk_treeview_add_columns_update (GtkTreeView *treeview)
+pk_update_viewer_treeview_add_columns_update (GtkTreeView *treeview)
 {
 	GtkCellRenderer *renderer;
 	GtkTreeViewColumn *column;
@@ -1019,7 +1101,7 @@
 	/* column for select toggle */
 	renderer = gtk_cell_renderer_toggle_new ();
 	model = gtk_tree_view_get_model (treeview);
-	g_signal_connect (renderer, "toggled", G_CALLBACK (pk_treeview_update_toggled), model);
+	g_signal_connect (renderer, "toggled", G_CALLBACK (pk_update_viewer_treeview_update_toggled), model);
 	column = gtk_tree_view_column_new_with_attributes ("Update", renderer, "active", PACKAGES_COLUMN_SELECT, NULL);
 
 	/* set this column to a fixed sizing (of 50 pixels) */
@@ -1028,7 +1110,7 @@
 	gtk_tree_view_append_column (treeview, column);
 
 	/* usual suspects */
-	pk_treeview_add_columns (treeview);
+	pk_update_viewer_treeview_add_columns (treeview);
 }
 
 /**
@@ -1062,7 +1144,7 @@
 		g_free (package_id);
 
 		/* clear and display animation until new details come in */
-		pk_updates_description_animation_start ();
+		pk_update_viewer_description_animation_start ();
 
 		widget = glade_xml_get_widget (glade_xml, "hbox_reboot");
 		gtk_widget_hide (widget);
@@ -1089,19 +1171,10 @@
 }
 
 /**
- * pk_connection_changed_cb:
+ * pk_update_viewer_add_preview_item:
  **/
 static void
-pk_connection_changed_cb (PkConnection *pconnection, gboolean connected, gpointer data)
-{
-	pk_debug ("connected=%i", connected);
-}
-
-/**
- * pk_updates_add_preview_item:
- **/
-static void
-pk_updates_add_preview_item (const gchar *icon, const gchar *message, gboolean clear)
+pk_update_viewer_add_preview_item (const gchar *icon, const gchar *message, gboolean clear)
 {
 	GtkWidget *tree_view;
 	GtkTreeSelection *selection;
@@ -1188,18 +1261,18 @@
 }
 
 static void
-pk_updates_restart_cb (GtkWidget *widget, gpointer data)
+pk_update_viewer_restart_cb (GtkWidget *widget, gpointer data)
 {
 	gpk_restart_system ();
 }
 
-static void populate_preview (void);
+static void pk_update_viewer_populate_preview (void);
 
 /**
- *pk_updates_check_blocked_packages:
+ * pk_update_viewer_check_blocked_packages:
  **/
 static void
-pk_updates_check_blocked_packages (PkClient *client)
+pk_update_viewer_check_blocked_packages (PkClient *client)
 {
 	guint i;
 	guint length;
@@ -1256,10 +1329,10 @@
 }
 
 /**
- * pk_updates_finished_cb:
+ * pk_update_viewer_finished_cb:
  **/
 static void
-pk_updates_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
+pk_update_viewer_finished_cb (PkClient *client, PkExitEnum exit, guint runtime, gpointer data)
 {
 	GtkWidget *widget;
 	PkRoleEnum role;
@@ -1267,36 +1340,19 @@
 
 	pk_client_get_role (client, &role, NULL, NULL);
 
-	/* just update the preview page */
-	if (role == PK_ROLE_ENUM_REFRESH_CACHE) {
-		/* update last time in the UI */
-		pk_update_update_last_refreshed_time ();
-	} else if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
-		   role == PK_ROLE_ENUM_UPDATE_PACKAGES) {
-		pk_update_update_last_updated_time ();
-	}
-
 	/* we don't need to do anything here */
-	if (role == PK_ROLE_ENUM_REFRESH_CACHE ||
-	    role == PK_ROLE_ENUM_GET_UPDATE_DETAIL) {
+	if (role == PK_ROLE_ENUM_GET_UPDATE_DETAIL ||
+	    role == PK_ROLE_ENUM_REFRESH_CACHE) {
 		return;
 	}
 
 	/* stop the throbber */
-	pk_updates_preview_animation_stop ();
-
-	/* make the buttons clickable again now we have completed */
-	widget = glade_xml_get_widget (glade_xml, "button_review");
-	gtk_widget_set_sensitive (widget, TRUE);
-	widget = glade_xml_get_widget (glade_xml, "button_history");
-	gtk_widget_set_sensitive (widget, TRUE);
-	polkit_gnome_action_set_sensitive (refresh_action, TRUE);
-	polkit_gnome_action_set_sensitive (update_system_action, TRUE);
+	pk_update_viewer_preview_animation_stop ();
 
 	/* check if we need to display infomation about blocked packages */
 	if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
 	    role == PK_ROLE_ENUM_UPDATE_PACKAGES) {
-		pk_updates_check_blocked_packages (client);
+		pk_update_viewer_check_blocked_packages (client);
 	}
 
 	/* hide the cancel */
@@ -1319,143 +1375,27 @@
 			}
 
 			/* set correct view */
-			pk_updates_set_page (PAGE_CONFIRM);
+			pk_update_viewer_set_page (PAGE_CONFIRM);
 		}
 	}
 
-	populate_preview ();
+	pk_update_viewer_populate_preview ();
 }
 
 static void
 pk_button_more_installs_cb (GtkWidget *button, gpointer data)
 {
-	gboolean ret;
-	GError *error = NULL;
-
-	/* clear existing list */
-	gtk_list_store_clear (list_store_details);
-
 	/* set correct view */
-	pk_updates_set_page (PAGE_DETAILS);
-
-	/* get the new update list */
-	ret = pk_client_reset (client_query, &error);
-	if (!ret) {
-		pk_warning ("failed to reset client: %s", error->message);
-		g_error_free (error);
-		return;
-	}
-	ret = pk_client_get_updates (client_query, PK_FILTER_ENUM_BASENAME, &error);
-	if (!ret) {
-		pk_warning ("failed to get updates: %s", error->message);
-		g_error_free (error);
-		return;
-	}
-
-	populate_preview ();
-}
-
-static void
-populate_preview (void)
-{
-	GtkWidget *widget;
-	guint length;
-
-	/* clear existing lists */
-	gtk_list_store_clear (list_store_preview);
-
-	length = pk_client_package_buffer_get_size (client_query);
-	if (length == 0) {
-		/* put a message in the listbox */
-		pk_updates_add_preview_item ("dialog-information", _("There are no updates available!"), TRUE);
-
-		/* if no updates then hide apply */
-		widget = glade_xml_get_widget (glade_xml, "button_review");
-		gtk_widget_hide (widget);
-		polkit_gnome_action_set_visible (update_system_action, FALSE);
-	} else {
-
-		PkPackageItem *item;
-		guint i;
-		guint num_low = 0;
-		guint num_normal = 0;
-		guint num_important = 0;
-		guint num_security = 0;
-		guint num_bugfix = 0;
-		guint num_enhancement = 0;
-		const gchar *icon;
-		gchar *text;
-
-		for (i=0;i<length;i++) {
-			item = pk_client_package_buffer_get_item (client_query, i);
-			if (item->info == PK_INFO_ENUM_LOW) {
-				num_low++;
-			} else if (item->info == PK_INFO_ENUM_IMPORTANT) {
-				num_important++;
-			} else if (item->info == PK_INFO_ENUM_SECURITY) {
-				num_security++;
-			} else if (item->info == PK_INFO_ENUM_BUGFIX) {
-				num_bugfix++;
-			} else if (item->info == PK_INFO_ENUM_ENHANCEMENT) {
-				num_enhancement++;
-			} else {
-				num_normal++;
-			}
-		}
-
-		/* clear existing list */
-		gtk_list_store_clear (list_store_preview);
-
-		/* add to preview box in order of priority */
-		if (num_security > 0) {
-			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_SECURITY);
-			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_SECURITY, num_security);
-			pk_updates_add_preview_item (icon, text, FALSE);
-			g_free (text);
-		}
-		if (num_important > 0) {
-			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_IMPORTANT);
-			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_IMPORTANT, num_important);
-			pk_updates_add_preview_item (icon, text, FALSE);
-			g_free (text);
-		}
-		if (num_bugfix > 0) {
-			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_BUGFIX);
-			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_BUGFIX, num_bugfix);
-			pk_updates_add_preview_item (icon, text, FALSE);
-			g_free (text);
-		}
-		if (num_enhancement > 0) {
-			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_ENHANCEMENT);
-			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_ENHANCEMENT, num_enhancement);
-			pk_updates_add_preview_item (icon, text, FALSE);
-			g_free (text);
-		}
-		if (num_low > 0) {
-			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_LOW);
-			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_LOW, num_low);
-			pk_updates_add_preview_item (icon, text, FALSE);
-			g_free (text);
-		}
-		if (num_normal > 0) {
-			icon = gpk_info_enum_to_icon_name (PK_INFO_ENUM_NORMAL);
-			text = gpk_update_enum_to_localised_text (PK_INFO_ENUM_NORMAL, num_normal);
-			pk_updates_add_preview_item (icon, text, FALSE);
-			g_free (text);
-		}
+	pk_update_viewer_set_page (PAGE_DETAILS);
 
-		/* set visible and sensitive */
-		widget = glade_xml_get_widget (glade_xml, "button_review");
-		gtk_widget_show (widget);
-		polkit_gnome_action_set_visible (update_system_action, TRUE);
-	}
+	pk_update_viewer_get_new_update_list ();
 }
 
 /**
- * pk_updates_progress_changed_cb:
+ * pk_update_viewer_progress_changed_cb:
  **/
 static void
-pk_updates_progress_changed_cb (PkClient *client, guint percentage, guint subpercentage,
+pk_update_viewer_progress_changed_cb (PkClient *client, guint percentage, guint subpercentage,
 				guint elapsed, guint remaining, gpointer data)
 {
 	GtkWidget *widget;
@@ -1467,10 +1407,10 @@
 }
 
 /**
- * pk_updates_allow_cancel_cb:
+ * pk_update_viewer_allow_cancel_cb:
  **/
 static void
-pk_updates_allow_cancel_cb (PkClient *client, gboolean allow_cancel, gpointer data)
+pk_update_viewer_allow_cancel_cb (PkClient *client, gboolean allow_cancel, gpointer data)
 {
 	GtkWidget *widget;
 	widget = glade_xml_get_widget (glade_xml, "button_cancel");
@@ -1478,30 +1418,52 @@
 }
 
 /**
- * pk_updates_task_list_changed_cb:
+ * pk_update_viewer_preview_set_animation:
  **/
 static void
-pk_updates_task_list_changed_cb (PkTaskList *tlist, gpointer data)
+pk_update_viewer_preview_set_animation (const gchar *text)
+{
+	GtkWidget *widget;
+
+	/* put a message in the listbox */
+	pk_update_viewer_add_preview_item ("dialog-information", text, TRUE);
+
+	/* hide apply, review and refresh */
+	polkit_gnome_action_set_sensitive (update_system_action, FALSE);
+	polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
+	polkit_gnome_action_set_sensitive (refresh_action, FALSE);
+	widget = glade_xml_get_widget (glade_xml, "button_review");
+	gtk_widget_set_sensitive (widget, FALSE);
+
+	/* start the spinning preview */
+	pk_update_viewer_preview_animation_start ();
+}
+
+/**
+ * pk_update_viewer_task_list_changed_cb:
+ **/
+static void
+pk_update_viewer_task_list_changed_cb (PkTaskList *tlist, gpointer data)
 {
 	GtkWidget *widget;
 
 	/* hide buttons if we are updating */
 	if (pk_task_list_contains_role (tlist, PK_ROLE_ENUM_UPDATE_SYSTEM) ||
 	    pk_task_list_contains_role (tlist, PK_ROLE_ENUM_UPDATE_PACKAGES)) {
-		/* clear existing list */
-		gtk_list_store_clear (list_store_preview);
+		pk_update_viewer_preview_set_animation (_("A system update is already in progress"));
 
-		/* put a message in the listbox */
-		pk_updates_add_preview_item ("dialog-information", _("There is an update already in progress!"), TRUE);
+	} else if (pk_task_list_contains_role (tlist, PK_ROLE_ENUM_GET_UPDATES)) {
+		pk_update_viewer_preview_set_animation (_("Getting updates"));
+
+	} else if (pk_task_list_contains_role (tlist, PK_ROLE_ENUM_REFRESH_CACHE)) {
+		pk_update_viewer_preview_set_animation (_("Refreshing package cache"));
 
-		/* hide apply, review and refresh */
-		polkit_gnome_action_set_sensitive (update_system_action, FALSE);
-		polkit_gnome_action_set_sensitive (refresh_action, FALSE);
-		widget = glade_xml_get_widget (glade_xml, "button_review");
-		gtk_widget_set_sensitive (widget, FALSE);
 	} else {
+		pk_update_viewer_preview_animation_stop ();
+
 		/* show apply, review and refresh */
 		polkit_gnome_action_set_sensitive (update_system_action, TRUE);
+		polkit_gnome_action_set_sensitive (update_packages_action, TRUE);
 		polkit_gnome_action_set_sensitive (refresh_action, TRUE);
 		widget = glade_xml_get_widget (glade_xml, "button_review");
 		gtk_widget_set_sensitive (widget, TRUE);
@@ -1509,10 +1471,10 @@
 }
 
 /**
- * pk_updates_error_code_cb:
+ * pk_update_viewer_error_code_cb:
  **/
 static void
-pk_updates_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
+pk_update_viewer_error_code_cb (PkClient *client, PkErrorCodeEnum code, const gchar *details, gpointer data)
 {
 	GtkWidget *widget;
 	const gchar *title;
@@ -1520,7 +1482,7 @@
 	gchar *details_safe;
 
 	/* set correct view */
-	pk_updates_set_page (PAGE_ERROR);
+	pk_update_viewer_set_page (PAGE_ERROR);
 
 	/* set bold title */
 	widget = glade_xml_get_widget (glade_xml, "label_error_title");
@@ -1539,36 +1501,19 @@
 }
 
 /**
- * pk_updates_changed_cb:
+ * pk_update_viewer_repo_list_changed_cb:
  **/
 static void
-pk_updates_changed_cb (PkClient *client, gpointer data)
+pk_update_viewer_repo_list_changed_cb (PkClient *client, gpointer data)
 {
-	gboolean ret;
-	GError *error = NULL;
-
-	/* get the update list */
-	ret = pk_client_reset (client_query, &error);
-	if (!ret) {
-		pk_warning ("failed to reset client: %s", error->message);
-		g_error_free (error);
-		return;
-	}
-	ret = pk_client_get_updates (client_query, PK_FILTER_ENUM_BASENAME, &error);
-	if (!ret) {
-		pk_warning ("failed to get new list: %s", error->message);
-		g_error_free (error);
-	} else {
-		/* only show this if we succeeded */
-		pk_updates_preview_animation_start ();
-	}
+	pk_update_viewer_get_new_update_list ();
 }
 
 /**
- * pk_updates_detail_popup_menu_select_all:
+ * pk_update_viewer_detail_popup_menu_select_all:
  **/
 void
-pk_updates_detail_popup_menu_select_all (GtkWidget *menuitem, gpointer userdata)
+pk_update_viewer_detail_popup_menu_select_all (GtkWidget *menuitem, gpointer userdata)
 {
 	GtkTreeView *treeview = GTK_TREE_VIEW (userdata);
 	gboolean valid;
@@ -1587,10 +1532,10 @@
 }
 
 /**
- * pk_updates_detail_popup_menu_select_none:
+ * pk_update_viewer_detail_popup_menu_select_none:
  **/
 void
-pk_updates_detail_popup_menu_select_none (GtkWidget *menuitem, gpointer userdata)
+pk_update_viewer_detail_popup_menu_select_none (GtkWidget *menuitem, gpointer userdata)
 {
 	GtkTreeView *treeview = GTK_TREE_VIEW (userdata);
 	gboolean valid;
@@ -1609,10 +1554,10 @@
 }
 
 /**
- * pk_updates_get_checked_status:
+ * pk_update_viewer_get_checked_status:
  **/
 void
-pk_updates_get_checked_status (gboolean *all_checked, gboolean *none_checked)
+pk_update_viewer_get_checked_status (gboolean *all_checked, gboolean *none_checked)
 {
 	GtkTreeView *treeview;
 	gboolean valid;
@@ -1638,10 +1583,10 @@
 }
 
 /**
- * pk_updates_detail_popup_menu_create:
+ * pk_update_viewer_detail_popup_menu_create:
  **/
 void
-pk_updates_detail_popup_menu_create (GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
+pk_update_viewer_detail_popup_menu_create (GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
 {
 	GtkWidget *menu;
 	GtkWidget *menuitem;
@@ -1651,26 +1596,26 @@
 	menu = gtk_menu_new();
 
 	/* we don't want to show 'Select all' if they are all checked */
-	pk_updates_get_checked_status (&all_checked, &none_checked);
+	pk_update_viewer_get_checked_status (&all_checked, &none_checked);
 
 	if (!all_checked) {
 		menuitem = gtk_menu_item_new_with_label ("Select all");
 		g_signal_connect (menuitem, "activate",
-				  G_CALLBACK (pk_updates_detail_popup_menu_select_all), treeview);
+				  G_CALLBACK (pk_update_viewer_detail_popup_menu_select_all), treeview);
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 	}
 
 	if (!none_checked) {
 		menuitem = gtk_menu_item_new_with_label ("Unselect all");
 		g_signal_connect (menuitem, "activate",
-				  G_CALLBACK (pk_updates_detail_popup_menu_select_none), treeview);
+				  G_CALLBACK (pk_update_viewer_detail_popup_menu_select_none), treeview);
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 	}
 
 	menuitem = gtk_menu_item_new_with_label ("Ignore this package");
 	gtk_widget_set_sensitive (GTK_WIDGET (menuitem), FALSE);
 	g_signal_connect (menuitem, "activate",
-			  G_CALLBACK (pk_updates_detail_popup_menu_select_all), treeview);
+			  G_CALLBACK (pk_update_viewer_detail_popup_menu_select_all), treeview);
 	gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
 
 	gtk_widget_show_all (menu);
@@ -1680,10 +1625,10 @@
 }
 
 /**
- * pk_updates_detail_button_pressed:
+ * pk_update_viewer_detail_button_pressed:
  **/
 gboolean
-pk_updates_detail_button_pressed (GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
+pk_update_viewer_detail_button_pressed (GtkWidget *treeview, GdkEventButton *event, gpointer userdata)
 {
 	GtkTreeSelection *selection;
 
@@ -1700,7 +1645,9 @@
 	if (gtk_tree_selection_count_selected_rows (selection) <= 1) {
 		GtkTreePath *path;
 		/* Get tree path for row that was clicked */
-		if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview), (gint) event->x, (gint) event->y, &path, NULL, NULL, NULL)) {
+		if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (treeview),
+						   (gint) event->x, (gint) event->y, &path,
+						   NULL, NULL, NULL)) {
 			gtk_tree_selection_unselect_all (selection);
 			gtk_tree_selection_select_path (selection, path);
 			gtk_tree_path_free (path);
@@ -1708,21 +1655,55 @@
 	}
 
 	/* create */
-	pk_updates_detail_popup_menu_create (treeview, event, userdata);
+	pk_update_viewer_detail_popup_menu_create (treeview, event, userdata);
 	return TRUE;
 }
 
 /**
- * pk_updates_detail_popup_menu:
+ * pk_update_viewer_detail_popup_menu:
  **/
 gboolean
-pk_updates_detail_popup_menu (GtkWidget *treeview, gpointer userdata)
+pk_update_viewer_detail_popup_menu (GtkWidget *treeview, gpointer userdata)
 {
-	pk_updates_detail_popup_menu_create (treeview, NULL, userdata);
+	pk_update_viewer_detail_popup_menu_create (treeview, NULL, userdata);
 	return TRUE;
 }
 
 /**
+ * pk_update_viewer_task_list_finished_cb:
+ **/
+static void
+pk_update_viewer_task_list_finished_cb (PkTaskList *tlist, PkClient *client, PkExitEnum exit,
+					guint runtime, gpointer userdata)
+{
+	PkRoleEnum role;
+	gboolean ret;
+
+	/* get the role */
+	ret = pk_client_get_role (client, &role, NULL, NULL);
+	if (!ret) {
+		pk_warning ("cannot get role");
+		return;
+	}
+	pk_debug ("%s", pk_role_enum_to_text (role));
+
+	/* update last time in the UI */
+	if (role == PK_ROLE_ENUM_REFRESH_CACHE) {
+		pk_update_update_last_refreshed_time ();
+	} else if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
+		   role == PK_ROLE_ENUM_UPDATE_PACKAGES) {
+		pk_update_update_last_updated_time ();
+	}
+
+	/* do we need to repopulate the preview widget */
+	if (role == PK_ROLE_ENUM_UPDATE_SYSTEM ||
+	    role == PK_ROLE_ENUM_UPDATE_PACKAGES ||
+	    role == PK_ROLE_ENUM_REFRESH_CACHE) {
+		pk_update_viewer_get_new_update_list ();
+	}
+}
+
+/**
  * main:
  **/
 int
@@ -1735,7 +1716,6 @@
 	GtkWidget *main_window;
 	GtkWidget *widget;
 	GtkTreeSelection *selection;
-	PkConnection *pconnection;
 	PkRoleEnum roles;
 	gboolean ret;
 	GtkSizeGroup *size_group;
@@ -1785,48 +1765,44 @@
 
 	control = pk_control_new ();
 	g_signal_connect (control, "repo-list-changed",
-			  G_CALLBACK (pk_updates_changed_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_repo_list_changed_cb), NULL);
 
 	/* this is stuff we don't care about */
 	client_query = pk_client_new ();
 	pk_client_set_use_buffer (client_query, TRUE, NULL);
 	g_signal_connect (client_query, "package",
-			  G_CALLBACK (pk_updates_package_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_package_cb), NULL);
 	g_signal_connect (client_query, "finished",
-			  G_CALLBACK (pk_updates_finished_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_finished_cb), NULL);
 	g_signal_connect (client_query, "progress-changed",
-			  G_CALLBACK (pk_updates_progress_changed_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_progress_changed_cb), NULL);
 	g_signal_connect (client_query, "update-detail",
-			  G_CALLBACK (pk_updates_update_detail_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_update_detail_cb), NULL);
 	g_signal_connect (client_query, "status-changed",
-			  G_CALLBACK (pk_updates_status_changed_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_status_changed_cb), NULL);
 	g_signal_connect (client_query, "error-code",
-			  G_CALLBACK (pk_updates_error_code_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_error_code_cb), NULL);
 	g_signal_connect (client_query, "allow-cancel",
-			  G_CALLBACK (pk_updates_allow_cancel_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_allow_cancel_cb), NULL);
 
 	client_action = pk_client_new ();
 	pk_client_set_use_buffer (client_action, TRUE, NULL);
 	g_signal_connect (client_action, "package",
-			  G_CALLBACK (pk_updates_package_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_package_cb), NULL);
 	g_signal_connect (client_action, "finished",
-			  G_CALLBACK (pk_updates_finished_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_finished_cb), NULL);
 	g_signal_connect (client_action, "progress-changed",
-			  G_CALLBACK (pk_updates_progress_changed_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_progress_changed_cb), NULL);
 	g_signal_connect (client_action, "status-changed",
-			  G_CALLBACK (pk_updates_status_changed_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_status_changed_cb), NULL);
 	g_signal_connect (client_action, "error-code",
-			  G_CALLBACK (pk_updates_error_code_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_error_code_cb), NULL);
 	g_signal_connect (client_action, "allow-cancel",
-			  G_CALLBACK (pk_updates_allow_cancel_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_allow_cancel_cb), NULL);
 
 	/* get actions */
 	roles = pk_control_get_actions (control);
 
-	pconnection = pk_connection_new ();
-	g_signal_connect (pconnection, "connection-changed",
-			  G_CALLBACK (pk_connection_changed_cb), NULL);
-
 	/* monitor for other updates in progress */
 	tlist = pk_task_list_new ();
 
@@ -1843,10 +1819,8 @@
 
 	pk_action = polkit_action_new ();
 	polkit_action_set_action_id (pk_action, "org.freedesktop.consolekit.system.restart");
-	restart_action = polkit_gnome_action_new_default ("restart-system",
-							  pk_action,
-							  _("_Restart computer now"),
-							  NULL);
+	restart_action = polkit_gnome_action_new_default ("restart-system", pk_action,
+							  _("_Restart computer now"), NULL);
 	g_object_set (restart_action,
 		      "no-icon-name", GTK_STOCK_REFRESH,
 		      "auth-icon-name", GTK_STOCK_REFRESH,
@@ -1857,7 +1831,7 @@
 		      NULL);
 	polkit_action_unref (pk_action);
 	g_signal_connect (restart_action, "activate",
-			  G_CALLBACK (pk_updates_restart_cb), loop);
+			  G_CALLBACK (pk_update_viewer_restart_cb), loop);
 	button = polkit_gnome_action_create_button (restart_action);
 	widget = glade_xml_get_widget (glade_xml, "buttonbox_confirm");
 	gtk_box_pack_start (GTK_BOX (widget), button, FALSE, FALSE, 0);
@@ -1865,29 +1839,29 @@
 
 	/* Get the main window quit */
 	g_signal_connect (main_window, "delete_event",
-			  G_CALLBACK (pk_window_delete_event_cb), loop);
+			  G_CALLBACK (pk_update_viewer_window_delete_event_cb), loop);
 
 	/* button_close2 and button_close3 are on the overview/review
 	 * screens, where we want to cancel transactions when closing
 	 */
 	widget = glade_xml_get_widget (glade_xml, "button_close2");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_close_and_cancel_cb), loop);
+			  G_CALLBACK (pk_update_viewer_button_close_and_cancel_cb), loop);
 	widget = glade_xml_get_widget (glade_xml, "button_close3");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_close_and_cancel_cb), loop);
+			  G_CALLBACK (pk_update_viewer_button_close_and_cancel_cb), loop);
 	widget = glade_xml_get_widget (glade_xml, "button_close");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_close_cb), loop);
+			  G_CALLBACK (pk_update_viewer_close_cb), loop);
 	widget = glade_xml_get_widget (glade_xml, "button_close4");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_close_cb), loop);
+			  G_CALLBACK (pk_update_viewer_close_cb), loop);
 	widget = glade_xml_get_widget (glade_xml, "button_close5");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_close_cb), loop);
+			  G_CALLBACK (pk_update_viewer_close_cb), loop);
 	widget = glade_xml_get_widget (glade_xml, "button_cancel");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_cancel_cb), loop);
+			  G_CALLBACK (pk_update_viewer_button_cancel_cb), loop);
 	gtk_widget_set_sensitive (widget, FALSE);
 
 	/* can we ever do the action? */
@@ -1897,12 +1871,12 @@
 
 	widget = glade_xml_get_widget (glade_xml, "button_review");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_review_cb), loop);
+			  G_CALLBACK (pk_update_viewer_review_cb), loop);
 	gtk_widget_set_tooltip_text(widget, _("Review the update list"));
 
 	widget = glade_xml_get_widget (glade_xml, "button_overview");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_button_overview_cb), loop);
+			  G_CALLBACK (pk_update_viewer_overview_cb), loop);
 	gtk_widget_set_tooltip_text(widget, _("Back to overview"));
 
 	widget = glade_xml_get_widget (glade_xml, "button_overview2");
@@ -1912,20 +1886,20 @@
 
 	pk_action = polkit_action_new ();
 	polkit_action_set_action_id (pk_action, "org.freedesktop.packagekit.update-package");
-	update_package_action = polkit_gnome_action_new_default ("update-package",
+	update_packages_action = polkit_gnome_action_new_default ("update-package",
 								pk_action,
 								_("_Apply Updates"),
 								_("Apply the selected updates"));
-	g_object_set (update_package_action,
+	g_object_set (update_packages_action,
 		      "no-icon-name", GTK_STOCK_APPLY,
 		      "auth-icon-name", GTK_STOCK_APPLY,
 		      "yes-icon-name", GTK_STOCK_APPLY,
 		      "self-blocked-icon-name", GTK_STOCK_APPLY,
 		      NULL);
 	polkit_action_unref (pk_action);
-	g_signal_connect (update_package_action, "activate",
-			  G_CALLBACK (pk_updates_apply_cb), loop);
-	button = polkit_gnome_action_create_button (update_package_action);
+	g_signal_connect (update_packages_action, "activate",
+			  G_CALLBACK (pk_update_viewer_apply_cb), loop);
+	button = polkit_gnome_action_create_button (update_packages_action);
 	widget = glade_xml_get_widget (glade_xml, "buttonbox_review");
 	gtk_box_pack_start (GTK_BOX (widget), button, FALSE, FALSE, 0);
 	gtk_box_reorder_child (GTK_BOX (widget), button, 2);
@@ -1944,7 +1918,7 @@
 		      NULL);
 	polkit_action_unref (pk_action);
 	g_signal_connect (update_system_action, "activate",
-			  G_CALLBACK (pk_updates_update_system_cb), loop);
+			  G_CALLBACK (pk_update_viewer_update_system_cb), loop);
 	button = polkit_gnome_action_create_button (update_system_action);
 	widget = glade_xml_get_widget (glade_xml, "buttonbox_overview");
 	gtk_box_pack_start (GTK_BOX (widget), button, FALSE, FALSE, 0);
@@ -1963,7 +1937,7 @@
 	polkit_action_unref (pk_action);
 
 	g_signal_connect (refresh_action, "activate",
-			  G_CALLBACK (pk_updates_refresh_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_refresh_cb), NULL);
 
 	button = polkit_gnome_action_create_button (refresh_action);
 	gtk_container_add (GTK_CONTAINER (widget), button);
@@ -1971,7 +1945,7 @@
 
 	widget = glade_xml_get_widget (glade_xml, "button_history");
 	g_signal_connect (widget, "clicked",
-			  G_CALLBACK (pk_updates_history_cb), NULL);
+			  G_CALLBACK (pk_update_viewer_history_cb), NULL);
 	gtk_size_group_add_widget (size_group, widget);
 
 	widget = glade_xml_get_widget (glade_xml, "button_help");
@@ -1998,7 +1972,7 @@
 				 GTK_TREE_MODEL (list_store_preview));
 
 	/* add columns to the tree view */
-	pk_treeview_add_columns (GTK_TREE_VIEW (widget));
+	pk_update_viewer_treeview_add_columns (GTK_TREE_VIEW (widget));
 	gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
 
 	/* create description tree view */
@@ -2007,7 +1981,7 @@
 				 GTK_TREE_MODEL (list_store_description));
 
 	/* add columns to the tree view */
-	pk_treeview_add_columns_description (GTK_TREE_VIEW (widget));
+	pk_update_viewer_treeview_add_columns_description (GTK_TREE_VIEW (widget));
 	gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
 
 	/* create package tree view */
@@ -2015,9 +1989,9 @@
 	gtk_tree_view_set_model (GTK_TREE_VIEW (widget),
 				 GTK_TREE_MODEL (list_store_details));
 	g_signal_connect (widget, "popup-menu",
-			  G_CALLBACK (pk_updates_detail_popup_menu), NULL);
+			  G_CALLBACK (pk_update_viewer_detail_popup_menu), NULL);
 	g_signal_connect (widget, "button-press-event",
-			  G_CALLBACK (pk_updates_detail_button_pressed), NULL);
+			  G_CALLBACK (pk_update_viewer_detail_button_pressed), NULL);
 
 	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
 	gtk_tree_selection_set_mode (selection, GTK_SELECTION_BROWSE);
@@ -2025,16 +1999,15 @@
 			  G_CALLBACK (pk_packages_treeview_clicked_cb), NULL);
 
 	/* add columns to the tree view */
-	pk_treeview_add_columns_update (GTK_TREE_VIEW (widget));
+	pk_update_viewer_treeview_add_columns_update (GTK_TREE_VIEW (widget));
 	gtk_tree_view_columns_autosize (GTK_TREE_VIEW (widget));
 
 	/* make the buttons non-clickable until we get completion */
 	polkit_gnome_action_set_sensitive (refresh_action, FALSE);
 	polkit_gnome_action_set_sensitive (update_system_action, FALSE);
+	polkit_gnome_action_set_sensitive (update_packages_action, FALSE);
 	widget = glade_xml_get_widget (glade_xml, "button_review");
 	gtk_widget_set_sensitive (widget, FALSE);
-	widget = glade_xml_get_widget (glade_xml, "button_history");
-	gtk_widget_set_sensitive (widget, FALSE);
 
 	/* set the last updated text */
 	pk_update_update_last_refreshed_time ();
@@ -2048,15 +2021,13 @@
 
 	/* we need to grey out all the buttons if we are in progress */
 	g_signal_connect (tlist, "changed",
-			  G_CALLBACK (pk_updates_task_list_changed_cb), NULL);
-	pk_updates_task_list_changed_cb (tlist, NULL);
+			  G_CALLBACK (pk_update_viewer_task_list_changed_cb), NULL);
+	pk_update_viewer_task_list_changed_cb (tlist, NULL);
+	g_signal_connect (tlist, "finished",
+			  G_CALLBACK (pk_update_viewer_task_list_finished_cb), NULL);
 
-	/* get the update list */
-	ret = pk_client_get_updates (client_query, PK_FILTER_ENUM_BASENAME, NULL);
-	if (ret) {
-		/* only show this if we succeeded */
-		pk_updates_preview_animation_start ();
-	}
+	/* coldplug */
+	pk_update_viewer_get_new_update_list ();
 
 	g_main_loop_run (loop);
 	g_main_loop_unref (loop);
@@ -2075,7 +2046,6 @@
 	g_object_unref (control);
 	g_object_unref (client_query);
 	g_object_unref (client_action);
-	g_object_unref (pconnection);
 	g_free (cached_package_id);
 
 	return 0;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]