1 /*
2 * Copyright (c) 2021 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 "dcamera_sink_service_ipc.h"
17
18 #include "if_system_ability_manager.h"
19 #include "iservice_registry.h"
20
21 #include "anonymous_string.h"
22 #include "distributed_camera_constants.h"
23 #include "distributed_camera_errno.h"
24 #include "distributed_hardware_log.h"
25
26 namespace OHOS {
27 namespace DistributedHardware {
DCameraSinkServiceIpc()28 DCameraSinkServiceIpc::DCameraSinkServiceIpc() : isInit_(false)
29 {
30 DHLOGI("DCameraSinkServiceIpc Create");
31 }
32
~DCameraSinkServiceIpc()33 DCameraSinkServiceIpc::~DCameraSinkServiceIpc()
34 {
35 DHLOGI("DCameraSinkServiceIpc Delete");
36 UnInit();
37 }
38
39 IMPLEMENT_SINGLE_INSTANCE(DCameraSinkServiceIpc);
40
Init()41 void DCameraSinkServiceIpc::Init()
42 {
43 std::lock_guard<std::mutex> autoLock(initDmsLock_);
44 DHLOGI("DCameraSinkServiceIpc Init Start");
45 if (isInit_) {
46 DHLOGI("DCameraSinkServiceIpc has already init");
47 return;
48 }
49 auto runner = AppExecFwk::EventRunner::Create("DCameraSinkServiceIpcHandler");
50 serviceHandler_ = std::make_shared<AppExecFwk::EventHandler>(runner);
51 sourceRemoteRecipient_ = new SourceRemoteRecipient();
52 isInit_ = true;
53 DHLOGI("DCameraSinkServiceIpc Init End");
54 }
55
UnInit()56 void DCameraSinkServiceIpc::UnInit()
57 {
58 std::lock_guard<std::mutex> autoLock(initDmsLock_);
59 DHLOGI("DCameraSinkServiceIpc UnInit Start");
60 if (!isInit_) {
61 DHLOGI("DCameraSinkServiceIpc has already UnInit");
62 return;
63 }
64 ClearSourceRemoteDhms();
65 DHLOGI("DCameraSinkServiceIpc Start free serviceHandler");
66 serviceHandler_ = nullptr;
67 DHLOGI("DCameraSinkServiceIpc Start free recipient");
68 sourceRemoteRecipient_ = nullptr;
69 isInit_ = false;
70 DHLOGI("DCameraSinkServiceIpc UnInit End");
71 }
72
GetSourceRemoteDHMS(const std::string & deviceId)73 sptr<IDistributedCameraSource> DCameraSinkServiceIpc::GetSourceRemoteDHMS(const std::string& deviceId)
74 {
75 if (deviceId.empty()) {
76 DHLOGE("GetSourceRemoteDHMS deviceId is empty");
77 return nullptr;
78 }
79 {
80 std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
81 auto iter = remoteSources_.find(deviceId);
82 if (iter != remoteSources_.end()) {
83 auto object = iter->second;
84 if (object != nullptr) {
85 DHLOGI("DCameraSinkServiceIpc GetSourceRemoteDHMS from cache devId: %s",
86 GetAnonyString(deviceId).c_str());
87 return object;
88 }
89 }
90 }
91 DHLOGI("GetSourceRemoteDHMS remote deviceid is %s", GetAnonyString(deviceId).c_str());
92 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
93 if (samgr == nullptr) {
94 DHLOGE("GetSourceRemoteDHMS failed to connect to systemAbilityMgr!");
95 return nullptr;
96 }
97
98 auto object = samgr->CheckSystemAbility(DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, deviceId);
99 if (object == nullptr) {
100 DHLOGE("GetSourceRemoteDHMS failed get remote DHMS %s", GetAnonyString(deviceId).c_str());
101 return nullptr;
102 }
103 int32_t ret = object->AddDeathRecipient(sourceRemoteRecipient_);
104 sptr<IDistributedCameraSource> remoteDmsObj = iface_cast<IDistributedCameraSource>(object);
105 if (remoteDmsObj == nullptr) {
106 DHLOGI("GetSourceRemoteDHMS failed, remoteDmsObj is null ret: %d", ret);
107 return nullptr;
108 }
109 {
110 std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
111 auto iter = remoteSources_.find(deviceId);
112 if (iter != remoteSources_.end()) {
113 iter->second->AsObject()->RemoveDeathRecipient(sourceRemoteRecipient_);
114 }
115 remoteSources_[deviceId] = remoteDmsObj;
116 }
117 DHLOGI("GetSourceRemoteDHMS success, AddDeathRecipient ret: %d", ret);
118 return remoteDmsObj;
119 }
120
DeleteSourceRemoteDhms(const std::string & deviceId)121 void DCameraSinkServiceIpc::DeleteSourceRemoteDhms(const std::string& deviceId)
122 {
123 DHLOGI("DeleteSourceRemoteDhms devId: %s", GetAnonyString(deviceId).c_str());
124 std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
125 auto item = remoteSources_.find(deviceId);
126 if (item == remoteSources_.end()) {
127 DHLOGI("DeleteSourceRemoteDhms not found device: %s", GetAnonyString(deviceId).c_str());
128 return;
129 }
130
131 if (item->second != nullptr) {
132 item->second->AsObject()->RemoveDeathRecipient(sourceRemoteRecipient_);
133 }
134 remoteSources_.erase(item);
135 }
136
ClearSourceRemoteDhms()137 void DCameraSinkServiceIpc::ClearSourceRemoteDhms()
138 {
139 DHLOGI("ClearSourceRemoteDhms Start");
140 std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
141 for (auto iter = remoteSources_.begin(); iter != remoteSources_.end(); iter++) {
142 if (iter->second != nullptr) {
143 iter->second->AsObject()->RemoveDeathRecipient(sourceRemoteRecipient_);
144 }
145 }
146 remoteSources_.clear();
147 DHLOGI("ClearSourceRemoteDhms end");
148 }
149
OnRemoteDied(const wptr<IRemoteObject> & remote)150 void DCameraSinkServiceIpc::SourceRemoteRecipient::OnRemoteDied(const wptr<IRemoteObject>& remote)
151 {
152 DHLOGI("SourceRemoteRecipient OnRemoteDied received died notify!");
153 DCameraSinkServiceIpc::GetInstance().OnSourceRemoteDmsDied(remote);
154 }
155
OnSourceRemoteDmsDied(const wptr<IRemoteObject> & remote)156 void DCameraSinkServiceIpc::OnSourceRemoteDmsDied(const wptr<IRemoteObject>& remote)
157 {
158 sptr<IRemoteObject> diedRemoted = remote.promote();
159 if (diedRemoted == nullptr) {
160 DHLOGE("OnSourceRemoteDmsDied promote failed!");
161 return;
162 }
163 DHLOGI("OnSourceRemoteDmsDied delete diedRemoted");
164 auto remoteDmsDiedFunc = [this, diedRemoted]() {
165 OnSourceRemoteDmsDied(diedRemoted);
166 };
167 if (serviceHandler_ != nullptr) {
168 serviceHandler_->PostTask(remoteDmsDiedFunc);
169 }
170 }
171
OnSourceRemoteDmsDied(const sptr<IRemoteObject> & remote)172 void DCameraSinkServiceIpc::OnSourceRemoteDmsDied(const sptr<IRemoteObject>& remote)
173 {
174 std::lock_guard<std::mutex> autoLock(sourceRemoteDmsLock_);
175 auto iter = std::find_if(remoteSources_.begin(), remoteSources_.end(), [&](
176 const std::pair<std::string, sptr<IDistributedCameraSource>> &item)->bool {
177 return item.second->AsObject() == remote;
178 });
179 if (iter == remoteSources_.end()) {
180 DHLOGI("OnSourceRemoteDmsDied not found remote object");
181 return;
182 }
183
184 DHLOGI("OnSourceRemoteDmsDied remote.devId: %s", GetAnonyString(iter->first).c_str());
185 if (iter->second != nullptr) {
186 iter->second->AsObject()->RemoveDeathRecipient(sourceRemoteRecipient_);
187 }
188 remoteSources_.erase(iter);
189 }
190 }
191 }