Commit 215cb2be authored by Julien Fontanet's avatar Julien Fontanet

feat(write): low level write method

parent 97a9273e
...@@ -4,9 +4,6 @@ var BigInt = require('../tools/bigint'); ...@@ -4,9 +4,6 @@ var BigInt = require('../tools/bigint');
var parseFlags = require('../tools/parse-flags'); var parseFlags = require('../tools/parse-flags');
var request = require('../tools/smb2-forge').request; var request = require('../tools/smb2-forge').request;
// Where does it come from?!
var maxPacketSize = 0x00010000 - 0x71;
module.exports = function createWriteStream(path, options, cb) { module.exports = function createWriteStream(path, options, cb) {
if (typeof options === 'function') { if (typeof options === 'function') {
cb = options; cb = options;
...@@ -31,7 +28,7 @@ module.exports = function createWriteStream(path, options, cb) { ...@@ -31,7 +28,7 @@ module.exports = function createWriteStream(path, options, cb) {
var close = request.bind(undefined, 'close', file, connection); var close = request.bind(undefined, 'close', file, connection);
function write(buffer, i, cb) { function write(buffer, i, cb) {
var j = i + maxPacketSize; var j = i + constants.MAX_WRITE_LENGTH;
var chunk = buffer.slice(i, j); var chunk = buffer.slice(i, j);
request( request(
'write', 'write',
......
var assert = require('assert');
var BigInt = require('../tools/bigint');
var request = require('../tools/smb2-forge').request;
var MAX_WRITE_LENGTH = require('../structures/constants').MAX_WRITE_LENGTH;
module.exports = function write(file, buffer, offset, length, start, cb) {
assert(Buffer.isBuffer(buffer));
if (offset === undefined) {
offset = 0;
} else {
assert(typeof offset === 'number');
assert(offset > 0);
assert(offset < buffer.length);
}
if (length === undefined) {
length = buffer.length - offset;
} else {
assert(typeof length === 'number');
assert(length > 0);
length = Math.min(length, buffer.length - offset);
}
assert(typeof start === 'number');
var connection = this;
var pos = start;
var chunkLength;
function onWrite(err) {
if (err != null) {
return cb(err, pos - start, buffer);
}
offset += chunkLength;
pos += chunkLength;
writeChunk();
}
function writeChunk() {
if (length <= 0) {
cb(null, length);
}
chunkLength = Math.min(MAX_WRITE_LENGTH, length);
request(
'write',
{
Buffer: buffer.slice(offset, offset + chunkLength),
FileId: file.FileId,
Offset: new BigInt(8, pos).toBuffer(),
},
connection,
onWrite
);
}
process.nextTick(writeChunk);
};
...@@ -84,7 +84,7 @@ module.exports = function writeFile(filename, data, options, cb) { ...@@ -84,7 +84,7 @@ module.exports = function writeFile(filename, data, options, cb) {
var offset = new BigInt(8); var offset = new BigInt(8);
var stop = false; var stop = false;
var nbRemainingPackets = 0; var nbRemainingPackets = 0;
var maxPacketSize = new BigInt(8, 0x00010000 - 0x71); var maxPacketSize = new BigInt(8, constants.MAX_WRITE_LENGTH);
// callback manager // callback manager
function callback() { function callback() {
return function(err) { return function(err) {
......
...@@ -10,6 +10,7 @@ module.exports = { ...@@ -10,6 +10,7 @@ module.exports = {
FILE_OVERWRITE: 0x00000004, FILE_OVERWRITE: 0x00000004,
FILE_OVERWRITE_IF: 0x00000005, FILE_OVERWRITE_IF: 0x00000005,
// Where does it come from?! // Where do they come from?!
MAX_READ_LENGTH: 0x00010000, MAX_READ_LENGTH: 0x00010000,
MAX_WRITE_LENGTH: 0x00010000 - 0x71,
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment