mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-06 13:17:41 +00:00
GUAC-1172: Define ManagedFilesystem type. Handle received filesystem objects.
This commit is contained in:
@@ -31,6 +31,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
|
|||||||
var ManagedClientState = $injector.get('ManagedClientState');
|
var ManagedClientState = $injector.get('ManagedClientState');
|
||||||
var ManagedDisplay = $injector.get('ManagedDisplay');
|
var ManagedDisplay = $injector.get('ManagedDisplay');
|
||||||
var ManagedFileDownload = $injector.get('ManagedFileDownload');
|
var ManagedFileDownload = $injector.get('ManagedFileDownload');
|
||||||
|
var ManagedFilesystem = $injector.get('ManagedFilesystem');
|
||||||
var ManagedFileUpload = $injector.get('ManagedFileUpload');
|
var ManagedFileUpload = $injector.get('ManagedFileUpload');
|
||||||
|
|
||||||
// Required services
|
// Required services
|
||||||
@@ -119,6 +120,15 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
|
|||||||
*/
|
*/
|
||||||
this.uploads = template.uploads || [];
|
this.uploads = template.uploads || [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All currently-exposed filesystems. When the Guacamole server exposes
|
||||||
|
* a filesystem object, that object will be made available as a
|
||||||
|
* ManagedFilesystem within this array.
|
||||||
|
*
|
||||||
|
* @type ManagedFilesystem[]
|
||||||
|
*/
|
||||||
|
this.filesystems = template.filesystems || [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The current state of the Guacamole client (idle, connecting,
|
* The current state of the Guacamole client (idle, connecting,
|
||||||
* connected, terminated with error, etc.).
|
* connected, terminated with error, etc.).
|
||||||
@@ -382,6 +392,13 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector',
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Handle any received filesystem objects
|
||||||
|
client.onfilesystem = function fileSystemReceived(object, name) {
|
||||||
|
$rootScope.$apply(function exposeFilesystem() {
|
||||||
|
managedClient.filesystems.push(ManagedFilesystem.getInstance(object, name));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// Manage the client display
|
// Manage the client display
|
||||||
managedClient.managedDisplay = ManagedDisplay.getInstance(client.getDisplay());
|
managedClient.managedDisplay = ManagedDisplay.getInstance(client.getDisplay());
|
||||||
|
|
||||||
|
263
guacamole/src/main/webapp/app/client/types/ManagedFilesystem.js
Normal file
263
guacamole/src/main/webapp/app/client/types/ManagedFilesystem.js
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Glyptodon LLC
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the ManagedFilesystem class used by ManagedClient to represent
|
||||||
|
* available remote filesystems.
|
||||||
|
*/
|
||||||
|
angular.module('client').factory('ManagedFilesystem', ['$rootScope', '$injector',
|
||||||
|
function defineManagedFilesystem($rootScope, $injector) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object which serves as a surrogate interface, encapsulating a Guacamole
|
||||||
|
* filesystem object while it is active, allowing it to be detached and
|
||||||
|
* reattached from different client views.
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @param {ManagedFilesystem|Object} [template={}]
|
||||||
|
* The object whose properties should be copied within the new
|
||||||
|
* ManagedFilesystem.
|
||||||
|
*/
|
||||||
|
var ManagedFilesystem = function ManagedFilesystem(template) {
|
||||||
|
|
||||||
|
// Use empty object by default
|
||||||
|
template = template || {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Guacamole filesystem object, as received via a "filesystem"
|
||||||
|
* instruction.
|
||||||
|
*
|
||||||
|
* @type Guacamole.Object
|
||||||
|
*/
|
||||||
|
this.object = template.object;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The declared, human-readable name of the filesystem
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.name = template.name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The root directory of the filesystem.
|
||||||
|
*
|
||||||
|
* @type ManagedFilesystem.File
|
||||||
|
*/
|
||||||
|
this.root = template.root;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refreshes the contents of the given file, if that file is a directory.
|
||||||
|
* Only the immediate children of the file are refreshed. Files further
|
||||||
|
* down the directory tree are not refreshed.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem} filesystem
|
||||||
|
* The filesystem associated with the file being refreshed.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem.File} file
|
||||||
|
* The file being refreshed.
|
||||||
|
*/
|
||||||
|
ManagedFilesystem.refresh = function updateDirectory(filesystem, file) {
|
||||||
|
|
||||||
|
// Do not attempt to refresh the contents of directories
|
||||||
|
if (file.mimetype !== Guacamole.Object.STREAM_INDEX_MIMETYPE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Request contents of given file
|
||||||
|
filesystem.object.requestInputStream(file.streamName, function handleStream(stream, mimetype) {
|
||||||
|
|
||||||
|
// Ignore stream if mimetype is wrong
|
||||||
|
if (mimetype !== Guacamole.Object.STREAM_INDEX_MIMETYPE) {
|
||||||
|
stream.sendAck('Unexpected mimetype', Guacamole.Status.Code.UNSUPPORTED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Signal server that data is ready to be received
|
||||||
|
stream.sendAck('Ready', Guacamole.Status.Code.SUCCESS);
|
||||||
|
|
||||||
|
// Read stream as JSON
|
||||||
|
var reader = new Guacamole.JSONReader(stream);
|
||||||
|
|
||||||
|
// Acknowledge received JSON blobs
|
||||||
|
reader.onprogress = function onprogress() {
|
||||||
|
stream.sendAck("Received", Guacamole.Status.Code.SUCCESS);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Reset contents of directory
|
||||||
|
reader.onend = function jsonReady() {
|
||||||
|
$rootScope.$evalAsync(function updateFileContents() {
|
||||||
|
|
||||||
|
// Empty contents
|
||||||
|
file.files = {};
|
||||||
|
|
||||||
|
// Determine the expected filename prefix of each stream
|
||||||
|
var expectedPrefix = file.streamName;
|
||||||
|
if (expectedPrefix.charAt(expectedPrefix.length - 1) !== '/')
|
||||||
|
expectedPrefix += '/';
|
||||||
|
|
||||||
|
// For each received stream name
|
||||||
|
var mimetypes = reader.getJSON();
|
||||||
|
for (var name in mimetypes) {
|
||||||
|
|
||||||
|
// Assert prefix is correct
|
||||||
|
if (name.substring(0, expectedPrefix.length) !== expectedPrefix)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Extract filename from stream name
|
||||||
|
var filename = name.substring(expectedPrefix.length);
|
||||||
|
|
||||||
|
// Deduce type from mimetype
|
||||||
|
var type = ManagedFilesystem.File.Type.NORMAL;
|
||||||
|
if (mimetypes[name] === Guacamole.Object.STREAM_INDEX_MIMETYPE)
|
||||||
|
type = ManagedFilesystem.File.Type.DIRECTORY;
|
||||||
|
|
||||||
|
// Add file entry
|
||||||
|
file.files[filename] = new ManagedFilesystem.File({
|
||||||
|
mimetype : mimetypes[name],
|
||||||
|
streamName : name,
|
||||||
|
type : type,
|
||||||
|
name : filename
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new ManagedFilesystem instance from the given Guacamole.Object
|
||||||
|
* and human-readable name. Upon creation, a request to populate the
|
||||||
|
* contents of the root directory will be automatically dispatched.
|
||||||
|
*
|
||||||
|
* @param {Guacamole.Object} object
|
||||||
|
* The Guacamole.Object defining the filesystem.
|
||||||
|
*
|
||||||
|
* @param {String} name
|
||||||
|
* A human-readable name for the filesystem.
|
||||||
|
*
|
||||||
|
* @returns {ManagedFilesystem}
|
||||||
|
* The newly-created ManagedFilesystem.
|
||||||
|
*/
|
||||||
|
ManagedFilesystem.getInstance = function getInstance(object, name) {
|
||||||
|
|
||||||
|
// Init new filesystem object
|
||||||
|
var managedFilesystem = new ManagedFilesystem({
|
||||||
|
object : object,
|
||||||
|
name : name,
|
||||||
|
root : new ManagedFilesystem.File({
|
||||||
|
mimetype : Guacamole.Object.STREAM_INDEX_MIMETYPE,
|
||||||
|
streamName : Guacamole.Object.ROOT_STREAM,
|
||||||
|
type : ManagedFilesystem.File.Type.DIRECTORY
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Retrieve contents of root
|
||||||
|
ManagedFilesystem.refresh(managedFilesystem, managedFilesystem.root);
|
||||||
|
|
||||||
|
return managedFilesystem;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A file within a ManagedFilesystem. Each ManagedFilesystem.File provides
|
||||||
|
* sufficient information for retrieval or replacement of the file's
|
||||||
|
* contents, as well as the file's name and type.
|
||||||
|
*
|
||||||
|
* @param {ManagedFilesystem|Object} [template={}]
|
||||||
|
* The object whose properties should be copied within the new
|
||||||
|
* ManagedFilesystem.File.
|
||||||
|
*/
|
||||||
|
ManagedFilesystem.File = function File(template) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The mimetype of the data contained within this file.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.mimetype = template.mimetype;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the stream representing this files contents within its
|
||||||
|
* associated filesystem object.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.streamName = template.streamName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of this file. All legal file type strings are defined
|
||||||
|
* within ManagedFilesystem.File.Type.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.type = template.type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of this file.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
this.name = template.name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of all known files containined within this file by name. This is
|
||||||
|
* only applicable to directories.
|
||||||
|
*
|
||||||
|
* @type Object.<String, ManagedFilesystem.File>
|
||||||
|
*/
|
||||||
|
this.files = template.files || {};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All legal type strings for a ManagedFilesystem.File.
|
||||||
|
*
|
||||||
|
* @type Object.<String, String>
|
||||||
|
*/
|
||||||
|
ManagedFilesystem.File.Type = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A normal file. As ManagedFilesystem does not currently represent any
|
||||||
|
* other non-directory types of files, like symbolic links, this type
|
||||||
|
* string may be used for any non-directory file.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
NORMAL : 'NORMAL',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A directory.
|
||||||
|
*
|
||||||
|
* @type String
|
||||||
|
*/
|
||||||
|
DIRECTORY : 'DIRECTORY'
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return ManagedFilesystem;
|
||||||
|
|
||||||
|
}]);
|
Reference in New Issue
Block a user