/** * Copied from node_buffer.h * see http://www.nodejs.org/ * * Node's license follows: * * Copyright 2009, 2010 Ryan Lienhart Dahl. All rights reserved. * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef MOCK_RIL_NODE_BUFFER_H_ #define MOCK_RIL_NODE_BUFFER_H_ #include <v8.h> #include "node_object_wrap.h" /* 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<v8::Object> target); static void InitializeObjectTemplate(v8::Handle<v8::ObjectTemplate> target); static Buffer* New(size_t length); // public constructor static inline bool HasInstance(v8::Handle<v8::Value> val) { if (!val->IsObject()) return false; v8::Local<v8::Object> obj = val->ToObject(); return constructor_template->HasInstance(obj); } char* data(); size_t length() const { return length_; } struct Blob_* blob() const { return blob_; } void NewBlob(size_t length); int AsciiWrite(char *string, int offset, int length); int Utf8Write(char *string, int offset, int length); private: static v8::Persistent<v8::FunctionTemplate> constructor_template; static v8::Handle<v8::Value> New(const v8::Arguments &args); static v8::Handle<v8::Value> Slice(const v8::Arguments &args); static v8::Handle<v8::Value> BinarySlice(const v8::Arguments &args); static v8::Handle<v8::Value> AsciiSlice(const v8::Arguments &args); static v8::Handle<v8::Value> Utf8Slice(const v8::Arguments &args); static v8::Handle<v8::Value> BinaryWrite(const v8::Arguments &args); static v8::Handle<v8::Value> AsciiWrite(const v8::Arguments &args); static v8::Handle<v8::Value> Utf8Write(const v8::Arguments &args); static v8::Handle<v8::Value> ByteLength(const v8::Arguments &args); static v8::Handle<v8::Value> Unpack(const v8::Arguments &args); static v8::Handle<v8::Value> Copy(const v8::Arguments &args); Buffer(size_t length); Buffer(Buffer *parent, size_t start, size_t end); size_t off_; // offset inside blob_ size_t length_; // length inside blob_ struct Blob_ *blob_; }; #endif // MOCK_RIL_NODE_BUFFER_H_