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