aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/apt-transaction.c100
-rw-r--r--src/apt-transaction.h5
-rw-r--r--src/apt-watcher.c69
-rw-r--r--src/dbus-shared-names.h17
-rw-r--r--src/device-menu-mgr.c54
-rw-r--r--src/session-service.c4
6 files changed, 171 insertions, 78 deletions
diff --git a/src/apt-transaction.c b/src/apt-transaction.c
index 51a5ce9..78a0ff2 100644
--- a/src/apt-transaction.c
+++ b/src/apt-transaction.c
@@ -41,7 +41,7 @@ struct _AptTransaction
GDBusProxy * proxy;
GCancellable * proxy_cancel;
gchar* id;
- AptState current_state;
+ TransactionType type;
};
enum {
@@ -64,12 +64,14 @@ apt_transaction_init (AptTransaction *self)
static void
apt_transaction_finalize (GObject *object)
{
- /* TODO: Add deinitalization code here */
AptTransaction* self = APT_TRANSACTION(object);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (self->proxy),
+ G_CALLBACK (apt_transaction_receive_signal),
+ self);
if (self->proxy != NULL){
g_object_unref (self->proxy);
self->proxy = NULL;
- }
+ }
g_free (self->id);
G_OBJECT_CLASS (apt_transaction_parent_class)->finalize (object);
}
@@ -88,6 +90,7 @@ apt_transaction_class_init (AptTransactionClass *klass)
g_cclosure_marshal_VOID__INT,
G_TYPE_NONE, 1, G_TYPE_INT);
}
+
// TODO: you don't need this additional helper
// Just GObject properties properly
static void
@@ -134,16 +137,17 @@ apt_transaction_finish_proxy_setup (GObject *source_object,
G_CALLBACK (apt_transaction_receive_signal),
self);
- g_dbus_proxy_call (self->proxy,
- "Simulate",
- NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- apt_transaction_simulate_transaction_cb,
- self);
-
-}
+ if (self->type == SIMULATION){
+ g_dbus_proxy_call (self->proxy,
+ "Simulate",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ apt_transaction_simulate_transaction_cb,
+ self);
+ }
+}
static void
apt_transaction_receive_signal (GDBusProxy * proxy,
@@ -153,17 +157,24 @@ apt_transaction_receive_signal (GDBusProxy * proxy,
gpointer user_data)
{
g_return_if_fail (APT_IS_TRANSACTION (user_data));
- AptTransaction* self = APT_TRANSACTION(user_data);
-
- if (g_strcmp0(signal_name, "PropertyChanged") == 0)
+ AptTransaction* self = APT_TRANSACTION(user_data);
+ AptState current_state = DONT_KNOW;
+
+ if (g_strcmp0(signal_name, "PropertyChanged") == 0 && self->type == SIMULATION)
{
gchar* prop_name= NULL;
GVariant* value = NULL;
- g_variant_get (parameters, "(sv)", &prop_name, &value);
+ g_variant_get (parameters, "(sv)", &prop_name, &value);
+ g_debug ("transaction prop update - prop = %s", prop_name);
+
+ if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING) == TRUE){
+ gchar* key = NULL;
+ g_variant_get (value, "s", &key);
+ g_debug ("transaction prop update - value = %s", key);
+ }
if (g_strcmp0 (prop_name, "Dependencies") == 0){
-
-
+
gchar** install = NULL;
gchar** reinstall = NULL;
gchar** remove = NULL;
@@ -173,8 +184,7 @@ apt_transaction_receive_signal (GDBusProxy * proxy,
gchar** keep = NULL;
g_variant_get (value, "(asasasasasasas)", &install,
&reinstall, &remove, &purge, &upgrade, &downgrade,
- &keep);
-
+ &keep);
//g_debug ("Seemed to uppack dependencies without any warnings");
//g_debug ("Upgrade quantity : %u", g_strv_length(upgrade));
gboolean upgrade_needed = (g_strv_length(upgrade) > 0) ||
@@ -183,20 +193,41 @@ apt_transaction_receive_signal (GDBusProxy * proxy,
(g_strv_length(remove) > 0) ||
(g_strv_length(purge) > 0);
if (upgrade_needed == TRUE){
- g_signal_emit (self,
- signals[UPDATE],
- 0,
- UPDATES_AVAILABLE);
-
+ current_state = UPDATES_AVAILABLE;
}
else{
- g_signal_emit (self,
- signals[UPDATE],
- 0,
- UP_TO_DATE);
+ current_state = UP_TO_DATE;
}
}
}
+ else if (g_strcmp0(signal_name, "PropertyChanged") == 0 &&
+ self->type == REAL)
+ {
+ GVariant* role = g_dbus_proxy_get_cached_property (self->proxy,
+ "Role");
+ if (g_variant_is_of_type (role, G_VARIANT_TYPE_STRING) == TRUE){
+ gchar* current_role = NULL;
+ g_variant_get (role, "s", &current_role);
+ g_debug ("Current transaction role = %s", current_role);
+ if (g_strcmp0 (current_role, "role-commit-packages") == 0 ||
+ g_strcmp0 (current_role, "role-upgrade-system") == 0){
+ g_debug ("UPGRADE IN PROGRESS");
+ current_state = UPGRADE_IN_PROGRESS;
+ }
+ }
+ }
+ else if (g_strcmp0(signal_name, "Finished") == 0)
+ {
+ g_debug ("TRANSACTION Finished");
+ current_state = FINISHED;
+ }
+ // Finally send out the state update
+ if (current_state != DONT_KNOW){
+ g_signal_emit (self,
+ signals[UPDATE],
+ 0,
+ current_state);
+ }
g_variant_unref (parameters);
}
@@ -206,18 +237,23 @@ apt_transaction_simulate_transaction_cb (GObject * obj,
gpointer user_data)
{
GError * error = NULL;
-
if (error != NULL) {
g_warning ("unable to complete the simulate call");
g_error_free (error);
return;
}
}
+TransactionType
+apt_transaction_get_transaction_type (AptTransaction* self)
+{
+ return self->type;
+}
-AptTransaction* apt_transaction_new (gchar* transaction_id)
+AptTransaction* apt_transaction_new (gchar* transaction_id, TransactionType t)
{
AptTransaction* tr = g_object_new (APT_TYPE_TRANSACTION, NULL);
tr->id = transaction_id;
+ tr->type = t;
g_debug ("Apt transaction new id = %s", tr->id);
apt_transaction_investigate (tr);
return tr;
diff --git a/src/apt-transaction.h b/src/apt-transaction.h
index dec62ef..9e4370d 100644
--- a/src/apt-transaction.h
+++ b/src/apt-transaction.h
@@ -21,6 +21,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#define _APT_TRANSACTION_H_
#include <glib-object.h>
+#include "dbus-shared-names.h"
G_BEGIN_DECLS
@@ -39,8 +40,8 @@ struct _AptTransactionClass
GObjectClass parent_class;
};
-AptTransaction* apt_transaction_new (gchar* transaction_id);
-
+AptTransaction* apt_transaction_new (gchar* transaction_id, TransactionType t);
+TransactionType apt_transaction_get_transaction_type (AptTransaction* self);
GType apt_transaction_get_type (void) G_GNUC_CONST;
G_END_DECLS
diff --git a/src/apt-watcher.c b/src/apt-watcher.c
index 546c733..285eb81 100644
--- a/src/apt-watcher.c
+++ b/src/apt-watcher.c
@@ -20,7 +20,6 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
#include <gio/gio.h>
#include <glib/gi18n.h>
#include "apt-watcher.h"
-#include "dbus-shared-names.h"
#include "apt-transaction.h"
static guint watcher_id;
@@ -235,31 +234,56 @@ apt_watcher_transaction_state_update_cb (AptTransaction* trans,
AptState state = (AptState)update;
- if ( state == UP_TO_DATE ){
+ if (state == UP_TO_DATE){
dbusmenu_menuitem_property_set (self->apt_item,
DBUSMENU_MENUITEM_PROP_LABEL,
- _("Software Up to Date"));
+ _("Software Up to Date"));
+ // Simulations don't send a finished signal for some reason
+ // Anyway from a simulation we just need one state update
+ // (updates available or not)
+ if (apt_transaction_get_transaction_type (self->current_transaction)
+ == SIMULATION){
+ g_object_unref (G_OBJECT(self->current_transaction));
+ self->current_transaction = NULL;
+ }
}
- else if ( state == UPDATES_AVAILABLE ){
+ else if (state == UPDATES_AVAILABLE){
dbusmenu_menuitem_property_set (self->apt_item,
DBUSMENU_MENUITEM_PROP_LABEL,
_("Updates Available…"));
+ // Simulations don't send a finished signal for some reason
+ // Anyway from a simulation we just need one state update
+ // (updates available or not)
+ if (apt_transaction_get_transaction_type (self->current_transaction)
+ == SIMULATION){
+ g_object_unref (G_OBJECT(self->current_transaction));
+ self->current_transaction = NULL;
+ }
+ }
+ else if (state == UPGRADE_IN_PROGRESS){
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Updates Installing…"));
}
+ else if (state == FINISHED){
+ dbusmenu_menuitem_property_set (self->apt_item,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Software Up to Date"));
+ g_object_unref (G_OBJECT(self->current_transaction));
+ self->current_transaction = NULL;
+ }
self->current_state = state;
- g_object_unref (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);
- g_object_ref (self->current_transaction);
+ 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_update_cb), self);
- }
+ }
}
// TODO - Ask MVO about this.
@@ -279,17 +303,22 @@ static void apt_watcher_signal_cb ( GDBusProxy* proxy,
if (g_strcmp0(signal_name, "ActiveTransactionsChanged") == 0){
gchar* input = NULL;
g_variant_get(value, "s", & input);
-
- g_debug ("Active Transactions signal - input is null = %i", input == NULL);
- // TODO don't call on null terminated input
- g_dbus_proxy_call (self->proxy,
- "UpgradeSystem",
- g_variant_new("(b)", TRUE),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- apt_watcher_upgrade_system_cb,
- user_data);
+ if (g_str_has_prefix (input, "/org/debian/apt/transaction/") == TRUE){
+ g_debug ("Active Transactions signal - input is null = %i", input == NULL);
+
+ if (self->current_transaction != NULL)
+ {
+ g_object_unref (G_OBJECT(self->current_transaction));
+ self->current_transaction = NULL;
+ }
+
+ self->current_transaction = apt_transaction_new (input, REAL);
+ g_signal_connect (G_OBJECT(self->current_transaction),
+ "state-update",
+ G_CALLBACK(apt_watcher_transaction_state_update_cb), self);
+
+
+ }
}
g_variant_unref (parameters);
}
diff --git a/src/dbus-shared-names.h b/src/dbus-shared-names.h
index 13ad227..d9dfff1 100644
--- a/src/dbus-shared-names.h
+++ b/src/dbus-shared-names.h
@@ -20,18 +20,23 @@ You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#ifndef __DBUS_SHARED_NAMES_H__
+#define __DBUS_SHARED_NAMES_H__
+
typedef enum {
UP_TO_DATE,
CHECKING_FOR_UPDATES,
UPDATES_AVAILABLE,
- FINISHED_CHECKING,
- UPDATING,
- RESTART_NEEDED
+ UPGRADE_IN_PROGRESS,
+ FINISHED,
+ RESTART_NEEDED,
+ DONT_KNOW
}AptState;
-
-#ifndef __DBUS_SHARED_NAMES_H__
-#define __DBUS_SHARED_NAMES_H__ 1
+typedef enum {
+ SIMULATION,
+ REAL
+}TransactionType;
#define INDICATOR_USERS_DBUS_NAME INDICATOR_SESSION_DBUS_NAME
#define INDICATOR_USERS_DBUS_OBJECT "/com/canonical/indicator/users/menu"
diff --git a/src/device-menu-mgr.c b/src/device-menu-mgr.c
index b13b2fa..324b3f1 100644
--- a/src/device-menu-mgr.c
+++ b/src/device-menu-mgr.c
@@ -58,7 +58,7 @@ static DBusGProxyCall * suspend_call = NULL;
static DBusGProxyCall * hibernate_call = NULL;
static DbusmenuMenuitem * hibernate_mi = NULL;
-//static DbusmenuMenuitem * suspend_mi = NULL;
+static DbusmenuMenuitem * suspend_mi = NULL;
static DbusmenuMenuitem * logout_mi = NULL;
static DbusmenuMenuitem * restart_mi = NULL;
static DbusmenuMenuitem * shutdown_mi = NULL;
@@ -86,11 +86,11 @@ static void
machine_sleep_from_hibernate (DbusmenuMenuitem * mi,
guint timestamp,
gpointer userdata);
-/*static void
+static void
machine_sleep_from_suspend (DbusmenuMenuitem * mi,
guint timestamp,
gpointer userdata);
-*/
+
G_DEFINE_TYPE (DeviceMenuMgr, device_menu_mgr, G_TYPE_OBJECT);
static void
@@ -106,7 +106,6 @@ device_menu_mgr_init (DeviceMenuMgr *self)
static void
device_menu_mgr_finalize (GObject *object)
{
- /* TODO: Add deinitalization code here */
G_OBJECT_CLASS (device_menu_mgr_parent_class)->finalize (object);
}
@@ -115,7 +114,6 @@ static void
device_menu_mgr_class_init (DeviceMenuMgrClass *klass)
{
GObjectClass* object_class = G_OBJECT_CLASS (klass);
- //GObjectClass* parent_class = G_OBJECT_CLASS (klass);
object_class->finalize = device_menu_mgr_finalize;
}
@@ -187,15 +185,14 @@ sleep_response (DBusGProxy * proxy, DBusGProxyCall * call, gpointer data)
return;
}
-
-/*static void
+static void
machine_sleep_from_suspend (DbusmenuMenuitem * mi,
guint timestamp,
gpointer userdata)
{
DeviceMenuMgr* self = DEVICE_MENU_MGR (userdata);
machine_sleep_with_context (self, "Suspend");
-}*/
+}
static void
machine_sleep_from_hibernate (DbusmenuMenuitem * mi,
@@ -229,9 +226,6 @@ machine_sleep_with_context (DeviceMenuMgr* self, gchar* type)
}
/* A response to getting the suspend property */
-// TODO
-// Is this needed anymore
-
static void
suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata)
{
@@ -252,14 +246,14 @@ suspend_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata)
if (local_can_suspend != can_suspend) {
can_suspend = local_can_suspend;
// TODO figure out what needs updating on the menu
+ // And add or remove it but just don't rebuild the whole menu
+ // a waste
device_menu_mgr_rebuild_items(self);
}
return;
}
/* Response to getting the hibernate property */
-// TODO
-// Is this needed anymore
static void
hibernate_prop_cb (DBusGProxy * proxy, DBusGProxyCall * call, gpointer userdata)
{
@@ -505,13 +499,13 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self)
login_settings_menuitem = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set (login_settings_menuitem,
DBUSMENU_MENUITEM_PROP_LABEL,
- _("Login Items..."));
+ _("Startup Applications..."));
g_signal_connect (G_OBJECT(login_settings_menuitem),
DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK(show_session_properties),
"login");
dbusmenu_menuitem_child_add_position(self->root_item,
- login_settings_menuitem,
+ login_settings_menuitem,
3);
software_updates_menuitem = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set (software_updates_menuitem,
@@ -561,6 +555,11 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self)
dbusmenu_menuitem_child_add_position (self->root_item,
scanners_menuitem,
8);
+ //tmp
+ dbusmenu_menuitem_property_set_bool (scanners_menuitem,
+ DBUSMENU_MENUITEM_PROP_VISIBLE,
+ FALSE);
+
webcam_menuitem = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set (webcam_menuitem,
DBUSMENU_MENUITEM_PROP_LABEL,
@@ -572,6 +571,11 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self)
dbusmenu_menuitem_child_add_position (self->root_item,
webcam_menuitem,
10);
+ //tmp
+ dbusmenu_menuitem_property_set_bool (webcam_menuitem,
+ DBUSMENU_MENUITEM_PROP_VISIBLE,
+ FALSE);
+
DbusmenuMenuitem * separator3 = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set (separator3,
DBUSMENU_MENUITEM_PROP_TYPE,
@@ -630,6 +634,18 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self)
DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK(show_dialog), "logout");
+ if (can_suspend && allow_suspend) {
+ suspend_mi = dbusmenu_menuitem_new();
+ dbusmenu_menuitem_property_set (suspend_mi,
+ DBUSMENU_MENUITEM_PROP_LABEL,
+ _("Suspend"));
+ dbusmenu_menuitem_child_append (self->root_item, suspend_mi);
+ g_signal_connect( G_OBJECT(suspend_mi),
+ DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
+ G_CALLBACK(machine_sleep_from_suspend),
+ self);
+ }
+
if (can_hibernate && allow_hibernate) {
hibernate_mi = dbusmenu_menuitem_new();
dbusmenu_menuitem_property_set (hibernate_mi,
@@ -672,7 +688,13 @@ device_menu_mgr_build_static_items (DeviceMenuMgr* self)
static void
device_menu_mgr_rebuild_items (DeviceMenuMgr* self)
{
-}
+ dbusmenu_menuitem_property_set_bool (hibernate_mi,
+ DBUSMENU_MENUITEM_PROP_VISIBLE,
+ can_hibernate && allow_hibernate);
+ dbusmenu_menuitem_property_set_bool (suspend_mi,
+ DBUSMENU_MENUITEM_PROP_VISIBLE,
+ can_suspend && allow_suspend);
+}
/* When the directory changes we need to figure out how our menu
item should look. */
diff --git a/src/session-service.c b/src/session-service.c
index bb473e9..22552dc 100644
--- a/src/session-service.c
+++ b/src/session-service.c
@@ -71,10 +71,10 @@ static GMainLoop * mainloop = NULL;
void
service_shutdown (IndicatorService * service, gpointer user_data)
{
- if (mainloop != NULL) {
+ /*if (mainloop != NULL) {
g_debug("Service shutdown");
g_main_loop_quit(mainloop);
- }
+ }*/
return;
}