1 /*
2 * Copyright (c) 2021-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 "dcamera_source_handler.h"
17
18 #include "anonymous_string.h"
19 #include "dcamera_hisysevent_adapter.h"
20 #include "dcamera_radar.h"
21 #include "dcamera_source_callback.h"
22 #include "dcamera_source_handler_ipc.h"
23 #include "dcamera_source_load_callback.h"
24 #include "distributed_camera_constants.h"
25 #include "distributed_camera_errno.h"
26 #include "distributed_hardware_log.h"
27 #include "if_system_ability_manager.h"
28 #include "iservice_registry.h"
29
30 namespace OHOS {
31 namespace DistributedHardware {
32 IMPLEMENT_SINGLE_INSTANCE(DCameraSourceHandler);
33
DCameraSourceHandler()34 DCameraSourceHandler::DCameraSourceHandler()
35 {
36 DHLOGI("DCameraSourceHandler construct.");
37 callback_ = sptr<DCameraSourceCallback>(new DCameraSourceCallback());
38 }
39
~DCameraSourceHandler()40 DCameraSourceHandler::~DCameraSourceHandler()
41 {
42 DHLOGI("~DCameraSourceHandler");
43 }
44
InitSource(const std::string & params)45 int32_t DCameraSourceHandler::InitSource(const std::string& params)
46 {
47 DHLOGI("Start");
48 {
49 std::lock_guard<std::mutex> autoLock(producerMutex_);
50 if (state_ == DCAMERA_SA_STATE_START) {
51 return DCAMERA_OK;
52 }
53 }
54 sptr<ISystemAbilityManager> sm = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
55 if (sm == nullptr) {
56 DHLOGE("GetSourceLocalCamSrv GetSystemAbilityManager failed");
57 return DCAMERA_INIT_ERR;
58 }
59 ReportSaEvent(INIT_SA_EVENT, DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, "init source sa event.");
60 sptr<DCameraSourceLoadCallback> loadCallback(new DCameraSourceLoadCallback(params));
61 int32_t ret = sm->LoadSystemAbility(DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, loadCallback);
62 DcameraRadar::GetInstance().ReportDcameraInit("LoadSystemAbility", CameraInit::SERVICE_INIT,
63 BizState::BIZ_STATE_START, ret);
64 if (ret != ERR_OK) {
65 DHLOGE("systemAbilityId: %{public}d load failed, result code: %{public}d.",
66 DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, ret);
67 return DCAMERA_INIT_ERR;
68 }
69 {
70 uint32_t interval = 1;
71 std::unique_lock<std::mutex> lock(producerMutex_);
72 producerCon_.wait_for(lock, std::chrono::minutes(interval), [this] {
73 return (this->state_ == DCAMERA_SA_STATE_START);
74 });
75 if (state_ == DCAMERA_SA_STATE_STOP) {
76 DHLOGE("SourceSA Start failed!");
77 return DCAMERA_INIT_ERR;
78 }
79 }
80 DHLOGI("end, result: %{public}d", ret);
81 return DCAMERA_OK;
82 }
83
FinishStartSA(const std::string & params)84 void DCameraSourceHandler::FinishStartSA(const std::string ¶ms)
85 {
86 DCameraSourceHandlerIpc::GetInstance().Init();
87 sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
88 if (dCameraSourceSrv == nullptr) {
89 DHLOGE("get Service failed");
90 return;
91 }
92
93 DcameraRadar::GetInstance().ReportDcameraInitProgress("InitSource", CameraInit::SOURCE_CAMERA_INIT, DCAMERA_OK);
94 dCameraSourceSrv->InitSource(params, callback_);
95 std::lock_guard<std::mutex> lock(producerMutex_);
96 state_ = DCAMERA_SA_STATE_START;
97 producerCon_.notify_one();
98 }
99
FinishStartSAFailed(const int32_t systemAbilityId)100 void DCameraSourceHandler::FinishStartSAFailed(const int32_t systemAbilityId)
101 {
102 DHLOGE("SourceSA Start failed, systemAbilityId: %{public}d.", systemAbilityId);
103 std::unique_lock<std::mutex> lock(producerMutex_);
104 state_ = DCAMERA_SA_STATE_STOP;
105 producerCon_.notify_one();
106 }
107
ReleaseSource()108 int32_t DCameraSourceHandler::ReleaseSource()
109 {
110 DHLOGI("Start");
111 sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
112 if (dCameraSourceSrv == nullptr) {
113 DHLOGE("get Service failed");
114 return DCAMERA_INIT_ERR;
115 }
116 ReportSaEvent(RELEASE_SA_EVENT, DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID, "release source sa event.");
117 dCameraSourceSrv->ReleaseSource();
118 DCameraSourceHandlerIpc::GetInstance().UnInit();
119 std::unique_lock<std::mutex> lock(producerMutex_);
120 state_ = DCAMERA_SA_STATE_STOP;
121 DHLOGI("end");
122 return DCAMERA_OK;
123 }
124
RegisterDistributedHardware(const std::string & devId,const std::string & dhId,const EnableParam & param,std::shared_ptr<RegisterCallback> callback)125 int32_t DCameraSourceHandler::RegisterDistributedHardware(const std::string& devId, const std::string& dhId,
126 const EnableParam& param, std::shared_ptr<RegisterCallback> callback)
127 {
128 DHLOGI("devId: %{public}s dhId: %{public}s", GetAnonyString(devId).c_str(),
129 GetAnonyString(dhId).c_str());
130 if (callback == nullptr) {
131 DHLOGI("RegisterCallback is null.");
132 return DCAMERA_BAD_VALUE;
133 }
134 sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
135 if (dCameraSourceSrv == nullptr) {
136 DHLOGE("get Service failed");
137 return DCAMERA_BAD_VALUE;
138 }
139
140 std::string reqId = GetRandomID();
141 std::lock_guard<std::mutex> autoLock(optLock_);
142
143 CHECK_AND_RETURN_RET_LOG(callback_ == nullptr, DCAMERA_BAD_VALUE, "ipc callback is null.");
144 callback_->PushRegCallback(reqId, callback);
145 int32_t ret = dCameraSourceSrv->RegisterDistributedHardware(devId, dhId, reqId, param);
146 if (ret != DCAMERA_OK) {
147 callback_->PopRegCallback(reqId);
148 }
149 DHLOGI("end, ret: %{public}d devId: %{public}s dhId: %{public}s version: %{public}s",
150 ret, GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), param.sinkVersion.c_str());
151 return ret;
152 }
153
UnregisterDistributedHardware(const std::string & devId,const std::string & dhId,std::shared_ptr<UnregisterCallback> callback)154 int32_t DCameraSourceHandler::UnregisterDistributedHardware(const std::string& devId, const std::string& dhId,
155 std::shared_ptr<UnregisterCallback> callback)
156 {
157 DHLOGI("devId: %{public}s dhId: %{public}s", GetAnonyString(devId).c_str(),
158 GetAnonyString(dhId).c_str());
159 if (callback == nullptr) {
160 DHLOGI("UnregisterCallback is null.");
161 return DCAMERA_BAD_VALUE;
162 }
163 sptr<IDistributedCameraSource> dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv();
164 if (dCameraSourceSrv == nullptr) {
165 DHLOGE("get Service failed");
166 return DCAMERA_BAD_VALUE;
167 }
168
169 std::string reqId = GetRandomID();
170 std::lock_guard<std::mutex> autoLock(optLock_);
171
172 CHECK_AND_RETURN_RET_LOG(callback_ == nullptr, DCAMERA_BAD_VALUE, "ipc callback is null.");
173 callback_->PushUnregCallback(reqId, callback);
174 int32_t ret = dCameraSourceSrv->UnregisterDistributedHardware(devId, dhId, reqId);
175 if (ret != DCAMERA_OK) {
176 callback_->PopUnregCallback(reqId);
177 }
178 DHLOGI("end, ret: %{public}d devId: %{public}s dhId: %{public}s", ret,
179 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
180 return ret;
181 }
182
ConfigDistributedHardware(const std::string & devId,const std::string & dhId,const std::string & key,const std::string & value)183 int32_t DCameraSourceHandler::ConfigDistributedHardware(const std::string& devId, const std::string& dhId,
184 const std::string& key, const std::string& value)
185 {
186 return DCAMERA_OK;
187 }
188
RegisterDistributedHardwareStateListener(std::shared_ptr<DistributedHardwareStateListener> listener)189 void DCameraSourceHandler::RegisterDistributedHardwareStateListener(
190 std::shared_ptr<DistributedHardwareStateListener> listener)
191 {
192 CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
193 callback_->RegisterStateListener(listener);
194 }
195
UnregisterDistributedHardwareStateListener()196 void DCameraSourceHandler::UnregisterDistributedHardwareStateListener()
197 {
198 CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
199 callback_->UnRegisterStateListener();
200 }
201
RegisterDataSyncTriggerListener(std::shared_ptr<DataSyncTriggerListener> listener)202 void DCameraSourceHandler::RegisterDataSyncTriggerListener(std::shared_ptr<DataSyncTriggerListener> listener)
203 {
204 CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
205 callback_->RegisterTriggerListener(listener);
206 }
207
UnregisterDataSyncTriggerListener()208 void DCameraSourceHandler::UnregisterDataSyncTriggerListener()
209 {
210 CHECK_AND_RETURN_LOG(callback_ == nullptr, "%{public}s", "ipc callback is null.");
211 callback_->UnRegisterTriggerListener();
212 }
213
SetSAState()214 void DCameraSourceHandler::SetSAState()
215 {
216 std::unique_lock<std::mutex> lock(producerMutex_);
217 state_ = DCAMERA_SA_STATE_STOP;
218 }
219
GetSourceHardwareHandler()220 IDistributedHardwareSource *GetSourceHardwareHandler()
221 {
222 DHLOGI("DCameraSourceHandler GetSourceHardwareHandler Start");
223 return &DCameraSourceHandler::GetInstance();
224 }
225 } // namespace DistributedHardware
226 } // namespace OHOS
227