Explorar o código

added fileTime

Nicolas Cannasse %!s(int64=17) %!d(string=hai) anos
pai
achega
eb5a14e18b
Modificáronse 1 ficheiros con 20 adicións e 3 borrados
  1. 20 3
      std/neko/zip/File.hx

+ 20 - 3
std/neko/zip/File.hx

@@ -27,6 +27,7 @@ package neko.zip;
 typedef ZipEntry = {
 typedef ZipEntry = {
 	var fileName : String;
 	var fileName : String;
 	var fileSize : Int;
 	var fileSize : Int;
+	var fileTime : Date;
 	var compressed : Bool;
 	var compressed : Bool;
 	var compressedSize : Int;
 	var compressedSize : Int;
 	var data : String;
 	var data : String;
@@ -48,6 +49,18 @@ class File {
 		return s;
 		return s;
 	}
 	}
 
 
+	static function readZipDate( i : neko.io.Input ) {
+		var t = i.readUInt16();
+		var hour = (t >> 11) & 31;
+		var min = (t >> 5) & 63;
+		var sec = t & 31;
+		var d = i.readUInt16();
+		var year = d >> 9;
+		var month = (d >> 5) & 15;
+		var day = d & 31;
+		return new Date(year + 1980, month-1, day, hour, min, sec);
+	}
+
 	public static function readZipEntry( i : neko.io.Input ) : ZipEntry {
 	public static function readZipEntry( i : neko.io.Input ) : ZipEntry {
 		var h = i.readInt32();
 		var h = i.readInt32();
 		if( h == 0x02014B50 || h == 0x06054B50 )
 		if( h == 0x02014B50 || h == 0x06054B50 )
@@ -63,8 +76,7 @@ class File {
 		var compressed = (compression != 0);
 		var compressed = (compression != 0);
 		if( compressed && compression != 8 )
 		if( compressed && compression != 8 )
 			throw "Unsupported compression "+compression;
 			throw "Unsupported compression "+compression;
-		var lastmodTime = i.readUInt16();
-		var lastmodDate = i.readUInt16();
+		var mtime = readZipDate(i);
 		var crc32 = i.read(4);
 		var crc32 = i.read(4);
 		var csize = i.readInt32();
 		var csize = i.readInt32();
 		var usize = i.readInt32();
 		var usize = i.readInt32();
@@ -84,6 +96,7 @@ class File {
 		return {
 		return {
 			fileName : fname,
 			fileName : fname,
 			fileSize : usize,
 			fileSize : usize,
+			fileTime : mtime,
 			compressed : compressed,
 			compressed : compressed,
 			compressedSize : csize,
 			compressedSize : csize,
 			data : data,
 			data : data,
@@ -119,6 +132,7 @@ class File {
 			l.add({
 			l.add({
 				fileName : e.fileName,
 				fileName : e.fileName,
 				fileSize : e.fileSize,
 				fileSize : e.fileSize,
+				fileTime : e.fileTime,
 				compressed : false,
 				compressed : false,
 				compressedSize : e.fileSize,
 				compressedSize : e.fileSize,
 				data : data,
 				data : data,
@@ -213,7 +227,9 @@ class File {
 		var uid = parseOctal(i.read(8));
 		var uid = parseOctal(i.read(8));
 		var gid = parseOctal(i.read(8));
 		var gid = parseOctal(i.read(8));
 		var fsize = parseOctal(i.read(12));
 		var fsize = parseOctal(i.read(12));
-		var mtime = i.read(12);
+		// read in two parts in order to prevent overflow
+		var mtime : Float = parseOctal(i.read(8));
+		mtime = mtime * 512.0 + parseOctal(i.read(4));
 		var crc = i.read(8);
 		var crc = i.read(8);
 		var type = i.readChar();
 		var type = i.readChar();
 		var lname = i.readUntil(0);
 		var lname = i.readUntil(0);
@@ -234,6 +250,7 @@ class File {
 		return {
 		return {
 			fileName : fname,
 			fileName : fname,
 			fileSize : fsize,
 			fileSize : fsize,
+			fileTime : Date.fromTime(mtime * 1000.0),
 		};
 		};
 	}
 	}