#ifndef NODE_BUFFER_H_ #define NODE_BUFFER_H_ #include #include #include namespace node { /* A buffer is a chunk of memory stored outside the V8 heap, mirrored by an * object in javascript. The object is not totally opaque, one can access * individual bytes with [] and slice it into substrings or sub-buffers * without copying memory. * * // return an ascii encoded string - no memory iscopied * buffer.asciiSlide(0, 3) * * // returns another buffer - no memory is copied * buffer.slice(0, 3) * * Interally, each javascript buffer object is backed by a "struct buffer" * object. These "struct buffer" objects are either a root buffer (in the * case that buffer->root == NULL) or slice objects (in which case * buffer->root != NULL). A root buffer is only GCed once all its slices * are GCed. */ struct Blob_; class Buffer : public ObjectWrap { public: ~Buffer(); static void Initialize(v8::Handle target); static Buffer* New(size_t length); // public constructor static bool HasInstance(v8::Handle val); static char* Data(v8::Handle); static size_t Length(v8::Handle); char* data(); size_t length() const { return length_; } int AsciiWrite(char *string, int offset, int length); int Utf8Write(char *string, int offset, int length); private: static v8::Persistent constructor_template; static v8::Handle New(const v8::Arguments &args); static v8::Handle Slice(const v8::Arguments &args); static v8::Handle BinarySlice(const v8::Arguments &args); static v8::Handle AsciiSlice(const v8::Arguments &args); static v8::Handle Base64Slice(const v8::Arguments &args); static v8::Handle Utf8Slice(const v8::Arguments &args); static v8::Handle BinaryWrite(const v8::Arguments &args); static v8::Handle Base64Write(const v8::Arguments &args); static v8::Handle AsciiWrite(const v8::Arguments &args); static v8::Handle Utf8Write(const v8::Arguments &args); static v8::Handle ByteLength(const v8::Arguments &args); static v8::Handle MakeFastBuffer(const v8::Arguments &args); static v8::Handle Unpack(const v8::Arguments &args); static v8::Handle Copy(const v8::Arguments &args); Buffer(size_t length); Buffer(Buffer *parent, size_t start, size_t end); size_t off_; size_t length_; char* data_; }; } // namespace node buffer #endif // NODE_BUFFER_H_