| OLD | NEW |
| 1 // Copyright 2017 The Chromium OS Authors. All rights reserved. | 1 // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 'use strict'; | 5 'use strict'; |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * A class that takes care of communication with NaCL and creates an archive. | 8 * A class that takes care of communication with NaCL and creates an archive. |
| 9 * One instance of this class is created for each pack request. Since multiple | 9 * One instance of this class is created for each pack request. Since multiple |
| 10 * compression requests can be in progress at the same time, each instance has | 10 * compression requests can be in progress at the same time, each instance has |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 | 282 |
| 283 var entryId = this.pendingAddToArchiveRequests_.shift(); | 283 var entryId = this.pendingAddToArchiveRequests_.shift(); |
| 284 this.entryIdInProgress_ = entryId; | 284 this.entryIdInProgress_ = entryId; |
| 285 | 285 |
| 286 // Convert the absolute path on the virtual filesystem to a relative path from | 286 // Convert the absolute path on the virtual filesystem to a relative path from |
| 287 // the archive root by removing the leading '/' if exists. | 287 // the archive root by removing the leading '/' if exists. |
| 288 var fullPath = this.entries_[entryId].fullPath; | 288 var fullPath = this.entries_[entryId].fullPath; |
| 289 if (fullPath.length && fullPath[0] == '/') | 289 if (fullPath.length && fullPath[0] == '/') |
| 290 fullPath = fullPath.substring(1); | 290 fullPath = fullPath.substring(1); |
| 291 | 291 |
| 292 // Modification time is sent as string in a format: 'mm/dd/yy hh:mm:ss'. | 292 // Modification time is set to the archive in local time. |
| 293 var mt = this.metadata_[entryId].modificationTime; | 293 var utc = this.metadata_[entryId].modificationTime; |
| 294 var formattedTime = (mt.getMonth() + 1) + '/' + mt.getDate() + '/' + | 294 var modificationTime = utc.getTime() - (utc.getTimezoneOffset() * 60000); |
| 295 mt.getFullYear() + ' ' + mt.getHours() + ':' + | |
| 296 mt.getMinutes() + ':' + mt.getSeconds(); | |
| 297 | 295 |
| 298 var request = unpacker.request.createAddToArchiveRequest( | 296 var request = unpacker.request.createAddToArchiveRequest( |
| 299 this.compressorId_, entryId, fullPath, | 297 this.compressorId_, entryId, fullPath, |
| 300 this.metadata_[entryId].size, formattedTime, | 298 this.metadata_[entryId].size, modificationTime, |
| 301 this.entries_[entryId].isDirectory); | 299 this.entries_[entryId].isDirectory); |
| 302 this.naclModule_.postMessage(request); | 300 this.naclModule_.postMessage(request); |
| 303 } | 301 } |
| 304 | 302 |
| 305 /** | 303 /** |
| 306 * Sends a close archive request to libarchive. libarchive writes metadata of | 304 * Sends a close archive request to libarchive. libarchive writes metadata of |
| 307 * the archive itself on the archive and releases objects obtainted in the | 305 * the archive itself on the archive and releases objects obtainted in the |
| 308 * packing process. | 306 * packing process. |
| 309 */ | 307 */ |
| 310 unpacker.Compressor.prototype.sendCloseArchiveRequest = function(hasError) { | 308 unpacker.Compressor.prototype.sendCloseArchiveRequest = function(hasError) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 388 readFileChunk(); | 386 readFileChunk(); |
| 389 } | 387 } |
| 390 | 388 |
| 391 /** | 389 /** |
| 392 * A handler of write chunk requests. | 390 * A handler of write chunk requests. |
| 393 * Writes the data in the given buffer onto the archive file. | 391 * Writes the data in the given buffer onto the archive file. |
| 394 * @param {!Object} data | 392 * @param {!Object} data |
| 395 * @private | 393 * @private |
| 396 */ | 394 */ |
| 397 unpacker.Compressor.prototype.onWriteChunk_ = function(data) { | 395 unpacker.Compressor.prototype.onWriteChunk_ = function(data) { |
| 396 var offset = Number(data[unpacker.request.Key.OFFSET]); |
| 398 var length = Number(data[unpacker.request.Key.LENGTH]); | 397 var length = Number(data[unpacker.request.Key.LENGTH]); |
| 399 var buffer = data[unpacker.request.Key.CHUNK_BUFFER]; | 398 var buffer = data[unpacker.request.Key.CHUNK_BUFFER]; |
| 400 this.writeChunk_(length, buffer, this.sendWriteChunkDone_.bind(this)); | 399 this.writeChunk_(offset, length, buffer, this.sendWriteChunkDone_.bind(this)); |
| 401 } | 400 } |
| 402 | 401 |
| 403 /** | 402 /** |
| 404 * Writes buffer into the archive file (window.archiveFileEntry). | 403 * Writes buffer into the archive file (window.archiveFileEntry). |
| 404 * @param {number} offset The offset from which date is written. |
| 405 * @param {number} length The number of bytes in the buffer to write. | 405 * @param {number} length The number of bytes in the buffer to write. |
| 406 * @param {!ArrayBuffer} buffer The buffer to write in the archive. | 406 * @param {!ArrayBuffer} buffer The buffer to write in the archive. |
| 407 * @param {function(number)} callback Callback to execute at the end of the | 407 * @param {function(number)} callback Callback to execute at the end of the |
| 408 * function. This function has one parameter: length, which represents the | 408 * function. This function has one parameter: length, which represents the |
| 409 * length of bytes written on to the archive. If writing a chunk fails, | 409 * length of bytes written on to the archive. If writing a chunk fails, |
| 410 * a negative value must be assigned to this argument. | 410 * a negative value must be assigned to this argument. |
| 411 * @private | 411 * @private |
| 412 */ | 412 */ |
| 413 unpacker.Compressor.prototype.writeChunk_ = function(length, buffer, | 413 unpacker.Compressor.prototype.writeChunk_ = function(offset, length, buffer, |
| 414 callback) { | 414 callback) { |
| 415 // TODO(takise): Use the same instance of FileWriter over multiple calls of | 415 // TODO(takise): Use the same instance of FileWriter over multiple calls of |
| 416 // this function instead of creating new ones. | 416 // this function instead of creating new ones. |
| 417 this.archiveFileEntry_.createWriter(function(fileWriter) { | 417 this.archiveFileEntry_.createWriter(function(fileWriter) { |
| 418 fileWriter.onwriteend = function(event) { | 418 fileWriter.onwriteend = function(event) { |
| 419 callback(length); | 419 callback(length); |
| 420 }; | 420 }; |
| 421 | 421 |
| 422 fileWriter.onerror = function(event) { | 422 fileWriter.onerror = function(event) { |
| 423 console.error('Failed to write chunk to ' + this.archiveFileEntry_ + '.'); | 423 console.error('Failed to write chunk to ' + this.archiveFileEntry_ + '.'); |
| 424 | 424 |
| 425 // If the first argument(length) is negative, it means that an error | 425 // If the first argument(length) is negative, it means that an error |
| 426 // occurred in writing a chunk. | 426 // occurred in writing a chunk. |
| 427 callback(-1 /* length */); | 427 callback(-1 /* length */); |
| 428 this.onError_(this.compressorId_); | 428 this.onError_(this.compressorId_); |
| 429 }; | 429 }; |
| 430 | 430 |
| 431 // Create a new Blob and append it to the archive file. | 431 // Create a new Blob and append it to the archive file. |
| 432 var blob = new Blob([buffer], {}); | 432 var blob = new Blob([buffer], {}); |
| 433 fileWriter.seek(fileWriter.length); | 433 fileWriter.seek(offset); |
| 434 fileWriter.write(blob); | 434 fileWriter.write(blob); |
| 435 }, function(event) { | 435 }, function(event) { |
| 436 console.error('Failed to create writer for ' + this.archiveFileEntry_ + | 436 console.error('Failed to create writer for ' + this.archiveFileEntry_ + |
| 437 '.'); | 437 '.'); |
| 438 this.onError_(this.compressorId_); | 438 this.onError_(this.compressorId_); |
| 439 }); | 439 }); |
| 440 }; | 440 }; |
| 441 | 441 |
| 442 /** | 442 /** |
| 443 * Sends a write chunk done response. | 443 * Sends a write chunk done response. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 ': ' + data[unpacker.request.Key.ERROR]); // The error contains | 507 ': ' + data[unpacker.request.Key.ERROR]); // The error contains |
| 508 // the '.' at the end. | 508 // the '.' at the end. |
| 509 this.onError_(this.compressorId_); | 509 this.onError_(this.compressorId_); |
| 510 break; | 510 break; |
| 511 | 511 |
| 512 default: | 512 default: |
| 513 console.error('Invalid NaCl operation: ' + operation + '.'); | 513 console.error('Invalid NaCl operation: ' + operation + '.'); |
| 514 this.onError_(this.compressorId_); | 514 this.onError_(this.compressorId_); |
| 515 } | 515 } |
| 516 }; | 516 }; |
| OLD | NEW |