aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/apt-watcher.c406
-rw-r--r--src/apt-watcher.h2
2 files changed, 15 insertions, 393 deletions
diff --git a/src/apt-watcher.c b/src/apt-watcher.c
index 481029a..07b633d 100644
--- a/src/apt-watcher.c
+++ b/src/apt-watcher.c
@@ -17,104 +17,50 @@ You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <gio/gio.h>
+// Conor - 6/2/2012
+// Please pull in packagekit's client lib
+// using apt-get install --no-install-recommends libpackagekit-glib2-dev
+// make sure you don't install package-kit
+#define I_KNOW_THE_PACKAGEKIT_GLIB2_API_IS_SUBJECT_TO_CHANGE
+
#include <glib/gi18n.h>
+#include <packagekit-glib2/packagekit.h>
#include "apt-watcher.h"
-#include "apt-transaction.h"
+#include "dbus-shared-names.h"
static guint watcher_id;
struct _AptWatcher
{
GObject parent_instance;
- guint reboot_query;
- GCancellable * proxy_cancel;
- GDBusProxy * proxy;
SessionDbus* session_dbus_interface;
DbusmenuMenuitem* apt_item;
AptState current_state;
- AptTransaction* current_transaction;
+ PkClient* pkclient;
};
-
-static void
-apt_watcher_on_name_appeared (GDBusConnection *connection,
- const gchar *name,
- const gchar *name_owner,
- gpointer user_data);
-static void
-apt_watcher_on_name_vanished (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data);
-static void fetch_proxy_cb (GObject * object,
- GAsyncResult * res,
- gpointer user_data);
-
-static void apt_watcher_upgrade_system_cb (GObject * obj,
- GAsyncResult * res,
- gpointer user_data);
-
-
+
static void apt_watcher_show_apt_dialog (DbusmenuMenuitem* mi,
guint timestamp,
gpointer userdata);
-static void apt_watcher_signal_cb (GDBusProxy* proxy,
- gchar* sender_name,
- gchar* signal_name,
- GVariant* parameters,
- gpointer user_data);
-static void apt_watcher_manage_transactions (AptWatcher* self,
- gchar* transaction_id);
-static gboolean apt_watcher_query_reboot_status (gpointer self);
-static void apt_watcher_transaction_state_simulation_update_cb (AptTransaction* trans,
- gint update,
- gpointer user_data);
-static void apt_watcher_transaction_state_real_update_cb (AptTransaction* trans,
- gint update,
- gpointer user_data);
-static gboolean apt_watcher_start_apt_interaction (gpointer data);
-
G_DEFINE_TYPE (AptWatcher, apt_watcher, G_TYPE_OBJECT);
static void
apt_watcher_init (AptWatcher *self)
{
self->current_state = UP_TO_DATE;
- self->proxy_cancel = g_cancellable_new();
- self->proxy = NULL;
- self->reboot_query = 0;
- self->current_transaction = NULL;
- g_timeout_add_seconds (60,
+ self->pkclient = pk_client_new ();
+ /*g_timeout_add_seconds (60,
apt_watcher_start_apt_interaction,
- self);
-}
-
-static gboolean
-apt_watcher_start_apt_interaction (gpointer data)
-{
- g_return_val_if_fail (APT_IS_WATCHER (data), FALSE);
- AptWatcher* self = APT_WATCHER (data);
- g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.debian.apt",
- "/org/debian/apt",
- "org.debian.apt",
- self->proxy_cancel,
- fetch_proxy_cb,
- self);
- return FALSE;
+ self); */
}
static void
apt_watcher_finalize (GObject *object)
{
g_bus_unwatch_name (watcher_id);
- AptWatcher* self = APT_WATCHER (object);
+ //AptWatcher* self = APT_WATCHER (object);
- if (self->proxy != NULL)
- g_object_unref (self->proxy);
-
G_OBJECT_CLASS (apt_watcher_parent_class)->finalize (object);
}
@@ -125,109 +71,6 @@ apt_watcher_class_init (AptWatcherClass *klass)
object_class->finalize = apt_watcher_finalize;
}
-static void
-fetch_proxy_cb (GObject * object, GAsyncResult * res, gpointer user_data)
-{
- GError * error = NULL;
-
- AptWatcher* self = APT_WATCHER(user_data);
- g_return_if_fail(self != NULL);
-
- GDBusProxy * proxy = g_dbus_proxy_new_for_bus_finish(res, &error);
-
- if (self->proxy_cancel != NULL) {
- g_object_unref(self->proxy_cancel);
- self->proxy_cancel = NULL;
- }
-
- if (error != NULL) {
- g_warning("Could not grab DBus proxy for %s: %s",
- "org.debian.apt", error->message);
- g_error_free(error);
- return;
- }
-
- self->proxy = proxy;
- // Set up the watch.
- watcher_id = g_bus_watch_name (G_BUS_TYPE_SYSTEM,
- "org.debian.apt",
- G_BUS_NAME_WATCHER_FLAGS_NONE,
- apt_watcher_on_name_appeared,
- apt_watcher_on_name_vanished,
- self,
- NULL);
-
- g_signal_connect (self->proxy,
- "g-signal",
- G_CALLBACK(apt_watcher_signal_cb),
- self);
-}
-
-static void
-apt_watcher_on_name_appeared (GDBusConnection *connection,
- const gchar *name,
- const gchar *name_owner,
- gpointer user_data)
-{
- g_return_if_fail (APT_IS_WATCHER (user_data));
- AptWatcher* watcher = APT_WATCHER (user_data);
-
- g_print ("Name %s on %s is owned by %s\n",
- name,
- "the system bus",
- name_owner);
-
- g_dbus_proxy_call (watcher->proxy,
- "UpgradeSystem",
- g_variant_new("(b)", TRUE),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- apt_watcher_upgrade_system_cb,
- user_data);
-}
-
-
-static void
-apt_watcher_on_name_vanished (GDBusConnection *connection,
- const gchar *name,
- gpointer user_data)
-{
- g_debug ("Name %s does not exist or has just vanished",
- name);
- g_return_if_fail (APT_IS_WATCHER (user_data));
-}
-
-static void
-apt_watcher_upgrade_system_cb (GObject * obj,
- GAsyncResult * res,
- gpointer user_data)
-{
- g_return_if_fail (APT_IS_WATCHER (user_data));
- AptWatcher* self = APT_WATCHER (user_data);
-
- GError * error = NULL;
- GVariant * result;
-
- result = g_dbus_proxy_call_finish(self->proxy, res, &error);
-
- if (error != NULL) {
- g_warning ("unable to complete the UpgradeSystem apt call");
- g_error_free (error);
- return;
- }
-
- gchar* transaction_id = NULL;
- g_variant_get (result, "(s)", &transaction_id);
-
- if (transaction_id == NULL){
- g_warning ("apt_watcher_upgrade_system_cb - transaction id is null");
- return;
- }
-
- apt_watcher_manage_transactions (self, transaction_id);
-
-}
static void
apt_watcher_show_apt_dialog (DbusmenuMenuitem * mi,
@@ -260,227 +103,6 @@ apt_watcher_show_apt_dialog (DbusmenuMenuitem * mi,
}
}
-static void
-apt_watcher_transaction_state_real_update_cb (AptTransaction* trans,
- gint update,
- gpointer user_data)
-{
- g_debug ("apt-watcher -transaction update %i", update);
- g_return_if_fail (APT_IS_WATCHER (user_data));
- AptWatcher* self = APT_WATCHER (user_data);
-
- AptState state = (AptState)update;
- if (self->current_state != RESTART_NEEDED)
- {
- if (state == UP_TO_DATE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Software Up to Date"));
- self->current_state = state;
- }
- else if (state == UPDATES_AVAILABLE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Updates Available…"));
- self->current_state = state;
- }
- else if (state == UPGRADE_IN_PROGRESS){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Updates Installing…"));
- self->current_state = state;
- }
- else if (state == FINISHED){
- gboolean query_again = FALSE;
-
- // Only query if the previous state was an upgrade.
- if (self->current_state != UPGRADE_IN_PROGRESS){
- query_again = TRUE;
- }
- else{
- if (self->reboot_query != 0){
- g_source_remove (self->reboot_query);
- self->reboot_query = 0;
- }
- self->reboot_query = g_timeout_add_seconds (1,
- apt_watcher_query_reboot_status,
- self);
- }
- self->current_state = state;
-
- g_object_unref (G_OBJECT(self->current_transaction));
- self->current_transaction = NULL;
-
- // It is impossible to determine from a 'real' transaction whether
- // updates are available therefore it is necessary to check again via a
- // simulation whether there are updates available.
- if (query_again){
- g_dbus_proxy_call (self->proxy,
- "UpgradeSystem",
- g_variant_new("(b)", TRUE),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- apt_watcher_upgrade_system_cb,
- self);
- }
- }
- }
-}
-
-
-static void
-apt_watcher_transaction_state_simulation_update_cb (AptTransaction* trans,
- gint update,
- gpointer user_data)
-{
- g_debug ("apt-watcher -transaction update %i", update);
- g_return_if_fail (APT_IS_WATCHER (user_data));
- AptWatcher* self = APT_WATCHER (user_data);
-
- AptState state = (AptState)update;
- if (self->current_state != RESTART_NEEDED)
- {
- if (state == UP_TO_DATE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Software Up to Date"));
- if (self->reboot_query != 0){
- g_source_remove (self->reboot_query);
- self->reboot_query = 0;
- }
- self->reboot_query = g_timeout_add_seconds (1,
- apt_watcher_query_reboot_status,
- self);
- }
- else if (state == UPDATES_AVAILABLE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Updates Available…"));
- }
- else if (state == UPGRADE_IN_PROGRESS){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Updates Installing…"));
- }
- self->current_state = state;
- }
- if (self->current_state != UPGRADE_IN_PROGRESS){
- g_object_unref (G_OBJECT(self->current_transaction));
- self->current_transaction = NULL;
- }
-}
-
-static void
-apt_watcher_manage_transactions (AptWatcher* self, gchar* transaction_id)
-{
- if (self->current_transaction == NULL){
- self->current_transaction = apt_transaction_new (transaction_id, SIMULATION);
- g_signal_connect (G_OBJECT(self->current_transaction),
- "state-update",
- G_CALLBACK(apt_watcher_transaction_state_simulation_update_cb), self);
- }
-}
-
-static gboolean
-apt_watcher_query_reboot_status (gpointer data)
-{
- g_return_val_if_fail (APT_IS_WATCHER (data), FALSE);
- AptWatcher* self = APT_WATCHER (data);
-
- GVariant* reboot_result = g_dbus_proxy_get_cached_property (self->proxy,
- "RebootRequired");
- gboolean reboot = FALSE;
- g_variant_get (reboot_result, "b", &reboot);
- g_debug ("apt_watcher_query_reboot_status: reboot prop = %i", reboot);
- if (reboot == FALSE){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Software Up to Date"));
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_DISPOSITION,
- DBUSMENU_MENUITEM_DISPOSITION_NORMAL);
-
- }
- else{
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Restart to Complete Updates…"));
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_DISPOSITION,
- DBUSMENU_MENUITEM_DISPOSITION_ALERT);
- session_dbus_restart_required (self->session_dbus_interface);
- self->current_state = RESTART_NEEDED;
- }
- self->reboot_query = 0;
- return FALSE;
-}
-
-static void apt_watcher_signal_cb ( GDBusProxy* proxy,
- gchar* sender_name,
- gchar* signal_name,
- GVariant* parameters,
- gpointer user_data)
-{
- g_return_if_fail (APT_IS_WATCHER (user_data));
- AptWatcher* self = APT_WATCHER (user_data);
-
- g_variant_ref_sink (parameters);
- GVariant *value = g_variant_get_child_value (parameters, 0);
-
- if (g_strcmp0(signal_name, "ActiveTransactionsChanged") == 0){
- gchar* current = NULL;
- g_debug ("ActiveTransactionsChanged");
-
- g_variant_get(value, "s", &current);
-
- if (g_str_has_prefix (current, "/org/debian/apt/transaction/") == TRUE){
- g_debug ("ActiveTransactionsChanged - current is %s", current);
-
- // Cancel all existing operations.
- if (self->reboot_query != 0){
- g_source_remove (self->reboot_query);
- self->reboot_query = 0;
- }
-
- if (self->current_transaction != NULL)
- {
- g_object_unref (G_OBJECT(self->current_transaction));
- self->current_transaction = NULL;
- }
-
- self->current_transaction = apt_transaction_new (current, REAL);
- g_signal_connect (G_OBJECT(self->current_transaction),
- "state-update",
- G_CALLBACK(apt_watcher_transaction_state_real_update_cb), self);
- }
- }
- else if (g_strcmp0(signal_name, "PropertyChanged") == 0)
- {
- gchar* prop_name= NULL;
- GVariant* value = NULL;
- g_variant_get (parameters, "(sv)", &prop_name, &value);
- g_debug ("transaction prop update - prop = %s", prop_name);
-
- if (g_strcmp0 (prop_name, "RebootRequired") == 0){
- gboolean reboot_required = FALSE;
- g_variant_get (value, "(b)", &reboot_required);
- if (reboot_required){
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_LABEL,
- _("Restart to Complete Updates…"));
- dbusmenu_menuitem_property_set (self->apt_item,
- DBUSMENU_MENUITEM_PROP_DISPOSITION,
- DBUSMENU_MENUITEM_DISPOSITION_ALERT);
- self->current_state = RESTART_NEEDED;
- }
- }
- }
-
- g_variant_unref (value);
- g_variant_unref (parameters);
-}
-
AptWatcher* apt_watcher_new (SessionDbus* session_dbus,
DbusmenuMenuitem* item)
{
diff --git a/src/apt-watcher.h b/src/apt-watcher.h
index 6b7d5e1..54d26f5 100644
--- a/src/apt-watcher.h
+++ b/src/apt-watcher.h
@@ -28,6 +28,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <libdbusmenu-gtk/menuitem.h>
#include "session-dbus.h"
+#include "dbus-shared-names.h"
G_BEGIN_DECLS
@@ -50,7 +51,6 @@ GType apt_watcher_get_type (void) G_GNUC_CONST;
AptWatcher* apt_watcher_new (SessionDbus* session_dbus,
DbusmenuMenuitem* apt_item);
-
G_END_DECLS
#endif /* _APT_WATCHER_H_ */