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 "monitor_server.h"
17
18 #include <cstddef>
19 #include <utility>
20
21 #include <napi/native_api.h>
22 #include <napi/native_common.h>
23 #include <securec.h>
24 #include <uv.h>
25
26 #include "module_template.h"
27 #include "napi_utils.h"
28 #include "netstack_log.h"
29
30 #include "tls_socket_server.h"
31 #include "tlssocketserver_module.h"
32
33 namespace OHOS {
34 namespace NetStack {
35 namespace TlsSocketServer {
36 namespace {
37 constexpr int PARAM_OPTION = 1;
38 constexpr int PARAM_OPTION_CALLBACK = 2;
39 constexpr std::string_view EVENT_MESSAGE = "message";
40 constexpr std::string_view EVENT_CONNECT = "connect";
41 constexpr std::string_view EVENT_CLOSE = "close";
42 constexpr std::string_view EVENT_ERROR = "error";
43
44 constexpr const char *PROPERTY_ADDRESS = "address";
45 constexpr const char *PROPERTY_FAMILY = "family";
46 constexpr const char *PROPERTY_PORT = "port";
47 constexpr const char *PROPERTY_SIZE = "size";
48 constexpr const char *ON_MESSAGE = "message";
49 constexpr const char *ON_REMOTE_INFO = "remoteInfo";
50
NewInstanceWithConstructor(napi_env env,napi_callback_info info,napi_value jsConstructor,int32_t counter,std::shared_ptr<EventManager> eventManager)51 napi_value NewInstanceWithConstructor(napi_env env, napi_callback_info info, napi_value jsConstructor, int32_t counter,
52 std::shared_ptr<EventManager> eventManager)
53 {
54 napi_value result = nullptr;
55 NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result));
56
57 auto sharedManager = new (std::nothrow) std::shared_ptr<EventManager>();
58 if (sharedManager == nullptr) {
59 return result;
60 }
61 *sharedManager = eventManager;
62 napi_wrap(
63 env, result, reinterpret_cast<void *>(sharedManager),
64 [](napi_env, void *data, void *) {
65 NETSTACK_LOGI("socket handle is finalized");
66 auto sharedManager = static_cast<std::shared_ptr<EventManager> *>(data);
67 if (sharedManager != nullptr) {
68 auto manager = *sharedManager;
69 auto tlsServer = static_cast<TLSSocketServer *>(manager->GetData());
70 if (tlsServer != nullptr) {
71 tlsServer->CloseConnectionByEventManager(manager);
72 tlsServer->DeleteConnectionByEventManager(manager);
73 }
74 }
75 delete sharedManager;
76 },
77 nullptr, nullptr);
78
79 return result;
80 }
81
ConstructTLSSocketConnection(napi_env env,napi_callback_info info,int32_t counter,std::shared_ptr<EventManager> eventManager)82 napi_value ConstructTLSSocketConnection(napi_env env, napi_callback_info info, int32_t counter,
83 std::shared_ptr<EventManager> eventManager)
84 {
85 napi_value jsConstructor = nullptr;
86 std::initializer_list<napi_property_descriptor> properties = {
87 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_CERTIFICATE,
88 TLSSocketServerModuleExports::TLSSocketConnection::GetCertificate),
89 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_REMOTE_CERTIFICATE,
90 TlsSocketServer::TLSSocketServerModuleExports::TLSSocketConnection::GetRemoteCertificate),
91 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_SIGNATURE_ALGORITHMS,
92 TLSSocketServerModuleExports::TLSSocketConnection::GetSignatureAlgorithms),
93 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_CIPHER_SUITE,
94 TLSSocketServerModuleExports::TLSSocketConnection::GetCipherSuites),
95 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_SEND,
96 TLSSocketServerModuleExports::TLSSocketConnection::Send),
97 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_CLOSE,
98 TLSSocketServerModuleExports::TLSSocketConnection::Close),
99 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_REMOTE_ADDRESS,
100 TLSSocketServerModuleExports::TLSSocketConnection::GetRemoteAddress),
101 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_LOCAL_ADDRESS,
102 TLSSocketServerModuleExports::TLSSocketConnection::GetLocalAddress),
103 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_ON,
104 TLSSocketServerModuleExports::TLSSocketConnection::On),
105 DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_OFF,
106 TLSSocketServerModuleExports::TLSSocketConnection::Off),
107 };
108
109 auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
110 napi_value thisVal = nullptr;
111 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr));
112
113 return thisVal;
114 };
115
116 napi_property_descriptor descriptors[properties.size()];
117 std::copy(properties.begin(), properties.end(), descriptors);
118
119 NAPI_CALL_BASE(env,
120 napi_define_class(env, TLSSocketServerModuleExports::INTERFACE_TLS_SOCKET_SERVER_CONNECTION,
121 NAPI_AUTO_LENGTH, constructor, nullptr, properties.size(), descriptors,
122 &jsConstructor),
123 NapiUtils::GetUndefined(env));
124
125 if (jsConstructor != nullptr) {
126 napi_value result = NewInstanceWithConstructor(env, info, jsConstructor, counter, eventManager);
127 NapiUtils::SetInt32Property(env, result, TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID,
128 counter);
129 return result;
130 }
131 return NapiUtils::GetUndefined(env);
132 }
133
MakeMessageObj(napi_env env,std::shared_ptr<MonitorServer::MessageRecvParma> MessagePara)134 napi_value MakeMessageObj(napi_env env, std::shared_ptr<MonitorServer::MessageRecvParma> MessagePara)
135 {
136 void *data = nullptr;
137 napi_value arrayBuffer = NapiUtils::CreateArrayBuffer(env, MessagePara->data.size(), &data);
138 if (data != nullptr && arrayBuffer != nullptr) {
139 if (memcpy_s(data, MessagePara->data.size(), MessagePara->data.c_str(), MessagePara->data.size()) != EOK) {
140 NETSTACK_LOGE("memcpy_s failed!");
141 return nullptr;
142 }
143 } else {
144 return nullptr;
145 }
146
147 napi_value obj = NapiUtils::CreateObject(env);
148 napi_value remoteInfo = NapiUtils::CreateObject(env);
149
150 napi_value message = nullptr;
151 napi_create_typedarray(env, napi_uint8_array, MessagePara->data.size(), arrayBuffer, 0, &message);
152 napi_value address = NapiUtils::CreateStringUtf8(env, MessagePara->remoteInfo_.GetAddress());
153 napi_value family = NapiUtils::CreateStringUtf8(env, MessagePara->remoteInfo_.GetFamily());
154 napi_value port = NapiUtils::CreateInt32(env, MessagePara->remoteInfo_.GetPort());
155 napi_value size = NapiUtils::CreateInt32(env, MessagePara->remoteInfo_.GetSize());
156 NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_ADDRESS, address);
157 NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_FAMILY, family);
158 NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_PORT, port);
159 NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_SIZE, size);
160 NapiUtils::SetNamedProperty(env, obj, ON_MESSAGE, message);
161 NapiUtils::SetNamedProperty(env, obj, ON_REMOTE_INFO, remoteInfo);
162
163 return obj;
164 }
165
EventMessageCallback(uv_work_t * work,int status)166 void EventMessageCallback(uv_work_t *work, int status)
167 {
168 (void)status;
169 if (work == nullptr) {
170 NETSTACK_LOGE("work is nullptr");
171 return;
172 }
173 auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
174 if (workWrapper == nullptr) {
175 NETSTACK_LOGE("workWrapper is nullptr");
176 delete work;
177 return;
178 }
179 std::shared_ptr<MonitorServer::MessageRecvParma> ptrMessageRecvParma(
180 static_cast<MonitorServer::MessageRecvParma *>(workWrapper->data));
181 if (ptrMessageRecvParma == nullptr) {
182 NETSTACK_LOGE("messageRecvParma is nullptr");
183 delete workWrapper;
184 delete work;
185 return;
186 }
187 if (workWrapper->manager == nullptr) {
188 NETSTACK_LOGE("manager is nullptr");
189 delete workWrapper;
190 delete work;
191 return;
192 }
193 napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
194 auto obj = MakeMessageObj(workWrapper->env, ptrMessageRecvParma);
195 if (obj == nullptr) {
196 NapiUtils::CloseScope(workWrapper->env, scope);
197 delete workWrapper;
198 delete work;
199 return;
200 }
201
202 workWrapper->manager->Emit(workWrapper->type, std::make_pair(NapiUtils::GetUndefined(workWrapper->env), obj));
203 NapiUtils::CloseScope(workWrapper->env, scope);
204
205 delete workWrapper;
206 delete work;
207 }
208
EventConnectCallback(uv_work_t * work,int status)209 void EventConnectCallback(uv_work_t *work, int status)
210 {
211 (void)status;
212 if (work == nullptr) {
213 NETSTACK_LOGE("work is nullptr");
214 return;
215 }
216 auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
217 if (workWrapper == nullptr) {
218 NETSTACK_LOGE("workWrapper is nullptr");
219 delete work;
220 return;
221 }
222 std::shared_ptr<MonitorServer::MessageParma> messageParma(
223 static_cast<MonitorServer::MessageParma *>(workWrapper->data));
224 if (messageParma == nullptr) {
225 NETSTACK_LOGE("messageParma is nullptr");
226 delete workWrapper;
227 delete work;
228 return;
229 }
230 auto clientid = messageParma->clientID;
231 auto eventManager = messageParma->eventManager;
232 napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
233 napi_callback_info info = nullptr;
234 napi_value obj = ConstructTLSSocketConnection(workWrapper->env, info, clientid, eventManager);
235 workWrapper->manager->Emit(workWrapper->type, std::make_pair(NapiUtils::GetUndefined(workWrapper->env), obj));
236 NapiUtils::CloseScope(workWrapper->env, scope);
237 delete workWrapper;
238 delete work;
239 }
240
EventCloseCallback(uv_work_t * work,int status)241 void EventCloseCallback(uv_work_t *work, int status)
242 {
243 (void)status;
244 if (work == nullptr) {
245 NETSTACK_LOGE("work is nullptr");
246 return;
247 }
248 auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
249 if (workWrapper == nullptr) {
250 NETSTACK_LOGE("workWrapper is nullptr");
251 delete work;
252 return;
253 }
254 if (workWrapper->manager == nullptr) {
255 NETSTACK_LOGE("manager is nullptr");
256 delete workWrapper;
257 delete work;
258 return;
259 }
260 napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
261 napi_value obj = nullptr;
262 workWrapper->manager->Emit(workWrapper->type, std::make_pair(NapiUtils::GetUndefined(workWrapper->env), obj));
263 NapiUtils::CloseScope(workWrapper->env, scope);
264 delete workWrapper;
265 delete work;
266 }
267
EventErrorCallback(uv_work_t * work,int status)268 void EventErrorCallback(uv_work_t *work, int status)
269 {
270 (void)status;
271 if (work == nullptr) {
272 NETSTACK_LOGE("work is nullptr");
273 return;
274 }
275 auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
276 if (workWrapper == nullptr) {
277 NETSTACK_LOGE("workWrapper is nullptr");
278 delete work;
279 return;
280 }
281 std::shared_ptr<std::pair<int32_t, std::string>> err(
282 static_cast<std::pair<int32_t, std::string> *>(workWrapper->data));
283 if (err == nullptr) {
284 NETSTACK_LOGE("err is nullptr");
285 delete workWrapper;
286 delete work;
287 return;
288 }
289 if (workWrapper->manager == nullptr) {
290 NETSTACK_LOGE("manager is nullptr");
291 delete workWrapper;
292 delete work;
293 return;
294 }
295 napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
296 napi_value obj = NapiUtils::CreateObject(workWrapper->env);
297 napi_value errorNumber = NapiUtils::CreateInt32(workWrapper->env, err->first);
298 napi_value errorString = NapiUtils::CreateStringUtf8(workWrapper->env, err->second);
299 NapiUtils::SetNamedProperty(workWrapper->env, obj, "errorNumber", errorNumber);
300 NapiUtils::SetNamedProperty(workWrapper->env, obj, "errorString", errorString);
301 std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(workWrapper->env), obj};
302 workWrapper->manager->Emit(workWrapper->type, arg);
303 NapiUtils::CloseScope(workWrapper->env, scope);
304 delete workWrapper;
305 delete work;
306 }
307 } // namespace
308
MonitorServer()309 MonitorServer::MonitorServer() {}
310
~MonitorServer()311 MonitorServer::~MonitorServer() {}
312
On(napi_env env,napi_callback_info info)313 napi_value MonitorServer::On(napi_env env, napi_callback_info info)
314 {
315 napi_value thisVal = nullptr;
316 size_t paramsCount = MAX_PARAM_NUM;
317 napi_value params[MAX_PARAM_NUM] = {nullptr};
318 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
319
320 if (paramsCount != PARAM_OPTION_CALLBACK || NapiUtils::GetValueType(env, params[0]) != napi_string ||
321 NapiUtils::GetValueType(env, params[1]) != napi_function) {
322 NETSTACK_LOGE("on off once interface para: [string, function]");
323 napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
324 return NapiUtils::GetUndefined(env);
325 }
326 std::shared_ptr<EventManager> *sharedManager = nullptr;
327 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
328 if (sharedManager == nullptr || *sharedManager == nullptr) {
329 NETSTACK_LOGE("manager is nullptr");
330 return NapiUtils::GetUndefined(env);
331 }
332 auto manager = *sharedManager;
333 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
334 if (tlsSocketServer == nullptr) {
335 NETSTACK_LOGE("tlsSocketServer is null");
336 return NapiUtils::GetUndefined(env);
337 }
338
339 const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
340 manager->AddListener(env, event, params[1], false, false);
341 TLSServerRegEvent(event, tlsSocketServer, manager);
342 return NapiUtils::GetUndefined(env);
343 }
344
ConnectionOn(napi_env env,napi_callback_info info)345 napi_value MonitorServer::ConnectionOn(napi_env env, napi_callback_info info)
346 {
347 napi_value thisVal = nullptr;
348 size_t paramsCount = MAX_PARAM_NUM;
349 napi_value params[MAX_PARAM_NUM] = {nullptr};
350 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
351
352 if (!NapiUtils::HasNamedProperty(env, thisVal,
353 TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID)) {
354 NETSTACK_LOGI("not found Property clientId");
355 return NapiUtils::GetUndefined(env);
356 }
357
358 int clientid = NapiUtils::GetInt32Property(env, thisVal,
359 TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID);
360
361 if (paramsCount != PARAM_OPTION_CALLBACK || NapiUtils::GetValueType(env, params[0]) != napi_string ||
362 NapiUtils::GetValueType(env, params[1]) != napi_function) {
363 NETSTACK_LOGE("on off once interface para: [string, function]");
364 napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
365 return NapiUtils::GetUndefined(env);
366 }
367 std::shared_ptr<EventManager> *sharedManager = nullptr;
368 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
369 if (sharedManager == nullptr || *sharedManager == nullptr) {
370 NETSTACK_LOGE("manager is nullptr");
371 return NapiUtils::GetUndefined(env);
372 }
373 auto manager = *sharedManager;
374 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
375 if (tlsSocketServer == nullptr) {
376 NETSTACK_LOGE("tlsSocketServer is null");
377 return NapiUtils::GetUndefined(env);
378 }
379
380 const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
381
382 manager->AddListener(env, event, params[1], false, false);
383 TLSConnectionRegEvent(event, tlsSocketServer, clientid, manager);
384 return NapiUtils::GetUndefined(env);
385 }
386
Off(napi_env env,napi_callback_info info)387 napi_value MonitorServer::Off(napi_env env, napi_callback_info info)
388 {
389 napi_value thisVal = nullptr;
390 size_t paramsCount = MAX_PARAM_NUM;
391 napi_value params[MAX_PARAM_NUM] = {nullptr};
392 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
393
394 if ((paramsCount != PARAM_OPTION && paramsCount != PARAM_OPTION_CALLBACK) ||
395 NapiUtils::GetValueType(env, params[0]) != napi_string) {
396 NETSTACK_LOGE("on off once interface para: [string, function?]");
397 napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
398 return NapiUtils::GetUndefined(env);
399 }
400
401 if (paramsCount == PARAM_OPTION_CALLBACK && NapiUtils::GetValueType(env, params[1]) != napi_function) {
402 NETSTACK_LOGE("on off once interface para: [string, function]");
403 napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
404 return NapiUtils::GetUndefined(env);
405 }
406 std::shared_ptr<EventManager> *sharedManager = nullptr;
407 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
408 if (sharedManager == nullptr || *sharedManager == nullptr) {
409 NETSTACK_LOGE("manager is nullptr");
410 return NapiUtils::GetUndefined(env);
411 }
412 auto manager = *sharedManager;
413 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
414 if (tlsSocketServer == nullptr) {
415 NETSTACK_LOGE("tlsSocketServer is null");
416 return NapiUtils::GetUndefined(env);
417 }
418
419 const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
420 if (event == EVENT_CONNECT) {
421 tlsSocketServer->OffConnect();
422 }
423 if (event == EVENT_ERROR) {
424 tlsSocketServer->OffError();
425 }
426
427 if (paramsCount == PARAM_OPTION_CALLBACK) {
428 manager->DeleteListener(event, params[1]);
429 } else {
430 manager->DeleteListener(event);
431 }
432 return NapiUtils::GetUndefined(env);
433 }
434
ConnectionOff(napi_env env,napi_callback_info info)435 napi_value MonitorServer::ConnectionOff(napi_env env, napi_callback_info info)
436 {
437 napi_value thisVal = nullptr;
438 size_t paramsCount = MAX_PARAM_NUM;
439 napi_value params[MAX_PARAM_NUM] = {nullptr};
440 NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
441
442 int clientid = NapiUtils::GetInt32Property(env, thisVal,
443 TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID);
444
445 if ((paramsCount != PARAM_OPTION && paramsCount != PARAM_OPTION_CALLBACK) ||
446 NapiUtils::GetValueType(env, params[0]) != napi_string) {
447 NETSTACK_LOGE("on off once interface para: [string, function?]");
448 napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
449 return NapiUtils::GetUndefined(env);
450 }
451
452 if (paramsCount == PARAM_OPTION_CALLBACK && NapiUtils::GetValueType(env, params[1]) != napi_function) {
453 NETSTACK_LOGE("on off once interface para: [string, function]");
454 napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
455 return NapiUtils::GetUndefined(env);
456 }
457 std::shared_ptr<EventManager> *sharedManager = nullptr;
458 napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
459 if (sharedManager == nullptr || *sharedManager == nullptr) {
460 NETSTACK_LOGE("manager is nullptr");
461 return NapiUtils::GetUndefined(env);
462 }
463 auto manager = *sharedManager;
464 auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
465 if (tlsSocketServer == nullptr) {
466 NETSTACK_LOGE("tlsSocketServer is null");
467 return NapiUtils::GetUndefined(env);
468 }
469
470 const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
471 TLSConnectionUnRegEvent(event, tlsSocketServer, clientid);
472 if (paramsCount == PARAM_OPTION_CALLBACK) {
473 manager->DeleteListener(event, params[1]);
474 } else {
475 manager->DeleteListener(event);
476 }
477 return NapiUtils::GetUndefined(env);
478 }
479
TLSServerRegEvent(std::string event,TLSSocketServer * tlsSocketServer,const std::shared_ptr<EventManager> & ServerEventManager)480 void MonitorServer::TLSServerRegEvent(std::string event, TLSSocketServer *tlsSocketServer,
481 const std::shared_ptr<EventManager> &ServerEventManager)
482 {
483 if (event == EVENT_CONNECT) {
484 tlsSocketServer->OnConnect(
485 [this, ServerEventManager](auto clientFd, std::shared_ptr<EventManager> eventManager) {
486 if (ServerEventManager->HasEventListener(std::string(EVENT_CONNECT))) {
487 auto messageParma = new MonitorServer::MessageParma();
488 messageParma->clientID = clientFd;
489 messageParma->eventManager = eventManager;
490 ServerEventManager->EmitByUvWithoutCheckShared(std::string(EVENT_CONNECT), messageParma,
491 EventConnectCallback);
492 }
493 });
494 }
495 if (event == EVENT_ERROR) {
496 tlsSocketServer->OnError([this, ServerEventManager](auto errorNumber, auto errorString) {
497 errorNumber_ = errorNumber;
498 errorString_ = errorString;
499 ServerEventManager->EmitByUvWithoutCheckShared(std::string(EVENT_ERROR),
500 new std::pair<int32_t, std::string>(errorNumber_, errorString_), EventErrorCallback);
501 });
502 }
503 }
504
TLSConnectionRegEvent(std::string event,TLSSocketServer * tlsSocketServer,int clientId,const std::shared_ptr<EventManager> & eventManager)505 void MonitorServer::TLSConnectionRegEvent(std::string event, TLSSocketServer *tlsSocketServer, int clientId,
506 const std::shared_ptr<EventManager> &eventManager)
507 {
508 if (event == EVENT_MESSAGE) {
509 InsertEventMessage(tlsSocketServer, clientId, eventManager);
510 }
511 if (event == EVENT_CLOSE) {
512 auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
513 if (ptrConnection != nullptr) {
514 ptrConnection->OnClose([this, eventManager](auto clientFd) {
515 eventManager->EmitByUvWithoutCheckShared(std::string(EVENT_CLOSE), nullptr,
516 EventCloseCallback);
517 });
518 }
519 }
520 if (event == EVENT_ERROR) {
521 auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
522 if (ptrConnection != nullptr) {
523 ptrConnection->OnError([this, eventManager](auto errorNumber, auto errorString) {
524 eventManager->EmitByUvWithoutCheckShared(std::string(EVENT_ERROR),
525 new std::pair<int32_t, std::string>(errorNumber, errorString), EventErrorCallback);
526 });
527 }
528 }
529 }
530
InsertEventMessage(TLSSocketServer * tlsSocketServer,int clientId,const std::shared_ptr<EventManager> & eventManager)531 void MonitorServer::InsertEventMessage(TLSSocketServer *tlsSocketServer, int clientId,
532 const std::shared_ptr<EventManager> &eventManager)
533 {
534 if (tlsSocketServer == nullptr) {
535 return;
536 }
537
538 auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
539 if (ptrConnection != nullptr) {
540 ptrConnection->OnMessage([this, eventManager](auto clientFd, auto data, auto remoteInfo) {
541 if (eventManager->HasEventListener(std::string(EVENT_MESSAGE))) {
542 auto messageRecvParma = new MessageRecvParma();
543 messageRecvParma->clientID = clientFd;
544 messageRecvParma->data = data;
545 messageRecvParma->remoteInfo_.SetAddress(remoteInfo.GetAddress());
546 messageRecvParma->remoteInfo_.SetFamilyByStr(remoteInfo.GetFamily());
547 messageRecvParma->remoteInfo_.SetPort(remoteInfo.GetPort());
548 messageRecvParma->remoteInfo_.SetSize(remoteInfo.GetSize());
549 eventManager->EmitByUvWithoutCheckShared(std::string(EVENT_MESSAGE), messageRecvParma,
550 EventMessageCallback);
551 }
552 });
553 }
554 }
555
TLSConnectionUnRegEvent(std::string event,TLSSocketServer * tlsSocketServer,int clientId)556 void MonitorServer::TLSConnectionUnRegEvent(std::string event, TLSSocketServer *tlsSocketServer, int clientId)
557 {
558 if (event == EVENT_MESSAGE) {
559 auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
560 if (ptrConnection != nullptr) {
561 ptrConnection->OffMessage();
562 }
563 }
564 if (event == EVENT_CLOSE) {
565 auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
566 if (ptrConnection != nullptr) {
567 ptrConnection->OffClose();
568 }
569 }
570 if (event == EVENT_ERROR) {
571 auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
572 if (ptrConnection != nullptr) {
573 ptrConnection->OffError();
574 }
575 }
576 }
577 } // namespace TlsSocketServer
578 } // namespace NetStack
579 } // namespace OHOS
580