1 /*
2 * Copyright (c) 2021-2025 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_controller.h"
17
18 #include <securec.h>
19 #include <cstdlib>
20 #include "iservice_registry.h"
21 #include "iservmgr_hdi.h"
22 #include "iproxy_broker.h"
23
24 #include "anonymous_string.h"
25 #include "dcamera_capture_info_cmd.h"
26 #include "dcamera_channel_source_impl.h"
27 #include "dcamera_hitrace_adapter.h"
28 #include "dcamera_metadata_setting_cmd.h"
29 #include "dcamera_protocol.h"
30 #include "dcamera_radar.h"
31 #include "dcamera_softbus_latency.h"
32 #include "dcamera_source_controller_channel_listener.h"
33 #include "dcamera_source_service_ipc.h"
34 #include "dcamera_utils_tools.h"
35
36 #include "distributed_camera_constants.h"
37 #include "distributed_camera_errno.h"
38 #include "distributed_hardware_log.h"
39 #include "idistributed_camera_sink.h"
40 #include "dcamera_low_latency.h"
41 #ifdef OS_ACCOUNT_ENABLE
42 #include "ohos_account_kits.h"
43 #include "os_account_manager.h"
44 #endif
45
46 namespace OHOS {
47 namespace DistributedHardware {
DCameraSourceController(std::string devId,std::string dhId,std::shared_ptr<DCameraSourceStateMachine> & stateMachine,std::shared_ptr<DCameraSourceDev> & camDev)48 DCameraSourceController::DCameraSourceController(std::string devId, std::string dhId,
49 std::shared_ptr<DCameraSourceStateMachine>& stateMachine, std::shared_ptr<DCameraSourceDev>& camDev)
50 : devId_(devId), dhId_(dhId), stateMachine_(stateMachine), camDev_(camDev),
51 channelState_(DCAMERA_CHANNEL_STATE_DISCONNECTED)
52 {
53 DHLOGI("DCameraSourceController create devId: %{public}s dhId: %{public}s", GetAnonyString(devId_).c_str(),
54 GetAnonyString(dhId_).c_str());
55 isInit = false;
56 cameraHdiRecipient_ = sptr<DCameraHdiRecipient>(new DCameraHdiRecipient());
57 }
58
~DCameraSourceController()59 DCameraSourceController::~DCameraSourceController()
60 {
61 DHLOGI("DCameraSourceController delete devId: %{public}s dhId: %{public}s", GetAnonyString(devId_).c_str(),
62 GetAnonyString(dhId_).c_str());
63 if (isInit) {
64 UnInit();
65 }
66 camHdiProvider_ = nullptr;
67 }
68
StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos,int32_t sceneMode)69 int32_t DCameraSourceController::StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos,
70 int32_t sceneMode)
71 {
72 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
73 DHLOGE("StartCapture not support operate %{public}zu camera", indexs_.size());
74 return DCAMERA_BAD_OPERATE;
75 }
76
77 std::string dhId = indexs_.begin()->dhId_;
78 std::string devId = indexs_.begin()->devId_;
79 DHLOGI("StartCapture devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(),
80 GetAnonyString(dhId).c_str());
81 DCameraCaptureInfoCmd cmd;
82 cmd.type_ = DCAMERA_PROTOCOL_TYPE_OPERATION;
83 cmd.dhId_ = dhId;
84 cmd.command_ = DCAMERA_PROTOCOL_CMD_CAPTURE;
85 cmd.value_.assign(captureInfos.begin(), captureInfos.end());
86 cmd.sceneMode_ = sceneMode;
87 cmd.userId_ = userId_;
88 cmd.tokenId_ = tokenId_;
89 cmd.accountId_ = accountId_;
90 std::string jsonStr;
91 int32_t ret = cmd.Marshal(jsonStr);
92 if (ret != DCAMERA_OK) {
93 DHLOGE("Marshal failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
94 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
95 return ret;
96 }
97 DHLOGI("devId: %{public}s, dhId: %{public}s captureCommand: %{public}s", GetAnonyString(devId).c_str(),
98 GetAnonyString(dhId).c_str(), cmd.command_.c_str());
99 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(jsonStr.length() + 1);
100 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(const_cast<char *>(jsonStr.c_str())),
101 jsonStr.length());
102 if (ret != EOK) {
103 DHLOGE("memcpy_s failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
104 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
105 return ret;
106 }
107 CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "channel_ is null.");
108 ret = channel_->SendData(buffer);
109 if (ret != DCAMERA_OK) {
110 DHLOGE("SendData failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
111 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
112 return ret;
113 }
114 DHLOGI("StartCapture devId: %{public}s, dhId: %{public}s success", GetAnonyString(devId).c_str(),
115 GetAnonyString(dhId).c_str());
116 return DCAMERA_OK;
117 }
118
StopCapture()119 int32_t DCameraSourceController::StopCapture()
120 {
121 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
122 DHLOGE("StopCapture not support operate %{public}zu camera", indexs_.size());
123 return DCAMERA_BAD_OPERATE;
124 }
125
126 std::string dhId = indexs_.begin()->dhId_;
127 std::string devId = indexs_.begin()->devId_;
128 DHLOGI("StopCapture devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(),
129 GetAnonyString(dhId).c_str());
130 if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
131 sptr<IDistributedCameraSink> camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId);
132 CHECK_AND_RETURN_RET_LOG(camSinkSrv == nullptr, DCAMERA_BAD_VALUE, "stopCapture can not get sink service");
133 int32_t ret = camSinkSrv->StopCapture(dhId);
134 if (ret != DCAMERA_OK) {
135 DHLOGE("StopCapture failed: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
136 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
137 return DCAMERA_BAD_OPERATE;
138 }
139 } else {
140 cJSON *rootValue = cJSON_CreateObject();
141 if (rootValue == nullptr) {
142 return DCAMERA_BAD_VALUE;
143 }
144 cJSON_AddStringToObject(rootValue, "Command", DCAMERA_PROTOCOL_CMD_STOP_CAPTURE.c_str());
145 char *data = cJSON_Print(rootValue);
146 if (data == nullptr) {
147 cJSON_Delete(rootValue);
148 return DCAMERA_BAD_VALUE;
149 }
150 std::string jsonStr = std::string(data);
151 cJSON_Delete(rootValue);
152 cJSON_free(data);
153 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(jsonStr.length() + 1);
154 int32_t ret = memcpy_s(buffer->Data(), buffer->Capacity(),
155 reinterpret_cast<uint8_t *>(const_cast<char *>(jsonStr.c_str())), jsonStr.length());
156 CHECK_AND_RETURN_RET_LOG(ret != EOK, ret, "StopCapture memcpy_s failed ret: %{public}d", ret);
157 CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "channel_ is null.");
158 ret = channel_->SendData(buffer);
159 if (ret != DCAMERA_OK) {
160 DHLOGE("StopCapture SendData failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
161 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
162 return ret;
163 }
164 }
165 DHLOGI("StopCapture devId: %{public}s, dhId: %{public}s success", GetAnonyString(devId).c_str(),
166 GetAnonyString(dhId).c_str());
167 return DCAMERA_OK;
168 }
169
ChannelNeg(std::shared_ptr<DCameraChannelInfo> & info)170 int32_t DCameraSourceController::ChannelNeg(std::shared_ptr<DCameraChannelInfo>& info)
171 {
172 CHECK_AND_RETURN_RET_LOG(info == nullptr, DCAMERA_BAD_VALUE, "ChannelNeg info is nullptr");
173 if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
174 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
175 DHLOGE("ChannelNeg not support operate %{public}zu camera", indexs_.size());
176 return DCAMERA_BAD_OPERATE;
177 }
178
179 std::string dhId = indexs_.begin()->dhId_;
180 std::string devId = indexs_.begin()->devId_;
181 DHLOGI("ChannelNeg devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(),
182 GetAnonyString(dhId).c_str());
183 sptr<IDistributedCameraSink> camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId);
184 if (camSinkSrv == nullptr) {
185 DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str());
186 return DCAMERA_BAD_OPERATE;
187 }
188 DCameraChannelInfoCmd cmd;
189 cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
190 cmd.dhId_ = dhId;
191 cmd.command_ = DCAMERA_PROTOCOL_CMD_CHAN_NEG;
192 cmd.value_ = info;
193 std::string jsonStr;
194 int32_t ret = cmd.Marshal(jsonStr);
195 if (ret != DCAMERA_OK) {
196 DHLOGE("Marshal failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
197 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
198 return ret;
199 }
200 DHLOGD("devId: %{public}s, dhId: %{public}s channelNegCommand: %{public}s",
201 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), cmd.command_.c_str());
202 ret = camSinkSrv->ChannelNeg(dhId, jsonStr);
203 if (ret != DCAMERA_OK) {
204 DHLOGE("ChannelNeg rpc failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
205 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
206 return ret;
207 }
208 DHLOGD("DCameraSourceController ChannelNeg devId: %{public}s, dhId: %{public}s success",
209 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
210 }
211 return DCAMERA_OK;
212 }
213
DCameraNotify(std::shared_ptr<DCameraEvent> & events)214 int32_t DCameraSourceController::DCameraNotify(std::shared_ptr<DCameraEvent>& events)
215 {
216 CHECK_AND_RETURN_RET_LOG(events == nullptr, DCAMERA_BAD_VALUE, "DCameraNotify events is nullptr");
217 if (events->eventResult_ == DCAMERA_EVENT_CAMERA_SUCCESS &&
218 events->eventContent_ == START_CAPTURE_SUCC) {
219 DcameraRadar::GetInstance().ReportDcameraOpen("StartCapture", CameraOpen::START_CAPTURE,
220 BizState::BIZ_STATE_END, DCAMERA_OK);
221 }
222
223 if (events->eventResult_ == DCAMERA_EVENT_CAMERA_ERROR) {
224 DcameraFinishAsyncTrace(DCAMERA_CONTINUE_FIRST_FRAME, DCAMERA_CONTINUE_FIRST_FRAME_TASKID);
225 DcameraFinishAsyncTrace(DCAMERA_SNAPSHOT_FIRST_FRAME, DCAMERA_SNAPSHOT_FIRST_FRAME_TASKID);
226 }
227 if (camHdiProvider_ == nullptr) {
228 DHLOGI("DCameraNotify camHdiProvider is nullptr devId: %{public}s dhId: %{public}s",
229 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
230 return DCAMERA_BAD_OPERATE;
231 }
232 DHBase dhBase;
233 dhBase.deviceId_ = devId_;
234 dhBase.dhId_ = dhId_;
235 if (events->eventType_ == DCAMERA_SINK_STOP && events->eventResult_ == DCAMERA_EVENT_SINK_STOP) {
236 events->eventType_ = DCAMERA_OPERATION;
237 events->eventResult_ = DCAMERA_EVENT_DEVICE_ERROR;
238 }
239 DCameraHDFEvent hdiEvent;
240 hdiEvent.type_ = events->eventType_;
241 hdiEvent.result_ = events->eventResult_;
242 hdiEvent.content_ = events->eventContent_;
243 int32_t retHdi = camHdiProvider_->Notify(dhBase, hdiEvent);
244 DHLOGI("Nofify hal, ret: %{public}d, devId: %{public}s dhId: %{public}s, type: %{public}d, result: %{public}d, "
245 "content: %{public}s", retHdi, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(),
246 events->eventType_, events->eventResult_, events->eventContent_.c_str());
247 if (retHdi != SUCCESS) {
248 return DCAMERA_BAD_OPERATE;
249 }
250 return DCAMERA_OK;
251 }
252
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)253 int32_t DCameraSourceController::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
254 {
255 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
256 DHLOGE("UpdateSettings not support operate %{public}zu camera", indexs_.size());
257 return DCAMERA_BAD_OPERATE;
258 }
259
260 std::string dhId = indexs_.begin()->dhId_;
261 std::string devId = indexs_.begin()->devId_;
262 DHLOGI("UpdateSettings devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(),
263 GetAnonyString(dhId).c_str());
264 DCameraMetadataSettingCmd cmd;
265 cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
266 cmd.dhId_ = dhId;
267 cmd.command_ = DCAMERA_PROTOCOL_CMD_UPDATE_METADATA;
268 cmd.value_.assign(settings.begin(), settings.end());
269 std::string jsonStr;
270 int32_t ret = cmd.Marshal(jsonStr);
271 if (ret != DCAMERA_OK) {
272 DHLOGE("Marshal failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
273 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
274 return ret;
275 }
276 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(jsonStr.length() + 1);
277 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(const_cast<char *>(jsonStr.c_str())),
278 jsonStr.length());
279 if (ret != EOK) {
280 DHLOGE("memcpy_s failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
281 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
282 return ret;
283 }
284 CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "channel_ is null.");
285 ret = channel_->SendData(buffer);
286 if (ret != DCAMERA_OK) {
287 DHLOGE("SendData failed %{public}d, devId: %{public}s, dhId: %{public}s", ret,
288 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
289 return ret;
290 }
291 DHLOGI("UpdateSettings devId: %{public}s, dhId: %{public}s success", GetAnonyString(devId).c_str(),
292 GetAnonyString(dhId).c_str());
293 return DCAMERA_OK;
294 }
295
GetCameraInfo(std::shared_ptr<DCameraInfo> & camInfo)296 int32_t DCameraSourceController::GetCameraInfo(std::shared_ptr<DCameraInfo>& camInfo)
297 {
298 if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
299 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
300 DHLOGE("GetCameraInfo not support operate %{public}zu camera", indexs_.size());
301 return DCAMERA_BAD_OPERATE;
302 }
303
304 std::string dhId = indexs_.begin()->dhId_;
305 std::string devId = indexs_.begin()->devId_;
306 DHLOGI("GetCameraInfo devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(),
307 GetAnonyString(dhId).c_str());
308 sptr<IDistributedCameraSink> camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId);
309 if (camSinkSrv == nullptr) {
310 DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str());
311 return DCAMERA_BAD_OPERATE;
312 }
313 std::string camInfoJson;
314 int32_t ret = camSinkSrv->GetCameraInfo(dhId, camInfoJson);
315 if (ret != DCAMERA_OK) {
316 DHLOGE("GetCameraInfo failed: %{public}d, devId: %{public}s, dhId: %{public}s", ret,
317 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
318 return ret;
319 }
320 DCameraInfoCmd cmd;
321 ret = cmd.Unmarshal(camInfoJson);
322 if (ret != DCAMERA_OK) {
323 DHLOGE("DCameraInfoCmd Unmarshal failed: %{public}d", ret);
324 return ret;
325 }
326 camInfo = cmd.value_;
327 }
328 return DCAMERA_OK;
329 }
330
OpenChannel(std::shared_ptr<DCameraOpenInfo> & openInfo)331 int32_t DCameraSourceController::OpenChannel(std::shared_ptr<DCameraOpenInfo>& openInfo)
332 {
333 CHECK_AND_RETURN_RET_LOG(openInfo == nullptr, DCAMERA_BAD_VALUE, "OpenChannel openInfo is nullptr");
334 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
335 DHLOGE("OpenChannel not support operate %{public}zu camera", indexs_.size());
336 return DCAMERA_BAD_OPERATE;
337 }
338 CHECK_AND_RETURN_RET_LOG(AddCameraServiceDeathRecipient() != DCAMERA_OK, DCAMERA_BAD_VALUE,
339 "AddCameraServiceDeathRecipient failed");
340 std::string dhId = indexs_.begin()->dhId_;
341 std::string devId = indexs_.begin()->devId_;
342 DHLOGI("DCameraSourceController OpenChannel Start, devId: %{public}s, dhId: %{public}s",
343 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
344 srcDevId_ = openInfo->sourceDevId_;
345 if (!CheckAclRight()) {
346 DHLOGE("ACL check failed.");
347 return DCAMERA_BAD_OPERATE;
348 }
349 bool isInvalid = false;
350 CHECK_AND_RETURN_RET_LOG(CheckOsType(devId, isInvalid) != DCAMERA_OK && isInvalid, DCAMERA_BAD_VALUE,
351 "CheckOsType failed or invalid osType");
352 if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
353 sptr<IDistributedCameraSink> camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId);
354 CHECK_AND_RETURN_RET_LOG(camSinkSrv == nullptr, DCAMERA_BAD_OPERATE,
355 "DCameraSourceController can not get service, devId: %{public}s", GetAnonyString(devId).c_str());
356 std::string jsonStr;
357 DCameraOpenInfoCmd cmd;
358 cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
359 cmd.dhId_ = dhId;
360 cmd.command_ = DCAMERA_PROTOCOL_CMD_OPEN_CHANNEL;
361 cmd.value_ = openInfo;
362 int32_t ret = cmd.Marshal(jsonStr);
363 CHECK_AND_RETURN_RET_LOG(ret != DCAMERA_OK, ret,
364 "DCameraSourceController Marshal OpenInfo failed %{public}d", ret);
365 ret = camSinkSrv->OpenChannel(dhId, jsonStr);
366 CHECK_AND_RETURN_RET_LOG(ret != DCAMERA_OK, ret,
367 "DCameraSourceController SA OpenChannel failed %{public}d", ret);
368 DHLOGD("DCameraSourceController OpenChannel devId: %{public}s, dhId: %{public}s success",
369 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
370 }
371
372 std::vector<DCameraIndex> indexs;
373 indexs.push_back(DCameraIndex(devId, dhId));
374 CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "OpenChannel channel_ is null.");
375 int32_t ret = channel_->CreateSession(indexs, SESSION_FLAG, DCAMERA_SESSION_MODE_CTRL, listener_);
376 if (ret != DCAMERA_OK) {
377 DHLOGE("DCameraSourceController Bind Socket failed, ret: %{public}d", ret);
378 PostChannelDisconnectedEvent();
379 return ret;
380 }
381 return PublishEnableLatencyMsg(devId);
382 }
383
ParseValueFromCjson(std::string args,std::string key)384 int32_t DCameraSourceController::ParseValueFromCjson(std::string args, std::string key)
385 {
386 DHLOGD("ParseValueFromCjson");
387 cJSON *jParam = cJSON_Parse(args.c_str());
388 CHECK_NULL_RETURN(jParam == nullptr, DCAMERA_BAD_VALUE);
389 cJSON *retItem = cJSON_GetObjectItemCaseSensitive(jParam, key.c_str());
390 CHECK_AND_FREE_RETURN_RET_LOG(retItem == nullptr || !cJSON_IsNumber(retItem),
391 DCAMERA_BAD_VALUE, jParam, "Not found key result");
392 int32_t ret = retItem->valueint;
393 cJSON_Delete(jParam);
394 return ret;
395 }
396
CheckOsType(const std::string & networkId,bool & isInvalid)397 int32_t DCameraSourceController::CheckOsType(const std::string &networkId, bool &isInvalid)
398 {
399 std::vector<DistributedHardware::DmDeviceInfo> dmDeviceInfoList;
400 int32_t errCode = DeviceManager::GetInstance().GetTrustedDeviceList(DCAMERA_PKG_NAME, "", dmDeviceInfoList);
401 CHECK_AND_RETURN_RET_LOG(errCode != DCAMERA_OK, DCAMERA_BAD_VALUE,
402 "Get device manager trusted device list fail, errCode %{public}d", errCode);
403 for (const auto& dmDeviceInfo : dmDeviceInfoList) {
404 if (dmDeviceInfo.networkId == networkId) {
405 int32_t osType = ParseValueFromCjson(dmDeviceInfo.extraData, KEY_OS_TYPE);
406 if (osType != VALID_OS_TYPE && osType != DCAMERA_BAD_VALUE) {
407 isInvalid = true;
408 }
409 DHLOGI("remote found, osType: %{public}d, isInvalid: %{public}d", osType, isInvalid);
410 return DCAMERA_OK;
411 }
412 }
413 DHLOGI("remote not found.");
414 return DCAMERA_OK;
415 }
416
CheckAclRight()417 bool DCameraSourceController::CheckAclRight()
418 {
419 if (!GetOsAccountInfo()) {
420 return false;
421 }
422 std::shared_ptr<DmInitCallback> initCallback = std::make_shared<DeviceInitCallback>();
423 int32_t ret = DeviceManager::GetInstance().InitDeviceManager(DCAMERA_PKG_NAME, initCallback);
424 if (ret != DCAMERA_OK) {
425 DHLOGE("InitDeviceManager failed ret = %{public}d", ret);
426 return false;
427 }
428 DmAccessCaller dmSrcCaller = {
429 .accountId = accountId_,
430 .pkgName = DCAMERA_PKG_NAME,
431 .networkId = srcDevId_,
432 .userId = userId_,
433 .tokenId = tokenId_,
434 };
435 DmAccessCallee dmDstCallee = {
436 .networkId = devId_,
437 };
438 DHLOGI("CheckAclRight dmSrcCaller networkId: %{public}s, accountId: %{public}s, devId: %{public}s",
439 GetAnonyString(srcDevId_).c_str(), GetAnonyString(accountId_).c_str(), GetAnonyString(devId_).c_str());
440 if (DeviceManager::GetInstance().CheckSrcAccessControl(dmSrcCaller, dmDstCallee)) {
441 return true;
442 }
443 return false;
444 }
445
GetOsAccountInfo()446 bool DCameraSourceController::GetOsAccountInfo()
447 {
448 #ifdef OS_ACCOUNT_ENABLE
449 std::vector<int32_t> ids;
450 int32_t ret = AccountSA::OsAccountManager::QueryActiveOsAccountIds(ids);
451 CHECK_AND_RETURN_RET_LOG(ret != DCAMERA_OK || ids.empty(), false,
452 "Get userId from active os accountIds fail, ret: %{public}d", ret);
453 userId_ = ids[0];
454
455 AccountSA::OhosAccountInfo osAccountInfo;
456 ret = AccountSA::OhosAccountKits::GetInstance().GetOhosAccountInfo(osAccountInfo);
457 CHECK_AND_RETURN_RET_LOG(ret != DCAMERA_OK, false,
458 "Get accountId from ohos account info fail, ret: %{public}d", ret);
459 accountId_ = osAccountInfo.uid_;
460 #endif
461 return true;
462 }
463
CloseChannel()464 int32_t DCameraSourceController::CloseChannel()
465 {
466 if (indexs_.empty() || indexs_.size() > DCAMERA_MAX_NUM) {
467 DHLOGE("CloseChannel not support operate %{public}zu camera", indexs_.size());
468 return DCAMERA_BAD_OPERATE;
469 }
470 if (cameraServiceProxy_ != nullptr && cameraServiceProxy_->AsObject() != nullptr) {
471 (void)cameraServiceProxy_->AsObject()->RemoveDeathRecipient(cameraServiceRecipient_);
472 }
473 cameraServiceRecipient_ = nullptr;
474 DCameraLowLatency::GetInstance().DisableLowLatency();
475 DCameraSoftbusLatency::GetInstance().StopSoftbusTimeSync(devId_);
476 std::string dhId = indexs_.begin()->dhId_;
477 std::string devId = indexs_.begin()->devId_;
478 DHLOGI("DCameraSourceController CloseChannel Start, devId: %{public}s, dhId: %{public}s",
479 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
480 CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "CloseChannel channel_ is null.");
481 int32_t ret = channel_->CloseSession();
482 if (ret != DCAMERA_OK) {
483 DHLOGE("CloseSession failed %{public}d", ret);
484 }
485 DHLOGI("DCameraSourceController CloseChannel devId: %{public}s, dhId: %{public}s success",
486 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
487 channelState_ = DCAMERA_CHANNEL_STATE_DISCONNECTED;
488 ret = channel_->ReleaseSession();
489 if (ret != DCAMERA_OK) {
490 DHLOGE("ReleaseSession failed %{public}d", ret);
491 }
492 if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
493 sptr<IDistributedCameraSink> camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId);
494 if (camSinkSrv != nullptr) {
495 ret = camSinkSrv->CloseChannel(dhId);
496 if (ret != DCAMERA_OK) {
497 DHLOGE("DCameraSourceController SA CloseChannel failed %{public}d", ret);
498 }
499 DCameraSourceServiceIpc::GetInstance().DeleteSinkRemoteCamSrv(devId);
500 }
501 }
502 return ret;
503 }
504
Init(std::vector<DCameraIndex> & indexs)505 int32_t DCameraSourceController::Init(std::vector<DCameraIndex>& indexs)
506 {
507 DHLOGI("DCameraSourceController Init");
508 if (indexs.size() > DCAMERA_MAX_NUM) {
509 DHLOGE("DCameraSourceController init error");
510 return DCAMERA_INIT_ERR;
511 }
512 camHdiProvider_ = IDCameraProvider::Get(HDF_DCAMERA_EXT_SERVICE);
513 if (camHdiProvider_ == nullptr) {
514 DHLOGE("camHdiProvider_ is null.");
515 return DCAMERA_INIT_ERR;
516 }
517 remote_ = OHOS::HDI::hdi_objcast<IDCameraProvider>(camHdiProvider_);
518 if (remote_ != nullptr) {
519 remote_->AddDeathRecipient(cameraHdiRecipient_);
520 }
521
522 indexs_.assign(indexs.begin(), indexs.end());
523 std::string dhId = indexs_.begin()->dhId_;
524 std::string devId = indexs_.begin()->devId_;
525 controller_ = std::shared_ptr<DCameraSourceController>(shared_from_this());
526 listener_ = std::make_shared<DCameraSourceControllerChannelListener>(controller_);
527 channel_ = std::make_shared<DCameraChannelSourceImpl>();
528 DHLOGI("DCameraSourceController Init GetProvider end devId: %{public}s, dhId: %{public}s",
529 GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str());
530 isInit = true;
531 return DCAMERA_OK;
532 }
533
UnInit()534 int32_t DCameraSourceController::UnInit()
535 {
536 DHLOGI("DCameraSourceController UnInit");
537 indexs_.clear();
538 isInit = false;
539 isChannelConnected_.store(false);
540 if (remote_ != nullptr) {
541 remote_->RemoveDeathRecipient(cameraHdiRecipient_);
542 }
543 return DCAMERA_OK;
544 }
545
OnSessionState(int32_t state,std::string networkId)546 void DCameraSourceController::OnSessionState(int32_t state, std::string networkId)
547 {
548 DHLOGI("DCameraSourceController OnSessionState state %{public}d", state);
549 channelState_ = state;
550 switch (state) {
551 case DCAMERA_CHANNEL_STATE_CONNECTED: {
552 DcameraFinishAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
553 isChannelConnected_.store(true);
554 CHECK_AND_RETURN_LOG(stateMachine_ == nullptr, "stateMachine_ is nullptr");
555 stateMachine_->UpdateState(DCAMERA_STATE_OPENED);
556 std::shared_ptr<DCameraSourceDev> camDev = camDev_.lock();
557 if (camDev == nullptr) {
558 DHLOGE("DCameraSourceController OnSessionState camDev is nullptr");
559 break;
560 }
561 camDev->OnChannelConnectedEvent();
562 break;
563 }
564 case DCAMERA_CHANNEL_STATE_DISCONNECTED: {
565 DcameraFinishAsyncTrace(DCAMERA_OPEN_CHANNEL_CONTROL, DCAMERA_OPEN_CHANNEL_TASKID);
566 DHLOGI("DCameraSourceDev PostTask Controller CloseSession OnClose devId %{public}s dhId %{public}s",
567 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
568 isChannelConnected_.store(false);
569 PostChannelDisconnectedEvent();
570 break;
571 }
572 default: {
573 break;
574 }
575 }
576 }
577
OnSessionError(int32_t eventType,int32_t eventReason,std::string detail)578 void DCameraSourceController::OnSessionError(int32_t eventType, int32_t eventReason, std::string detail)
579 {
580 DHLOGI("DCameraSourceController OnSessionError devId: %{public}s, dhId: %{public}s, eventType: %{public}d, "
581 "eventReason: %{public}d, detail %{public}s", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str(),
582 eventType, eventReason, detail.c_str());
583 return;
584 }
585
OnDataReceived(std::vector<std::shared_ptr<DataBuffer>> & buffers)586 void DCameraSourceController::OnDataReceived(std::vector<std::shared_ptr<DataBuffer>>& buffers)
587 {
588 for (auto& buffer : buffers) {
589 if (buffer->Size() <= 0 || buffer->Size() > DATABUFF_MAX_SIZE) {
590 DHLOGI("buffer is invalid");
591 return;
592 }
593 HandleReceivedData(buffer);
594 }
595 }
596
HandleReceivedData(std::shared_ptr<DataBuffer> & dataBuffer)597 void DCameraSourceController::HandleReceivedData(std::shared_ptr<DataBuffer>& dataBuffer)
598 {
599 CHECK_AND_RETURN_LOG(dataBuffer == nullptr, "dataBuffer is nullptr");
600 DHLOGI("DCameraSourceController::HandleReceivedData dhId: %{public}s", GetAnonyString(dhId_).c_str());
601 uint8_t *data = dataBuffer->Data();
602 std::string jsonStr(reinterpret_cast<const char *>(data), dataBuffer->Capacity());
603 cJSON *rootValue = cJSON_Parse(jsonStr.c_str());
604 if (rootValue == nullptr) {
605 return;
606 }
607 cJSON *comvalue = cJSON_GetObjectItemCaseSensitive(rootValue, "Command");
608 if (comvalue == nullptr || !cJSON_IsString(comvalue) || (comvalue->valuestring == nullptr)) {
609 cJSON_Delete(rootValue);
610 DHLOGE("parse command failed");
611 return;
612 }
613 std::string command = std::string(comvalue->valuestring);
614 cJSON_Delete(rootValue);
615 if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_METADATA_RESULT) == 0)) {
616 HandleMetaDataResult(jsonStr);
617 } else if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_STATE_NOTIFY) == 0)) {
618 DCameraEventCmd cmd;
619 int32_t ret = cmd.Unmarshal(jsonStr);
620 if (ret != DCAMERA_OK) {
621 DHLOGE("DCameraSourceController Unmarshal failed, ret: %{public}d, devId: %{public}s, "
622 "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
623 return;
624 }
625 DCameraNotify(cmd.value_);
626 }
627 }
628
HandleMetaDataResult(std::string & jsonStr)629 void DCameraSourceController::HandleMetaDataResult(std::string& jsonStr)
630 {
631 if (camHdiProvider_ == nullptr) {
632 DHLOGI("DCameraSourceController HandleMetaDataResult camHdiProvider is null, devId: %{public}s, "
633 "dhId: %{public}s", GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
634 return;
635 }
636 DCameraMetadataSettingCmd cmd;
637 int32_t ret = cmd.Unmarshal(jsonStr);
638 if (ret != DCAMERA_OK) {
639 DHLOGI("DCameraSourceController HandleMetaDataResult failed, ret: %{public}d, devId: %{public}s, "
640 "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
641 return;
642 }
643 DHBase dhBase;
644 dhBase.deviceId_ = devId_;
645 dhBase.dhId_ = dhId_;
646 for (auto iter = cmd.value_.begin(); iter != cmd.value_.end(); iter++) {
647 DCameraSettings setting;
648 setting.type_ = (*iter)->type_;
649 setting.value_ = (*iter)->value_;
650 int32_t retHdi = camHdiProvider_->OnSettingsResult(dhBase, setting);
651 DHLOGI("OnSettingsResult hal, ret: %{public}d, devId: %{public}s dhId: %{public}s", retHdi,
652 GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str());
653 }
654 }
655
PublishEnableLatencyMsg(const std::string & devId)656 int32_t DCameraSourceController::PublishEnableLatencyMsg(const std::string& devId)
657 {
658 DHLOGI("DCameraSourceController PublishEnableLatencyMsg Start,devId: %{public}s", GetAnonyString(devId_).c_str());
659 isChannelConnected_.store(false);
660 DCameraLowLatency::GetInstance().EnableLowLatency();
661 DCameraSoftbusLatency::GetInstance().StartSoftbusTimeSync(devId);
662 DHLOGI("DCameraSourceController PublishEnableLatencyMsg End,devId: %{public}s", GetAnonyString(devId_).c_str());
663 return DCAMERA_OK;
664 }
665
PostChannelDisconnectedEvent()666 void DCameraSourceController::PostChannelDisconnectedEvent()
667 {
668 std::shared_ptr<DCameraSourceDev> camDev = camDev_.lock();
669 if (camDev == nullptr) {
670 DHLOGE("DCameraSourceController PostChannelDisconnectedEvent camDev is nullptr");
671 return;
672 }
673 camDev->OnChannelDisconnectedEvent();
674 }
675
PauseDistributedHardware(const std::string & networkId)676 int32_t DCameraSourceController::PauseDistributedHardware(const std::string &networkId)
677 {
678 return DCAMERA_OK;
679 }
680
ResumeDistributedHardware(const std::string & networkId)681 int32_t DCameraSourceController::ResumeDistributedHardware(const std::string &networkId)
682 {
683 return DCAMERA_OK;
684 }
685
StopDistributedHardware(const std::string & networkId)686 int32_t DCameraSourceController::StopDistributedHardware(const std::string &networkId)
687 {
688 return DCAMERA_OK;
689 }
690
OnRemoteDied(const wptr<IRemoteObject> & remote)691 void DCameraSourceController::DCameraHdiRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
692 {
693 DHLOGE("Exit the current process.");
694 _Exit(0);
695 }
696
AddCameraServiceDeathRecipient()697 int32_t DCameraSourceController::AddCameraServiceDeathRecipient()
698 {
699 cameraServiceRecipient_ = sptr<CameraServiceRecipient>(new CameraServiceRecipient(controller_));
700 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
701 CHECK_AND_RETURN_RET_LOG(samgr == nullptr, DCAMERA_BAD_VALUE, "GetSystemAbilityManager failed.");
702 auto object = samgr->CheckSystemAbility(CAMERA_SERVICE_ID);
703 CHECK_AND_RETURN_RET_LOG(object == nullptr, DCAMERA_BAD_VALUE,
704 "CheckSystemAbility %{public}d failed.", CAMERA_SERVICE_ID);
705 cameraServiceProxy_ = iface_cast<CameraStandard::ICameraService>(object);
706 CHECK_AND_RETURN_RET_LOG(cameraServiceProxy_ == nullptr, DCAMERA_BAD_VALUE, "Get ICameraService failed.");
707 auto remoteObj = cameraServiceProxy_->AsObject();
708 CHECK_AND_RETURN_RET_LOG(remoteObj == nullptr, DCAMERA_BAD_VALUE, "Get remote object failed.");
709 remoteObj->AddDeathRecipient(cameraServiceRecipient_);
710 return DCAMERA_OK;
711 }
712
CameraServiceRecipient(std::shared_ptr<DCameraSourceController> sourceContrlPtr)713 DCameraSourceController::CameraServiceRecipient::CameraServiceRecipient(
714 std::shared_ptr<DCameraSourceController> sourceContrlPtr) : sourceContrlPtr_(sourceContrlPtr)
715 {
716 DHLOGI("Ctor CameraServiceRecipient()");
717 }
718
OnRemoteDied(const wptr<IRemoteObject> & remote)719 void DCameraSourceController::CameraServiceRecipient::OnRemoteDied(const wptr<IRemoteObject> &remote)
720 {
721 DHLOGE("CameraService died, Exit the current process.");
722 std::shared_ptr<DCameraEvent> events = std::make_shared<DCameraEvent>();
723 events->eventType_ = DCAMERA_MESSAGE;
724 events->eventResult_ = DCAMERA_EVENT_DEVICE_ERROR;
725 events->eventContent_ = CAMERA_SERVICE_DIED;
726 auto sourceContrl = sourceContrlPtr_.lock();
727 CHECK_AND_RETURN_LOG(sourceContrl == nullptr, "sourceContrl is nullptr.");
728 sourceContrl->DCameraNotify(events);
729 }
730
SetTokenId(uint64_t token)731 void DCameraSourceController::SetTokenId(uint64_t token)
732 {
733 tokenId_ = token;
734 }
735
OnRemoteDied()736 void DeviceInitCallback::OnRemoteDied()
737 {
738 DHLOGI("DeviceInitCallback OnRemoteDied");
739 }
740 } // namespace DistributedHardware
741 } // namespace OHOS
742