Skip to content

Commit 22e5f06

Browse files
committed
Merge pull request #14 from TeskeVirtualSystem/JPK2Loader
Jpk2 loader
2 parents 2efaed6 + 19d83f3 commit 22e5f06

10 files changed

Lines changed: 154 additions & 20 deletions

File tree

jssrc/alpha.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ var JPAK = {
6969
/**
7070
* Clean all deletedValue from array
7171
*/
72-
Array.prototype.clean = function(deleteValue) {
73-
for (var i = 0; i < this.length; i++) {
74-
if (this[i] === deleteValue) {
75-
this.splice(i, 1);
72+
JPAK.Tools.cleanArray = function(array, deleteValue) {
73+
for (var i = 0; i < array.length; i++) {
74+
if (array[i] === deleteValue) {
75+
array.splice(i, 1);
7676
i--;
7777
}
7878
}
79-
return this;
79+
return array;
8080
};
8181

8282
/*

jssrc/directory-entry.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7575
JPKDirectoryEntry.prototype.addFile = function(filepath, jds, normalizeName) {
7676
console.log(" Adding "+(normalizeName ? path.basename(filepath) : filepath)+" to "+this.name);
7777
var addedData = jds.addFromFile(filepath);
78-
this.files[path.basename(filepath)] = new JPAK.Classes.JPKFileEntry(path.basename(filepath), normalizeName ? path.basename(filepath) : filepath, addedData.offset, addedData.size, "", false, jds.name);
78+
this.files[path.basename(filepath)] = new JPAK.Classes.JPKFileEntry(path.basename(filepath), normalizeName ? path.basename(filepath) : filepath, addedData[0], addedData[1], "", false, jds.name);
7979
this.numfiles++;
8080
};
8181

jssrc/jds.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7676
while ( c < size ) {
7777
var chunk = size - c > this.CHUNK ? this.CHUNK : size - c;
7878
fs.readSync(newFd, data, 0, chunk);
79-
fs.writeSync(this.fd, data, 0, chunk);
79+
fs.writeSync(this.fd, data, 0, chunk, this.currentPosition);
8080
c += chunk;
8181
this.currentPosition += chunk;
8282
}

jssrc/jms.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
9191
var u8 = new Uint8Array(buffer);
9292
var dv = new DataView(buffer);
9393

94-
dv.setUint32(buffer.byteLength-16, this.producerId);
95-
dv.setUint32(buffer.byteLength-12, this.flags);
96-
dv.setUint32(buffer.byteLength-8, this.userflags);
94+
dv.setUint32(buffer.byteLength-16, this.producerId, true);
95+
dv.setUint32(buffer.byteLength-12, this.flags, true);
96+
dv.setUint32(buffer.byteLength-8, this.userflags, true);
9797

9898
u8.putString(this.MAGIC);
9999
var fileTableOffset = u8.putString(0xC, volumeTable);
100100
u8.putString(fileTableOffset, fileTable);
101-
dv.setUint32(buffer.byteLength-4, fileTableOffset);
101+
dv.setUint32(buffer.byteLength-4, fileTableOffset, true);
102102

103103
return buffer;
104104
};

jssrc/webloader.js

Lines changed: 92 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5353
};
5454

5555
Loader.prototype._proceedJMS1 = function() {
56-
var def = Q.defer();
56+
var _this = this;
5757
this.jpakType = "JMS";
58-
def.reject("TODO: Implement it!");
59-
60-
return def.promise;
58+
JPAK.Tools.d("JMS1 Format");
59+
return this._p_getFileSize().then(function(){return _this._p_jms1_loadFileTable();});
6160
};
6261

6362
Loader.prototype.checkMagic = function(magic) {
@@ -109,7 +108,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
109108
var base = this.fileTable;
110109
if(this.tableLoaded) {
111110
if(path !== "/") {
112-
path = path.split("/").clean("");
111+
path = JPAK.Tools.cleanArray(path.split("/"), "");
113112
var dir = "", ok = true;
114113
for(var i=0;i<path.length;i++) {
115114
dir = path[i];
@@ -132,7 +131,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
132131
* Returns null if not found
133132
*/
134133
Loader.prototype.findFileEntry = function(path) {
135-
var pathblock = path.split("/").clean("");
134+
var pathblock = JPAK.Tools.cleanArray(path.split("/"), "");
136135
var filename = pathblock[pathblock.length-1];
137136
path = path.replace(filename,"");
138137
var base = this.findDirectoryEntry(path);
@@ -168,7 +167,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
168167

169168
switch (this.jpakType) {
170169
case "JPAK1": return this._p_jpak1_getFileBlob(path, type);
171-
case "JMS": return this._p_jms_getFileBlob(path, type);
170+
case "JMS": return this._p_jms1_getFileBlob(path, type);
172171
default: def.reject("Not a valid jpak file!");
173172
}
174173

@@ -193,7 +192,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
193192

194193
switch (this.jpakType) {
195194
case "JPAK1": return this._p_jpak1_getFile(path, type);
196-
case "JMS": return this._p_jms_getFile(path, type);
195+
case "JMS": return this._p_jms1_getFile(path, type);
197196
default: def.reject("Not a valid jpak file!");
198197
}
199198

@@ -313,6 +312,91 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
313312
return def.promise;
314313
};
315314

315+
Loader.prototype._p_jms1_loadFileTable = function() {
316+
var _this = this;
317+
var tableOffsetLoader = new JPAK.Tools.DataLoader({
318+
url: this.jpakfile,
319+
partial: true,
320+
partialFrom: this.fileSize-4,
321+
partialTo: this.fileSize
322+
});
323+
324+
return tableOffsetLoader.start().then(function(data) {
325+
_this.fileTableOffset = new DataView(data).getUint32(0, true);
326+
var fileTableLoader = new JPAK.Tools.DataLoader({
327+
url: _this.jpakfile,
328+
partial: true,
329+
partialFrom: _this.fileTableOffset,
330+
partialTo: _this.fileSize - 16 -1
331+
});
332+
333+
return fileTableLoader.start();
334+
}).then(function(data) {
335+
data = (new Uint8Array(data)).asString();
336+
_this.fileTable = JSON.parse(data);
337+
_this.tableLoaded = true;
338+
339+
var volumeTableLoader = new JPAK.Tools.DataLoader({
340+
url: _this.jpakfile,
341+
partial: true,
342+
partialFrom: 0xC,
343+
partialTo: _this.fileTableOffset -1
344+
});
345+
346+
return volumeTableLoader.start();
347+
348+
}).then(function(data) {
349+
var def = Q.defer();
350+
data = (new Uint8Array(data)).asString();
351+
_this.volumeTable = JSON.parse(data);
352+
_this.volumeTableLoaded = true;
353+
def.resolve(_this.fileTable);
354+
return def.promise;
355+
});
356+
};
357+
358+
Loader.prototype._p_jms1_getFile = function(path, type) {
359+
var def = Q.defer();
360+
var file = this.findFileEntry(path);
361+
type = type || 'application/octet-binary';
362+
363+
if (file.volume in this.volumeTable) {
364+
var volumePath = this.volumeTable[file.volume].filename;
365+
var fileLoader = new JPAK.Tools.DataLoader({
366+
url: volumePath,
367+
partial: true,
368+
partialFrom: file.offset,
369+
partialTo: file.offset + file.size -1
370+
});
371+
372+
fileLoader.start().then(function(data) {
373+
if(file.compressed !== undefined && file.compressed)
374+
data = JPAK.Tools.GZ.decompress(data);
375+
def.resolve(data);
376+
}).fail(function(error) {
377+
def.reject(error);
378+
});
379+
} else {
380+
def.reject("Volume \""+file.volume+"\" not found!");
381+
}
382+
383+
return def.promise;
384+
};
385+
386+
Loader.prototype._p_jms1_getFileBlob = function(path, type) {
387+
var def = Q.defer();
388+
389+
this._p_jms1_getFile(path, type).then(function (data) {
390+
def.resolve(new Blob([new Uint8Array(data).buffer], {"type":type}));
391+
}).fail(function(error) {
392+
def.reject(error);
393+
});
394+
395+
return def.promise;
396+
};
397+
316398
JPAK.Loader = Loader;
317399
}
400+
401+
318402
})();
Binary file not shown.

test/packtest.jms

994 Bytes
Binary file not shown.

test/packtest.jpak

982 Bytes
Binary file not shown.

test/test_jms.html

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<html>
2+
<head>
3+
<title>Javascript Package Test V2</title>
4+
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
5+
<script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
6+
<script src="../dist/jpak.js"></script>
7+
<script>
8+
var packtest = new JPAK.Loader({"file" : "packtest.jms"});
9+
packtest.load().then(function() {
10+
// Lets load the HTML file
11+
packtest.getFile("/test.html", "text/html").then(function(data) {
12+
var reader = new FileReader();
13+
reader.onloadend = function(evt) {
14+
console.log("Loaded /test.html");
15+
$("body").append('<BR>/test.html:<BR><BR>'+evt.target.result);
16+
};
17+
reader.readAsText(data);
18+
});
19+
20+
// Lets load the Image File
21+
packtest.getFileURL("/img/python-logo-official.png", "image/png").then(function(data) {
22+
$("body").append('<BR>/img/python-logo-official.png: <BR><BR> <img src="'+data+'">');
23+
console.log("Loaded /img/python-logo-official.png");
24+
});
25+
26+
// Lets load the Javascript File
27+
packtest.getFile("/js/test.js", "text/html").then(function(data) {
28+
var reader = new FileReader();
29+
reader.onloadend = function(evt) {
30+
console.log("Loaded /js/test.js");
31+
eval(evt.target.result);
32+
};
33+
reader.readAsText(data);
34+
});
35+
}).catch(function (error) {
36+
console.error(error);
37+
});
38+
</script>
39+
</head>
40+
<body>
41+
<pre>
42+
_ ____ _ _ __
43+
| | _ \ / \ | |/ /
44+
_ | | |_) / _ \ | ' /
45+
| |_| | __/ ___ \| . \
46+
\___/|_| /_/ \_\_|\_\
47+
48+
</pre>
49+
</body>
50+
</html>

tools/extpacker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/nodejs
22

33
var fs = require("fs");
4-
var jpaktool = require("../dist/jpak.min").JPAK;
4+
var jpaktool = require("../dist/jpak").JPAK;
55
var fs = require("fs");
66
var path = require("path");
77

0 commit comments

Comments
 (0)