Browse Source

add position arguments to File#read and File#write

v0.7.4-release
Ryan 16 years ago
parent
commit
0b1e3240be
  1. 20
      src/file.cc
  2. 14
      src/file.js

20
src/file.cc

@ -351,8 +351,8 @@ File::AfterOpen (eio_req *req)
Handle<Value>
File::Write (const Arguments& args)
{
if (args.Length() < 1) return Undefined();
if (!args[0]->IsString())
if (args.Length() < 2) return Undefined();
if (!args[1]->IsNumber()) return Undefined();
HandleScope scope;
@ -362,14 +362,14 @@ File::Write (const Arguments& args)
size_t length = 0;
if (args[0]->IsString()) {
// utf8 encoded data
// utf8 encoding
Local<String> string = args[0]->ToString();
length = string->Utf8Length();
buf = static_cast<char*>(malloc(length));
string->WriteUtf8(buf, length);
} else if (args[0]->IsArray()) {
// binary data
// raw encoding
Local<Array> array = Local<Array>::Cast(args[0]);
length = array->Length();
buf = static_cast<char*>(malloc(length));
@ -383,6 +383,8 @@ File::Write (const Arguments& args)
return Undefined();
}
size_t pos = args[1]->Uint32Value();
if (file->handle_->Has(FD_SYMBOL) == false) {
printf("trying to write to a bad fd!\n");
return Undefined();
@ -390,9 +392,8 @@ File::Write (const Arguments& args)
int fd = file->GetFD();
// NOTE: -1 offset in eio_write() invokes write() instead of pwrite()
node_eio_warmup();
eio_req *req = eio_write(fd, buf, length, -1, EIO_PRI_DEFAULT, File::AfterWrite, file);
eio_req *req = eio_write(fd, buf, length, pos, EIO_PRI_DEFAULT, File::AfterWrite, file);
return Undefined();
}
@ -422,17 +423,18 @@ File::Read (const Arguments& args)
{
if (args.Length() < 1) return Undefined();
if (!args[0]->IsNumber()) return Undefined();
if (!args[1]->IsNumber()) return Undefined();
HandleScope scope;
File *file = File::Unwrap(args.Holder());
size_t length = args[0]->IntegerValue();
size_t pos = args[1]->Uint32Value();
int fd = file->GetFD();
// NOTE: -1 offset in eio_read() invokes read() instead of pread()
// NULL pointer tells eio to allocate it itself
// NOTE: NULL pointer tells eio to allocate it itself
node_eio_warmup();
eio_req *req = eio_read(fd, NULL, length, -1, EIO_PRI_DEFAULT, File::AfterRead, file);
eio_req *req = eio_read(fd, NULL, length, pos, EIO_PRI_DEFAULT, File::AfterRead, file);
assert(req);
return Undefined();

14
src/file.js

@ -15,11 +15,14 @@ File.exists = function (path, callback) {
File.cat = function (path, callback) {
var content = "";
var file = new File;
var pos = 0;
var chunkSize = 10*1024;
function readChunk () {
file.read(1024, function (status, chunk) {
file.read(chunkSize, pos, function (status, chunk) {
if (chunk) {
content += chunk.encodeUtf8();
pos += chunk.length;
readChunk();
} else {
callback(0, content);
@ -48,12 +51,12 @@ File.prototype.close = function (callback) {
this._addAction("close", [], callback);
};
File.prototype.write = function (buf, callback) {
this._addAction("write", [buf], callback);
File.prototype.write = function (buf, pos, callback) {
this._addAction("write", [buf, pos], callback);
};
File.prototype.read = function (length, callback) {
this._addAction("read", [length], callback);
File.prototype.read = function (length, pos, callback) {
this._addAction("read", [length, pos], callback);
};
// Some explanation of the File binding.
@ -92,6 +95,7 @@ File._addAction = File.prototype._addAction = function (method, args, callback)
File._act = File.prototype._act = function () {
var action = this._actionQueue[0];
if (action)
// TODO FIXME what if the action throws an error?
this["_ffi_" + action.method].apply(this, action.args);
};

Loading…
Cancel
Save