allow reuse of object

This commit is contained in:
Richard Hughes 2007-08-16 02:00:42 +01:00
parent 456bf0baf4
commit 9c7106c399
5 changed files with 75 additions and 10 deletions

View File

@ -43,6 +43,7 @@ struct PkApplicationPrivate
{
GladeXML *glade_xml;
GtkListStore *store;
PkTaskClient *tclient;
gchar *package;
};
@ -114,10 +115,12 @@ pk_application_help_cb (GtkWidget *widget,
* @graph: This graph class instance
**/
static void
pk_application_install_cb (GtkWidget *widget,
PkApplication *application)
pk_application_install_cb (GtkWidget *widget,
PkApplication *application)
{
pk_debug ("install %s", application->priv->package);
pk_task_client_install_package (application->priv->tclient,
application->priv->package);
}
/**
@ -126,10 +129,12 @@ pk_application_install_cb (GtkWidget *widget,
* @graph: This graph class instance
**/
static void
pk_application_remove_cb (GtkWidget *widget,
PkApplication *application)
pk_application_remove_cb (GtkWidget *widget,
PkApplication *application)
{
pk_debug ("remove %s", application->priv->package);
pk_task_client_remove_package (application->priv->tclient,
application->priv->package);
}
/**
@ -161,7 +166,7 @@ pk_application_close_cb (GtkWidget *widget,
* pk_console_package_cb:
**/
static void
pk_console_package_cb (PkTaskClient *tclient, guint value, const gchar *package, const gchar *summary, PkApplication *application)
pk_console_package_cb (PkTaskClient *tclient, guint value, const gchar *package, const gchar *summary, PkApplication *application)
{
GtkTreeIter iter;
g_debug ("package = %i:%s:%s", value, package, summary);
@ -173,6 +178,15 @@ pk_console_package_cb (PkTaskClient *tclient, guint value, const gchar *package,
-1);
}
/**
* pk_console_finished_cb:
**/
static void
pk_console_finished_cb (PkTaskClient *tclient, PkTaskStatus status, PkApplication *application)
{
pk_task_client_reset (application->priv->tclient);
}
/**
* pk_application_find_cb:
* @widget: The GtkWidget object
@ -184,7 +198,6 @@ pk_application_find_cb (GtkWidget *button_widget,
{
GtkWidget *widget;
const gchar *package;
PkTaskClient *tclient;
widget = glade_xml_get_widget (application->priv->glade_xml, "entry_text");
package = gtk_entry_get_text (GTK_ENTRY (widget));
@ -194,10 +207,7 @@ pk_application_find_cb (GtkWidget *button_widget,
g_debug ("find %s", package);
tclient = pk_task_client_new ();
g_signal_connect (tclient, "package",
G_CALLBACK (pk_console_package_cb), application);
pk_task_client_find_packages (tclient, package);
pk_task_client_find_packages (application->priv->tclient, package);
}
/**
@ -337,6 +347,12 @@ pk_application_init (PkApplication *application)
application->priv = PK_APPLICATION_GET_PRIVATE (application);
application->priv->package = NULL;
application->priv->tclient = pk_task_client_new ();
g_signal_connect (application->priv->tclient, "package",
G_CALLBACK (pk_console_package_cb), application);
g_signal_connect (application->priv->tclient, "finished",
G_CALLBACK (pk_console_finished_cb), application);
application->priv->glade_xml = glade_xml_new (PK_DATA "/pk-application.glade", NULL, NULL);
main_window = glade_xml_get_widget (application->priv->glade_xml, "window_manager");
@ -371,6 +387,10 @@ pk_application_init (PkApplication *application)
G_CALLBACK (pk_application_deps_cb), application);
gtk_widget_set_sensitive (widget, FALSE);
widget = glade_xml_get_widget (application->priv->glade_xml, "progressbar_status");
gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (widget), 0.25);
gtk_widget_hide (widget);
widget = glade_xml_get_widget (application->priv->glade_xml, "button_find");
g_signal_connect (widget, "clicked",
G_CALLBACK (pk_application_find_cb), application);
@ -432,6 +452,7 @@ pk_application_finalize (GObject *object)
application->priv = PK_APPLICATION_GET_PRIVATE (application);
g_object_unref (application->priv->store);
g_object_unref (application->priv->tclient);
g_free (application->priv->package);
G_OBJECT_CLASS (pk_application_parent_class)->finalize (object);

View File

@ -198,6 +198,21 @@
</packing>
</child>
<child>
<widget class="GtkProgressBar" id="progressbar_status">
<property name="visible">True</property>
<property name="orientation">GTK_PROGRESS_LEFT_TO_RIGHT</property>
<property name="fraction">0.5</property>
<property name="pulse_step">0.10000000149</property>
<property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
</widget>
<packing>
<property name="padding">0</property>
<property name="expand">False</property>
<property name="fill">False</property>
</packing>
</child>
<child>
<widget class="GtkScrolledWindow" id="scrolledwindow_packages">
<property name="visible">True</property>

View File

@ -52,6 +52,8 @@ struct PkTaskClientPrivate
gboolean is_sync;
guint job;
GMainLoop *loop;
PkTaskStatus last_status;
gboolean is_finished;
};
typedef enum {
@ -96,6 +98,27 @@ pk_task_client_wait_if_sync (PkTaskClient *tclient)
return TRUE;
}
/**
* pk_task_client_reset:
**/
gboolean
pk_task_client_reset (PkTaskClient *tclient)
{
g_return_val_if_fail (tclient != NULL, FALSE);
g_return_val_if_fail (PK_IS_TASK_CLIENT (tclient), FALSE);
if (tclient->priv->is_finished != TRUE) {
pk_warning ("not exit status, cannot reset");
return FALSE;
}
tclient->priv->assigned = FALSE;
tclient->priv->is_sync = FALSE;
tclient->priv->job = 0;
tclient->priv->last_status = PK_TASK_STATUS_UNKNOWN;
tclient->priv->is_finished = FALSE;
return TRUE;
}
/**
* pk_task_client_get_updates:
**/
@ -436,6 +459,7 @@ pk_task_client_finished_cb (DBusGProxy *proxy,
if (job == tclient->priv->job) {
exit = pk_task_exit_from_text (exit_text);
pk_debug ("emit finished %i", exit);
tclient->priv->is_finished = TRUE;
g_signal_emit (tclient , signals [PK_TASK_CLIENT_FINISHED], 0, exit);
/* if we are async, then cancel */
@ -483,6 +507,7 @@ pk_task_client_job_status_changed_cb (DBusGProxy *proxy,
if (job == tclient->priv->job) {
pk_debug ("emit job-status-changed %i", status);
g_signal_emit (tclient , signals [PK_TASK_CLIENT_JOB_STATUS_CHANGED], 0, status);
tclient->priv->last_status = status;
}
}
@ -553,6 +578,8 @@ pk_task_client_init (PkTaskClient *tclient)
tclient->priv->assigned = FALSE;
tclient->priv->is_sync = FALSE;
tclient->priv->job = 0;
tclient->priv->last_status = PK_TASK_STATUS_UNKNOWN;
tclient->priv->is_finished = FALSE;
/* check dbus connections, exit if not valid */
tclient->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);

View File

@ -65,6 +65,7 @@ gboolean pk_task_client_remove_package_with_deps(PkTaskClient *tclient,
gboolean pk_task_client_install_package (PkTaskClient *tclient,
const gchar *package);
gboolean pk_task_client_cancel_job_try (PkTaskClient *tclient);
gboolean pk_task_client_reset (PkTaskClient *tclient);
/* not sure where this belongs... */
gboolean pk_task_client_get_job_status (PkTaskClient *tclient,

View File

@ -162,6 +162,7 @@ pk_task_finished (PkTask *task, PkTaskExit exit)
* has been sent to the client. I love async... */
pk_debug ("adding finished %p to idle loop", task);
task->exit = exit;
pk_task_change_job_status (task, PK_TASK_STATUS_EXIT);
g_idle_add (pk_task_finished_idle, task);
return TRUE;
}