Skip to content

Commit

Permalink
Implemented fs.write()
Browse files Browse the repository at this point in the history
IoT.js-DCO-1.0-Signed-off-by: Ilyong Cho [email protected]
  • Loading branch information
ILyoan committed Jun 24, 2015
1 parent 5a6b27a commit 0bd1203
Show file tree
Hide file tree
Showing 7 changed files with 196 additions and 1 deletion.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
/build
/build/*
/src/iotjs_js.h
/test/tmp/*

# IDE related files
nbproject
Expand Down
43 changes: 43 additions & 0 deletions src/iotjs_module_fs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ static void After(uv_fs_t* req) {
}
case UV_FS_OPEN:
case UV_FS_READ:
case UV_FS_WRITE:
{
JObject arg1(static_cast<int32_t>(req->result));
jarg.Add(arg1);
Expand Down Expand Up @@ -200,6 +201,47 @@ JHANDLER_FUNCTION(Read, handler) {
}


JHANDLER_FUNCTION(Write, handler) {
IOTJS_ASSERT(handler.GetThis()->IsObject());
IOTJS_ASSERT(handler.GetArgLength() >= 5);
IOTJS_ASSERT(handler.GetArg(0)->IsNumber());
IOTJS_ASSERT(handler.GetArg(1)->IsObject());
IOTJS_ASSERT(handler.GetArg(2)->IsNumber());
IOTJS_ASSERT(handler.GetArg(3)->IsNumber());
IOTJS_ASSERT(handler.GetArg(4)->IsNumber());

Environment* env = Environment::GetEnv();

int fd = handler.GetArg(0)->GetInt32();
int offset = handler.GetArg(2)->GetInt32();
int length = handler.GetArg(3)->GetInt32();
int position = handler.GetArg(4)->GetInt32();

JObject* jbuffer = handler.GetArg(1);
Buffer* buffer_wrap = Buffer::FromJBuffer(*jbuffer);
char* buffer = buffer_wrap->buffer();
int buffer_length = buffer_wrap->length();

if (offset >= buffer_length) {
JHANDLER_THROW_RETURN(handler, RangeError, "offset out of bound");
}
if (offset + length > buffer_length) {
JHANDLER_THROW_RETURN(handler, RangeError, "length out of bound");
}

uv_buf_t uvbuf = uv_buf_init(buffer + offset, length);

if (handler.GetArgLength() > 5 && handler.GetArg(5)->IsFunction()) {
FS_ASYNC(env, write, handler.GetArg(5), fd, &uvbuf, 1, position);
} else {
FS_SYNC(env, write, fd, &uvbuf, 1, position);
handler.Return(JVal::Number(err));
}

return !handler.HasThrown();
}


JObject MakeStatObject(uv_stat_t* statbuf) {


Expand Down Expand Up @@ -285,6 +327,7 @@ JObject* InitFs() {
fs->SetMethod("close", Close);
fs->SetMethod("open", Open);
fs->SetMethod("read", Read);
fs->SetMethod("write", Write);
fs->SetMethod("stat", Stat);

module->module = fs;
Expand Down
35 changes: 34 additions & 1 deletion src/js/fs.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ fs.read = function(fd, buffer, offset, length, position, callback) {


fs.readSync = function(fd, buffer, offset, length, position) {
//return fsBuiltin.read(fd, buffer, offset, length, position);
return fsBuiltin.read(checkArgNumber(fd, 'fd'),
checkArgBuffer(buffer, 'buffer'),
checkArgNumber(offset, 'offset'),
Expand All @@ -143,6 +142,40 @@ fs.readSync = function(fd, buffer, offset, length, position) {
};


fs.write = function(fd, buffer, offset, length, position, callback) {
if (util.isFunction(position)) {
callback = position;
position = -1; // write at current position.
}

callback = checkArgFunction(callback, 'callback');

var cb = function(err, written) {
callback(err, written, buffer);
};

return fsBuiltin.write(checkArgNumber(fd, 'fd'),
checkArgBuffer(buffer, 'buffer'),
checkArgNumber(offset, 'offset'),
checkArgNumber(length, 'length'),
checkArgNumber(position, 'position'),
cb);
};


fs.writeSync = function(fd, buffer, offset, length, position) {
if (util.isNullOrUndefined(position)) {
position = -1; // write at current position.
}

return fsBuiltin.write(checkArgNumber(fd, 'fd'),
checkArgBuffer(buffer, 'buffer'),
checkArgNumber(offset, 'offset'),
checkArgNumber(length, 'length'),
checkArgNumber(position, 'position'));
};


function convertFlags(flag) {
if (util.isString(flag)) {
switch (flag) {
Expand Down
1 change: 1 addition & 0 deletions test/resources/test1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
TEST File Read & Write
49 changes: 49 additions & 0 deletions test/run_pass/test_fs1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/* Copyright 2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
@STDOUT=FILE[../resources/test1.txt]
*/


var fs = require('fs');
var assert = require('assert');


var srcFilePath = "../resources/test1.txt";
var dstFilePath = "../tmp/test_fs1.txt";

try {
var fd1 = fs.openSync(srcFilePath, 'r');
var buffer = new Buffer(128);
var bytes1 = fs.readSync(fd1, buffer, 0, buffer.length, 0);
fs.closeSync(fd1);

var fd2 = fs.openSync(dstFilePath, 'w');
var bytes2 = fs.writeSync(fd2, buffer, 0, bytes1, 0);
fs.closeSync(fd2);

assert.equal(bytes1, bytes2);

var fd3 = fs.openSync(srcFilePath, 'r');
var bytes3 = fs.readSync(fd3, buffer, 0, buffer.length, 0);
fs.closeSync(fd3);

assert.equal(bytes1, bytes3);

console.log(buffer.toString());
} catch (err) {
throw err;
}
67 changes: 67 additions & 0 deletions test/run_pass/test_fs2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/* Copyright 2015 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
@STDOUT=FILE[../resources/test1.txt]
*/


var fs = require('fs');
var assert = require('assert');


var srcFilePath = "../resources/test1.txt";
var dstFilePath = "../tmp/test_fs2.txt";

var data;

function onWrite(err, written, buffer) {
if (err) {
throw err;
} else {
var fd = fs.openSync(dstFilePath, 'r');
var buffer = new Buffer(128);
fs.readSync(fd, buffer, 0, buffer.length, 0);
console.log(buffer.toString());
}
}

function onOpenForWrite(err, fd) {
if (err) {
throw err;
} else {
fs.write(fd, data, 0, data.length, onWrite);
}
}

function onRead(err, bytesRead, buffer) {
if (err) {
throw err;
} else {
data = new Buffer(buffer.toString());
fs.open(dstFilePath, 'w', onOpenForWrite);
}
}

function onOpenForRead(err, fd) {
if (err) {
throw err;
} else {
var buffer = new Buffer(128);
fs.read(fd, buffer, 0, buffer.length, 0, onRead);
}
}

fs.open(srcFilePath, 'r', onOpenForRead);
1 change: 1 addition & 0 deletions test/tmp/README
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This directory is for temporary files will be generated during build test.

0 comments on commit 0bd1203

Please sign in to comment.