Skip to content

Commit

Permalink
Modify relative path only when HasRelativePath is true
Browse files Browse the repository at this point in the history
  • Loading branch information
shresthagrawal committed Apr 22, 2020
1 parent 98ba539 commit 5825731
Show file tree
Hide file tree
Showing 6 changed files with 229 additions and 21 deletions.
14 changes: 14 additions & 0 deletions build/lib/fileref-data/fileref-data.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export declare class FilerefData {
systemName: string;
location: string;
format: string;
constructor(systemName: string, location: string, format: string);
getFileName(): string;
getDir(): string;
getLocation(delminator: string): string;
getSystemName(): string;
getFormat(): string;
setLocation(location: string): void;
}
export declare function unmarshall(stream: string): FilerefData;
export declare function marshall(data: FilerefData): string;
140 changes: 140 additions & 0 deletions build/lib/fileref-data/fileref-data.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
var path_1 = __importDefault(require("path"));
var utils_1 = require("./utils");
var FilerefData = /** @class */ (function () {
function FilerefData(systemName, location, format) {
this.systemName = systemName;
this.location = location;
this.format = format;
}
FilerefData.prototype.getFileName = function () {
return path_1.default.parse(this.location).base;
};
FilerefData.prototype.getDir = function () {
return path_1.default.basename(path_1.default.dirname(this.location));
};
FilerefData.prototype.getLocation = function (delminator) {
return this.location.split(path_1.default.sep).join(delminator);
};
FilerefData.prototype.getSystemName = function () {
return this.systemName;
};
FilerefData.prototype.getFormat = function () {
return this.format;
};
FilerefData.prototype.setLocation = function (location) {
this.location = location;
};
return FilerefData;
}());
exports.FilerefData = FilerefData;
function unmarshall(stream) {
// Leave the first 8 as padding
var cntr = 8;
// 8 to 12 as the total length, 2 padding
var totalLength = utils_1.hex2dec(stream.substr(cntr, 4));
cntr += 6;
// 14 to 20 Unknown
cntr += 6;
// 20 to 22 length of System Name
var systemNameLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next 62 as System Name
var systemName = utils_1.hex2ascii(stream.substr(cntr, systemNameLength * 2));
cntr += 62;
// Next 8 unknown
cntr += 8;
// Next 16 padding with FFFFFFFF
cntr += 8;
// 20 to 22 length of File Name
var fileNameLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next 126 as System Name
var fileName = utils_1.hex2ascii(stream.substr(cntr, fileNameLength * 2));
cntr += 126;
// Next 16 as padding FFFFFFFF00000000
cntr += 16;
// Next 8 file format
var format = utils_1.hex2ascii(stream.substr(cntr, 8));
cntr += 8;
// Next 16 as padding FFFFFFFF00000000
cntr += 16;
// Next 38 unknown
cntr += 38;
// Next 2 dir name length
var dirNameLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next dirNameLength as Directory Name
var dirName = utils_1.hex2ascii(stream.substr(cntr, dirNameLength * 2));
cntr += dirNameLength * 2;
// Weird padding based on odd or even
cntr += dirNameLength % 2 == 0 ? 2 : 4;
// Next 4 unknown
cntr += 4;
// Next 2 location length
var locationLength = utils_1.hex2dec(stream.substr(cntr, 2));
cntr += 2;
// Next locationLength as Location
var locationRaw = utils_1.hex2ascii(stream.substr(cntr, locationLength * 2));
cntr += locationLength * 2;
var location = locationRaw.substr(2).split(':').join('/');
return new FilerefData(systemName, location, format);
}
exports.unmarshall = unmarshall;
function marshall(data) {
// Starting 8 Padding, 4 total length, 6 unknown
var stream = '00000000000000020000';
// 1 size, 63 system name
stream += utils_1.dec2hex(data.getSystemName().length);
stream += utils_1.ascii2hex(data.getSystemName()).padEnd(62, '0');
// Unknown 8, buffer 8
stream += '42440001FFFFFFFF';
// 1 size, 126 file name
stream += utils_1.dec2hex(data.getFileName().length);
stream += utils_1.ascii2hex(data.getFileName()).padEnd(126, '0');
// 16 padding
stream += 'FFFFFFFF00000000';
// 8 fileformat
stream += utils_1.ascii2hex(data.getFormat());
// 16 padding
stream += '00000000FFFFFFFF';
// 38 Unknown
stream += '00000A20637500000000000000000000000000';
// 1 size, 63 dir name, weird padding based on length
stream += utils_1.dec2hex(data.getDir().length);
stream += utils_1.ascii2hex(data.getDir());
stream += utils_1.lenPad(data.getDir().length);
// Unknown 4
stream += '0200';
// length + 2, location with delminator :
stream += utils_1.dec2hex(data.getLocation(':').length + 2);
stream += utils_1.ascii2hex('/:' + data.getLocation(':'));
stream += utils_1.lenPad(data.getLocation(':').length);
// Unknown 4
stream += '0E00';
// length of the file name with padding and length header (12*2 + 2 = 26), 2 padding
stream += utils_1.dec2hex((data.getFileName().length * 2) + 2) + '00';
stream += utils_1.dec2hex(data.getFileName().length) + '00';
stream += utils_1.ascii2hex(data.getFileName().split('').join('\0')) + '00';
// Unknown 4
stream += '0F00';
// length of the system name with padding and length header (12*2 + 2 = 26), 2 padding
stream += utils_1.dec2hex((data.getSystemName().length * 2) + 2) + '00';
stream += utils_1.dec2hex(data.getSystemName().length) + '00';
stream += utils_1.ascii2hex(data.getSystemName().split('').join('\0')) + '00';
// Unknown 4
stream += '1200';
stream += utils_1.dec2hex(data.getLocation('/').length);
stream += utils_1.ascii2hex(data.getLocation('/'));
stream += utils_1.lenPad(data.getLocation('/').length);
// Unknwon end
stream += '1300012F00001500020015FFFF0000';
var lenStr = utils_1.dec2hex(stream.length / 2);
stream = utils_1.replaceAt(stream, lenStr, 8);
return stream;
}
exports.marshall = marshall;
6 changes: 6 additions & 0 deletions build/lib/fileref-data/utils.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export declare function ascii2hex(str: string): string;
export declare function hex2ascii(hex: string): string;
export declare function hex2dec(hex: string): number;
export declare function dec2hex(dec: number): string;
export declare function lenPad(len: number): "00" | "0000";
export declare function replaceAt(str: string, rep: string, index: number): string;
44 changes: 44 additions & 0 deletions build/lib/fileref-data/utils.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function ascii2hex(str) {
var hex = '';
for (var _i = 0, str_1 = str; _i < str_1.length; _i++) {
var char = str_1[_i];
var res = char.charCodeAt(0).toString(16);
hex += res == '0' ? '00' : res;
}
return hex.toUpperCase();
}
exports.ascii2hex = ascii2hex;
function hex2ascii(hex) {
var str = '';
for (var i = 0; i < hex.length; i += 2) {
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
}
return str;
}
exports.hex2ascii = hex2ascii;
function hex2dec(hex) {
return parseInt(hex, 16);
}
exports.hex2dec = hex2dec;
function dec2hex(dec) {
var hex = dec.toString(16).toUpperCase();
if (hex.length % 2 == 1)
return '0' + hex;
else
return hex;
}
exports.dec2hex = dec2hex;
function lenPad(len) {
return len % 2 == 0 ? '00' : '0000';
}
exports.lenPad = lenPad;
function replaceAt(str, rep, index) {
var arr = str.split('');
for (var i = 0; i < rep.length; i++) {
arr[index + i] = rep[i];
}
return arr.join('');
}
exports.replaceAt = replaceAt;
24 changes: 13 additions & 11 deletions build/lib/fileref/fileref.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,19 @@ var Fileref = /** @class */ (function () {
// Update the Relative path
var projectFolder = path_1.default.parse(project).dir;
var relativePathArray = path_1.default.relative(projectFolder, resourceFolder).split(path_1.default.sep);
this.fileref.RelativePath[0].RelativePathElement = [];
for (var index in relativePathArray) {
if (relativePathArray[index] == "..")
relativePathArray[index] = '';
var obj = {
'$': {
Id: index.toString(),
Dir: relativePathArray[index]
}
};
this.fileref.RelativePath[0].RelativePathElement.push(obj);
if (this.fileref.HasRelativePath[0]['$'].Value === "true") {
this.fileref.RelativePath[0].RelativePathElement = [];
for (var index in relativePathArray) {
if (relativePathArray[index] == "..")
relativePathArray[index] = '';
var obj = {
'$': {
Id: index.toString(),
Dir: relativePathArray[index]
}
};
this.fileref.RelativePath[0].RelativePathElement.push(obj);
}
}
this.fileref.LivePackName[0]['$'].Value = '';
this.fileref.LivePackId[0]['$'].Value = '';
Expand Down
22 changes: 12 additions & 10 deletions lib/fileref/fileref.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,18 @@ export class Fileref {
// Update the Relative path
let projectFolder = path.parse(project).dir;
let relativePathArray = path.relative(projectFolder, resourceFolder).split(path.sep);
this.fileref.RelativePath[0].RelativePathElement = [];
for (let index in relativePathArray) {
if (relativePathArray[index] == "..") relativePathArray[index] = '';
let obj = {
'$': {
Id: index.toString(),
Dir: relativePathArray[index]
}
};
this.fileref.RelativePath[0].RelativePathElement.push(obj);
if (this.fileref.HasRelativePath[0]['$'].Value === "true") {
this.fileref.RelativePath[0].RelativePathElement = [];
for (let index in relativePathArray) {
if (relativePathArray[index] == "..") relativePathArray[index] = '';
let obj = {
'$': {
Id: index.toString(),
Dir: relativePathArray[index]
}
};
this.fileref.RelativePath[0].RelativePathElement.push(obj);
}
}
this.fileref.LivePackName[0]['$'].Value = '';
this.fileref.LivePackId[0]['$'].Value = '';
Expand Down

0 comments on commit 5825731

Please sign in to comment.