Skip to content

Commit 56ccf29

Browse files
committed
Harmony port: napi shell
1 parent 9605a66 commit 56ccf29

File tree

1 file changed

+79
-20
lines changed

1 file changed

+79
-20
lines changed

src/core/ohos/SDL_ohos.c

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <js_native_api_types.h>
77
#include <node_api.h>
88
#include <node_api_types.h>
9+
#include <stdint.h>
910

1011
#ifdef SDL_PLATFORM_OHOS
1112

@@ -28,28 +29,32 @@ static struct
2829
napi_ref interface;
2930
} napiEnv;
3031

31-
typedef union
32+
typedef enum
3233
{
33-
int i;
34-
short s;
35-
char c;
36-
long long l;
37-
float f;
38-
double d;
39-
const char* str;
40-
bool b;
34+
Int,
35+
Long,
36+
Double,
37+
String
38+
} napiArgType;
39+
40+
typedef struct
41+
{
42+
napiArgType type;
43+
union
44+
{
45+
int i;
46+
long long l;
47+
double d;
48+
const char* str;
49+
} data;
4150
} napiCallbackArg;
4251
typedef struct
4352
{
4453
const char* func;
45-
napiCallbackArg arg1;
46-
napiCallbackArg arg2;
47-
napiCallbackArg arg3;
48-
napiCallbackArg arg4;
49-
napiCallbackArg arg5;
50-
napiCallbackArg arg6;
51-
napiCallbackArg arg7;
52-
napiCallbackArg arg8;
54+
int argCount;
55+
napiCallbackArg arg[16];
56+
napiArgType type;
57+
napiCallbackArg ret;
5358
} napiCallbackData;
5459

5560
void OHOS_windowDataFill(SDL_Window* w)
@@ -175,11 +180,61 @@ static napi_value minus(napi_env env, napi_callback_info info)
175180

176181
static void sdlJSCallback(napi_env env, napi_value jsCb, void* content, void* data)
177182
{
183+
napiCallbackData* ar = (napiCallbackData*) data;
184+
178185
napi_value callb = NULL;
179186
napi_get_reference_value(env, napiEnv.interface, &callb);
180187
napi_value jsMethod = NULL;
181-
napi_get_named_property(env, callb, "test", &jsMethod);
182-
napi_call_function(env, NULL, jsMethod, 0, NULL, NULL);
188+
napi_get_named_property(env, callb, ar->func, &jsMethod);
189+
190+
napi_value args[16];
191+
for (int i = 0; i < ar->argCount; i++)
192+
{
193+
switch (ar->arg[i].type)
194+
{
195+
case Int: {
196+
napi_create_int32(env, ar->arg[i].data.i, args + i);
197+
break;
198+
}
199+
case Long: {
200+
napi_create_int64(env, ar->arg[i].data.l, args + i);
201+
break;
202+
}
203+
case Double: {
204+
napi_create_double(env, ar->arg[i].data.d, args + i);
205+
break;
206+
}
207+
case String: {
208+
napi_create_string_utf8(env, ar->arg[i].data.str, SDL_strlen(ar->arg[i].data.str), args + i);
209+
break;
210+
}
211+
}
212+
}
213+
214+
napi_value v;
215+
napi_call_function(env, NULL, jsMethod, ar->argCount, args, &v);
216+
switch (ar->type) {
217+
case Int: {
218+
napi_get_value_int32(env, v, &ar->ret.data.i);
219+
break;
220+
}
221+
case Long: {
222+
napi_get_value_int64(env, v, (int64_t*) &ar->ret.data.l);
223+
break;
224+
}
225+
case String: {
226+
size_t stringSize = 0;
227+
napi_get_value_string_utf8(env, args[1], NULL, 0, &stringSize);
228+
char* value = SDL_malloc(stringSize + 1);
229+
napi_get_value_string_utf8(env, args[1], value, stringSize + 1, &stringSize);
230+
ar->ret.data.str = value;
231+
break;
232+
}
233+
case Double: {
234+
napi_get_value_double(env, v, &ar->ret.data.d);
235+
break;
236+
}
237+
}
183238
}
184239

185240
static napi_value sdlCallbackInit(napi_env env, napi_callback_info info)
@@ -196,7 +251,11 @@ static napi_value sdlCallbackInit(napi_env env, napi_callback_info info)
196251
napi_create_string_utf8(env, "SDLThreadSafe", NAPI_AUTO_LENGTH, &resName);
197252
napi_create_threadsafe_function(env, args[0], NULL, resName, 0, 1, NULL, NULL, NULL, sdlJSCallback, &napiEnv.func);
198253

199-
napi_call_threadsafe_function(napiEnv.func, NULL, napi_tsfn_nonblocking);
254+
napiCallbackData data;
255+
data.func = "test";
256+
data.argCount = 0;
257+
258+
napi_call_threadsafe_function(napiEnv.func, &data, napi_tsfn_nonblocking);
200259

201260
napi_value result;
202261
napi_create_int32(env, 0, &result);

0 commit comments

Comments
 (0)