summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2009-09-03 13:52:43 +0100
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2009-09-03 13:52:44 +0100
commit67136cb48edf7886d269cf011964b172a244f9e2 (patch)
tree0163f9f99cfbc8d1283731b39b82e3d737a0d5e6
parent8be324191f058b703b1bf2a0d19df6e526eab2e4 (diff)
parent2003e2d124a715c370007e949957b50af53ea5f7 (diff)
Merge branch '52-always-on' into telepathy-mission-control-5.2
Reviewed-by: Alberto Mardegan <alberto.mardegan@nokia.com>
-rw-r--r--src/mcd-account-conditions.c11
-rw-r--r--src/mcd-account-priv.h2
-rw-r--r--src/mcd-account.c78
3 files changed, 83 insertions, 8 deletions
diff --git a/src/mcd-account-conditions.c b/src/mcd-account-conditions.c
index fe78262e..e8cd4e7e 100644
--- a/src/mcd-account-conditions.c
+++ b/src/mcd-account-conditions.c
@@ -77,9 +77,18 @@ set_condition (TpSvcDBusProperties *self, const gchar *name,
return FALSE;
}
- keyfile = _mcd_account_get_keyfile (account);
unique_name = mcd_account_get_unique_name (account);
conditions = g_value_get_boxed (value);
+
+ if (_mcd_account_get_always_on (account))
+ {
+ g_set_error (error, TP_ERRORS, TP_ERROR_PERMISSION_DENIED,
+ "Account %s conditions cannot be changed",
+ unique_name);
+ return FALSE;
+ }
+
+ keyfile = _mcd_account_get_keyfile (account);
/* first, delete existing conditions */
keys = g_key_file_get_keys (keyfile, unique_name, NULL, NULL);
for (key = keys; *key != NULL; key++)
diff --git a/src/mcd-account-priv.h b/src/mcd-account-priv.h
index fbde3dc7..e85278d4 100644
--- a/src/mcd-account-priv.h
+++ b/src/mcd-account-priv.h
@@ -172,4 +172,6 @@ G_GNUC_INTERNAL gboolean _mcd_account_check_request_real (McdAccount *account,
GHashTable *request,
GError **error);
+G_GNUC_INTERNAL gboolean _mcd_account_get_always_on (McdAccount *self);
+
#endif /* __MCD_ACCOUNT_PRIV_H__ */
diff --git a/src/mcd-account.c b/src/mcd-account.c
index e052553c..3a4b3550 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -142,6 +142,7 @@ struct _McdAccountPrivate
guint loaded : 1;
guint has_been_online : 1;
guint removed : 1;
+ guint always_on : 1;
/* These fields are used to cache the changed properties */
GHashTable *changed_properties;
@@ -154,6 +155,7 @@ enum
PROP_DBUS_DAEMON,
PROP_ACCOUNT_MANAGER,
PROP_NAME,
+ PROP_ALWAYS_ON,
};
enum
@@ -952,7 +954,6 @@ set_enabled (TpSvcDBusProperties *self, const gchar *name, const GValue *value,
DEBUG ("called for %s", priv->unique_name);
- /* We can't raise an error in this API :-( */
if (!G_VALUE_HOLDS_BOOLEAN (value))
{
g_set_error (error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
@@ -962,6 +963,15 @@ set_enabled (TpSvcDBusProperties *self, const gchar *name, const GValue *value,
}
enabled = g_value_get_boolean (value);
+
+ if (priv->always_on && !enabled)
+ {
+ g_set_error (error, TP_ERRORS, TP_ERROR_PERMISSION_DENIED,
+ "Account %s cannot be disabled",
+ priv->unique_name);
+ return FALSE;
+ }
+
if (priv->enabled != enabled)
{
if (!enabled)
@@ -1248,6 +1258,15 @@ set_connect_automatically (TpSvcDBusProperties *self,
}
connect_automatically = g_value_get_boolean (value);
+
+ if (priv->always_on && !connect_automatically)
+ {
+ g_set_error (error, TP_ERRORS, TP_ERROR_PERMISSION_DENIED,
+ "Account %s always connects automatically",
+ priv->unique_name);
+ return FALSE;
+ }
+
if (priv->connect_automatically != connect_automatically)
{
g_key_file_set_boolean (priv->keyfile, priv->unique_name,
@@ -1363,6 +1382,13 @@ set_requested_presence (TpSvcDBusProperties *self,
status = g_value_get_string (va->values + 1);
message = g_value_get_string (va->values + 2);
+ if (priv->always_on && !_presence_type_is_online (type))
+ {
+ g_set_error (error, TP_ERRORS, TP_ERROR_PERMISSION_DENIED,
+ "Account %s cannot be taken offline", priv->unique_name);
+ return FALSE;
+ }
+
if (!_presence_type_is_settable (type))
{
g_set_error (error, TP_ERRORS, TP_ERROR_INVALID_ARGUMENT,
@@ -1905,13 +1931,17 @@ mcd_account_setup (McdAccount *account)
priv->object_path = g_strconcat (MC_ACCOUNT_DBUS_OBJECT_BASE,
priv->unique_name, NULL);
- priv->enabled =
- g_key_file_get_boolean (priv->keyfile, priv->unique_name,
- MC_ACCOUNTS_KEY_ENABLED, NULL);
+ if (!priv->always_on)
+ {
+ priv->enabled =
+ g_key_file_get_boolean (priv->keyfile, priv->unique_name,
+ MC_ACCOUNTS_KEY_ENABLED, NULL);
- priv->connect_automatically =
- g_key_file_get_boolean (priv->keyfile, priv->unique_name,
- MC_ACCOUNTS_KEY_CONNECT_AUTOMATICALLY, NULL);
+ priv->connect_automatically =
+ g_key_file_get_boolean (priv->keyfile, priv->unique_name,
+ MC_ACCOUNTS_KEY_CONNECT_AUTOMATICALLY,
+ NULL);
+ }
priv->has_been_online =
g_key_file_get_boolean (priv->keyfile, priv->unique_name,
@@ -1968,11 +1998,26 @@ set_property (GObject *obj, guint prop_id,
* its lifetime is longer than the McdAccount's */
priv->account_manager = g_value_get_object (val);
break;
+
case PROP_NAME:
g_assert (priv->unique_name == NULL);
priv->unique_name = g_value_dup_string (val);
break;
+ case PROP_ALWAYS_ON:
+ priv->always_on = g_value_get_boolean (val);
+
+ if (priv->always_on)
+ {
+ priv->enabled = TRUE;
+ priv->connect_automatically = TRUE;
+ priv->req_presence_type = priv->auto_presence_type;
+ priv->req_presence_status = g_strdup (priv->auto_presence_status);
+ priv->req_presence_message = g_strdup (priv->auto_presence_message);
+ }
+
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
break;
@@ -2144,6 +2189,13 @@ mcd_account_class_init (McdAccountClass * klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property
+ (object_class, PROP_ALWAYS_ON,
+ g_param_spec_boolean ("always-on", "Always on?", "Always on?",
+ FALSE,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
/* Signals */
_mcd_account_signals[CONNECTION_STATUS_CHANGED] =
g_signal_new ("connection-status-changed",
@@ -2182,6 +2234,10 @@ mcd_account_init (McdAccount *account)
priv->req_presence_status = g_strdup ("offline");
priv->req_presence_message = g_strdup ("");
+ priv->always_on = FALSE;
+ priv->enabled = FALSE;
+ priv->connect_automatically = FALSE;
+
priv->auto_presence_type = TP_CONNECTION_PRESENCE_TYPE_AVAILABLE;
priv->auto_presence_status = g_strdup ("available");
priv->auto_presence_message = g_strdup ("");
@@ -3164,3 +3220,11 @@ _mcd_account_set_connection_context (McdAccount *self,
self->priv->connection_context = c;
}
+
+gboolean
+_mcd_account_get_always_on (McdAccount *self)
+{
+ g_return_val_if_fail (MCD_IS_ACCOUNT (self), FALSE);
+
+ return self->priv->always_on;
+}