1/*
2 * Copyright (c) 2021 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 <cstddef>
17#include <cstdint>
18
19#include "net_server.h"
20
21napi_value NetServer::JS_Constructor(napi_env env, napi_callback_info cbinfo)
22{
23    napi_value thisVar = nullptr;
24    void* data = nullptr;
25    napi_get_cb_info(env, cbinfo, nullptr, nullptr, &thisVar, &data);
26
27    NetServer* netServer = new NetServer(env, thisVar);
28
29    napi_wrap(
30        env, thisVar, netServer,
31        [](napi_env env, void* data, void* hint) {
32            NetServer* netServer = (NetServer*)data;
33            delete netServer;
34        },
35        nullptr, nullptr);
36
37    return thisVar;
38}
39
40napi_value NetServer::JS_Start(napi_env env, napi_callback_info cbinfo)
41{
42    size_t requireArgc = 1;
43    size_t argc = 1;
44    napi_value argv[1] = { 0 };
45    napi_value thisVar = nullptr;
46    void* data = nullptr;
47    napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data);
48
49    NetServer* netServer = nullptr;
50    napi_unwrap(env, thisVar, (void**)&netServer);
51
52    NAPI_ASSERT(env, argc >= requireArgc, "requires 1 parameter");
53
54    napi_valuetype valueType = napi_undefined;
55    napi_typeof(env, argv[0], &valueType);
56    NAPI_ASSERT(env, valueType == napi_number, "type mismatch for parameter 1");
57
58    int32_t port = 0;
59    napi_get_value_int32(env, argv[0], &port);
60
61    netServer->Start(port);
62
63    napi_value result = nullptr;
64    napi_get_undefined(env, &result);
65    return result;
66}
67
68napi_value NetServer::JS_Stop(napi_env env, napi_callback_info cbinfo)
69{
70    size_t argc = 1;
71    napi_value argv[1] = { 0 };
72    napi_value thisVar = nullptr;
73    void* data = nullptr;
74    napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data);
75
76    NetServer* netServer = nullptr;
77    napi_unwrap(env, thisVar, (void**)&netServer);
78
79    netServer->Stop();
80
81    napi_value result = nullptr;
82    napi_get_undefined(env, &result);
83    return result;
84}
85
86napi_value NetServer::JS_On(napi_env env, napi_callback_info cbinfo)
87{
88    size_t requireArgc = 2;
89    size_t argc = 2;
90    napi_value argv[2] = { 0 };
91    napi_value thisVar = 0;
92    void* data = nullptr;
93    napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data);
94
95    NetServer* netServer = nullptr;
96    napi_unwrap(env, thisVar, (void**)&netServer);
97
98    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameter");
99
100    napi_valuetype eventValueType = napi_undefined;
101    napi_typeof(env, argv[0], &eventValueType);
102    NAPI_ASSERT(env, eventValueType == napi_string, "type mismatch for parameter 1");
103
104    napi_valuetype eventHandleType = napi_undefined;
105    napi_typeof(env, argv[1], &eventHandleType);
106    NAPI_ASSERT(env, eventHandleType == napi_function, "type mismatch for parameter 2");
107
108    char type[64] = { 0 };
109    size_t typeLen = 0;
110
111    napi_get_value_string_utf8(env, argv[0], type, sizeof(type), &typeLen);
112
113    netServer->On((const char*)type, argv[1]);
114
115    napi_value result = nullptr;
116    napi_get_undefined(env, &result);
117    return result;
118}
119
120napi_value NetServer::JS_Once(napi_env env, napi_callback_info cbinfo)
121{
122    size_t requireArgc = 2;
123    size_t argc = 2;
124    napi_value argv[2] = { 0 };
125    napi_value thisVar = 0;
126    void* data = nullptr;
127    napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data);
128
129    NetServer* netServer = nullptr;
130    napi_unwrap(env, thisVar, (void**)&netServer);
131
132    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameter");
133
134    napi_valuetype eventValueType = napi_undefined;
135    napi_typeof(env, argv[0], &eventValueType);
136    NAPI_ASSERT(env, eventValueType == napi_string, "type mismatch for parameter 1");
137
138    napi_valuetype eventHandleType = napi_undefined;
139    napi_typeof(env, argv[1], &eventHandleType);
140    NAPI_ASSERT(env, eventValueType == napi_function, "type mismatch for parameter 2");
141
142    char* type = nullptr;
143    size_t typeLen = 0;
144    napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
145
146    NAPI_ASSERT(env, typeLen > 0, "typeLen == 0");
147    type = new char[typeLen + 1];
148    napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
149
150    netServer->Once(type, argv[1]);
151
152    delete[] type;
153
154    napi_value result = nullptr;
155    napi_get_undefined(env, &result);
156    return result;
157}
158
159napi_value NetServer::JS_Off(napi_env env, napi_callback_info cbinfo)
160{
161    size_t requireArgc = 1;
162    size_t argc = 2;
163    napi_value argv[2] = { 0 };
164    napi_value thisVar = 0;
165    void* data = nullptr;
166    napi_get_cb_info(env, cbinfo, &argc, argv, &thisVar, &data);
167
168    NetServer* netServer = nullptr;
169    napi_unwrap(env, thisVar, (void**)&netServer);
170
171    NAPI_ASSERT(env, argc >= requireArgc, "requires 2 parameter");
172
173    napi_valuetype eventValueType = napi_undefined;
174    napi_typeof(env, argv[0], &eventValueType);
175    NAPI_ASSERT(env, eventValueType == napi_string, "type mismatch for parameter 1");
176
177    napi_valuetype eventHandleType = napi_undefined;
178    napi_typeof(env, argv[1], &eventHandleType);
179    NAPI_ASSERT(env, eventValueType == napi_function, "type mismatch for parameter 2");
180
181    char* type = nullptr;
182    size_t typeLen = 0;
183    napi_get_value_string_utf8(env, argv[0], nullptr, 0, &typeLen);
184
185    NAPI_ASSERT(env, typeLen > 0, "typeLen == 0");
186    type = new char[typeLen + 1];
187
188    napi_get_value_string_utf8(env, argv[0], type, typeLen + 1, &typeLen);
189
190    if (argc > requireArgc) {
191        netServer->Off(type, argv[1]);
192    } else {
193        netServer->Off(type);
194    }
195    delete[] type;
196    napi_value result = nullptr;
197    napi_get_undefined(env, &result);
198    return result;
199}
200
201napi_value NetServer::Export(napi_env env, napi_value exports)
202{
203    const char className[] = "NetServer";
204    napi_property_descriptor properties[] = {
205        DECLARE_NAPI_FUNCTION("start", JS_Start),
206        DECLARE_NAPI_FUNCTION("stop", JS_Stop),
207        DECLARE_NAPI_FUNCTION("on", JS_On),
208        DECLARE_NAPI_FUNCTION("once", JS_Once),
209        DECLARE_NAPI_FUNCTION("off", JS_Off),
210    };
211    napi_value netServerClass = nullptr;
212
213    napi_define_class(env, className, sizeof(className), JS_Constructor, nullptr,
214        sizeof(properties) / sizeof(properties[0]), properties, &netServerClass);
215
216    napi_set_named_property(env, exports, "NetServer", netServerClass);
217
218    return exports;
219}
220