• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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