• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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 "device_manager_service.h"
17 
18 #include <dlfcn.h>
19 #include <functional>
20 
21 #include "dm_anonymous.h"
22 #include "dm_constants.h"
23 #include "dm_hidumper.h"
24 #include "dm_log.h"
25 
26 constexpr const char* LIB_IMPL_NAME = "libdevicemanagerserviceimpl.z.so";
27 
28 namespace OHOS {
29 namespace DistributedHardware {
30 IMPLEMENT_SINGLE_INSTANCE(DeviceManagerService);
31 
~DeviceManagerService()32 DeviceManagerService::~DeviceManagerService()
33 {
34     LOGI("DeviceManagerService destructor");
35     if (dmServiceImpl_ != nullptr) {
36         dmServiceImpl_->Release();
37     }
38     std::string soPathName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
39     void *so_handle = dlopen(soPathName.c_str(), RTLD_NOW | RTLD_NOLOAD);
40     if (so_handle != nullptr) {
41         dlclose(so_handle);
42     }
43 }
44 
Init()45 int32_t DeviceManagerService::Init()
46 {
47     InitSoftbusListener();
48     InitDMServiceListener();
49 
50     LOGI("Init success, dm service single instance initialized.");
51     return DM_OK;
52 }
53 
InitSoftbusListener()54 int32_t DeviceManagerService::InitSoftbusListener()
55 {
56     if (softbusListener_ == nullptr) {
57         softbusListener_ = std::make_shared<SoftbusListener>();
58     }
59     LOGI("SoftbusListener init success.");
60 
61     return DM_OK;
62 }
63 
UninitSoftbusListener()64 void DeviceManagerService::UninitSoftbusListener()
65 {
66     softbusListener_ = nullptr;
67     LOGI("SoftbusListener uninit.");
68 }
69 
InitDMServiceListener()70 int32_t DeviceManagerService::InitDMServiceListener()
71 {
72     if (listener_ == nullptr) {
73         listener_ = std::make_shared<DeviceManagerServiceListener>();
74     }
75 
76     LOGI("DeviceManagerServiceListener init success.");
77     return DM_OK;
78 }
79 
UninitDMServiceListener()80 void DeviceManagerService::UninitDMServiceListener()
81 {
82     listener_ = nullptr;
83     LOGI("DeviceManagerServiceListener uninit.");
84 }
85 
GetTrustedDeviceList(const std::string & pkgName,const std::string & extra,std::vector<DmDeviceInfo> & deviceList)86 int32_t DeviceManagerService::GetTrustedDeviceList(const std::string &pkgName, const std::string &extra,
87                                                    std::vector<DmDeviceInfo> &deviceList)
88 {
89     LOGI("DeviceManagerService::GetTrustedDeviceList begin for pkgName = %s, extra = %s", pkgName.c_str(),
90         extra.c_str());
91     if (pkgName.empty()) {
92         LOGE("Invalid parameter, pkgName is empty.");
93         return ERR_DM_INPUT_PARA_INVALID;
94     }
95     int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
96     if (ret != DM_OK) {
97         LOGE("GetTrustedDeviceList failed");
98     }
99     return ret;
100 }
101 
GetLocalDeviceInfo(DmDeviceInfo & info)102 int32_t DeviceManagerService::GetLocalDeviceInfo(DmDeviceInfo &info)
103 {
104     LOGI("DeviceManagerService::GetLocalDeviceInfo begin.");
105     int32_t ret = softbusListener_->GetLocalDeviceInfo(info);
106     if (ret != DM_OK) {
107         LOGE("GetLocalDeviceInfo failed");
108     }
109     return ret;
110 }
111 
GetUdidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & udid)112 int32_t DeviceManagerService::GetUdidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
113                                                  std::string &udid)
114 {
115     LOGI("DeviceManagerService::GetUdidByNetworkId begin for pkgName = %s", pkgName.c_str());
116     if (pkgName.empty() || netWorkId.empty()) {
117         LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
118         return ERR_DM_INPUT_PARA_INVALID;
119     }
120     SoftbusListener::GetUdidByNetworkId(netWorkId.c_str(), udid);
121     return DM_OK;
122 }
123 
GetUuidByNetworkId(const std::string & pkgName,const std::string & netWorkId,std::string & uuid)124 int32_t DeviceManagerService::GetUuidByNetworkId(const std::string &pkgName, const std::string &netWorkId,
125                                                  std::string &uuid)
126 {
127     LOGI("DeviceManagerService::GetUuidByNetworkId begin for pkgName = %s", pkgName.c_str());
128     if (pkgName.empty() || netWorkId.empty()) {
129         LOGE("Invalid parameter, pkgName: %s, netWorkId: %s", pkgName.c_str(), GetAnonyString(netWorkId).c_str());
130         return ERR_DM_INPUT_PARA_INVALID;
131     }
132     SoftbusListener::GetUuidByNetworkId(netWorkId.c_str(), uuid);
133     return DM_OK;
134 }
135 
StartDeviceDiscovery(const std::string & pkgName,const DmSubscribeInfo & subscribeInfo,const std::string & extra)136 int32_t DeviceManagerService::StartDeviceDiscovery(const std::string &pkgName, const DmSubscribeInfo &subscribeInfo,
137                                                    const std::string &extra)
138 {
139     LOGI("DeviceManagerService::StartDeviceDiscovery begin for pkgName = %s, extra = %s", pkgName.c_str(),
140         extra.c_str());
141     if (pkgName.empty()) {
142         LOGE("Invalid parameter, pkgName is empty.");
143         return ERR_DM_INPUT_PARA_INVALID;
144     }
145     if (!IsDMServiceImplReady()) {
146         LOGE("StartDeviceDiscovery failed, instance not init or init failed.");
147         return ERR_DM_NOT_INIT;
148     }
149     return dmServiceImpl_->StartDeviceDiscovery(pkgName, subscribeInfo, extra);
150 }
151 
StopDeviceDiscovery(const std::string & pkgName,uint16_t subscribeId)152 int32_t DeviceManagerService::StopDeviceDiscovery(const std::string &pkgName, uint16_t subscribeId)
153 {
154     LOGI("DeviceManagerService::StopDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
155     if (pkgName.empty()) {
156         LOGE("Invalid parameter, pkgName is empty.");
157         return ERR_DM_INPUT_PARA_INVALID;
158     }
159     if (!IsDMServiceImplReady()) {
160         LOGE("StopDeviceDiscovery failed, instance not init or init failed.");
161         return ERR_DM_NOT_INIT;
162     }
163     return dmServiceImpl_->StopDeviceDiscovery(pkgName, subscribeId);
164 }
165 
PublishDeviceDiscovery(const std::string & pkgName,const DmPublishInfo & publishInfo)166 int32_t DeviceManagerService::PublishDeviceDiscovery(const std::string &pkgName, const DmPublishInfo &publishInfo)
167 {
168     LOGI("DeviceManagerService::PublishDeviceDiscovery begin for pkgName = %s", pkgName.c_str());
169     if (pkgName.empty()) {
170         LOGE("Invalid parameter, pkgName is empty.");
171         return ERR_DM_INPUT_PARA_INVALID;
172     }
173     if (!IsDMServiceImplReady()) {
174         LOGE("PublishDeviceDiscovery failed, instance not init or init failed.");
175         return ERR_DM_NOT_INIT;
176     }
177     return dmServiceImpl_->PublishDeviceDiscovery(pkgName, publishInfo);
178 }
179 
UnPublishDeviceDiscovery(const std::string & pkgName,int32_t publishId)180 int32_t DeviceManagerService::UnPublishDeviceDiscovery(const std::string &pkgName, int32_t publishId)
181 {
182     if (pkgName.empty()) {
183         LOGE("Invalid parameter, pkgName is empty.");
184         return ERR_DM_INPUT_PARA_INVALID;
185     }
186     if (!IsDMServiceImplReady()) {
187         LOGE("UnPublishDeviceDiscovery failed, instance not init or init failed.");
188         return ERR_DM_NOT_INIT;
189     }
190     return dmServiceImpl_->UnPublishDeviceDiscovery(pkgName, publishId);
191 }
192 
AuthenticateDevice(const std::string & pkgName,int32_t authType,const std::string & deviceId,const std::string & extra)193 int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType,
194                                                  const std::string &deviceId, const std::string &extra)
195 {
196     if (pkgName.empty() || deviceId.empty()) {
197         LOGE("DeviceManagerService::AuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
198         return ERR_DM_INPUT_PARA_INVALID;
199     }
200     if (!IsDMServiceImplReady()) {
201         LOGE("AuthenticateDevice failed, instance not init or init failed.");
202         return ERR_DM_NOT_INIT;
203     }
204     return dmServiceImpl_->AuthenticateDevice(pkgName, authType, deviceId, extra);
205 }
206 
UnAuthenticateDevice(const std::string & pkgName,const std::string & deviceId)207 int32_t DeviceManagerService::UnAuthenticateDevice(const std::string &pkgName, const std::string &deviceId)
208 {
209     LOGI("DeviceManagerService::UnAuthenticateDevice begin for pkgName = %s, deviceId = %s",
210         pkgName.c_str(), GetAnonyString(deviceId).c_str());
211     if (pkgName.empty() || deviceId.empty()) {
212         LOGE("DeviceManagerService::UnAuthenticateDevice error: Invalid parameter, pkgName: %s", pkgName.c_str());
213         return ERR_DM_INPUT_PARA_INVALID;
214     }
215     if (!IsDMServiceImplReady()) {
216         LOGE("UnAuthenticateDevice failed, instance not init or init failed.");
217         return ERR_DM_NOT_INIT;
218     }
219     return dmServiceImpl_->UnAuthenticateDevice(pkgName, deviceId);
220 }
221 
VerifyAuthentication(const std::string & authParam)222 int32_t DeviceManagerService::VerifyAuthentication(const std::string &authParam)
223 {
224     if (authParam.empty()) {
225         LOGE("DeviceManagerService::VerifyAuthentication error: Invalid parameter, authParam: %s", authParam.c_str());
226         return ERR_DM_INPUT_PARA_INVALID;
227     }
228     if (!IsDMServiceImplReady()) {
229         LOGE("DeviceManagerService::VerifyAuthentication failed, instance not init or init failed.");
230         return ERR_DM_NOT_INIT;
231     }
232     return dmServiceImpl_->VerifyAuthentication(authParam);
233 }
234 
GetFaParam(std::string & pkgName,DmAuthParam & authParam)235 int32_t DeviceManagerService::GetFaParam(std::string &pkgName, DmAuthParam &authParam)
236 {
237     if (pkgName.empty()) {
238         LOGE("Invalid parameter, pkgName is empty.");
239         return ERR_DM_INPUT_PARA_INVALID;
240     }
241     if (!IsDMServiceImplReady()) {
242         LOGE("GetFaParam failed, instance not init or init failed.");
243         return ERR_DM_NOT_INIT;
244     }
245     return dmServiceImpl_->GetFaParam(pkgName, authParam);
246 }
247 
SetUserOperation(std::string & pkgName,int32_t action,const std::string & params)248 int32_t DeviceManagerService::SetUserOperation(std::string &pkgName, int32_t action, const std::string &params)
249 {
250     if (pkgName.empty() || params.empty()) {
251         LOGE("DeviceManagerService::SetUserOperation error: Invalid parameter, pkgName: %s", pkgName.c_str(),
252             params.c_str());
253         return ERR_DM_INPUT_PARA_INVALID;
254     }
255     if (!IsDMServiceImplReady()) {
256         LOGE("SetUserOperation failed, instance not init or init failed.");
257         return ERR_DM_NOT_INIT;
258     }
259     return dmServiceImpl_->SetUserOperation(pkgName, action, params);
260 }
261 
RegisterDevStateCallback(const std::string & pkgName,const std::string & extra)262 int32_t DeviceManagerService::RegisterDevStateCallback(const std::string &pkgName, const std::string &extra)
263 {
264     if (pkgName.empty()) {
265         LOGE("DeviceManagerService::RegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
266         return ERR_DM_INPUT_PARA_INVALID;
267     }
268     {
269         std::lock_guard<std::mutex> lock(registerDevStateLock_);
270         if (registerDevStateMap_.count(pkgName) == 0) {
271             registerDevStateMap_.insert(std::map<std::string, std::string>::value_type (pkgName, extra));
272         }
273     }
274     return DM_OK;
275 }
276 
UnRegisterDevStateCallback(const std::string & pkgName,const std::string & extra)277 int32_t DeviceManagerService::UnRegisterDevStateCallback(const std::string &pkgName, const std::string &extra)
278 {
279     if (pkgName.empty()) {
280         LOGE("DeviceManagerService::UnRegisterDevStateCallback error: Invalid parameter, pkgName: %s", pkgName.c_str());
281         return ERR_DM_INPUT_PARA_INVALID;
282     }
283     {
284         std::lock_guard<std::mutex> lock(registerDevStateLock_);
285         if (registerDevStateMap_.count(pkgName) > 0) {
286             registerDevStateMap_.erase(pkgName);
287         }
288     }
289     if (IsDMServiceImplSoLoaded()) {
290         return dmServiceImpl_->UnRegisterDevStateCallback(pkgName, extra);
291     }
292     return DM_OK;
293 }
294 
HandleDeviceOnline(const DmDeviceInfo & info)295 void DeviceManagerService::HandleDeviceOnline(const DmDeviceInfo &info)
296 {
297     if (!IsDMServiceImplReady()) {
298         LOGE("HandleDeviceOnline failed, instance not init or init failed.");
299         return;
300     }
301     {
302         std::lock_guard<std::mutex> lock(registerDevStateLock_);
303         for (auto iter : registerDevStateMap_) {
304             dmServiceImpl_->RegisterDevStateCallback(iter.first, iter.second);
305         }
306     }
307     dmServiceImpl_->HandleDeviceOnline(info);
308 }
309 
HandleDeviceOffline(const DmDeviceInfo & info)310 void DeviceManagerService::HandleDeviceOffline(const DmDeviceInfo &info)
311 {
312     if (!IsDMServiceImplReady()) {
313         LOGE("HandleDeviceOffline failed, instance not init or init failed.");
314         return;
315     }
316     dmServiceImpl_->HandleDeviceOffline(info);
317 }
318 
OnSessionOpened(int sessionId,int result)319 int DeviceManagerService::OnSessionOpened(int sessionId, int result)
320 {
321     if (!IsDMServiceImplReady()) {
322         LOGE("OnSessionOpened failed, instance not init or init failed.");
323         return ERR_DM_NOT_INIT;
324     }
325     return dmServiceImpl_->OnSessionOpened(sessionId, result);
326 }
327 
OnSessionClosed(int sessionId)328 void DeviceManagerService::OnSessionClosed(int sessionId)
329 {
330     if (!IsDMServiceImplReady()) {
331         LOGE("OnSessionClosed failed, instance not init or init failed.");
332         return;
333     }
334     dmServiceImpl_->OnSessionClosed(sessionId);
335 }
336 
OnBytesReceived(int sessionId,const void * data,unsigned int dataLen)337 void DeviceManagerService::OnBytesReceived(int sessionId, const void *data, unsigned int dataLen)
338 {
339     if (!IsDMServiceImplReady()) {
340         LOGE("OnBytesReceived failed, instance not init or init failed.");
341         return;
342     }
343     dmServiceImpl_->OnBytesReceived(sessionId, data, dataLen);
344 }
345 
RequestCredential(const std::string & reqJsonStr,std::string & returnJsonStr)346 int32_t DeviceManagerService::RequestCredential(const std::string &reqJsonStr, std::string &returnJsonStr)
347 {
348     if (!IsDMServiceImplReady()) {
349         LOGE("RequestCredential failed, instance not init or init failed.");
350         return ERR_DM_NOT_INIT;
351     }
352     return dmServiceImpl_->RequestCredential(reqJsonStr, returnJsonStr);
353 }
354 
ImportCredential(const std::string & pkgName,const std::string & credentialInfo)355 int32_t DeviceManagerService::ImportCredential(const std::string &pkgName, const std::string &credentialInfo)
356 {
357     if (!IsDMServiceImplReady()) {
358         LOGE("ImportCredential failed, instance not init or init failed.");
359         return ERR_DM_NOT_INIT;
360     }
361     return dmServiceImpl_->ImportCredential(pkgName, credentialInfo);
362 }
363 
DeleteCredential(const std::string & pkgName,const std::string & deleteInfo)364 int32_t DeviceManagerService::DeleteCredential(const std::string &pkgName, const std::string &deleteInfo)
365 {
366     if (!IsDMServiceImplReady()) {
367         LOGE("DeleteCredential failed, instance not init or init failed.");
368         return ERR_DM_NOT_INIT;
369     }
370     return dmServiceImpl_->DeleteCredential(pkgName, deleteInfo);
371 }
372 
RegisterCredentialCallback(const std::string & pkgName)373 int32_t DeviceManagerService::RegisterCredentialCallback(const std::string &pkgName)
374 {
375     if (!IsDMServiceImplReady()) {
376         LOGE("RegisterCredentialCallback failed, instance not init or init failed.");
377         return ERR_DM_NOT_INIT;
378     }
379     return dmServiceImpl_->RegisterCredentialCallback(pkgName);
380 }
381 
UnRegisterCredentialCallback(const std::string & pkgName)382 int32_t DeviceManagerService::UnRegisterCredentialCallback(const std::string &pkgName)
383 {
384     if (!IsDMServiceImplReady()) {
385         LOGE("UnRegisterCredentialCallback failed, instance not init or init failed.");
386         return ERR_DM_NOT_INIT;
387     }
388     return dmServiceImpl_->UnRegisterCredentialCallback(pkgName);
389 }
390 
IsDMServiceImplReady()391 bool DeviceManagerService::IsDMServiceImplReady()
392 {
393     std::lock_guard<std::mutex> lock(isImplLoadLock_);
394     if (isImplsoLoaded_ && (dmServiceImpl_ != nullptr)) {
395         return true;
396     }
397 
398     std::string soName = std::string(LIB_LOAD_PATH) + std::string(LIB_IMPL_NAME);
399     void *so_handle = dlopen(soName.c_str(), RTLD_NOW | RTLD_NOLOAD);
400     if (so_handle == nullptr) {
401         so_handle = dlopen(soName.c_str(), RTLD_NOW);
402         if (so_handle == nullptr) {
403             LOGE("load libdevicemanagerserviceimpl so %s failed.", soName.c_str());
404             return false;
405         }
406     }
407     dlerror();
408     auto func = (CreateDMServiceFuncPtr)dlsym(so_handle, "CreateDMServiceObject");
409     if (dlerror() != nullptr || func == nullptr) {
410         LOGE("Create object function is not exist.");
411         return false;
412     }
413 
414     dmServiceImpl_ = std::shared_ptr<IDeviceManagerServiceImpl>(func());
415     if (dmServiceImpl_->Initialize(listener_) != DM_OK) {
416         dlclose(so_handle);
417         dmServiceImpl_ = nullptr;
418         isImplsoLoaded_ = false;
419         return false;
420     }
421     isImplsoLoaded_ = true;
422     return true;
423 }
424 
IsDMServiceImplSoLoaded()425 bool DeviceManagerService::IsDMServiceImplSoLoaded()
426 {
427     std::lock_guard<std::mutex> lock(isImplLoadLock_);
428     return isImplsoLoaded_;
429 }
430 
DmHiDumper(const std::vector<std::string> & args,std::string & result)431 int32_t DeviceManagerService::DmHiDumper(const std::vector<std::string>& args, std::string &result)
432 {
433     LOGI("HiDump GetTrustedDeviceList");
434     std::vector<HidumperFlag> dumpflag;
435     HiDumpHelper::GetInstance().GetArgsType(args, dumpflag);
436 
437     for (unsigned int i = 0; i < dumpflag.size(); i++) {
438         if (dumpflag[i] == HidumperFlag::HIDUMPER_GET_TRUSTED_LIST) {
439             std::vector<DmDeviceInfo> deviceList;
440 
441             int32_t ret = softbusListener_->GetTrustedDeviceList(deviceList);
442             if (ret != DM_OK) {
443                 result.append("HiDumpHelper GetTrustedDeviceList failed");
444                 LOGE("HiDumpHelper GetTrustedDeviceList failed");
445                 return ERR_DM_FAILED;
446             }
447 
448             for (unsigned int j = 0; j < deviceList.size(); j++) {
449                 HiDumpHelper::GetInstance().SetNodeInfo(deviceList[j]);
450                 LOGI("DeviceManagerService::DmHiDumper SetNodeInfo.");
451             }
452         }
453     }
454     HiDumpHelper::GetInstance().HiDump(args, result);
455     return DM_OK;
456 }
457 
NotifyEvent(const std::string & pkgName,const int32_t eventId,const std::string & event)458 int32_t DeviceManagerService::NotifyEvent(const std::string &pkgName, const int32_t eventId, const std::string &event)
459 {
460     if (!IsDMServiceImplReady()) {
461         LOGE("NotifyEvent failed, instance not init or init failed.");
462         return ERR_DM_NOT_INIT;
463     }
464     return dmServiceImpl_->NotifyEvent(pkgName, eventId, event);
465 }
466 
LoadHardwareFwkService()467 void DeviceManagerService::LoadHardwareFwkService()
468 {
469     std::string extra;
470     std::vector<DmDeviceInfo> deviceList;
471     int32_t ret = GetTrustedDeviceList(DM_PKG_NAME, extra, deviceList);
472     if (ret != DM_OK) {
473         LOGE("LoadHardwareFwkService failed, get trusted devicelist failed.");
474         return;
475     }
476     if (deviceList.size() > 0) {
477         dmServiceImpl_->LoadHardwareFwkService();
478     }
479 }
480 
GetEncryptedUuidByNetworkId(const std::string & pkgName,const std::string & networkId,std::string & uuid)481 int32_t DeviceManagerService::GetEncryptedUuidByNetworkId(const std::string &pkgName, const std::string &networkId,
482     std::string &uuid)
483 {
484     if (!IsDMServiceImplReady()) {
485         LOGE("GetEncryptedUuidByNetworkId failed, instance not init or init failed.");
486         return ERR_DM_NOT_INIT;
487     }
488     return dmServiceImpl_->GetEncryptedUuidByNetworkId(pkgName, networkId, uuid);
489 }
490 
GenerateEncryptedUuid(const std::string & pkgName,const std::string & uuid,const std::string & appId,std::string & encryptedUuid)491 int32_t DeviceManagerService::GenerateEncryptedUuid(const std::string &pkgName, const std::string &uuid,
492     const std::string &appId, std::string &encryptedUuid)
493 {
494     if (!IsDMServiceImplReady()) {
495         LOGE("GenerateEncryptedUuid failed, instance not init or init failed.");
496         return ERR_DM_NOT_INIT;
497     }
498     return dmServiceImpl_->GenerateEncryptedUuid(pkgName, uuid, appId, encryptedUuid);
499 }
500 } // namespace DistributedHardware
501 } // namespace OHOS
502