mirror of
https://gitee.com/openharmony/communication_netstack
synced 2024-11-23 15:00:25 +00:00
add shared manager
Signed-off-by: maosiping <maosiping@huawei.com>
This commit is contained in:
parent
7722227b49
commit
388ae01bfd
@ -14,6 +14,7 @@
|
||||
*/
|
||||
|
||||
#include <netdb.h>
|
||||
|
||||
#include "net_address.h"
|
||||
#include "netstack_log.h"
|
||||
#include "securec.h"
|
||||
@ -28,6 +29,9 @@ NetAddress::NetAddress(const NetAddress &other) : address_(other.address_), fami
|
||||
|
||||
void NetAddress::SetIpAddress(const std::string &address)
|
||||
{
|
||||
if (address.empty()) {
|
||||
return;
|
||||
}
|
||||
if (family_ == Family::IPv4) {
|
||||
in6_addr ipv6{};
|
||||
if (inet_pton(AF_INET6, address.c_str(), &ipv6) > 0) {
|
||||
@ -54,8 +58,9 @@ void NetAddress::SetIpAddress(const std::string &address)
|
||||
}
|
||||
}
|
||||
if (family_ == Family::IPv4) {
|
||||
auto inet = atoi(address.c_str());
|
||||
if (inet >= 0) {
|
||||
size_t size = SIZE_MAX;
|
||||
auto inet = std::stoi(address, &size);
|
||||
if (size == address.length()) {
|
||||
in_addr addr{};
|
||||
addr.s_addr = static_cast<in_addr_t>(inet);
|
||||
address_ = inet_ntoa(addr);
|
||||
|
@ -84,6 +84,8 @@ public:
|
||||
|
||||
void Emit(const std::string &type, const std::pair<napi_value, napi_value> &argv);
|
||||
|
||||
void EmitSharedManager(const std::string &type, const std::pair<napi_value, napi_value> &argv);
|
||||
|
||||
void SetNeedPromise(bool needPromise);
|
||||
|
||||
[[nodiscard]] bool IsNeedPromise() const;
|
||||
@ -104,6 +106,8 @@ public:
|
||||
|
||||
[[nodiscard]] std::shared_ptr<EventManager> GetSharedManager() const;
|
||||
|
||||
void SetSharedManager(const std::shared_ptr<EventManager> &sharedManager);
|
||||
|
||||
void CreateReference(napi_value value);
|
||||
|
||||
void DeleteReference();
|
||||
@ -155,7 +159,14 @@ private:
|
||||
|
||||
std::string errorMessage_;
|
||||
|
||||
protected:
|
||||
std::shared_ptr<EventManager> sharedManager_;
|
||||
|
||||
private:
|
||||
napi_ref callbackBak1_ = nullptr;
|
||||
napi_ref callbackBak2_ = nullptr;
|
||||
napi_ref callbackBak3_ = nullptr;
|
||||
napi_ref callbackBak4_ = nullptr;
|
||||
};
|
||||
} // namespace OHOS::NetStack
|
||||
|
||||
|
@ -23,11 +23,11 @@
|
||||
#include <vector>
|
||||
|
||||
#include "base_async_work.h"
|
||||
#include "base_context.h"
|
||||
#include "napi/native_api.h"
|
||||
#include "napi/native_common.h"
|
||||
#include "base_context.h"
|
||||
#include "netstack_log.h"
|
||||
#include "napi_utils.h"
|
||||
#include "netstack_log.h"
|
||||
|
||||
namespace OHOS::NetStack {
|
||||
class EventManager;
|
||||
@ -57,20 +57,15 @@ napi_value InterfaceWithSharedManager(napi_env env, napi_callback_info info, con
|
||||
NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
if (sharedManager == nullptr) {
|
||||
NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
auto manager = *sharedManager;
|
||||
if (manager == nullptr) {
|
||||
NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
auto context = new Context(env, manager);
|
||||
|
||||
auto context = new (std::nothrow) Context(env, nullptr);
|
||||
if (!context) {
|
||||
NETSTACK_LOGE("new context is nullptr");
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
if (sharedManager) {
|
||||
context->SetSharedManager(*sharedManager);
|
||||
}
|
||||
context->ParseParams(params, paramsCount);
|
||||
if (context->IsNeedThrowException()) { // only api9 or later need throw exception.
|
||||
napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str());
|
||||
@ -93,6 +88,55 @@ napi_value InterfaceWithSharedManager(napi_env env, napi_callback_info info, con
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
|
||||
template <class Context>
|
||||
napi_value InterfaceWithOutAsyncWorkWithSharedManager(napi_env env, napi_callback_info info,
|
||||
bool (*Work)(napi_env, napi_value, Context *),
|
||||
const std::string &asyncWorkName, AsyncWorkExecutor executor,
|
||||
AsyncWorkCallback callback)
|
||||
{
|
||||
static_assert(std::is_base_of<BaseContext, Context>::value);
|
||||
|
||||
napi_value thisVal = nullptr;
|
||||
size_t paramsCount = MAX_PARAM_NUM;
|
||||
napi_value params[MAX_PARAM_NUM] = {nullptr};
|
||||
NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
|
||||
|
||||
std::shared_ptr<EventManager> *sharedManager = nullptr;
|
||||
auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
|
||||
if (napi_ret != napi_ok) {
|
||||
NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
|
||||
auto context = new (std::nothrow) Context(env, nullptr);
|
||||
if (!context) {
|
||||
NETSTACK_LOGE("new context is nullptr");
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
if (sharedManager) {
|
||||
context->SetSharedManager(*sharedManager);
|
||||
}
|
||||
context->ParseParams(params, paramsCount);
|
||||
napi_value ret = NapiUtils::GetUndefined(env);
|
||||
if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
|
||||
NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str());
|
||||
ret = context->CreatePromise();
|
||||
} else {
|
||||
NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str());
|
||||
}
|
||||
context->CreateReference(thisVal);
|
||||
if (Work != nullptr) {
|
||||
if (!Work(env, thisVal, context)) {
|
||||
NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
|
||||
}
|
||||
}
|
||||
if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() ||
|
||||
context->GetSharedManager()->IsEventDestroy()) {
|
||||
context->CreateAsyncWork(asyncWorkName, executor, callback);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
template <class Context>
|
||||
napi_value Interface(napi_env env, napi_callback_info info, const std::string &asyncWorkName,
|
||||
bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor,
|
||||
@ -252,6 +296,9 @@ napi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, c
|
||||
napi_value OnSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
|
||||
bool asyncCallback);
|
||||
|
||||
napi_value OnceSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
|
||||
bool asyncCallback);
|
||||
|
||||
napi_value OffSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events);
|
||||
} // namespace OHOS::NetStack::ModuleTemplate
|
||||
#endif /* COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H */
|
||||
|
@ -92,12 +92,18 @@ napi_status BaseContext::SetCallback(napi_value callback)
|
||||
if (callback_ != nullptr) {
|
||||
(void)napi_delete_reference(env_, callback_);
|
||||
}
|
||||
return napi_create_reference(env_, callback, 1, &callback_);
|
||||
auto status = napi_create_reference(env_, callback, 1, &callback_);
|
||||
callbackBak1_ = callback_;
|
||||
callbackBak2_ = callback_;
|
||||
callbackBak3_ = callback_;
|
||||
callbackBak4_ = callback_;
|
||||
return status;
|
||||
}
|
||||
|
||||
void BaseContext::DeleteCallback()
|
||||
{
|
||||
if (callback_ == nullptr) {
|
||||
if (callback_ == nullptr || callback_ != callbackBak1_ || callback_ != callbackBak2_ ||
|
||||
callback_ != callbackBak3_ || callback_ != callbackBak4_) {
|
||||
return;
|
||||
}
|
||||
(void)napi_delete_reference(env_, callback_);
|
||||
@ -180,7 +186,8 @@ std::string BaseContext::GetErrorMessage() const
|
||||
|
||||
napi_value BaseContext::GetCallback() const
|
||||
{
|
||||
if (callback_ == nullptr) {
|
||||
if (callback_ == nullptr || callback_ != callbackBak1_ || callback_ != callbackBak2_ ||
|
||||
callback_ != callbackBak3_ || callback_ != callbackBak4_) {
|
||||
return nullptr;
|
||||
}
|
||||
napi_value callback = nullptr;
|
||||
@ -198,6 +205,13 @@ const std::string &BaseContext::GetAsyncWorkName() const
|
||||
return asyncWorkName_;
|
||||
}
|
||||
|
||||
void BaseContext::EmitSharedManager(const std::string &type, const std::pair<napi_value, napi_value> &argv)
|
||||
{
|
||||
if (sharedManager_ != nullptr) {
|
||||
sharedManager_->Emit(type, argv);
|
||||
}
|
||||
}
|
||||
|
||||
void BaseContext::Emit(const std::string &type, const std::pair<napi_value, napi_value> &argv)
|
||||
{
|
||||
if (manager_ != nullptr) {
|
||||
@ -225,6 +239,11 @@ std::shared_ptr<EventManager> BaseContext::GetSharedManager() const
|
||||
return sharedManager_;
|
||||
}
|
||||
|
||||
void BaseContext::SetSharedManager(const std::shared_ptr<EventManager> &sharedManager)
|
||||
{
|
||||
sharedManager_ = sharedManager;
|
||||
}
|
||||
|
||||
void BaseContext::ParseParams(napi_value *params, size_t paramsCount)
|
||||
{
|
||||
if (paramsCount != 0 && paramsCount != 1) {
|
||||
|
@ -74,6 +74,43 @@ napi_value OnSharedManager(napi_env env, napi_callback_info info, const std::ini
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
|
||||
napi_value OnceSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
|
||||
bool asyncCallback)
|
||||
{
|
||||
napi_value thisVal = nullptr;
|
||||
size_t paramsCount = MAX_PARAM_NUM;
|
||||
napi_value params[MAX_PARAM_NUM] = {nullptr};
|
||||
NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr));
|
||||
|
||||
if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string ||
|
||||
NapiUtils::GetValueType(env, params[1]) != napi_function) {
|
||||
NETSTACK_LOGE("on off once interface para: [string, function]");
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
|
||||
std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
|
||||
if (std::find(events.begin(), events.end(), event) == events.end()) {
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
|
||||
std::shared_ptr<EventManager> *sharedManager = nullptr;
|
||||
auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
|
||||
if (napi_ret != napi_ok) {
|
||||
NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
if (sharedManager == nullptr) {
|
||||
NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
auto manager = *sharedManager;
|
||||
if (manager != nullptr) {
|
||||
manager->AddListener(env, event, params[1], true, asyncCallback);
|
||||
}
|
||||
|
||||
return NapiUtils::GetUndefined(env);
|
||||
}
|
||||
|
||||
napi_value OffSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events)
|
||||
{
|
||||
napi_value thisVal = nullptr;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "napi_utils.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <initializer_list>
|
||||
|
Loading…
Reference in New Issue
Block a user