mirror of
https://git.fuwafuwa.moe/SMLoadrDev/SMLoadr
synced 2024-11-16 20:04:33 +01:00
132 lines
3.7 KiB
JavaScript
132 lines
3.7 KiB
JavaScript
var util = require("util");
|
|
var MetaDataBlock = require("./MetaDataBlock");
|
|
|
|
var MetaDataBlockPicture = module.exports = function(isLast) {
|
|
MetaDataBlock.call(this, isLast, 6);
|
|
|
|
this.pictureType = 0;
|
|
this.mimeType = "";
|
|
this.description = "";
|
|
this.width = 0;
|
|
this.height = 0;
|
|
this.bitsPerPixel = 0;
|
|
this.colors = 0;
|
|
this.pictureData = null;
|
|
}
|
|
|
|
util.inherits(MetaDataBlockPicture, MetaDataBlock);
|
|
|
|
MetaDataBlockPicture.create = function(isLast, pictureType, mimeType, description, width, height, bitsPerPixel, colors, pictureData) {
|
|
var mdb = new MetaDataBlockPicture(isLast);
|
|
mdb.pictureType = pictureType;
|
|
mdb.mimeType = mimeType;
|
|
mdb.description = description;
|
|
mdb.width = width;
|
|
mdb.height = height;
|
|
mdb.bitsPerPixel = bitsPerPixel;
|
|
mdb.colors = colors;
|
|
mdb.pictureData = pictureData;
|
|
mdb.hasData = true;
|
|
return mdb;
|
|
}
|
|
|
|
MetaDataBlockPicture.prototype.parse = function(buffer) {
|
|
try {
|
|
|
|
var pos = 0;
|
|
|
|
this.pictureType = buffer.readUInt32BE(pos);
|
|
pos += 4;
|
|
|
|
var mimeTypeLength = buffer.readUInt32BE(pos);
|
|
this.mimeType = buffer.toString("utf8", pos + 4, pos + 4 + mimeTypeLength);
|
|
pos += 4 + mimeTypeLength;
|
|
|
|
var descriptionLength = buffer.readUInt32BE(pos);
|
|
this.description = buffer.toString("utf8", pos + 4, pos + 4 + descriptionLength);
|
|
pos += 4 + descriptionLength;
|
|
|
|
this.width = buffer.readUInt32BE(pos);
|
|
this.height = buffer.readUInt32BE(pos + 4);
|
|
this.bitsPerPixel = buffer.readUInt32BE(pos + 8);
|
|
this.colors = buffer.readUInt32BE(pos + 12);
|
|
pos += 16;
|
|
|
|
var pictureDataLength = buffer.readUInt32BE(pos);
|
|
this.pictureData = new Buffer(pictureDataLength);
|
|
buffer.copy(this.pictureData, 0, pos + 4, pictureDataLength);
|
|
|
|
this.hasData = true;
|
|
|
|
}
|
|
catch (e) {
|
|
this.error = e;
|
|
this.hasData = false;
|
|
}
|
|
}
|
|
|
|
MetaDataBlockPicture.prototype.publish = function() {
|
|
var pos = 0;
|
|
var size = this.getSize();
|
|
var buffer = new Buffer(4 + size);
|
|
|
|
var header = size;
|
|
header |= (this.type << 24);
|
|
header |= (this.isLast ? 0x80000000 : 0);
|
|
buffer.writeUInt32BE(header >>> 0, pos);
|
|
pos += 4;
|
|
|
|
buffer.writeUInt32BE(this.pictureType, pos);
|
|
pos += 4;
|
|
|
|
var mimeTypeLen = Buffer.byteLength(this.mimeType);
|
|
buffer.writeUInt32BE(mimeTypeLen, pos);
|
|
buffer.write(this.mimeType, pos + 4);
|
|
pos += 4 + mimeTypeLen;
|
|
|
|
var descriptionLen = Buffer.byteLength(this.description);
|
|
buffer.writeUInt32BE(descriptionLen, pos);
|
|
buffer.write(this.description, pos + 4);
|
|
pos += 4 + descriptionLen;
|
|
|
|
buffer.writeUInt32BE(this.width, pos);
|
|
buffer.writeUInt32BE(this.height, pos + 4);
|
|
buffer.writeUInt32BE(this.bitsPerPixel, pos + 8);
|
|
buffer.writeUInt32BE(this.colors, pos + 12);
|
|
pos += 16;
|
|
|
|
buffer.writeUInt32BE(this.pictureData.length, pos);
|
|
this.pictureData.copy(buffer, pos + 4);
|
|
|
|
return buffer;
|
|
}
|
|
|
|
MetaDataBlockPicture.prototype.getSize = function() {
|
|
var size = 4;
|
|
size += 4 + Buffer.byteLength(this.mimeType);
|
|
size += 4 + Buffer.byteLength(this.description);
|
|
size += 16;
|
|
size += 4 + this.pictureData.length;
|
|
return size;
|
|
}
|
|
|
|
MetaDataBlockPicture.prototype.toString = function() {
|
|
var str = "[MetaDataBlockPicture]";
|
|
str += " type: " + this.type;
|
|
str += ", isLast: " + this.isLast;
|
|
if (this.error) {
|
|
str += "\n ERROR: " + this.error;
|
|
}
|
|
if (this.hasData) {
|
|
str += "\n pictureType: " + this.pictureType;
|
|
str += "\n mimeType: " + this.mimeType;
|
|
str += "\n description: " + this.description;
|
|
str += "\n width: " + this.width;
|
|
str += "\n height: " + this.height;
|
|
str += "\n bitsPerPixel: " + this.bitsPerPixel;
|
|
str += "\n colors: " + this.colors;
|
|
str += "\n pictureData: " + (this.pictureData ? this.pictureData.length : "<null>");
|
|
}
|
|
return str;
|
|
}
|