• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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