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