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 <vector>
17
18 #include "net_manager_constants.h"
19 #include "netmanager_ext_log.h"
20
21 #include "constant.h"
22 #include "mdns_callback_observer.h"
23 #include "mdns_instances.h"
24
25 namespace OHOS {
26 namespace NetManagerStandard {
27
ErrorCodeTrans(int32_t retCode)28 static int32_t ErrorCodeTrans(int32_t retCode)
29 {
30 NETMANAGER_EXT_LOGE("ErrorCodeTrans init value %{public}d", retCode);
31 switch (retCode) {
32 case NET_MDNS_ERR_CALLBACK_DUPLICATED:
33 [[fallthrough]];
34 case NET_MDNS_ERR_CALLBACK_NOT_FOUND:
35 return static_cast<int32_t>(MDnsErr::ALREADY_ACTIVE);
36 default:
37 return static_cast<int32_t>(MDnsErr::INTERNAL_ERROR);
38 }
39 }
40
HandleRegister(const MDnsServiceInfo & serviceInfo,int32_t retCode)41 void MDnsRegistrationObserver::HandleRegister(const MDnsServiceInfo &serviceInfo, int32_t retCode) {}
42
HandleUnRegister(const MDnsServiceInfo & serviceInfo,int32_t retCode)43 void MDnsRegistrationObserver::HandleUnRegister(const MDnsServiceInfo &serviceInfo, int32_t retCode) {}
44
HandleRegisterResult(const MDnsServiceInfo & serviceInfo,int32_t retCode)45 void MDnsRegistrationObserver::HandleRegisterResult(const MDnsServiceInfo &serviceInfo, int32_t retCode) {}
46
HandleStartDiscover(const MDnsServiceInfo & serviceInfo,int32_t retCode)47 void MDnsDiscoveryObserver::HandleStartDiscover(const MDnsServiceInfo &serviceInfo, int32_t retCode) {}
48
HandleStopDiscover(const MDnsServiceInfo & serviceInfo,int32_t retCode)49 void MDnsDiscoveryObserver::HandleStopDiscover(const MDnsServiceInfo &serviceInfo, int32_t retCode) {}
50
EmitStartDiscover(const MDnsServiceInfo & serviceInfo,int32_t retCode)51 void MDnsDiscoveryObserver::EmitStartDiscover(const MDnsServiceInfo &serviceInfo, int32_t retCode)
52 {
53 MDnsDiscoveryInstance *mdnsDisdicover = MDnsDiscoveryInstance::discoverInstanceMap_[this];
54 if (mdnsDisdicover == nullptr) {
55 NETMANAGER_EXT_LOGE("can not find MDnsDiscoveryInstance handle");
56 return;
57 }
58
59 if (!mdnsDisdicover->GetEventManager()->HasEventListener(EVENT_SERVICESTART)) {
60 NETMANAGER_EXT_LOGE("no event listener find %{public}s", EVENT_SERVICESTART);
61 return;
62 }
63 if (retCode == 0) {
64 mdnsDisdicover->GetEventManager()->EmitByUv(EVENT_SERVICESTART, new MDnsServiceInfo(serviceInfo),
65 ServiceCallback);
66 return;
67 }
68
69 auto pair = new std::pair<int32_t, MDnsServiceInfo>(ErrorCodeTrans(retCode), serviceInfo);
70 mdnsDisdicover->GetEventManager()->EmitByUv(EVENT_SERVICESTART, pair, ServiceCallbackWithError);
71 }
72
EmitStopDiscover(const MDnsServiceInfo & serviceInfo,int32_t retCode)73 void MDnsDiscoveryObserver::EmitStopDiscover(const MDnsServiceInfo &serviceInfo, int32_t retCode)
74 {
75 MDnsDiscoveryInstance *mdnsDisdicover = MDnsDiscoveryInstance::discoverInstanceMap_[this];
76 if (mdnsDisdicover == nullptr) {
77 NETMANAGER_EXT_LOGE("can not find MDnsDiscoveryInstance handle");
78 return;
79 }
80
81 if (!mdnsDisdicover->GetEventManager()->HasEventListener(EVENT_SERVICESTOP)) {
82 NETMANAGER_EXT_LOGE("no event listener find %{public}s", EVENT_SERVICESTOP);
83 return;
84 }
85 if (retCode == 0) {
86 mdnsDisdicover->GetEventManager()->EmitByUv(EVENT_SERVICESTOP, new MDnsServiceInfo(serviceInfo),
87 ServiceCallback);
88 return;
89 }
90 auto pair = new std::pair<int32_t, MDnsServiceInfo>(ErrorCodeTrans(retCode), serviceInfo);
91 mdnsDisdicover->GetEventManager()->EmitByUv(EVENT_SERVICESTOP, pair, ServiceCallbackWithError);
92 }
93
HandleServiceFound(const MDnsServiceInfo & serviceInfo,int32_t retCode)94 void MDnsDiscoveryObserver::HandleServiceFound(const MDnsServiceInfo &serviceInfo, int32_t retCode)
95 {
96 MDnsDiscoveryInstance *mdnsDisdicover = MDnsDiscoveryInstance::discoverInstanceMap_[this];
97 if (mdnsDisdicover == nullptr) {
98 NETMANAGER_EXT_LOGE("can not find MDnsDiscoveryInstance handle");
99 return;
100 }
101
102 if (!mdnsDisdicover->GetEventManager()->HasEventListener(EVENT_SERVICEFOUND)) {
103 NETMANAGER_EXT_LOGE("no event listener find %{public}s", EVENT_SERVICEFOUND);
104 return;
105 }
106
107 mdnsDisdicover->GetEventManager()->EmitByUv(EVENT_SERVICEFOUND, new MDnsServiceInfo(serviceInfo),
108 ServiceCallback);
109 }
110
HandleServiceLost(const MDnsServiceInfo & serviceInfo,int32_t retCode)111 void MDnsDiscoveryObserver::HandleServiceLost(const MDnsServiceInfo &serviceInfo, int32_t retCode)
112 {
113 MDnsDiscoveryInstance *mdnsDisdicover = MDnsDiscoveryInstance::discoverInstanceMap_[this];
114 if (mdnsDisdicover == nullptr) {
115 NETMANAGER_EXT_LOGE("can not find MDnsDiscoveryInstance handle");
116 return;
117 }
118
119 if (!mdnsDisdicover->GetEventManager()->HasEventListener(EVENT_SERVICELOST)) {
120 NETMANAGER_EXT_LOGE("no event listener find %{public}s", EVENT_SERVICELOST);
121 return;
122 }
123
124 mdnsDisdicover->GetEventManager()->EmitByUv(EVENT_SERVICELOST, new MDnsServiceInfo(serviceInfo),
125 ServiceCallback);
126 }
127
CreateCallbackParam(const MDnsServiceInfo & serviceInfo,napi_env env)128 napi_value CreateCallbackParam(const MDnsServiceInfo &serviceInfo, napi_env env)
129 {
130 napi_value object = NapiUtils::CreateObject(env);
131 NapiUtils::SetStringPropertyUtf8(env, object, SERVICEINFO_TYPE, serviceInfo.type);
132 NapiUtils::SetStringPropertyUtf8(env, object, SERVICEINFO_NAME, serviceInfo.name);
133 NapiUtils::SetInt32Property(env, object, SERVICEINFO_PORT, serviceInfo.port);
134
135 napi_value eleObj = NapiUtils::CreateObject(env);
136 NapiUtils::SetStringPropertyUtf8(env, eleObj, SERVICEINFO_ADDRESS, serviceInfo.addr);
137 NapiUtils::SetInt32Property(env, eleObj, SERVICEINFO_PORT, serviceInfo.port);
138 int32_t family = serviceInfo.family == MDnsServiceInfo::IPV6 ? 0 : 1;
139 NapiUtils::SetInt32Property(env, eleObj, SERVICEINFO_FAMILY, family);
140
141 NapiUtils::SetNamedProperty(env, object, SERVICEINFO_HOST, eleObj);
142 return object;
143 }
144
CreateServiceWithError(napi_env env,void * data)145 napi_value MDnsDiscoveryObserver::CreateServiceWithError(napi_env env, void *data)
146 {
147 auto pair = static_cast<std::pair<int32_t, MDnsServiceInfo> *>(data);
148 napi_value obj = NapiUtils::CreateObject(env);
149 NapiUtils::SetUint32Property(env, obj, ERRCODE, pair->first);
150 napi_value infoObj = CreateCallbackParam(pair->second, env);
151 NapiUtils::SetNamedProperty(env, obj, SERVICEINFO, infoObj);
152 delete pair;
153 return obj;
154 }
155
ServiceCallbackWithError(uv_work_t * work,int32_t status)156 void MDnsDiscoveryObserver::ServiceCallbackWithError(uv_work_t *work, int32_t status)
157 {
158 CallbackTemplate<CreateServiceWithError>(work, status);
159 }
160
CreateService(napi_env env,void * data)161 napi_value MDnsDiscoveryObserver::CreateService(napi_env env, void *data)
162 {
163 auto serviceInfo = static_cast<MDnsServiceInfo *>(data);
164 napi_value obj = CreateCallbackParam(*serviceInfo, env);
165 napi_value infoObj = CreateCallbackParam(*serviceInfo, env);
166 NapiUtils::SetNamedProperty(env, obj, SERVICEINFO, infoObj);
167 delete serviceInfo;
168 return obj;
169 }
170
ServiceCallback(uv_work_t * work,int32_t status)171 void MDnsDiscoveryObserver::ServiceCallback(uv_work_t *work, int32_t status)
172 {
173 CallbackTemplate<CreateService>(work, status);
174 }
175
HandleResolveResult(const MDnsServiceInfo & serviceInfo,int32_t retCode)176 void MDnsResolveObserver::HandleResolveResult(const MDnsServiceInfo &serviceInfo, int32_t retCode)
177 {
178 NETMANAGER_EXT_LOGI("HandleResolveResult [%{public}s][%{public}s][%{public}d]", serviceInfo.name.c_str(),
179 serviceInfo.type.c_str(), serviceInfo.port);
180 mutex_.lock();
181 retCode_ = retCode;
182 serviceInfo_ = serviceInfo;
183 resolved_ = true;
184 mutex_.unlock();
185 cv_.notify_one();
186 }
187 } // namespace NetManagerStandard
188 } // namespace OHOS
189