diff --git a/guacamole-common-js/src/main/webapp/modules/Client.js b/guacamole-common-js/src/main/webapp/modules/Client.js index c4ed16278..8f5017543 100644 --- a/guacamole-common-js/src/main/webapp/modules/Client.js +++ b/guacamole-common-js/src/main/webapp/modules/Client.js @@ -703,6 +703,40 @@ Guacamole.Client = function(tunnel) { */ this.onmsg = null; + /** + * Fired when a user joins a shared connection. + * + * @event + * @param {!string} userID + * A unique value representing this specific user's connection to the + * shared connection. This value is generated by the server and is + * guaranteed to be unique relative to other users of the connection. + * + * @param {!string} name + * A human-readable name representing the user that joined, such as + * their username. This value is provided by the web application during + * the connection handshake and is not necessarily unique relative to + * other users of the connection. + */ + this.onjoin = null; + + /** + * Fired when a user leaves a shared connection. + * + * @event + * @param {!string} userID + * A unique value representing this specific user's connection to the + * shared connection. This value is generated by the server and is + * guaranteed to be unique relative to other users of the connection. + * + * @param {!string} name + * A human-readable name representing the user that left, such as their + * username. This value is provided by the web application during the + * connection handshake and is not necessarily unique relative to other + * users of the connection. + */ + this.onleave = null; + /** * Fired when a audio stream is created. The stream provided to this event * handler will contain its own event handlers for received data. @@ -1416,8 +1450,24 @@ Guacamole.Client = function(tunnel) { }, "msg" : function(parameters) { - - if (guac_client.onmsg) guac_client.onmsg(parseInt(parameters[0]), parameters.slice(1)); + + var msgid = parseInt(parameters[0]); + if (guac_client.onmsg) + guac_client.onmsg(msgid, parameters.slice(1)); + + switch (msgid) { + + case Guacamole.Client.Message.USER_JOINED: + if (guac_client.onjoin) + guac_client.onjoin(parameters[1] /* User ID */, parameters[2] /* Name */); + break; + + case Guacamole.Client.Message.USER_LEFT: + if (guac_client.onleave) + guac_client.onleave(parameters[1] /* User ID */, parameters[2] /* Name */); + break; + + } }, diff --git a/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js b/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js index 2ed202fe6..6a32235d1 100644 --- a/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js +++ b/guacamole/src/main/frontend/src/app/client/types/ManagedClient.js @@ -507,47 +507,35 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', }); }; - - // Handle messages received from guacd to display to the client. - client.onmsg = function clientMessage(msgcode, args) { - switch (msgcode) { - // Update current users on connection when a user joins/leaves - case Guacamole.Client.Message.USER_JOINED: - case Guacamole.Client.Message.USER_LEFT: + // Update user count when a new user joins + client.onjoin = function userJoined(id, username) { + $rootScope.$apply(function usersChanged() { - var userID = args[0]; - var username = args[1]; + var connections = managedClient.users[username] || {}; + managedClient.users[username] = connections; - var connections = managedClient.users[username] || {}; - managedClient.users[username] = connections; + managedClient.userCount++; + connections[id] = true; - $rootScope.$apply(function usersChanged() { + }); + }; - // Add/remove user - if (msgcode === Guacamole.Client.Message.USER_JOINED) { - managedClient.userCount++; - connections[userID] = true; - } - else { - managedClient.userCount--; - delete connections[userID]; - } + // Update user count when a user leaves + client.onleave = function userLeft(id, username) { + $rootScope.$apply(function usersChanged() { - // Delete user entry after no connections remain - if (_.isEmpty(connections)) - delete managedClient.users[username]; + var connections = managedClient.users[username] || {}; + managedClient.users[username] = connections; - }); + managedClient.userCount--; + delete connections[id]; - break; + // Delete user entry after no connections remain + if (_.isEmpty(connections)) + delete managedClient.users[username]; - default: - // Ignore - we only handle join/leave messages, which are - // currently the only messages defined at the protocol - // level. - - } + }); }; // Automatically update the client thumbnail