1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "napi/native_api.h"
17 #include <native_buffer/native_buffer.h>
18 #include <climits>
19
20 #define SUCCESS 0
21 #define FAIL (-1)
22 #define ERROR_NUMBER 40001000
23
getBuffer()24 static OH_NativeBuffer *getBuffer()
25 {
26 OH_NativeBuffer_Config config = {
27 .width = 0x100,
28 .height = 0x100,
29 .format = NATIVEBUFFER_PIXEL_FMT_RGBA_8888,
30 .usage = NATIVEBUFFER_USAGE_CPU_READ | NATIVEBUFFER_USAGE_CPU_WRITE | NATIVEBUFFER_USAGE_MEM_DMA,
31 };
32 OH_NativeBuffer *buffer = OH_NativeBuffer_Alloc(&config);
33 return buffer;
34 }
OHNativeBufferAlloc(napi_env env,napi_callback_info info)35 static napi_value OHNativeBufferAlloc(napi_env env, napi_callback_info info)
36 {
37
38 napi_value result = nullptr;
39 int backInfo = FAIL;
40 OH_NativeBuffer *buffer = getBuffer();
41 if (buffer != nullptr) {
42 backInfo = SUCCESS;
43 }
44 napi_create_int32(env, backInfo, &result);
45 return result;
46 }
OHNativeBufferAllocAbnormal(napi_env env,napi_callback_info info)47 static napi_value OHNativeBufferAllocAbnormal(napi_env env, napi_callback_info info)
48 {
49 napi_value result = nullptr;
50 int backInfo = FAIL;
51 OH_NativeBuffer *buffer = OH_NativeBuffer_Alloc(nullptr);
52
53 if (buffer != nullptr) {
54 backInfo = SUCCESS;
55 }
56 napi_create_int32(env, backInfo, &result);
57
58 return result;
59 }
OHNativeBufferReference(napi_env env,napi_callback_info info)60 static napi_value OHNativeBufferReference(napi_env env, napi_callback_info info)
61 {
62 int backInfo = FAIL;
63 OH_NativeBuffer *buffer = getBuffer();
64 if (buffer != nullptr) {
65 int32_t ret = OH_NativeBuffer_Reference(buffer);
66 backInfo = ret;
67 }
68 napi_value result = nullptr;
69 napi_create_int32(env, backInfo, &result);
70 return result;
71 }
OHNativeBufferReferenceAbnormal(napi_env env,napi_callback_info info)72 static napi_value OHNativeBufferReferenceAbnormal(napi_env env, napi_callback_info info)
73 {
74 int backInfo = FAIL;
75 int32_t ret = OH_NativeBuffer_Reference(nullptr);
76 if (ret == 0) {
77 backInfo = SUCCESS;
78 }
79 napi_value result = nullptr;
80 napi_create_int32(env, backInfo, &result);
81 return result;
82 }
OHNativeBufferUnreference(napi_env env,napi_callback_info info)83 static napi_value OHNativeBufferUnreference(napi_env env, napi_callback_info info)
84 {
85 int backInfo = FAIL;
86 OH_NativeBuffer *buffer = getBuffer();
87
88 if (buffer != nullptr) {
89 int32_t ret = OH_NativeBuffer_Unreference(buffer);
90 backInfo = ret;
91 }
92 napi_value result = nullptr;
93 napi_create_int32(env, backInfo, &result);
94 return result;
95 }
96
OHNativeBufferUnreferenceAbnormal(napi_env env,napi_callback_info info)97 static napi_value OHNativeBufferUnreferenceAbnormal(napi_env env, napi_callback_info info)
98 {
99 int backInfo = FAIL;
100
101 int32_t ret = OH_NativeBuffer_Unreference(nullptr);
102 if (ret == 0) {
103 backInfo = SUCCESS;
104 }
105 napi_value result = nullptr;
106 napi_create_int32(env, backInfo, &result);
107 return result;
108 }
109
OHNativeBufferGetConfig(napi_env env,napi_callback_info info)110 static napi_value OHNativeBufferGetConfig(napi_env env, napi_callback_info info)
111 {
112 int backInfo = FAIL;
113 OH_NativeBuffer *buffer = getBuffer();
114 if (buffer != nullptr) {
115 OH_NativeBuffer_Config checkConfig = {};
116 checkConfig.width = 0x0;
117 checkConfig.height = 0x0;
118 checkConfig.format = 0x0;
119 checkConfig.usage = 0x0;
120 OH_NativeBuffer_GetConfig(buffer, &checkConfig);
121 if (&checkConfig != nullptr) {
122 backInfo = SUCCESS;
123 }
124 }
125 napi_value result = nullptr;
126 napi_create_int32(env, backInfo, &result);
127 return result;
128 }
129
OHNativeBufferMap(napi_env env,napi_callback_info info)130 static napi_value OHNativeBufferMap(napi_env env, napi_callback_info info)
131 {
132 int backInfo = FAIL;
133 OH_NativeBuffer *buffer = getBuffer();
134
135 if (buffer != nullptr) {
136 void *virAddr = nullptr;
137 int32_t ret = OH_NativeBuffer_Map(buffer, &virAddr);
138 backInfo = ret;
139 }
140 napi_value result = nullptr;
141 napi_create_int32(env, backInfo, &result);
142 return result;
143 }
OHNativeBufferMapAbnormal(napi_env env,napi_callback_info info)144 static napi_value OHNativeBufferMapAbnormal(napi_env env, napi_callback_info info)
145 {
146 int backInfo = FAIL;
147 void *virAddr = nullptr;
148 int32_t ret = OH_NativeBuffer_Map(nullptr, &virAddr);
149 if (ret == 0) {
150 backInfo = SUCCESS;
151 }
152 napi_value result = nullptr;
153 napi_create_int32(env, backInfo, &result);
154 return result;
155 }
OHNativeBufferUnmap(napi_env env,napi_callback_info info)156 static napi_value OHNativeBufferUnmap(napi_env env, napi_callback_info info)
157 {
158 int backInfo = FAIL;
159 OH_NativeBuffer *buffer = getBuffer();
160
161 if (buffer != nullptr) {
162 int32_t ret = OH_NativeBuffer_Unmap(buffer);
163 backInfo = ret;
164 }
165 napi_value result = nullptr;
166 napi_create_int32(env, backInfo, &result);
167 return result;
168 }
OHNativeBufferUnmapAbnormal(napi_env env,napi_callback_info info)169 static napi_value OHNativeBufferUnmapAbnormal(napi_env env, napi_callback_info info)
170 {
171 int backInfo = FAIL;
172 int32_t ret = OH_NativeBuffer_Unmap(nullptr);
173 if (ret == 0) {
174 backInfo = SUCCESS;
175 }
176 napi_value result = nullptr;
177 napi_create_int32(env, backInfo, &result);
178 return result;
179 }
OHNativeBufferGetSeqNum(napi_env env,napi_callback_info info)180 static napi_value OHNativeBufferGetSeqNum(napi_env env, napi_callback_info info)
181 {
182 int backInfo = FAIL;
183 OH_NativeBuffer *buffer = getBuffer();
184
185 if (buffer != nullptr) {
186 uint32_t id = OH_NativeBuffer_GetSeqNum(buffer);
187 if (id > 0) {
188 backInfo = SUCCESS;
189 }
190 }
191 napi_value result = nullptr;
192 napi_create_int32(env, backInfo, &result);
193 return result;
194 }
OHNativeBufferGetSeqNumAbnormal(napi_env env,napi_callback_info info)195 static napi_value OHNativeBufferGetSeqNumAbnormal(napi_env env, napi_callback_info info)
196 {
197 int backInfo = FAIL;
198 uint32_t id = OH_NativeBuffer_GetSeqNum(nullptr);
199 if (id > 0 && id != UINT_MAX) {
200 backInfo = SUCCESS;
201 }
202 napi_value result = nullptr;
203 napi_create_int32(env, backInfo, &result);
204 return result;
205 }
206 EXTERN_C_START
Init(napi_env env,napi_value exports)207 static napi_value Init(napi_env env, napi_value exports)
208 {
209 napi_property_descriptor desc[] = {
210 {"oHNativeBufferAlloc", nullptr, OHNativeBufferAlloc, nullptr, nullptr, nullptr, napi_default, nullptr},
211 {"oHNativeBufferReference", nullptr, OHNativeBufferReference, nullptr, nullptr, nullptr, napi_default, nullptr},
212 {"oHNativeBufferUnreference", nullptr, OHNativeBufferUnreference, nullptr, nullptr, nullptr, napi_default,
213 nullptr},
214 {"oHNativeBufferGetConfig", nullptr, OHNativeBufferGetConfig, nullptr, nullptr, nullptr, napi_default, nullptr},
215 {"oHNativeBufferMap", nullptr, OHNativeBufferMap, nullptr, nullptr, nullptr, napi_default, nullptr},
216 {"oHNativeBufferUnmap", nullptr, OHNativeBufferUnmap, nullptr, nullptr, nullptr, napi_default, nullptr},
217 {"oHNativeBufferGetSeqNum", nullptr, OHNativeBufferGetSeqNum, nullptr, nullptr, nullptr, napi_default, nullptr},
218 {"oHNativeBufferAllocAbnormal", nullptr, OHNativeBufferAllocAbnormal, nullptr, nullptr, nullptr, napi_default,
219 nullptr},
220 {"oHNativeBufferReferenceAbnormal", nullptr, OHNativeBufferReferenceAbnormal, nullptr, nullptr, nullptr,
221 napi_default, nullptr},
222 {"oHNativeBufferUnreferenceAbnormal", nullptr, OHNativeBufferUnreferenceAbnormal, nullptr, nullptr, nullptr,
223 napi_default, nullptr},
224 {"oHNativeBufferMapAbnormal", nullptr, OHNativeBufferMapAbnormal, nullptr, nullptr, nullptr, napi_default,
225 nullptr},
226 {"oHNativeBufferUnmapAbnormal", nullptr, OHNativeBufferUnmapAbnormal, nullptr, nullptr, nullptr, napi_default,
227 nullptr},
228 {"oHNativeBufferGetSeqNumAbnormal", nullptr, OHNativeBufferGetSeqNumAbnormal, nullptr, nullptr, nullptr,
229 napi_default, nullptr},
230
231 };
232 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
233 return exports;
234 }
235 EXTERN_C_END
236
237 static napi_module demoModule = {
238 .nm_version = 1,
239 .nm_flags = 0,
240 .nm_filename = nullptr,
241 .nm_register_func = Init,
242 .nm_modname = "nativebuffer",
243 .nm_priv = ((void *)0),
244 .reserved = {0},
245 };
246
RegisterModule(void)247 extern "C" __attribute__((constructor)) void RegisterModule(void) { napi_module_register(&demoModule); };
248