diff --git a/guacamole/src/main/webapp/app/client/controllers/clientController.js b/guacamole/src/main/webapp/app/client/controllers/clientController.js index 0c7145a88..daa782229 100644 --- a/guacamole/src/main/webapp/app/client/controllers/clientController.js +++ b/guacamole/src/main/webapp/app/client/controllers/clientController.js @@ -755,7 +755,7 @@ angular.module('client').controller('clientController', ['$scope', '$routeParams if (!$scope.client) return false; - return !!($scope.client.uploads.length || $scope.client.downloads.length); + return !!$scope.client.uploads.length; }; diff --git a/guacamole/src/main/webapp/app/client/directives/guacFileTransferManager.js b/guacamole/src/main/webapp/app/client/directives/guacFileTransferManager.js index ac810d04c..002494865 100644 --- a/guacamole/src/main/webapp/app/client/directives/guacFileTransferManager.js +++ b/guacamole/src/main/webapp/app/client/directives/guacFileTransferManager.js @@ -83,11 +83,6 @@ angular.module('client').directive('guacFileTransferManager', [function guacFile return isInProgress(upload.transferState); }); - // Remove completed downloads - $scope.client.downloads = $scope.client.downloads.filter(function isDownloadInProgress(download) { - return isInProgress(download.transferState); - }); - }; }] diff --git a/guacamole/src/main/webapp/app/client/types/ManagedClient.js b/guacamole/src/main/webapp/app/client/types/ManagedClient.js index 9a3ffb1c4..9a2870687 100644 --- a/guacamole/src/main/webapp/app/client/types/ManagedClient.js +++ b/guacamole/src/main/webapp/app/client/types/ManagedClient.js @@ -28,7 +28,6 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', var ClientIdentifier = $injector.get('ClientIdentifier'); var ManagedClientState = $injector.get('ManagedClientState'); var ManagedDisplay = $injector.get('ManagedDisplay'); - var ManagedFileDownload = $injector.get('ManagedFileDownload'); var ManagedFilesystem = $injector.get('ManagedFilesystem'); var ManagedFileUpload = $injector.get('ManagedFileUpload'); @@ -41,6 +40,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', var clipboardService = $injector.get('clipboardService'); var connectionGroupService = $injector.get('connectionGroupService'); var connectionService = $injector.get('connectionService'); + var tunnelService = $injector.get('tunnelService'); var guacAudio = $injector.get('guacAudio'); var guacHistory = $injector.get('guacHistory'); var guacImage = $injector.get('guacImage'); @@ -104,15 +104,6 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', */ this.clipboardData = template.clipboardData || ''; - /** - * All downloaded files. As files are downloaded, their progress can be - * observed through the elements of this array. It is intended that - * this array be manipulated externally as needed. - * - * @type ManagedFileDownload[] - */ - this.downloads = template.downloads || []; - /** * All uploaded files. As files are uploaded, their progress can be * observed through the elements of this array. It is intended that @@ -453,9 +444,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', // Handle any received files client.onfile = function clientFileReceived(stream, mimetype, filename) { - $rootScope.$apply(function startDownload() { - managedClient.downloads.push(ManagedFileDownload.getInstance(stream, mimetype, filename)); - }); + tunnelService.downloadStream(tunnel.uuid, stream, mimetype, filename); }; // Handle any received filesystem objects @@ -530,7 +519,7 @@ angular.module('client').factory('ManagedClient', ['$rootScope', '$injector', } // Start and manage file upload - managedClient.uploads.push(ManagedFileUpload.getInstance(managedClient.client, file, object, streamName)); + managedClient.uploads.push(ManagedFileUpload.getInstance(managedClient, file, object, streamName)); }; diff --git a/guacamole/src/main/webapp/app/client/types/ManagedFileDownload.js b/guacamole/src/main/webapp/app/client/types/ManagedFileDownload.js deleted file mode 100644 index 35f683b1f..000000000 --- a/guacamole/src/main/webapp/app/client/types/ManagedFileDownload.js +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * Provides the ManagedFileDownload class used by the guacClientManager service. - */ -angular.module('client').factory('ManagedFileDownload', ['$rootScope', '$injector', - function defineManagedFileDownload($rootScope, $injector) { - - // Required types - var ManagedFileTransferState = $injector.get('ManagedFileTransferState'); - - /** - * Object which serves as a surrogate interface, encapsulating a Guacamole - * file download while it is active, allowing it to be detached and - * reattached from different client views. - * - * @constructor - * @param {ManagedFileDownload|Object} [template={}] - * The object whose properties should be copied within the new - * ManagedFileDownload. - */ - var ManagedFileDownload = function ManagedFileDownload(template) { - - // Use empty object by default - template = template || {}; - - /** - * The current state of the file transfer stream. - * - * @type ManagedFileTransferState - */ - this.transferState = template.transferState || new ManagedFileTransferState(); - - /** - * The mimetype of the file being transferred. - * - * @type String - */ - this.mimetype = template.mimetype; - - /** - * The filename of the file being transferred. - * - * @type String - */ - this.filename = template.filename; - - /** - * The number of bytes transferred so far. - * - * @type Number - */ - this.progress = template.progress; - - /** - * A blob containing the complete downloaded file. This is available - * only after the download has finished. - * - * @type Blob - */ - this.blob = template.blob; - - }; - - /** - * Creates a new ManagedFileDownload which downloads the contents of the - * given stream as a file having the given mimetype and filename. - * - * @param {Guacamole.InputStream} stream - * The stream whose contents should be downloaded as a file. - * - * @param {String} mimetype - * The mimetype of the stream contents. - * - * @param {String} filename - * The filename of the file being received over the steram. - * - * @return {ManagedFileDownload} - * A new ManagedFileDownload object which can be used to track the - * progress of the download. - */ - ManagedFileDownload.getInstance = function getInstance(stream, mimetype, filename) { - - // Init new file download object - var managedFileDownload = new ManagedFileDownload({ - mimetype : mimetype, - filename : filename, - progress : 0, - transferState : new ManagedFileTransferState({ - streamState : ManagedFileTransferState.StreamState.OPEN - }) - }); - - // Begin file download - var blob_reader = new Guacamole.BlobReader(stream, mimetype); - - // Update progress as data is received - blob_reader.onprogress = function onprogress() { - - // Update progress - $rootScope.$apply(function downloadStreamProgress() { - managedFileDownload.progress = blob_reader.getLength(); - }); - - // Signal server that data was received - stream.sendAck("Received", Guacamole.Status.Code.SUCCESS); - - }; - - // Save blob and close stream when complete - blob_reader.onend = function onend() { - $rootScope.$apply(function downloadStreamEnd() { - - // Save blob - managedFileDownload.blob = blob_reader.getBlob(); - - // Mark stream as closed - ManagedFileTransferState.setStreamState(managedFileDownload.transferState, - ManagedFileTransferState.StreamState.CLOSED); - - // Notify of upload completion - $rootScope.$broadcast('guacDownloadComplete', filename); - - }); - }; - - // Signal server that data is ready to be received - stream.sendAck("Ready", Guacamole.Status.Code.SUCCESS); - - return managedFileDownload; - - }; - - return ManagedFileDownload; - -}]); \ No newline at end of file diff --git a/guacamole/src/main/webapp/app/client/types/ManagedFileUpload.js b/guacamole/src/main/webapp/app/client/types/ManagedFileUpload.js index 7fe4f3579..82bface4d 100644 --- a/guacamole/src/main/webapp/app/client/types/ManagedFileUpload.js +++ b/guacamole/src/main/webapp/app/client/types/ManagedFileUpload.js @@ -24,10 +24,11 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector' function defineManagedFileUpload($rootScope, $injector) { // Required types + var Error = $injector.get('Error'); var ManagedFileTransferState = $injector.get('ManagedFileTransferState'); // Required services - var $window = $injector.get('$window'); + var tunnelService = $injector.get('tunnelService'); /** * Object which serves as a surrogate interface, encapsulating a Guacamole @@ -81,32 +82,12 @@ angular.module('client').factory('ManagedFileUpload', ['$rootScope', '$injector' }; - /** - * Converts the given bytes to a base64-encoded string. - * - * @param {Uint8Array} bytes A Uint8Array which contains the data to be - * encoded as base64. - * @return {String} The base64-encoded string. - */ - var getBase64 = function getBase64(bytes) { - - var data = ""; - - // Produce binary string from bytes in buffer - for (var i=0; i