• 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 "napi_utils.h"
17 #include "net_manager_constants.h"
18 #include "netmanager_ext_log.h"
19 
20 #include "constant.h"
21 #include "mdns_client.h"
22 #include "mdns_exec.h"
23 #include "mdns_instances.h"
24 
25 namespace OHOS {
26 namespace NetManagerStandard {
27 
ExecAddLocalService(MDnsAddLocalServiceContext * context)28 bool MDnsExec::ExecAddLocalService(MDnsAddLocalServiceContext *context)
29 {
30     auto ret =
31         DelayedSingleton<MDnsClient>::GetInstance()->RegisterService(context->GetServiceInfo(), context->GetObserver());
32     if (ret != NETMANAGER_EXT_SUCCESS) {
33         context->SetErrorCode(ret);
34         NETMANAGER_EXT_LOGE("RegisterService error, errorCode: %{public}d", ret);
35         return false;
36     }
37     return ret == NETMANAGER_EXT_SUCCESS;
38 }
39 
ExecRemoveLocalService(MDnsRemoveLocalServiceContext * context)40 bool MDnsExec::ExecRemoveLocalService(MDnsRemoveLocalServiceContext *context)
41 {
42     sptr<IRegistrationCallback> callback = context->GetObserver();
43     auto ret = DelayedSingleton<MDnsClient>::GetInstance()->UnRegisterService(callback);
44     if (ret != NETMANAGER_EXT_SUCCESS) {
45         context->SetErrorCode(ret);
46         NETMANAGER_EXT_LOGE("UnRegisterService error, errorCode: %{public}d", ret);
47         return false;
48     }
49     return ret == NETMANAGER_EXT_SUCCESS;
50 }
51 
ExecResolveLocalService(MDnsResolveLocalServiceContext * context)52 bool MDnsExec::ExecResolveLocalService(MDnsResolveLocalServiceContext *context)
53 {
54     auto ret =
55         DelayedSingleton<MDnsClient>::GetInstance()->ResolveService(context->GetServiceInfo(), context->GetObserver());
56     if (ret != NETMANAGER_EXT_SUCCESS) {
57         context->SetErrorCode(ret);
58         NETMANAGER_EXT_LOGE("ResolveService error, errorCode: %{public}d", ret);
59         return false;
60     }
61 
62     sptr<IResolveCallback> callback = context->GetObserver();
63     MDnsResolveObserver *observer = static_cast<MDnsResolveObserver *>(callback.GetRefPtr());
64 
65     if (observer == nullptr) {
66         context->SetErrorCode(NET_MDNS_ERR_UNKNOWN);
67         return false;
68     }
69 
70     std::unique_lock<std::mutex> lk(observer->mutex_);
71     if (!observer->cv_.wait_for(lk, std::chrono::seconds(SYNC_TIMEOUT), [=]() { return observer->resolved_; })) {
72         context->SetErrorCode(NET_MDNS_ERR_TIMEOUT);
73         return false;
74     }
75 
76     context->SetServiceInfo(observer->serviceInfo_);
77     if (observer->retCode_ != NETMANAGER_EXT_SUCCESS) {
78         context->SetErrorCode(observer->retCode_);
79         NETMANAGER_EXT_LOGE("HandleResolveResult error, errorCode: %{public}d", ret);
80         return false;
81     }
82     return observer->retCode_ == NETMANAGER_EXT_SUCCESS;
83 }
84 
ExecStartSearchingMDNS(MDnsStartSearchingContext * context)85 bool MDnsExec::ExecStartSearchingMDNS(MDnsStartSearchingContext *context)
86 {
87     EventManager *manager = context->GetManager();
88     if (manager == nullptr) {
89         NETMANAGER_EXT_LOGE("manager is nullptr");
90         return false;
91     }
92     auto discover = static_cast<MDnsDiscoveryInstance *>(manager->GetData());
93     if (discover == nullptr) {
94         NETMANAGER_EXT_LOGE("discover is nullptr");
95         return false;
96     }
97     auto ret =
98         DelayedSingleton<MDnsClient>::GetInstance()->StartDiscoverService(discover->serviceType_, discover->observer_);
99     if (ret != NETMANAGER_EXT_SUCCESS) {
100         context->SetErrorCode(ret);
101         NETMANAGER_EXT_LOGE("StartDiscoverService error, errorCode: %{public}d", ret);
102         return false;
103     }
104     MDnsServiceInfo info;
105     info.type = discover->serviceType_;
106     discover->GetObserver()->EmitStartDiscover(info, ret);
107     return ret == NETMANAGER_EXT_SUCCESS;
108 }
109 
ExecStopSearchingMDNS(MDnsStopSearchingContext * context)110 bool MDnsExec::ExecStopSearchingMDNS(MDnsStopSearchingContext *context)
111 {
112     EventManager *manager = context->GetManager();
113     if (manager == nullptr) {
114         NETMANAGER_EXT_LOGE("manager is nullptr");
115         return false;
116     }
117     auto discover = static_cast<MDnsDiscoveryInstance *>(manager->GetData());
118     if (discover == nullptr) {
119         NETMANAGER_EXT_LOGE("discover is nullptr");
120         return false;
121     }
122     auto ret = DelayedSingleton<MDnsClient>::GetInstance()->StopDiscoverService(discover->observer_);
123     if (ret != NETMANAGER_EXT_SUCCESS) {
124         context->SetErrorCode(ret);
125         NETMANAGER_EXT_LOGE("StopDiscoverService error, errorCode: %{public}d", ret);
126         return false;
127     }
128     MDnsServiceInfo info;
129     info.type = discover->serviceType_;
130     discover->GetObserver()->EmitStopDiscover(info, ret);
131     return ret == NETMANAGER_EXT_SUCCESS;
132 }
133 
CreateAttributeObj(napi_env env,MDnsServiceInfo serviceInfo)134 napi_value CreateAttributeObj(napi_env env, MDnsServiceInfo serviceInfo)
135 {
136     TxtRecord attrMap = serviceInfo.GetAttrMap();
137     auto attrArrSize = attrMap.size();
138     size_t index = 0;
139     auto iter = attrMap.begin();
140     napi_value attrArr = NapiUtils::CreateArray(env, attrArrSize);
141     for (; iter != attrMap.end(); iter++, index++) {
142         napi_value attrItem = NapiUtils::CreateObject(env);
143         NapiUtils::SetStringPropertyUtf8(env, attrItem, SERVICEINFO_ATTR_KEY, iter->first);
144         auto valArrSize = iter->second.size();
145         napi_value valArr = NapiUtils::CreateArray(env, valArrSize);
146         auto setIter = iter->second.begin();
147         size_t setIndex = 0;
148         for (; setIter != iter->second.end(); setIter++, setIndex++) {
149             NapiUtils::SetArrayElement(env, valArr, setIndex, NapiUtils::CreateUint32(env, *setIter));
150         }
151         NapiUtils::SetNamedProperty(env, attrItem, SERVICEINFO_ATTR_VALUE, valArr);
152         NapiUtils::SetArrayElement(env, attrArr, index, attrItem);
153     }
154     return attrArr;
155 }
156 
CreateCallbackParam(T * context)157 template <class T> napi_value CreateCallbackParam(T *context)
158 {
159     napi_env env = context->GetEnv();
160     MDnsServiceInfo serviceInfo = context->GetServiceInfo();
161     NETMANAGER_EXT_LOGI("CreateCallbackParam [%{public}s][%{public}s][%{public}d]", serviceInfo.name.c_str(),
162                         serviceInfo.type.c_str(), serviceInfo.port);
163 
164     napi_value object = NapiUtils::CreateObject(env);
165     NapiUtils::SetStringPropertyUtf8(env, object, SERVICEINFO_TYPE, serviceInfo.type);
166     NapiUtils::SetStringPropertyUtf8(env, object, SERVICEINFO_NAME, serviceInfo.name);
167     NapiUtils::SetInt32Property(env, object, SERVICEINFO_PORT, serviceInfo.port);
168 
169     napi_value eleObj = NapiUtils::CreateObject(env);
170     NapiUtils::SetStringPropertyUtf8(env, eleObj, SERVICEINFO_ADDRESS, serviceInfo.addr);
171     NapiUtils::SetInt32Property(env, eleObj, SERVICEINFO_PORT, serviceInfo.port);
172     int32_t family = serviceInfo.family == MDnsServiceInfo::IPV6 ? 0 : 1;
173     NapiUtils::SetInt32Property(env, eleObj, SERVICEINFO_FAMILY, family);
174 
175     napi_value attrArrObj = CreateAttributeObj(env, serviceInfo);
176 
177     NapiUtils::SetNamedProperty(env, object, SERVICEINFO_HOST, eleObj);
178     NapiUtils::SetNamedProperty(env, object, SERVICEINFO_ATTR, attrArrObj);
179     return object;
180 }
181 
AddLocalServiceCallback(MDnsAddLocalServiceContext * context)182 napi_value MDnsExec::AddLocalServiceCallback(MDnsAddLocalServiceContext *context)
183 {
184     return CreateCallbackParam<MDnsAddLocalServiceContext>(context);
185 }
186 
RemoveLocalServiceCallback(MDnsRemoveLocalServiceContext * context)187 napi_value MDnsExec::RemoveLocalServiceCallback(MDnsRemoveLocalServiceContext *context)
188 {
189     return CreateCallbackParam<MDnsRemoveLocalServiceContext>(context);
190 }
191 
ResolveLocalServiceCallback(MDnsResolveLocalServiceContext * context)192 napi_value MDnsExec::ResolveLocalServiceCallback(MDnsResolveLocalServiceContext *context)
193 {
194     return CreateCallbackParam<MDnsResolveLocalServiceContext>(context);
195 }
196 
StartSearchingMDNSCallback(MDnsStartSearchingContext * context)197 napi_value MDnsExec::StartSearchingMDNSCallback(MDnsStartSearchingContext *context)
198 {
199     return NapiUtils::GetUndefined(context->GetEnv());
200 }
201 
StopSearchingMDNSCallback(MDnsStopSearchingContext * context)202 napi_value MDnsExec::StopSearchingMDNSCallback(MDnsStopSearchingContext *context)
203 {
204     return NapiUtils::GetUndefined(context->GetEnv());
205 }
206 } // namespace NetManagerStandard
207 } // namespace OHOS
208