matroska
Version:
Matroska node parser
101 lines (75 loc) • 1.88 kB
JavaScript
/*jslint node: true, vars: true, nomen: true */
;
var fs = require('fs');
var util = require('util');
var debug = require('debug')('matroska:fileSource');
var AbstractSource = require('./abstractSource');
var fileSourceKey = 0;
function FileSource(filename) {
AbstractSource.call(this);
this.filename = filename;
}
util.inherits(FileSource, AbstractSource);
module.exports = FileSource;
/**
* @private
* @param callback
*/
FileSource.prototype.getStream = function(session, options, callback) {
switch (arguments.length) {
case 1:
callback = session;
session = null;
break;
case 2:
callback = options;
options = null;
break;
}
session = session || {};
session.$fileSourceKey=fileSourceKey++;
var fd = session._fd;
if (fd) {
var params = {
flags: 'r',
fd: fd,
autoClose: false
};
if (typeof (options.start) === "number") {
params.start = options.start;
}
if (typeof (options.end) === "number") {
params.end = options.end;
}
debug("GetStream", params, " fd=", session._fd);
var stream = fs.createReadStream(this.filename, params);
stream.destroy = function() {
// Disable destory, because it will close fd !
};
return callback(null, stream);
}
var self = this;
fs.open(this.filename, 'r', function(error, fd) {
if (error) {
return callback(error);
}
session._fd = fd;
self.getStream(session, options, callback);
});
};
/**
* @private
*/
FileSource.prototype._end = function(session, callback) {
debug("Close", session._fd);
if (!session._fd) {
return callback();
}
fs.close(session._fd, function(error) {
delete session._fd;
return callback(error);
});
};
FileSource.prototype.toString = function() {
return "[FileSource file=" + this.filename + "]";
};