diff options
author | Alberto Mardegan <mardy@users.sourceforge.net> | 2007-05-31 14:28:47 +0000 |
---|---|---|
committer | Alberto Mardegan <mardy@users.sourceforge.net> | 2007-05-31 14:28:47 +0000 |
commit | 8fc54d271de2537ddf438920b57bd8bdc8a959f7 (patch) | |
tree | bd9caa398c1f6aa5e39351c1fc3f074654dba52b /src | |
parent | c2a20b950977db08ca529c700c3a7448c39c5f06 (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.c | 25 | ||||
-rw-r--r-- | src/mcd-connection.h | 1 | ||||
-rw-r--r-- | src/mcd-master.c | 30 |
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; } |