1 /*
2 * Copyright (c) 2021-2022 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_controller.h"
17
18 #include <securec.h>
19 #include <thread>
20
21 #include "anonymous_string.h"
22 #include "dcamera_channel_sink_impl.h"
23 #include "dcamera_client.h"
24 #include "dcamera_metadata_setting_cmd.h"
25 #include "dcamera_protocol.h"
26 #include "dcamera_utils_tools.h"
27
28 #include "dcamera_sink_access_control.h"
29 #include "dcamera_sink_controller_channel_listener.h"
30 #include "dcamera_sink_controller_state_callback.h"
31 #include "dcamera_sink_output.h"
32 #include "dcamera_sink_service_ipc.h"
33
34 #include "distributed_camera_constants.h"
35 #include "distributed_camera_errno.h"
36 #include "distributed_hardware_log.h"
37 #include "idistributed_camera_source.h"
38 #include "json/json.h"
39
40 namespace OHOS {
41 namespace DistributedHardware {
DCameraSinkController(std::shared_ptr<ICameraSinkAccessControl> & accessControl)42 DCameraSinkController::DCameraSinkController(std::shared_ptr<ICameraSinkAccessControl>& accessControl)
43 : isInit_(false), sessionState_(DCAMERA_CHANNEL_STATE_DISCONNECTED), accessControl_(accessControl)
44 {
45 }
46
~DCameraSinkController()47 DCameraSinkController::~DCameraSinkController()
48 {
49 if (isInit_) {
50 UnInit();
51 }
52 }
53
StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)54 int32_t DCameraSinkController::StartCapture(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
55 {
56 DHLOGI("DCameraSinkController::StartCapture dhId: %s", GetAnonyString(dhId_).c_str());
57 std::string accessType = "";
58 if ((accessControl_->IsSensitiveSrcAccess(SRC_TYPE)) &&
59 (accessControl_->GetAccessControlType(accessType) == DCAMERA_SAME_ACCOUNT)) {
60 int32_t ret = StartCaptureInner(captureInfos);
61 if (ret == DCAMERA_OK) {
62 accessControl_->NotifySensitiveSrc(SRC_TYPE);
63 }
64 return ret;
65 } else {
66 std::string param = "";
67 DCameraFrameTriggerEvent triggerEvent(*this, param);
68 DCameraPostAuthorizationEvent authEvent(*this, captureInfos);
69 eventBus_->PostEvent<DCameraFrameTriggerEvent>(triggerEvent, POSTMODE::POST_ASYNC);
70 eventBus_->PostEvent<DCameraPostAuthorizationEvent>(authEvent, POSTMODE::POST_ASYNC);
71 }
72 return DCAMERA_OK;
73 }
74
StopCapture()75 int32_t DCameraSinkController::StopCapture()
76 {
77 DHLOGI("DCameraSinkController::StopCapture dhId: %s", GetAnonyString(dhId_).c_str());
78 std::lock_guard<std::mutex> autoLock(captureLock_);
79 int32_t ret = operator_->StopCapture();
80 if (ret != DCAMERA_OK) {
81 DHLOGE("DCameraSinkController::StopCapture client stop capture failed, dhId: %s, ret: %d",
82 GetAnonyString(dhId_).c_str(), ret);
83 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("operator stop capture failed."));
84 return ret;
85 }
86
87 ret = output_->StopCapture();
88 if (ret != DCAMERA_OK) {
89 DHLOGE("DCameraSinkController::StopCapture output stop capture failed, dhId: %s, ret: %d",
90 GetAnonyString(dhId_).c_str(), ret);
91 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("output stop capture failed"));
92 return ret;
93 }
94
95 DHLOGI("DCameraSinkController::StopCapture %s success", GetAnonyString(dhId_).c_str());
96 return DCAMERA_OK;
97 }
98
ChannelNeg(std::shared_ptr<DCameraChannelInfo> & info)99 int32_t DCameraSinkController::ChannelNeg(std::shared_ptr<DCameraChannelInfo>& info)
100 {
101 DHLOGI("DCameraSinkController::ChannelNeg dhId: %s", GetAnonyString(dhId_).c_str());
102 int32_t ret = output_->OpenChannel(info);
103 if (ret != DCAMERA_OK) {
104 DHLOGE("DCameraSinkController::ChannelNeg channel negotiate failed, dhId: %s, ret: %d",
105 GetAnonyString(dhId_).c_str(), ret);
106 return ret;
107 }
108
109 DHLOGI("DCameraSinkController::ChannelNeg %s success", GetAnonyString(dhId_).c_str());
110 return DCAMERA_OK;
111 }
112
DCameraNotify(std::shared_ptr<DCameraEvent> & events)113 int32_t DCameraSinkController::DCameraNotify(std::shared_ptr<DCameraEvent>& events)
114 {
115 DHLOGI("DCameraSinkController::DCameraNotify dhId: %s", GetAnonyString(dhId_).c_str());
116 if (srcDevId_.empty()) {
117 DHLOGE("DCameraSinkController::DCameraNotify source deviceId is empty");
118 return DCAMERA_BAD_VALUE;
119 }
120
121 sptr<IDistributedCameraSource> sourceSA = DCameraSinkServiceIpc::GetInstance().GetSourceRemoteCamSrv(srcDevId_);
122 if (sourceSA == nullptr) {
123 DHLOGE("DCameraSinkController::DCameraNotify sourceSA is null");
124 return DCAMERA_BAD_VALUE;
125 }
126
127 DCameraEventCmd eventCmd;
128 std::string jsonStr = "";
129 eventCmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
130 eventCmd.dhId_ = dhId_;
131 eventCmd.command_ = DCAMERA_PROTOCOL_CMD_STATE_NOTIFY;
132 eventCmd.value_ = events;
133 int32_t ret = eventCmd.Marshal(jsonStr);
134 if (ret != DCAMERA_OK) {
135 DHLOGE("DCameraSinkController::DCameraNotify DCameraEventCmd marshal failed, dhId: %s, ret: %d",
136 GetAnonyString(dhId_).c_str(), ret);
137 return ret;
138 }
139
140 std::string sinkDevId;
141 ret = GetLocalDeviceNetworkId(sinkDevId);
142 if (ret != DCAMERA_OK) {
143 DHLOGE("DCameraSinkController::DCameraNotify GetLocalDeviceNetworkId failed, devId: %s, dhId: %s, ret: %d",
144 GetAnonyString(sinkDevId).c_str(), GetAnonyString(dhId_).c_str(), ret);
145 return ret;
146 }
147
148 ret = sourceSA->DCameraNotify(sinkDevId, dhId_, jsonStr);
149 if (ret != DCAMERA_OK) {
150 DHLOGE("DCameraSinkController::DCameraNotify SourceSA notify failed, srcId: %s, sinkId: %s, dhId: %s, ret: %d",
151 GetAnonyString(srcDevId_).c_str(), GetAnonyString(sinkDevId).c_str(),
152 GetAnonyString(dhId_).c_str(), ret);
153 return ret;
154 }
155
156 DHLOGI("DCameraSinkController::DCameraNotify %s success", GetAnonyString(dhId_).c_str());
157 return DCAMERA_OK;
158 }
159
UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>> & settings)160 int32_t DCameraSinkController::UpdateSettings(std::vector<std::shared_ptr<DCameraSettings>>& settings)
161 {
162 DHLOGI("DCameraSinkController::UpdateSettings dhId: %s", GetAnonyString(dhId_).c_str());
163 int32_t ret = operator_->UpdateSettings(settings);
164 if (ret != DCAMERA_OK) {
165 DHLOGE("DCameraSinkController::UpdateSettings failed, dhId: %s, ret: %d", GetAnonyString(dhId_).c_str(), ret);
166 return ret;
167 }
168
169 DHLOGI("DCameraSinkController::UpdateSettings %s success", GetAnonyString(dhId_).c_str());
170 return DCAMERA_OK;
171 }
172
GetCameraInfo(std::shared_ptr<DCameraInfo> & camInfo)173 int32_t DCameraSinkController::GetCameraInfo(std::shared_ptr<DCameraInfo>& camInfo)
174 {
175 DHLOGI("DCameraSinkController::GetCameraInfo dhId: %s, session state: %d",
176 GetAnonyString(dhId_).c_str(), sessionState_);
177 camInfo->state_ = sessionState_;
178 return DCAMERA_OK;
179 }
180
OpenChannel(std::shared_ptr<DCameraOpenInfo> & openInfo)181 int32_t DCameraSinkController::OpenChannel(std::shared_ptr<DCameraOpenInfo>& openInfo)
182 {
183 DHLOGI("DCameraSinkController::OpenChannel dhId: %s", GetAnonyString(dhId_).c_str());
184 if (sessionState_ != DCAMERA_CHANNEL_STATE_DISCONNECTED) {
185 DHLOGE("DCameraSinkController::OpenChannel wrong state, dhId: %s, sessionState: %d",
186 GetAnonyString(dhId_).c_str(), sessionState_);
187 return DCAMERA_WRONG_STATE;
188 }
189 srcDevId_ = openInfo->sourceDevId_;
190 std::vector<DCameraIndex> indexs;
191 indexs.push_back(DCameraIndex(srcDevId_, dhId_));
192 auto controller = std::shared_ptr<DCameraSinkController>(shared_from_this());
193 std::shared_ptr<ICameraChannelListener> listener =
194 std::make_shared<DCameraSinkControllerChannelListener>(controller);
195 int32_t ret = channel_->CreateSession(indexs, SESSION_FLAG, DCAMERA_SESSION_MODE_CTRL, listener);
196 if (ret != DCAMERA_OK) {
197 DHLOGE("DCameraSinkController::Init channel create session failed, dhId: %s, ret: %d",
198 GetAnonyString(dhId_).c_str(), ret);
199 return ret;
200 }
201 DHLOGI("DCameraSinkController::OpenChannel %s success", GetAnonyString(dhId_).c_str());
202 return DCAMERA_OK;
203 }
204
CloseChannel()205 int32_t DCameraSinkController::CloseChannel()
206 {
207 DHLOGI("DCameraSinkController::CloseChannel dhId: %s", GetAnonyString(dhId_).c_str());
208 std::lock_guard<std::mutex> autoLock(channelLock_);
209 DCameraSinkServiceIpc::GetInstance().DeleteSourceRemoteCamSrv(srcDevId_);
210 srcDevId_.clear();
211 int32_t ret = channel_->ReleaseSession();
212 if (ret != DCAMERA_OK) {
213 DHLOGE("DCameraSinkController release channel failed, dhId: %s, ret: %d",
214 GetAnonyString(dhId_).c_str(), ret);
215 }
216
217 ret = output_->CloseChannel();
218 if (ret != DCAMERA_OK) {
219 DHLOGE("DCameraSinkController CloseChannel failed, dhId: %s, ret: %d",
220 GetAnonyString(dhId_).c_str(), ret);
221 }
222 sessionState_ = DCAMERA_CHANNEL_STATE_DISCONNECTED;
223 DHLOGI("DCameraSinkController::CloseChannel %s success", GetAnonyString(dhId_).c_str());
224 return DCAMERA_OK;
225 }
226
Init(std::vector<DCameraIndex> & indexs)227 int32_t DCameraSinkController::Init(std::vector<DCameraIndex>& indexs)
228 {
229 DHLOGI("DCameraSinkController::Init");
230 dhId_ = indexs[0].dhId_;
231 operator_ = std::make_shared<DCameraClient>(dhId_);
232 output_ = std::make_shared<DCameraSinkOutput>(dhId_, operator_);
233 int32_t ret = output_->Init();
234 if (ret != DCAMERA_OK) {
235 DHLOGE("DCameraSinkController::Init output init failed, dhId: %s, ret: %d",
236 GetAnonyString(dhId_).c_str(), ret);
237 return ret;
238 }
239
240 auto controller = std::shared_ptr<DCameraSinkController>(shared_from_this());
241 std::shared_ptr<StateCallback> stateCallback = std::make_shared<DCameraSinkControllerStateCallback>(controller);
242 operator_->SetStateCallback(stateCallback);
243 ret = operator_->Init();
244 if (ret != DCAMERA_OK) {
245 DHLOGE("DCameraSinkController::Init operator init failed, dhId: %s, ret: %d",
246 GetAnonyString(dhId_).c_str(), ret);
247 return ret;
248 }
249
250 channel_ = std::make_shared<DCameraChannelSinkImpl>();
251 eventBus_ = std::make_shared<EventBus>("SinkCtlHandler");
252 DCameraFrameTriggerEvent triggerEvent(*this);
253 DCameraPostAuthorizationEvent authEvent(*this);
254 eventBus_->AddHandler<DCameraFrameTriggerEvent>(triggerEvent.GetType(), *this);
255 eventBus_->AddHandler<DCameraPostAuthorizationEvent>(authEvent.GetType(), *this);
256
257 isInit_ = true;
258 DHLOGI("DCameraSinkController::Init %s success", GetAnonyString(dhId_).c_str());
259 return DCAMERA_OK;
260 }
261
UnInit()262 int32_t DCameraSinkController::UnInit()
263 {
264 DHLOGI("DCameraSinkController::UnInit dhId: %s", GetAnonyString(dhId_).c_str());
265 std::lock_guard<std::mutex> autoLock(autoLock_);
266 int32_t ret = StopCapture();
267 if (ret != DCAMERA_OK) {
268 DHLOGE("DCameraSinkController::UnInit %s stop capture failed, ret: %d", GetAnonyString(dhId_).c_str(), ret);
269 }
270
271 ret = CloseChannel();
272 if (ret != DCAMERA_OK) {
273 DHLOGE("DCameraSinkController::UnInit %s close channel failed, ret: %d", GetAnonyString(dhId_).c_str(), ret);
274 }
275
276 if (output_ != nullptr) {
277 ret = output_->UnInit();
278 if (ret != DCAMERA_OK) {
279 DHLOGE("DCameraSinkController release output failed, dhId: %s, ret: %d",
280 GetAnonyString(dhId_).c_str(), ret);
281 }
282 }
283
284 if (operator_ != nullptr) {
285 ret = operator_->UnInit();
286 if (ret != DCAMERA_OK) {
287 DHLOGE("DCameraSinkController release operator failed, dhId: %s, ret: %d",
288 GetAnonyString(dhId_).c_str(), ret);
289 }
290 }
291
292 isInit_ = false;
293 DHLOGI("DCameraSinkController::UnInit %s success", GetAnonyString(dhId_).c_str());
294 return DCAMERA_OK;
295 }
296
OnEvent(DCameraFrameTriggerEvent & event)297 void DCameraSinkController::OnEvent(DCameraFrameTriggerEvent& event)
298 {
299 std::string param = event.GetParam();
300 accessControl_->TriggerFrame(param);
301 }
302
OnEvent(DCameraPostAuthorizationEvent & event)303 void DCameraSinkController::OnEvent(DCameraPostAuthorizationEvent& event)
304 {
305 std::vector<std::shared_ptr<DCameraCaptureInfo>> captureInfos = event.GetParam();
306 PostAuthorization(captureInfos);
307 }
308
OnStateChanged(std::shared_ptr<DCameraEvent> & event)309 void DCameraSinkController::OnStateChanged(std::shared_ptr<DCameraEvent>& event)
310 {
311 DHLOGI("DCameraSinkController::OnStateChanged dhId: %s, result: %d",
312 GetAnonyString(dhId_).c_str(), event->eventResult_);
313 if (event->eventResult_ == DCAMERA_EVENT_DEVICE_PREEMPT) {
314 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_PREEMPT, std::string("camera device preempted"));
315 } else {
316 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("camera error"));
317 }
318 }
319
OnMetadataResult(std::vector<std::shared_ptr<DCameraSettings>> & settings)320 void DCameraSinkController::OnMetadataResult(std::vector<std::shared_ptr<DCameraSettings>>& settings)
321 {
322 DHLOGI("DCameraSinkController::OnMetadataResult dhId: %s", GetAnonyString(dhId_).c_str());
323 if (settings.empty()) {
324 DHLOGE("DCameraSinkController::OnMetadataResult camera settings is empty");
325 return;
326 }
327 DCameraMetadataSettingCmd cmd;
328 cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE;
329 cmd.dhId_ = dhId_;
330 cmd.command_ = DCAMERA_PROTOCOL_CMD_METADATA_RESULT;
331 cmd.value_.assign(settings.begin(), settings.end());
332 std::string jsonStr;
333 int32_t ret = cmd.Marshal(jsonStr);
334 if (ret != DCAMERA_OK) {
335 DHLOGE("DCameraSinkController::OnMetadataResult Marshal metadata settings failed, dhId: %s ret: %d",
336 GetAnonyString(dhId_).c_str(), ret);
337 return;
338 }
339 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(jsonStr.length() + 1);
340 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(const_cast<char *>(jsonStr.c_str())),
341 jsonStr.length());
342 if (ret != EOK) {
343 DHLOGE("DCameraSinkController::OnMetadataResult memcpy_s failed, dhId: %s ret: %d",
344 GetAnonyString(dhId_).c_str(), ret);
345 return;
346 }
347 ret = channel_->SendData(buffer);
348 if (ret != DCAMERA_OK) {
349 DHLOGE("DCameraSinkController::OnMetadataResult channel send data failed, dhId: %s ret: %d",
350 GetAnonyString(dhId_).c_str(), ret);
351 return;
352 }
353 DHLOGI("DCameraSinkController::OnMetadataResult dhId: %s success", GetAnonyString(dhId_).c_str());
354 }
355
OnSessionState(int32_t state)356 void DCameraSinkController::OnSessionState(int32_t state)
357 {
358 DHLOGI("DCameraSinkController::OnSessionState dhId: %s, state: %d", GetAnonyString(dhId_).c_str(), state);
359 sessionState_ = state;
360 switch (state) {
361 case DCAMERA_CHANNEL_STATE_CONNECTING: {
362 DHLOGI("DCameraSinkController::OnSessionState channel is connecting");
363 break;
364 }
365 case DCAMERA_CHANNEL_STATE_CONNECTED: {
366 DHLOGI("DCameraSinkController::OnSessionState channel is connected");
367 break;
368 }
369 case DCAMERA_CHANNEL_STATE_DISCONNECTED: {
370 DHLOGI("DCameraSinkController::OnSessionState channel is disconnected");
371 std::thread([this]() {
372 DHLOGI("DCameraSinkController::OnSessionState %s new thread session state: %d",
373 GetAnonyString(dhId_).c_str(), sessionState_);
374 std::lock_guard<std::mutex> autoLock(autoLock_);
375 int32_t ret = CloseChannel();
376 if (ret != DCAMERA_OK) {
377 DHLOGE("DCameraSinkController::OnSessionState session state: %d, %s close channel failed, ret: %d",
378 sessionState_, GetAnonyString(dhId_).c_str(), ret);
379 }
380 ret = StopCapture();
381 if (ret != DCAMERA_OK) {
382 DHLOGE("DCameraSinkController::OnSessionState session state: %d, %s stop capture failed, ret: %d",
383 sessionState_, GetAnonyString(dhId_).c_str(), ret);
384 }
385 }).detach();
386 break;
387 }
388 default: {
389 DHLOGE("DCameraSinkController::OnSessionState unknown session state");
390 break;
391 }
392 }
393 }
394
OnSessionError(int32_t eventType,int32_t eventReason,std::string detail)395 void DCameraSinkController::OnSessionError(int32_t eventType, int32_t eventReason, std::string detail)
396 {
397 DHLOGI("DCameraSinkController::OnSessionError dhId: %s, eventType: %d, eventReason: %d, detail: %s",
398 GetAnonyString(dhId_).c_str(), eventType, eventReason, detail.c_str());
399 }
400
OnDataReceived(std::vector<std::shared_ptr<DataBuffer>> & buffers)401 void DCameraSinkController::OnDataReceived(std::vector<std::shared_ptr<DataBuffer>>& buffers)
402 {
403 DHLOGI("DCameraSinkController::OnReceivedData %s control channel receive data", GetAnonyString(dhId_).c_str());
404 for (auto& buffer : buffers) {
405 if (buffer->Size() <= 0 || buffer->Size() > DATABUFF_MAX_SIZE) {
406 DHLOGI("DCameraSinkController::OnDataReceived buffer is invalid");
407 return;
408 }
409 HandleReceivedData(buffer);
410 }
411 }
412
PostAuthorization(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)413 void DCameraSinkController::PostAuthorization(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
414 {
415 DHLOGI("DCameraSinkController::PostAuthorization dhId: %s", GetAnonyString(dhId_).c_str());
416 int32_t ret = StartCaptureInner(captureInfos);
417 if (ret == DCAMERA_OK) {
418 accessControl_->NotifySensitiveSrc(SRC_TYPE);
419 }
420 }
421
StartCaptureInner(std::vector<std::shared_ptr<DCameraCaptureInfo>> & captureInfos)422 int32_t DCameraSinkController::StartCaptureInner(std::vector<std::shared_ptr<DCameraCaptureInfo>>& captureInfos)
423 {
424 DHLOGI("DCameraSinkController::StartCaptureInner dhId: %s", GetAnonyString(dhId_).c_str());
425 std::lock_guard<std::mutex> autoLock(captureLock_);
426 int32_t ret = output_->StartCapture(captureInfos);
427 if (ret != DCAMERA_OK) {
428 DHLOGE("DCameraSinkController::StartCaptureInner output start capture failed, dhId: %s, ret: %d",
429 GetAnonyString(dhId_).c_str(), ret);
430 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_ERROR, std::string("output start capture failed"));
431 return ret;
432 }
433
434 ret = operator_->StartCapture(captureInfos);
435 if (ret != DCAMERA_OK) {
436 DHLOGE("DCameraSinkController::StartCaptureInner camera client start capture failed, dhId: %s, ret: %d",
437 GetAnonyString(dhId_).c_str(), ret);
438 if (ret == DCAMERA_ALLOC_ERROR) {
439 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_NO_PERMISSION,
440 std::string("operator start capture permission denial."));
441 } else if (ret == DCAMERA_DEVICE_BUSY) {
442 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_DEVICE_IN_USE,
443 std::string("operator start capture in used."));
444 }
445 return ret;
446 }
447
448 DCameraNotifyInner(DCAMERA_MESSAGE, DCAMERA_EVENT_CAMERA_SUCCESS, std::string("operator start capture success"));
449 DHLOGI("DCameraSinkController::StartCaptureInner %s success", GetAnonyString(dhId_).c_str());
450 return DCAMERA_OK;
451 }
452
DCameraNotifyInner(int32_t type,int32_t result,std::string reason)453 int32_t DCameraSinkController::DCameraNotifyInner(int32_t type, int32_t result, std::string reason)
454 {
455 std::shared_ptr<DCameraEvent> event = std::make_shared<DCameraEvent>();
456 event->eventType_ = type;
457 event->eventResult_ = result;
458 event->eventContent_ = reason;
459 return DCameraNotify(event);
460 }
461
HandleReceivedData(std::shared_ptr<DataBuffer> & dataBuffer)462 int32_t DCameraSinkController::HandleReceivedData(std::shared_ptr<DataBuffer>& dataBuffer)
463 {
464 DHLOGI("DCameraSinkController::HandleReceivedData dhId: %s", GetAnonyString(dhId_).c_str());
465 uint8_t *data = dataBuffer->Data();
466 std::string jsonStr(reinterpret_cast<const char *>(data), dataBuffer->Capacity());
467
468 JSONCPP_STRING errs;
469 Json::CharReaderBuilder readerBuilder;
470 Json::Value root;
471 std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
472 if ((!jsonReader->parse(jsonStr.c_str(), jsonStr.c_str() + jsonStr.length(), &root, &errs)) ||
473 (!root.isObject())) {
474 DHLOGE("DCameraSinkController::HandleReceivedData parse json string failed");
475 return DCAMERA_BAD_VALUE;
476 }
477
478 if ((!root.isMember("Command")) || (!root["Command"].isString())) {
479 DHLOGE("DCameraSinkController::HandleReceivedData parse command failed");
480 return DCAMERA_BAD_VALUE;
481 }
482
483 std::string command = root["Command"].asString();
484 if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_CAPTURE) == 0)) {
485 DCameraCaptureInfoCmd captureInfoCmd;
486 int ret = captureInfoCmd.Unmarshal(jsonStr);
487 if (ret != DCAMERA_OK) {
488 DHLOGE("DCameraSinkController::HandleReceivedData Capture Info Unmarshal failed, dhId: %s ret: %d",
489 GetAnonyString(dhId_).c_str(), ret);
490 return ret;
491 }
492 return StartCapture(captureInfoCmd.value_);
493 } else if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_UPDATE_METADATA) == 0)) {
494 DCameraMetadataSettingCmd metadataSettingCmd;
495 int ret = metadataSettingCmd.Unmarshal(jsonStr);
496 if (ret != DCAMERA_OK) {
497 DHLOGE("DCameraSinkController::HandleReceivedData Metadata Setting Unmarshal failed, dhId: %s ret: %d",
498 GetAnonyString(dhId_).c_str(), ret);
499 return ret;
500 }
501 return UpdateSettings(metadataSettingCmd.value_);
502 }
503 return DCAMERA_BAD_VALUE;
504 }
505 } // namespace DistributedHardware
506 } // namespace OHOS