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