GUAC-963: Remove managed client when view is destroyed if client is no longer connected.

This commit is contained in:
Michael Jumper
2014-12-28 20:01:01 -08:00
parent b30e3ce180
commit f9c3e02f47
2 changed files with 46 additions and 2 deletions

View File

@@ -709,6 +709,21 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams
// Clean up when view destroyed
$scope.$on('$destroy', function clientViewDestroyed() {
// Remove client from client manager if no longer connected
var managedClient = $scope.client;
if (managedClient) {
// Get current connection state
var connectionState = managedClient.clientState.connectionState;
// If disconnected, remove from management
if (connectionState === ManagedClientState.ConnectionState.DISCONNECTED
|| connectionState === ManagedClientState.ConnectionState.TUNNEL_ERROR
|| connectionState === ManagedClientState.ConnectionState.CLIENT_ERROR)
guacClientManager.removeManagedClient(managedClient.id);
}
// Hide any status dialog
$scope.showStatus(false);

View File

@@ -36,6 +36,36 @@ angular.module('client').factory('guacClientManager', ['ManagedClient',
*/
service.managedClients = {};
/**
* Removes the existing ManagedClient associated with the connection having
* the given ID, if any. If no such a ManagedClient already exists, this
* function has no effect.
*
* @param {String} id
* The ID of the connection whose ManagedClient should be removed.
*
* @returns {Boolean}
* true if an existing client was removed, false otherwise.
*/
service.removeManagedClient = function replaceManagedClient(id) {
// Remove client if it exists
if (id in service.managedClients) {
// Disconnect and remove
service.managedClients[id].client.disconnect();
delete service.managedClients[id];
// A client was removed
return true;
}
// No client was removed
return false;
};
/**
* Creates a new ManagedClient associated with the connection having the
* given ID. If such a ManagedClient already exists, it is disconnected and
@@ -56,8 +86,7 @@ angular.module('client').factory('guacClientManager', ['ManagedClient',
service.replaceManagedClient = function replaceManagedClient(id, connectionParameters) {
// Disconnect any existing client
if (id in service.managedClients)
service.managedClients[id].client.disconnect();
service.removeManagedClient(id);
// Set new client
return service.managedClients[id] = ManagedClient.getInstance(id, connectionParameters);