#ifndef BSON_H_ #define BSON_H_ #include #include #include using namespace v8; using namespace node; class BSON : public ObjectWrap { public: BSON() : ObjectWrap() {} ~BSON() {} static void Initialize(Handle target); static Handle BSONDeserializeStream(const Arguments &args); // JS based objects static Handle BSONSerialize(const Arguments &args); static Handle BSONDeserialize(const Arguments &args); // Calculate size of function static Handle CalculateObjectSize(const Arguments &args); static Handle SerializeWithBufferAndIndex(const Arguments &args); // Experimental static Handle CalculateObjectSize2(const Arguments &args); static Handle BSONSerialize2(const Arguments &args); // Constructor used for creating new BSON objects from C++ static Persistent constructor_template; private: static Handle New(const Arguments &args); static Handle deserialize(BSON *bson, char *data, uint32_t dataLength, uint32_t startIndex, bool is_array_item); static uint32_t serialize(BSON *bson, char *serialized_object, uint32_t index, Handle name, Handle value, bool check_key, bool serializeFunctions); static char* extract_string(char *data, uint32_t offset); static const char* ToCString(const v8::String::Utf8Value& value); static uint32_t calculate_object_size(BSON *bson, Handle object, bool serializeFunctions); static void write_int32(char *data, uint32_t value); static void write_int64(char *data, int64_t value); static void write_double(char *data, double value); static uint16_t deserialize_int8(char *data, uint32_t offset); static uint32_t deserialize_int32(char* data, uint32_t offset); static char *check_key(Local key); // BSON type instantiate functions Persistent longConstructor; Persistent objectIDConstructor; Persistent binaryConstructor; Persistent codeConstructor; Persistent dbrefConstructor; Persistent symbolConstructor; Persistent doubleConstructor; Persistent timestampConstructor; Persistent minKeyConstructor; Persistent maxKeyConstructor; // Equality Objects Persistent longString; Persistent objectIDString; Persistent binaryString; Persistent codeString; Persistent dbrefString; Persistent symbolString; Persistent doubleString; Persistent timestampString; Persistent minKeyString; Persistent maxKeyString; // Equality speed up comparision objects Persistent _bsontypeString; Persistent _longLowString; Persistent _longHighString; Persistent _objectIDidString; Persistent _binaryPositionString; Persistent _binarySubTypeString; Persistent _binaryBufferString; Persistent _doubleValueString; Persistent _symbolValueString; Persistent _dbRefRefString; Persistent _dbRefIdRefString; Persistent _dbRefDbRefString; Persistent _dbRefNamespaceString; Persistent _dbRefDbString; Persistent _dbRefOidString; // Decode JS function static Handle decodeLong(BSON *bson, char *data, uint32_t index); static Handle decodeTimestamp(BSON *bson, char *data, uint32_t index); static Handle decodeOid(BSON *bson, char *oid); static Handle decodeBinary(BSON *bson, uint32_t sub_type, uint32_t number_of_bytes, char *data); static Handle decodeCode(BSON *bson, char *code, Handle scope); static Handle decodeDBref(BSON *bson, Local ref, Local oid, Local db); // Experimental static uint32_t calculate_object_size2(Handle object); static uint32_t serialize2(char *serialized_object, uint32_t index, Handle name, Handle value, uint32_t object_size, bool check_key); }; #endif // BSON_H_