summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlberto Mardegan <mardy@users.sourceforge.net>2007-05-31 14:28:47 +0000
committerAlberto Mardegan <mardy@users.sourceforge.net>2007-05-31 14:28:47 +0000
commit8fc54d271de2537ddf438920b57bd8bdc8a959f7 (patch)
treebd9caa398c1f6aa5e39351c1fc3f074654dba52b /src
parentc2a20b950977db08ca529c700c3a7448c39c5f06 (diff)
* src/mcd-connection.[hc], src/mcd-master.c:
If an account parameter change, disconnect and reconnect it. * libmissioncontrol/Makefile.am, libmissioncontrol/mc-account-monitor.c: Add param-changed signal on McAccountMonitor: will be emitted whenever a connection parameter changes for an account. * libmissioncontrol/mc-account.c: When looking up an account, also accept the normalized name as a key. git-svn-id: https://mission-control.svn.sourceforge.net/svnroot/mission-control/trunk@48 d91c8aed-3f2b-0410-a83d-924a1c20a0ba
Diffstat (limited to 'src')
-rw-r--r--src/mcd-connection.c25
-rw-r--r--src/mcd-connection.h1
-rw-r--r--src/mcd-master.c30
3 files changed, 55 insertions, 1 deletions
diff --git a/src/mcd-connection.c b/src/mcd-connection.c
index 9cb7ba11..20c1fce2 100644
--- a/src/mcd-connection.c
+++ b/src/mcd-connection.c
@@ -114,6 +114,7 @@ typedef struct
guint reconnect_timer; /* timer for reconnection */
guint reconnect_interval;
+ gboolean reconnection_requested;
/* Supported presences */
GArray *recognized_presence_info_array;
@@ -969,7 +970,8 @@ _mcd_connection_status_changed_cb (DBusGProxy * tp_conn_proxy,
/* Notify connection abort */
if (conn_reason == TP_CONN_STATUS_REASON_NETWORK_ERROR ||
- conn_reason == TP_CONN_STATUS_REASON_NONE_SPECIFIED)
+ conn_reason == TP_CONN_STATUS_REASON_NONE_SPECIFIED ||
+ priv->reconnection_requested)
{
/* we were disconnected by a network error or by a gabble crash (in
* the latter case, we get NoneSpecified as a reason): don't abort
@@ -989,6 +991,7 @@ _mcd_connection_status_changed_cb (DBusGProxy * tp_conn_proxy,
priv->account,
TP_CONN_STATUS_CONNECTING,
TP_CONN_STATUS_REASON_REQUESTED);
+ priv->reconnection_requested = FALSE;
return;
}
@@ -2102,3 +2105,23 @@ mcd_connection_account_changed (McdConnection *connection)
}
}
+/**
+ * mcd_connection_restart:
+ * @connection: the #McdConnection.
+ *
+ * Disconnect the connection and reconnect it. This can be useful when some
+ * account parameter changes.
+ */
+void
+mcd_connection_restart (McdConnection *connection)
+{
+ McdConnectionPrivate *priv = MCD_CONNECTION_PRIV (connection);
+
+ g_debug ("%s called", G_STRFUNC);
+ priv->reconnection_requested = TRUE;
+ priv->reconnect_interval = 500; /* half a second */
+ mcd_mission_disconnect (MCD_MISSION (connection));
+ if (priv->tp_conn)
+ tp_conn_disconnect (DBUS_G_PROXY (priv->tp_conn), NULL);
+}
+
diff --git a/src/mcd-connection.h b/src/mcd-connection.h
index dd823281..28d83318 100644
--- a/src/mcd-connection.h
+++ b/src/mcd-connection.h
@@ -88,6 +88,7 @@ gboolean mcd_connection_remote_avatar_changed (McdConnection *connection,
guint contact_id,
const gchar *token);
void mcd_connection_account_changed (McdConnection *connection);
+void mcd_connection_restart (McdConnection *connection);
void mcd_connection_close (McdConnection *connection);
diff --git a/src/mcd-master.c b/src/mcd-master.c
index 868e45d1..29ed4098 100644
--- a/src/mcd-master.c
+++ b/src/mcd-master.c
@@ -385,6 +385,31 @@ _mcd_master_on_account_changed (McAccountMonitor * monitor,
}
static void
+_mcd_master_on_param_changed (McAccountMonitor *monitor, gchar *account_name,
+ gchar *param, McdMaster *master)
+{
+ McdManager *manager;
+ McAccount *account;
+
+ g_debug ("Account %s changed param %s", account_name, param);
+
+ account = mc_account_lookup (account_name);
+ if (!account) return;
+ manager = _mcd_master_find_manager (master, account);
+
+ if (manager)
+ {
+ McdConnection *connection;
+
+ connection = mcd_manager_get_account_connection (manager, account);
+ if (connection)
+ mcd_connection_restart (connection);
+ }
+
+ g_object_unref (account);
+}
+
+static void
_mcd_master_init_account_monitoring (McdMaster * master)
{
McdMasterPrivate *priv = MCD_MASTER_PRIV (master);
@@ -399,6 +424,9 @@ _mcd_master_init_account_monitoring (McdMaster * master)
g_signal_connect (priv->account_monitor,
"account-changed",
(GCallback) _mcd_master_on_account_changed, master);
+ g_signal_connect (priv->account_monitor,
+ "param-changed",
+ (GCallback) _mcd_master_on_param_changed, master);
}
static void
@@ -412,6 +440,8 @@ _mcd_master_dispose_account_monitoring (McdMaster * master)
(GCallback) _mcd_master_on_account_disabled, master);
g_signal_handlers_disconnect_by_func (priv->account_monitor,
(GCallback) _mcd_master_on_account_changed, master);
+ g_signal_handlers_disconnect_by_func (priv->account_monitor,
+ (GCallback) _mcd_master_on_param_changed, master);
g_object_unref (priv->account_monitor);
priv->account_monitor = NULL;
}