浏览代码

Implement the Tar operation

toby 8 年之前
父节点
当前提交
442dd560c0
共有 1 个文件被更改,包括 108 次插入2 次删除
  1. 108 2
      src/js/operations/Compress.js

+ 108 - 2
src/js/operations/Compress.js

@@ -364,8 +364,114 @@ var Compress = {
      * @returns {byteArray}
      * @returns {byteArray}
      */
      */
     runTar: function(input, args) {
     runTar: function(input, args) {
-        // Not implemented yet
-        return input;
+        var zeroFillBytes = function(string, bytes) {
+            var paddedString = new Array(bytes);
+            paddedString.fill(0);
+
+            string = string.toString().slice(0, bytes);
+            Array.prototype.map.call(string, function(chr, i) {
+                paddedString[i] = chr;
+            });
+
+            return paddedString;
+        };
+
+        var padLeft = function(string, length, padChar) {
+            while(string.length < length) {
+                string = padChar + string;
+            }
+            return string;
+        };
+
+        var Tarball = function() {
+            this.bytes = new Array(512);
+            this.position = 0;
+        };
+
+        Tarball.prototype.writeBytes = function(bytes) {
+            var self = this;
+
+            if(this.bytes.length - this.position < 512) {
+                var filler = new Array(512);
+                filler.fill(0);
+                this.bytes = this.bytes.concat(filler);
+            }
+
+            Array.prototype.forEach.call(bytes, function(b, i) {
+                if(typeof b.charCodeAt !== "undefined") {
+                    b = b.charCodeAt();
+                }
+
+                self.bytes[self.position] = b;
+                self.position += 1;
+            });
+        };
+
+        Tarball.prototype.writeEndBlocks = function() {
+            var filler = new Array(512 * 1);
+            filler.fill(0);
+            this.writeBytes(filler);
+        };
+
+        var fileSize = padLeft(input.length.toString(8), 11, "0");
+        var currentUnixTimestamp = Math.floor(Date.now() / 1000);
+        var lastModTime = padLeft(currentUnixTimestamp.toString(8), 11, "0");
+
+        var file = {
+            fileName: zeroFillBytes(args[0], 100),
+            fileMode: zeroFillBytes("0000664", 8),
+            ownerUID: zeroFillBytes("0", 8),
+            ownerGID: zeroFillBytes("0", 8),
+            size: zeroFillBytes(fileSize, 12),
+            lastModTime: zeroFillBytes(lastModTime, 12),
+            checksum: "        ",
+            type: "0",
+            linkedFileName: zeroFillBytes("", 100),
+            USTARFormat: zeroFillBytes("ustar", 6),
+            version: "00",
+            ownerUserName: zeroFillBytes("", 32),
+            ownerGroupName: zeroFillBytes("", 32),
+            deviceMajor: zeroFillBytes("", 8),
+            deviceMinor: zeroFillBytes("", 8),
+            fileNamePrefix: zeroFillBytes("", 155),
+        };
+
+        var checksum = 0;
+        for(var key in file) {
+            var bytes = file[key];
+            Array.prototype.forEach.call(bytes, function(b) {
+                if(typeof b.charCodeAt !== "undefined") {
+                    checksum += b.charCodeAt();
+                } else {
+                    checksum += b;
+                }
+            });
+        }
+        checksum = zeroFillBytes(padLeft(checksum.toString(8), 7, "0"), 8);
+        file.checksum = checksum;
+
+        var tarball = new Tarball();
+        tarball.writeBytes(file.fileName);
+        tarball.writeBytes(file.fileMode);
+        tarball.writeBytes(file.ownerUID);
+        tarball.writeBytes(file.ownerGID);
+        tarball.writeBytes(file.size);
+        tarball.writeBytes(file.lastModTime);
+        tarball.writeBytes(file.checksum);
+        tarball.writeBytes(file.type);
+        tarball.writeBytes(file.linkedFileName);
+        tarball.writeBytes(file.USTARFormat);
+        tarball.writeBytes(file.version);
+        tarball.writeBytes(file.ownerUserName);
+        tarball.writeBytes(file.ownerGroupName);
+        tarball.writeBytes(file.deviceMajor);
+        tarball.writeBytes(file.deviceMinor);
+        tarball.writeBytes(file.fileNamePrefix);
+        tarball.writeBytes(zeroFillBytes("", 12));
+        tarball.writeBytes(input);
+        tarball.writeEndBlocks();
+
+        return tarball.bytes;
     },
     },