Index: ui/file_manager/zip_archiver/unpacker/js/decompressor.js |
diff --git a/ui/file_manager/zip_archiver/unpacker/js/decompressor.js b/ui/file_manager/zip_archiver/unpacker/js/decompressor.js |
deleted file mode 100644 |
index 787770a4800fc47607df254b53959128edac28e2..0000000000000000000000000000000000000000 |
--- a/ui/file_manager/zip_archiver/unpacker/js/decompressor.js |
+++ /dev/null |
@@ -1,308 +0,0 @@ |
-// Copyright 2014 The Chromium OS Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-'use strict'; |
- |
-/** |
- * A class that takes care of communication between NaCl and archive volume. |
- * Its job is to handle communication with the naclModule. |
- * @constructor |
- * @param {!Object} naclModule The nacl module with which the decompressor |
- * communicates. |
- * @param {!unpacker.types.FileSystemId} fileSystemId The file system id of for |
- * the archive volume to decompress. |
- * @param {!Blob} blob The correspondent file blob for fileSystemId. |
- * @param {!unpacker.PassphraseManager} passphraseManager Passphrase manager. |
- */ |
-unpacker.Decompressor = function(naclModule, fileSystemId, blob, |
- passphraseManager) { |
- /** |
- * @private {!Object} |
- * @const |
- */ |
- this.naclModule_ = naclModule; |
- |
- /** |
- * @private {!unpacker.types.FileSystemId} |
- * @const |
- */ |
- this.fileSystemId_ = fileSystemId; |
- |
- /** |
- * @private {!Blob} |
- * @const |
- */ |
- this.blob_ = blob; |
- |
- /** |
- * @public {!unpacker.PassphraseManager} |
- * @const |
- */ |
- this.passphraseManager = passphraseManager; |
- |
- /** |
- * Requests in progress. No need to save them onSuspend for now as metadata |
- * reads are restarted from start. |
- * @public {!Object<!unpacker.types.RequestId, !Object>} |
- * @const |
- */ |
- this.requestsInProgress = {}; |
-}; |
- |
-/** |
- * @return {boolean} True if there is any request in progress. |
- */ |
-unpacker.Decompressor.prototype.hasRequestsInProgress = function() { |
- return Object.keys(this.requestsInProgress).length > 0; |
-}; |
- |
-/** |
- * Sends a request to NaCl and mark it as a request in progress. onSuccess and |
- * onError are the callbacks used when receiving an answer from NaCl. |
- * @param {!unpacker.types.RequestId} requestId The operation request id, which |
- * should be unique per every volume. |
- * @param {function(...)} onSuccess Callback to execute on success. |
- * @param {function(!ProviderError)} onError Callback to execute on error. |
- * @param {!Object} naclRequest A request that must be sent to NaCl using |
- * postMessage. |
- * @private |
- */ |
-unpacker.Decompressor.prototype.addRequest_ = function(requestId, onSuccess, |
- onError, naclRequest) { |
- console.assert(!this.requestsInProgress[requestId], |
- 'There is already a request with the id ' + requestId + '.'); |
- |
- this.requestsInProgress[requestId] = { |
- onSuccess: onSuccess, |
- onError: onError |
- }; |
- |
- this.naclModule_.postMessage(naclRequest); |
-}; |
- |
-/** |
- * Creates a request for reading metadata. |
- * @param {!unpacker.types.RequestId} requestId |
- * @param {string} encoding Default encoding for the archive's headers. |
- * @param {function(!Object<string, !Object>)} onSuccess Callback to execute |
- * once the metadata is obtained from NaCl. It has one parameter, which is |
- * the metadata itself. The metadata has as key the full path to an entry |
- * and as value information about the entry. |
- * @param {function(!ProviderError)} onError Callback to execute on error. |
- */ |
-unpacker.Decompressor.prototype.readMetadata = function(requestId, encoding, |
- onSuccess, onError) { |
- this.addRequest_( |
- requestId, onSuccess, onError, |
- unpacker.request.createReadMetadataRequest(this.fileSystemId_, requestId, |
- encoding, this.blob_.size)); |
-}; |
- |
-/** |
- * Sends an open file request to NaCl. |
- * @param {!unpacker.types.RequestId} requestId |
- * @param {number} index Index of the file in the header list. |
- * @param {string} encoding Default encoding for the archive's headers. |
- * @param {function()} onSuccess Callback to execute on successful open. |
- * @param {function(!ProviderError)} onError Callback to execute on error. |
- */ |
-unpacker.Decompressor.prototype.openFile = function(requestId, index, encoding, |
- onSuccess, onError) { |
- this.addRequest_( |
- requestId, onSuccess, onError, |
- unpacker.request.createOpenFileRequest(this.fileSystemId_, requestId, |
- index, encoding, this.blob_.size)); |
-}; |
- |
-/** |
- * Sends a close file request to NaCl. |
- * @param {!unpacker.types.RequestId} requestId |
- * @param {!unpacker.types.RequestId} openRequestId The request id of the |
- * corresponding open file operation for the file to close. |
- * @param {function()} onSuccess Callback to execute on successful open. |
- * @param {function(!ProviderError)} onError Callback to execute on error. |
- */ |
-unpacker.Decompressor.prototype.closeFile = function(requestId, openRequestId, |
- onSuccess, onError) { |
- this.addRequest_(requestId, onSuccess, onError, |
- unpacker.request.createCloseFileRequest( |
- this.fileSystemId_, requestId, openRequestId)); |
-}; |
- |
-/** |
- * Sends a read file request to NaCl. |
- * @param {!unpacker.types.RequestId} requestId |
- * @param {!unpacker.types.RequestId} openRequestId The request id of the |
- * corresponding open file operation for the file to read. |
- * @param {number} offset The offset from where read operation should start. |
- * @param {number} length The number of bytes to read. |
- * @param {function(!ArrayBuffer, boolean)} onSuccess Callback to execute on |
- * success. |
- * @param {function(!ProviderError)} onError Callback to execute on error. |
- */ |
-unpacker.Decompressor.prototype.readFile = function( |
- requestId, openRequestId, offset, length, onSuccess, onError) { |
- this.addRequest_( |
- requestId, onSuccess, onError, |
- unpacker.request.createReadFileRequest(this.fileSystemId_, requestId, |
- openRequestId, offset, length)); |
-}; |
- |
-/** |
- * Processes messages from NaCl module. |
- * @param {!Object} data The data contained in the message from NaCl. Its |
- * types depend on the operation of the request. |
- * @param {!unpacker.request.Operation} operation An operation from request.js. |
- * @param {number} requestId The request id, which should be unique per every |
- * volume. |
- */ |
-unpacker.Decompressor.prototype.processMessage = function(data, operation, |
- requestId) { |
- // Create a request reference for asynchronous calls as sometimes we delete |
- // some requestsInProgress from this.requestsInProgress. |
- var requestInProgress = this.requestsInProgress[requestId]; |
- console.assert(requestInProgress, 'No request with id <' + requestId + |
- '> for: ' + this.fileSystemId_ + '.'); |
- |
- switch (operation) { |
- case unpacker.request.Operation.READ_METADATA_DONE: |
- var metadata = data[unpacker.request.Key.METADATA]; |
- console.assert(metadata, 'No metadata.'); |
- requestInProgress.onSuccess(metadata); |
- break; |
- |
- case unpacker.request.Operation.READ_CHUNK: |
- this.readChunk_(data, requestId); |
- // this.requestsInProgress_[requestId] should be valid as long as NaCL |
- // can still make READ_CHUNK requests. |
- return; |
- |
- case unpacker.request.Operation.READ_PASSPHRASE: |
- this.readPassphrase_(data, requestId); |
- // this.requestsInProgress_[requestId] should be valid as long as NaCL |
- // can still make READ_PASSPHRASE requests. |
- return; |
- |
- case unpacker.request.Operation.OPEN_FILE_DONE: |
- requestInProgress.onSuccess(); |
- // this.requestsInProgress_[requestId] should be valid until closing the |
- // file so NaCL can make READ_CHUNK requests. |
- return; |
- |
- case unpacker.request.Operation.CLOSE_FILE_DONE: |
- var openRequestId = data[unpacker.request.Key.OPEN_REQUEST_ID]; |
- console.assert(openRequestId, 'No open request id.'); |
- |
- openRequestId = Number(openRequestId); // Received as string. |
- delete this.requestsInProgress[openRequestId]; |
- requestInProgress.onSuccess(); |
- break; |
- |
- case unpacker.request.Operation.READ_FILE_DONE: |
- var buffer = data[unpacker.request.Key.READ_FILE_DATA]; |
- console.assert(buffer, 'No buffer for read file operation.'); |
- var hasMoreData = data[unpacker.request.Key.HAS_MORE_DATA]; |
- console.assert(buffer !== undefined, |
- 'No HAS_MORE_DATA boolean value for file operation.'); |
- |
- requestInProgress.onSuccess(buffer, hasMoreData /* Last call. */); |
- if (hasMoreData) |
- return; // Do not delete requestInProgress. |
- break; |
- |
- case unpacker.request.Operation.FILE_SYSTEM_ERROR: |
- console.error('File system error for <' + this.fileSystemId_ + '>: ' + |
- data[unpacker.request.Key.ERROR]); // The error contains |
- // the '.' at the end. |
- requestInProgress.onError('FAILED'); |
- break; |
- |
- case unpacker.request.Operation.CONSOLE_LOG: |
- case unpacker.request.Operation.CONSOLE_DEBUG: |
- var src_file = data[unpacker.request.Key.SRC_FILE]; |
- var src_line = data[unpacker.request.Key.SRC_LINE]; |
- var src_func = data[unpacker.request.Key.SRC_FUNC]; |
- var msg = data[unpacker.request.Key.MESSAGE]; |
- var log = operation == unpacker.request.Operation.CONSOLE_LOG ? |
- console.log : console.debug; |
- log(src_file + ':' + src_func + ':' + src_line + ': ' + msg); |
- break; |
- |
- default: |
- console.error('Invalid NaCl operation: ' + operation + '.'); |
- requestInProgress.onError('FAILED'); |
- } |
- delete this.requestsInProgress[requestId]; |
-}; |
- |
-/** |
- * Reads a chunk of data from this.blob_ for READ_CHUNK operation. |
- * @param {!Object} data The data received from the NaCl module. |
- * @param {number} requestId The request id, which should be unique per every |
- * volume. |
- * @private |
- */ |
-unpacker.Decompressor.prototype.readChunk_ = function(data, requestId) { |
- // Offset and length are received as strings. See request.js. |
- var offset_str = data[unpacker.request.Key.OFFSET]; |
- var length_str = data[unpacker.request.Key.LENGTH]; |
- |
- // Explicit check if offset is undefined as it can be 0. |
- console.assert(offset_str !== undefined && !isNaN(offset_str) && |
- Number(offset_str) >= 0 && |
- Number(offset_str) < this.blob_.size, |
- 'Invalid offset.'); |
- console.assert(length_str && !isNaN(length_str) && Number(length_str) > 0, |
- 'Invalid length.'); |
- |
- var offset = Number(offset_str); |
- var length = Math.min(this.blob_.size - offset, Number(length_str)); |
- |
- // Read a chunk from offset to offset + length. |
- var blob = this.blob_.slice(offset, offset + length); |
- var fileReader = new FileReader(); |
- |
- fileReader.onload = function(event) { |
- this.naclModule_.postMessage(unpacker.request.createReadChunkDoneResponse( |
- this.fileSystemId_, requestId, event.target.result, offset)); |
- }.bind(this); |
- |
- fileReader.onerror = function(event) { |
- console.error('Failed to read a chunk of data from the archive.'); |
- this.naclModule_.postMessage(unpacker.request.createReadChunkErrorResponse( |
- this.fileSystemId_, requestId)); |
- // Reading from the source file failed. Assume that the file is gone and |
- // unmount the archive. |
- // TODO(523195): Show a notification that the source file is gone. |
- unpacker.app.unmountVolume(this.fileSystemId_, true); |
- }.bind(this); |
- |
- fileReader.readAsArrayBuffer(blob); |
-}; |
- |
-/** |
- * Reads a passphrase from user input for READ_PASSPHRASE operation. |
- * @param {!Object} data The data received from the NaCl module. |
- * @param {number} requestId The request id, which should be unique per every |
- * volume. |
- * @private |
- */ |
-unpacker.Decompressor.prototype.readPassphrase_ = function(data, requestId) { |
- this.passphraseManager.getPassphrase() |
- .then(function(passphrase) { |
- this.naclModule_.postMessage( |
- unpacker.request.createReadPassphraseDoneResponse( |
- this.fileSystemId_, requestId, passphrase)); |
- }.bind(this)) |
- .catch(function(error) { |
- console.error(error.stack || error); |
- this.naclModule_.postMessage( |
- unpacker.request.createReadPassphraseErrorResponse( |
- this.fileSystemId_, requestId)); |
- // TODO(mtomasz): Instead of unmounting just let the current operation |
- // fail and ask for password for another files. This is however |
- // impossible for now due to a bug in libarchive. |
- unpacker.app.unmountVolume(this.fileSystemId_, true); |
- }.bind(this)); |
-}; |