1 #include <stdlib.h>
2 #include <string.h>
3 #include <node_api.h>
4 #include "../../js-native-api/common.h"
5
6 static const char theText[] =
7 "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
8
9 static int deleterCallCount = 0;
deleteTheText(napi_env env,void * data,void * finalize_hint)10 static void deleteTheText(napi_env env, void* data, void* finalize_hint) {
11 NODE_API_ASSERT_RETURN_VOID(
12 env, data != NULL && strcmp(data, theText) == 0, "invalid data");
13 (void)finalize_hint;
14 free(data);
15 deleterCallCount++;
16 }
17
noopDeleter(napi_env env,void * data,void * finalize_hint)18 static void noopDeleter(napi_env env, void* data, void* finalize_hint) {
19 NODE_API_ASSERT_RETURN_VOID(
20 env, data != NULL && strcmp(data, theText) == 0, "invalid data");
21 (void)finalize_hint;
22 deleterCallCount++;
23 }
24
newBuffer(napi_env env,napi_callback_info info)25 static napi_value newBuffer(napi_env env, napi_callback_info info) {
26 napi_value theBuffer;
27 char* theCopy;
28 const unsigned int kBufferSize = sizeof(theText);
29
30 NODE_API_CALL(env,
31 napi_create_buffer(
32 env, sizeof(theText), (void**)(&theCopy), &theBuffer));
33 NODE_API_ASSERT(env, theCopy, "Failed to copy static text for newBuffer");
34 memcpy(theCopy, theText, kBufferSize);
35
36 return theBuffer;
37 }
38
newExternalBuffer(napi_env env,napi_callback_info info)39 static napi_value newExternalBuffer(napi_env env, napi_callback_info info) {
40 napi_value theBuffer;
41 char* theCopy = strdup(theText);
42 NODE_API_ASSERT(
43 env, theCopy, "Failed to copy static text for newExternalBuffer");
44 NODE_API_CALL(env,
45 napi_create_external_buffer(
46 env, sizeof(theText), theCopy, deleteTheText,
47 NULL /* finalize_hint */, &theBuffer));
48
49 return theBuffer;
50 }
51
getDeleterCallCount(napi_env env,napi_callback_info info)52 static napi_value getDeleterCallCount(napi_env env, napi_callback_info info) {
53 napi_value callCount;
54 NODE_API_CALL(env, napi_create_int32(env, deleterCallCount, &callCount));
55 return callCount;
56 }
57
copyBuffer(napi_env env,napi_callback_info info)58 static napi_value copyBuffer(napi_env env, napi_callback_info info) {
59 napi_value theBuffer;
60 NODE_API_CALL(env, napi_create_buffer_copy(
61 env, sizeof(theText), theText, NULL, &theBuffer));
62 return theBuffer;
63 }
64
bufferHasInstance(napi_env env,napi_callback_info info)65 static napi_value bufferHasInstance(napi_env env, napi_callback_info info) {
66 size_t argc = 1;
67 napi_value args[1];
68 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
69 NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
70 napi_value theBuffer = args[0];
71 bool hasInstance;
72 napi_valuetype theType;
73 NODE_API_CALL(env, napi_typeof(env, theBuffer, &theType));
74 NODE_API_ASSERT(env,
75 theType == napi_object, "bufferHasInstance: instance is not an object");
76 NODE_API_CALL(env, napi_is_buffer(env, theBuffer, &hasInstance));
77 NODE_API_ASSERT(env, hasInstance, "bufferHasInstance: instance is not a buffer");
78 napi_value returnValue;
79 NODE_API_CALL(env, napi_get_boolean(env, hasInstance, &returnValue));
80 return returnValue;
81 }
82
bufferInfo(napi_env env,napi_callback_info info)83 static napi_value bufferInfo(napi_env env, napi_callback_info info) {
84 size_t argc = 1;
85 napi_value args[1];
86 NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
87 NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
88 napi_value theBuffer = args[0];
89 char *bufferData;
90 napi_value returnValue;
91 size_t bufferLength;
92 NODE_API_CALL(env,
93 napi_get_buffer_info(
94 env, theBuffer, (void**)(&bufferData), &bufferLength));
95 NODE_API_CALL(env, napi_get_boolean(env,
96 !strcmp(bufferData, theText) && bufferLength == sizeof(theText),
97 &returnValue));
98 return returnValue;
99 }
100
staticBuffer(napi_env env,napi_callback_info info)101 static napi_value staticBuffer(napi_env env, napi_callback_info info) {
102 napi_value theBuffer;
103 NODE_API_CALL(env,
104 napi_create_external_buffer(
105 env, sizeof(theText), (void*)theText, noopDeleter,
106 NULL /* finalize_hint */, &theBuffer));
107 return theBuffer;
108 }
109
Init(napi_env env,napi_value exports)110 static napi_value Init(napi_env env, napi_value exports) {
111 napi_value theValue;
112
113 NODE_API_CALL(env,
114 napi_create_string_utf8(env, theText, sizeof(theText), &theValue));
115 NODE_API_CALL(env,
116 napi_set_named_property(env, exports, "theText", theValue));
117
118 napi_property_descriptor methods[] = {
119 DECLARE_NODE_API_PROPERTY("newBuffer", newBuffer),
120 DECLARE_NODE_API_PROPERTY("newExternalBuffer", newExternalBuffer),
121 DECLARE_NODE_API_PROPERTY("getDeleterCallCount", getDeleterCallCount),
122 DECLARE_NODE_API_PROPERTY("copyBuffer", copyBuffer),
123 DECLARE_NODE_API_PROPERTY("bufferHasInstance", bufferHasInstance),
124 DECLARE_NODE_API_PROPERTY("bufferInfo", bufferInfo),
125 DECLARE_NODE_API_PROPERTY("staticBuffer", staticBuffer),
126 };
127
128 NODE_API_CALL(env, napi_define_properties(
129 env, exports, sizeof(methods) / sizeof(methods[0]), methods));
130
131 return exports;
132 }
133
134 NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
135