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