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