telepathyClient: notify only once per account for connection error

https://bugzilla.gnome.org/show_bug.cgi?id=659050
This commit is contained in:
Xavier Claessens 2011-09-14 17:01:48 +02:00
parent 6e32c97c43
commit 1d14488a4f

View File

@ -83,6 +83,9 @@ Client.prototype = {
this._chatSources = {}; this._chatSources = {};
this._chatState = Tp.ChannelChatState.ACTIVE; this._chatState = Tp.ChannelChatState.ACTIVE;
// account path -> AccountNotification
this._accountNotifications = {};
// Set up a SimpleObserver, which will call _observeChannels whenever a // Set up a SimpleObserver, which will call _observeChannels whenever a
// channel matching its filters is detected. // channel matching its filters is detected.
// The second argument, recover, means _observeChannels will be run // The second argument, recover, means _observeChannels will be run
@ -420,7 +423,6 @@ Client.prototype = {
/* Display notification to ask user to accept/reject request */ /* Display notification to ask user to accept/reject request */
let source = this._ensureSubscriptionSource(); let source = this._ensureSubscriptionSource();
Main.messageTray.add(source);
let notif = new SubscriptionRequestNotification(source, contact); let notif = new SubscriptionRequestNotification(source, contact);
source.notify(notif); source.notify(notif);
@ -430,6 +432,7 @@ Client.prototype = {
if (this._subscriptionSource == null) { if (this._subscriptionSource == null) {
this._subscriptionSource = new MultiNotificationSource( this._subscriptionSource = new MultiNotificationSource(
_("Subscription request"), 'gtk-dialog-question'); _("Subscription request"), 'gtk-dialog-question');
Main.messageTray.add(this._subscriptionSource);
this._subscriptionSource.connect('destroy', Lang.bind(this, function () { this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
this._subscriptionSource = null; this._subscriptionSource = null;
})); }));
@ -446,11 +449,18 @@ Client.prototype = {
return; return;
} }
let notif = this._accountNotifications[account.get_object_path()];
if (notif)
return;
/* Display notification that account failed to connect */ /* Display notification that account failed to connect */
let source = this._ensureAccountSource(); let source = this._ensureAccountSource();
Main.messageTray.add(source);
let notif = new AccountNotification(source, account, connectionError); notif = new AccountNotification(source, account, connectionError);
this._accountNotifications[account.get_object_path()] = notif;
notif.connect('destroy', Lang.bind(this, function() {
delete this._accountNotifications[account.get_object_path()];
}));
source.notify(notif); source.notify(notif);
}, },
@ -458,6 +468,7 @@ Client.prototype = {
if (this._accountSource == null) { if (this._accountSource == null) {
this._accountSource = new MultiNotificationSource( this._accountSource = new MultiNotificationSource(
_("Connection error"), 'gtk-dialog-error'); _("Connection error"), 'gtk-dialog-error');
Main.messageTray.add(this._accountSource);
this._accountSource.connect('destroy', Lang.bind(this, function () { this._accountSource.connect('destroy', Lang.bind(this, function () {
this._accountSource = null; this._accountSource = null;
})); }));
@ -1448,17 +1459,12 @@ AccountNotification.prototype = {
_("Connection to %s failed").format(account.get_display_name()), _("Connection to %s failed").format(account.get_display_name()),
null, { customContent: true }); null, { customContent: true });
let message; this._label = new St.Label();
if (connectionError in _connectionErrorMessages) { this.addActor(this._label);
message = _connectionErrorMessages[connectionError]; this._updateMessage(connectionError);
} else {
message = _("Unknown reason");
}
this._account = account; this._account = account;
this.addBody(message);
this.addButton('reconnect', _("Reconnect")); this.addButton('reconnect', _("Reconnect"));
this.addButton('edit', _("Edit account")); this.addButton('edit', _("Edit account"));
@ -1492,11 +1498,25 @@ AccountNotification.prototype = {
this._connectionStatusId = account.connect('notify::connection-status', this._connectionStatusId = account.connect('notify::connection-status',
Lang.bind(this, function() { Lang.bind(this, function() {
if (account.connection_status != Tp.ConnectionStatus.DISCONNECTED) let status = account.connection_status;
if (status == Tp.ConnectionStatus.CONNECTED) {
this.destroy(); this.destroy();
} else if (status == Tp.ConnectionStatus.DISCONNECTED) {
this._updateMessage(account.connection_error);
}
})); }));
}, },
_updateMessage: function(connectionError) {
let message;
if (connectionError in _connectionErrorMessages) {
message = _connectionErrorMessages[connectionError];
} else {
message = _("Unknown reason");
}
this._label.set_text(message);
},
destroy: function() { destroy: function() {
if (this._enabledId != 0) { if (this._enabledId != 0) {
this._account.disconnect(this._enabledId); this._account.disconnect(this._enabledId);