1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "anonymous_string.h"
17 #include "dcamera_hisysevent_adapter.h"
18 #include "dcamera_sink_frame_info.h"
19 #include "dcamera_softbus_adapter.h"
20 #include "distributed_camera_constants.h"
21 #include "distributed_camera_errno.h"
22 #include "distributed_hardware_log.h"
23 #include <securec.h>
24 #include "softbus_bus_center.h"
25 #include "softbus_common.h"
26 #include "softbus_errcode.h"
27 #include "dcamera_utils_tools.h"
28 #include "dcamera_frame_info.h"
29
30 namespace OHOS {
31 namespace DistributedHardware {
32 namespace {
33 static QosTV g_qosInfo[] = {
34 { .qos = QOS_TYPE_MIN_BW, .value = DCAMERA_QOS_TYPE_MIN_BW },
35 { .qos = QOS_TYPE_MAX_LATENCY, .value = DCAMERA_QOS_TYPE_MAX_LATENCY },
36 { .qos = QOS_TYPE_MIN_LATENCY, .value = DCAMERA_QOS_TYPE_MIN_LATENCY}
37 };
38 static uint32_t g_QosTV_Param_Index = static_cast<uint32_t>(sizeof(g_qosInfo) / sizeof(QosTV));
39 }
40 IMPLEMENT_SINGLE_INSTANCE(DCameraSoftbusAdapter);
41
DCameraSourceOnBind(int32_t socket,PeerSocketInfo info)42 static void DCameraSourceOnBind(int32_t socket, PeerSocketInfo info)
43 {
44 return;
45 }
46
DCameraSourceOnShutDown(int32_t socket,ShutdownReason reason)47 static void DCameraSourceOnShutDown(int32_t socket, ShutdownReason reason)
48 {
49 DCameraSoftbusAdapter::GetInstance().SourceOnShutDown(socket, reason);
50 return;
51 }
52
DCameraSourceOnBytes(int32_t socket,const void * data,uint32_t dataLen)53 static void DCameraSourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)
54 {
55 DCameraSoftbusAdapter::GetInstance().SourceOnBytes(socket, data, dataLen);
56 return;
57 }
58
DCameraSourceOnMessage(int32_t socket,const void * data,uint32_t dataLen)59 static void DCameraSourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)
60 {
61 DCameraSoftbusAdapter::GetInstance().SourceOnMessage(socket, data, dataLen);
62 return;
63 }
64
DCameraSourceOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)65 static void DCameraSourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
66 const StreamFrameInfo *param)
67 {
68 DCameraSoftbusAdapter::GetInstance().SourceOnStream(socket, data, ext, param);
69 return;
70 }
71
72 // sink
DCameraSinkOnBind(int32_t socket,PeerSocketInfo info)73 static void DCameraSinkOnBind(int32_t socket, PeerSocketInfo info)
74 {
75 DCameraSoftbusAdapter::GetInstance().SinkOnBind(socket, info);
76 return;
77 }
78
DCameraSinkOnShutDown(int32_t socket,ShutdownReason reason)79 static void DCameraSinkOnShutDown(int32_t socket, ShutdownReason reason)
80 {
81 DCameraSoftbusAdapter::GetInstance().SinkOnShutDown(socket, reason);
82 return;
83 }
84
DCameraSinkOnBytes(int32_t socket,const void * data,uint32_t dataLen)85 static void DCameraSinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)
86 {
87 DCameraSoftbusAdapter::GetInstance().SinkOnBytes(socket, data, dataLen);
88 return;
89 }
90
DCameraSinkOnMessage(int32_t socket,const void * data,uint32_t dataLen)91 static void DCameraSinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)
92 {
93 DCameraSoftbusAdapter::GetInstance().SinkOnMessage(socket, data, dataLen);
94 return;
95 }
96
DCameraSinkOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)97 static void DCameraSinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
98 const StreamFrameInfo *param)
99 {
100 DCameraSoftbusAdapter::GetInstance().SinkOnStream(socket, data, ext, param);
101 return;
102 }
103
DCameraSoftbusAdapter()104 DCameraSoftbusAdapter::DCameraSoftbusAdapter()
105 {
106 sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_CTRL] = TransDataType::DATA_TYPE_BYTES;
107 sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_VIDEO] = TransDataType::DATA_TYPE_VIDEO_STREAM;
108 sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_JPEG] = TransDataType::DATA_TYPE_BYTES;
109
110 ISocketListener sourceListener;
111 sourceListener.OnBind = DCameraSourceOnBind;
112 sourceListener.OnShutdown = DCameraSourceOnShutDown;
113 sourceListener.OnBytes = DCameraSourceOnBytes;
114 sourceListener.OnMessage = DCameraSourceOnMessage;
115 sourceListener.OnStream = DCameraSourceOnStream;
116 sessListeners_[DCAMERA_CHANNLE_ROLE_SOURCE] = sourceListener;
117
118 ISocketListener sinkListener;
119 sinkListener.OnBind = DCameraSinkOnBind;
120 sinkListener.OnShutdown = DCameraSinkOnShutDown;
121 sinkListener.OnBytes = DCameraSinkOnBytes;
122 sinkListener.OnMessage = DCameraSinkOnMessage;
123 sinkListener.OnStream = DCameraSinkOnStream;
124 sessListeners_[DCAMERA_CHANNLE_ROLE_SINK] = sinkListener;
125 }
126
~DCameraSoftbusAdapter()127 DCameraSoftbusAdapter::~DCameraSoftbusAdapter()
128 {
129 }
130
CreatSoftBusSinkSocketServer(std::string mySessionName,DCAMERA_CHANNEL_ROLE role,DCameraSessionMode sessionMode,std::string peerDevId,std::string peerSessionName)131 int32_t DCameraSoftbusAdapter::CreatSoftBusSinkSocketServer(std::string mySessionName, DCAMERA_CHANNEL_ROLE role,
132 DCameraSessionMode sessionMode, std::string peerDevId, std::string peerSessionName)
133 {
134 DHLOGI("create socket server start, mySessionName: %s,peerSessionName: %s",
135 GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str());
136 {
137 std::lock_guard<std::mutex> autoLock(mySessionNameLock_);
138 if (mySessionNameSet_.find(mySessionName) != mySessionNameSet_.end()) {
139 DHLOGI("current mySessionName had Listened");
140 return DCAMERA_OK;
141 }
142 mySessionNameSet_.insert(mySessionName);
143 }
144 SocketInfo serverSocketInfo = {
145 .name = const_cast<char*>(mySessionName.c_str()),
146 .peerName = const_cast<char*>(peerSessionName.c_str()),
147 .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
148 .pkgName = const_cast<char*>(PKG_NAME.c_str()),
149 .dataType = sessionModeAndDataTypeMap_[sessionMode],
150 };
151 int socketId = Socket(serverSocketInfo);
152 if (socketId < 0) {
153 DHLOGE("create socket server error, socket is invalid");
154 return DCAMERA_BAD_VALUE;
155 }
156 int ret = Listen(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]);
157 if (ret != DCAMERA_OK) {
158 DHLOGE("create socket server error");
159 Shutdown(socketId);
160 return DCAMERA_BAD_VALUE;
161 }
162 {
163 std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
164 std::string peerDevIdMySessionName = peerDevId + std::string("_") + mySessionName;
165 peerDevIdMySessionNameMap_[peerDevIdMySessionName] = mySessionName;
166 }
167 DHLOGI("create socket server end, mySessionName: %s, peerSessionName: %s",
168 GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str());
169 return DCAMERA_OK;
170 }
171
CreateSoftBusSourceSocketClient(std::string myDevId,std::string peerSessionName,std::string peerDevId,DCameraSessionMode sessionMode,DCAMERA_CHANNEL_ROLE role)172 int32_t DCameraSoftbusAdapter::CreateSoftBusSourceSocketClient(std::string myDevId, std::string peerSessionName,
173 std::string peerDevId, DCameraSessionMode sessionMode, DCAMERA_CHANNEL_ROLE role)
174 {
175 DHLOGI("create socket client start, myDevId: %s, peerSessionName: %s",
176 GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str());
177 std::string myDevIdPeerSessionName = myDevId + std::string("_") + peerSessionName;
178 SocketInfo clientSocketInfo = {
179 .name = const_cast<char*>(myDevIdPeerSessionName.c_str()),
180 .peerName = const_cast<char*>(peerSessionName.c_str()),
181 .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
182 .pkgName = const_cast<char*>(PKG_NAME.c_str()),
183 .dataType = sessionModeAndDataTypeMap_[sessionMode],
184 };
185 int socketId = Socket(clientSocketInfo);
186 if (socketId < 0) {
187 DHLOGE("create socket client error, socket is invalid");
188 return DCAMERA_BAD_VALUE;
189 }
190 int ret = Bind(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]);
191 if (ret != DCAMERA_OK) {
192 DHLOGE("create socket client error");
193 Shutdown(socketId);
194 return DCAMERA_BAD_VALUE;
195 }
196 sourceSocketId_ = socketId;
197 DHLOGI("create socket client end, myDevId: %s, peerSessionName: %s",
198 GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str());
199 return DCAMERA_OK;
200 }
201
DestroySoftbusSessionServer(std::string sessionName)202 int32_t DCameraSoftbusAdapter::DestroySoftbusSessionServer(std::string sessionName)
203 {
204 std::lock_guard<std::mutex> autoLock(optLock_);
205 if (sessionTotal_.find(sessionName) == sessionTotal_.end()) {
206 DHLOGI("current sessionName already destroy, sessionName: %s", GetAnonyString(sessionName).c_str());
207 return DCAMERA_OK;
208 }
209
210 sessionTotal_[sessionName]--;
211 DHLOGI("sessionName destroy %s totalnum: %d", GetAnonyString(sessionName).c_str(),
212 sessionTotal_[sessionName]);
213 uint32_t total_ = sessionTotal_[sessionName];
214 if (total_ == 0) {
215 sessionTotal_.erase(sessionName);
216 }
217 return DCAMERA_OK;
218 }
219
CloseSoftbusSession(int32_t socket)220 int32_t DCameraSoftbusAdapter::CloseSoftbusSession(int32_t socket)
221 {
222 DHLOGI("Shutdown softbus socket start: %d", socket);
223 Shutdown(socket); // shutdown socket
224 {
225 std::lock_guard<std::mutex> autoLock(idMapLock_);
226 sessionIdMap_.erase(socket);
227 }
228 {
229 std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
230 sinkSocketSessionMap_.erase(socket);
231 }
232 {
233 std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
234 sourceSocketSessionMap_.erase(socket);
235 }
236 DHLOGI("Shutdown softbus socket: %d end", socket);
237 return DCAMERA_OK;
238 }
239
SendSofbusBytes(int32_t socket,std::shared_ptr<DataBuffer> & buffer)240 int32_t DCameraSoftbusAdapter::SendSofbusBytes(int32_t socket, std::shared_ptr<DataBuffer>& buffer)
241 {
242 return SendBytes(socket, buffer->Data(), buffer->Size());
243 }
244
SendSofbusStream(int32_t socket,std::shared_ptr<DataBuffer> & buffer)245 int32_t DCameraSoftbusAdapter::SendSofbusStream(int32_t socket, std::shared_ptr<DataBuffer>& buffer)
246 {
247 StreamData streamData = { reinterpret_cast<char *>(buffer->Data()), buffer->Size() };
248 int64_t timeStamp;
249 if (!buffer->FindInt64(TIME_STAMP_US, timeStamp)) {
250 DHLOGD("SendSofbusStream find %s failed.", TIME_STAMP_US.c_str());
251 }
252 int32_t frameType;
253 if (!buffer->FindInt32(FRAME_TYPE, frameType)) {
254 DHLOGD("SendSofbusStream find %s failed.", FRAME_TYPE.c_str());
255 }
256 int32_t index;
257 if (!buffer->FindInt32(INDEX, index)) {
258 DHLOGD("SendSofbusStream find %s failed.", INDEX.c_str());
259 }
260 int64_t startEncodeT;
261 if (!buffer->FindInt64(START_ENCODE_TIME_US, startEncodeT)) {
262 DHLOGD("SendSofbusStream find %s failed.", START_ENCODE_TIME_US.c_str());
263 }
264 int64_t finishEncodeT;
265 if (!buffer->FindInt64(FINISH_ENCODE_TIME_US, finishEncodeT)) {
266 DHLOGD("SendSofbusStream find %s failed.", FINISH_ENCODE_TIME_US.c_str());
267 }
268 std::string jsonStr = "";
269 DCameraSinkFrameInfo sinkFrameInfo;
270 sinkFrameInfo.pts_ = timeStamp;
271 sinkFrameInfo.type_ = frameType;
272 sinkFrameInfo.index_ = index;
273 sinkFrameInfo.startEncodeT_ = startEncodeT;
274 sinkFrameInfo.finishEncodeT_ = finishEncodeT;
275 sinkFrameInfo.sendT_ = GetNowTimeStampUs();
276 sinkFrameInfo.Marshal(jsonStr);
277 StreamData ext = { const_cast<char *>(jsonStr.c_str()), jsonStr.length() };
278 StreamFrameInfo param = { 0 };
279 int32_t ret = SendStream(socket, &streamData, &ext, ¶m);
280 if (ret != SOFTBUS_OK) {
281 DHLOGD("SendSofbusStream failed, ret is %d", ret);
282 return DCAMERA_BAD_VALUE;
283 }
284 return DCAMERA_OK;
285 }
286
DCameraSoftbusGetSessionById(int32_t sessionId,std::shared_ptr<DCameraSoftbusSession> & session)287 int32_t DCameraSoftbusAdapter::DCameraSoftbusGetSessionById(int32_t sessionId,
288 std::shared_ptr<DCameraSoftbusSession>& session)
289 {
290 DHLOGI("get softbus session by sessionId: %d", sessionId);
291 std::lock_guard<std::mutex> autoLock(idMapLock_);
292 auto iter = sessionIdMap_.find(sessionId);
293 if (iter == sessionIdMap_.end()) {
294 DHLOGE("get softbus session by id not find session %d", sessionId);
295 return DCAMERA_NOT_FOUND;
296 }
297 session = iter->second;
298 return DCAMERA_OK;
299 }
300
DCameraSoftbusSourceGetSession(int32_t socket,std::shared_ptr<DCameraSoftbusSession> & session)301 int32_t DCameraSoftbusAdapter::DCameraSoftbusSourceGetSession(int32_t socket,
302 std::shared_ptr<DCameraSoftbusSession>& session)
303 {
304 std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
305 auto iter = sourceSocketSessionMap_.find(socket);
306 if (iter == sourceSocketSessionMap_.end()) {
307 DHLOGE("source can not find current socket %d", socket);
308 return DCAMERA_NOT_FOUND;
309 }
310 session = iter->second;
311 return DCAMERA_OK;
312 }
313
314 // source
SourceOnBind(int32_t socket,PeerSocketInfo info)315 int32_t DCameraSoftbusAdapter::SourceOnBind(int32_t socket, PeerSocketInfo info)
316 {
317 DHLOGI("source bind socket begin, socket: %d", socket);
318 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
319 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
320 if (ret != DCAMERA_OK) {
321 DHLOGE("source bind socket can not find socket %d", socket);
322 return DCAMERA_NOT_FOUND;
323 }
324
325 ret = session->OnSessionOpened(socket);
326 if (ret != DCAMERA_OK) {
327 DHLOGE("source bind socket failed, ret: %d socket: %d", ret, socket);
328 } else {
329 std::lock_guard<std::mutex> autoLock(idMapLock_);
330 sessionIdMap_.emplace(socket, session);
331 }
332 DHLOGI("source bind socket end, socket: %d end", socket);
333 return ret;
334 }
335
SourceOnShutDown(int32_t socket,ShutdownReason reason)336 void DCameraSoftbusAdapter::SourceOnShutDown(int32_t socket, ShutdownReason reason)
337 {
338 DHLOGI("source on shutdown socket start, socket: %d", socket);
339 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
340 int32_t ret = DCameraSoftbusGetSessionById(socket, session);
341 if (ret != DCAMERA_OK) {
342 DHLOGE("SourceOnShutDown can not find socket %d", socket);
343 return;
344 }
345 {
346 std::lock_guard<std::mutex> autoLock(idMapLock_);
347 sessionIdMap_.erase(socket);
348 }
349 session->OnSessionClose(socket);
350 DHLOGI("source on shutdown socket end socket: %d end", socket);
351 return;
352 }
353
SourceOnBytes(int32_t socket,const void * data,uint32_t dataLen)354 void DCameraSoftbusAdapter::SourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)
355 {
356 if (dataLen == 0 || dataLen > DCAMERA_MAX_RECV_DATA_LEN || data == nullptr) {
357 DHLOGE("source callback send bytes error, dataLen: %d, socket: %d", dataLen, socket);
358 return;
359 }
360 DHLOGI("source callback send bytes start, socket: %d", socket);
361 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
362 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
363 if (ret != DCAMERA_OK) {
364 DHLOGE("source callback send bytes not find session %d", socket);
365 return;
366 }
367
368 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(dataLen);
369 ret = memcpy_s(buffer->Data(), buffer->Capacity(), data, dataLen);
370 if (ret != EOK) {
371 DHLOGE("source callback send bytes memcpy_s failed ret: %d", ret);
372 return;
373 }
374 session->OnDataReceived(buffer);
375 DHLOGI("source callback send bytes end, socket: %d", socket);
376 return;
377 }
378
SourceOnMessage(int32_t socket,const void * data,uint32_t dataLen)379 void DCameraSoftbusAdapter::SourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)
380 {
381 (void)socket;
382 (void)data;
383 (void)dataLen;
384 return;
385 }
386
SourceOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)387 void DCameraSoftbusAdapter::SourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
388 const StreamFrameInfo *param)
389 {
390 int64_t recvT = GetNowTimeStampUs();
391 if (data == nullptr) {
392 DHLOGE("SourceOnStream Error, data is null, socket: %d.", socket);
393 return;
394 }
395 int32_t dataLen = data->bufLen;
396 if (dataLen <= 0 || dataLen > static_cast<int32_t>(DCAMERA_MAX_RECV_DATA_LEN)) {
397 DHLOGE("SourceOnStream Error, dataLen: %d, socket: %d", dataLen, socket);
398 return;
399 }
400 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
401 int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
402 if (ret != DCAMERA_OK) {
403 DHLOGE("SourceOnStream not find socket %d", socket);
404 return;
405 }
406
407 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(data->bufLen);
408 buffer->SetInt64(RECV_TIME_US, recvT);
409 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(data->buf), data->bufLen);
410 if (ret != EOK) {
411 DHLOGE("SourceOnStream memcpy_s failed ret: %d", ret);
412 return;
413 }
414 ret = HandleSourceStreamExt(buffer, ext);
415 if (ret != DCAMERA_OK) {
416 DHLOGE("Handle source stream ext failed, ret is: %d", ret);
417 }
418 session->OnDataReceived(buffer);
419 }
420
HandleSourceStreamExt(std::shared_ptr<DataBuffer> & buffer,const StreamData * ext)421 int32_t DCameraSoftbusAdapter::HandleSourceStreamExt(std::shared_ptr<DataBuffer>& buffer, const StreamData *ext)
422 {
423 if (ext == nullptr) {
424 DHLOGE("Source stream ext is null.");
425 return DCAMERA_BAD_VALUE;
426 }
427 int32_t extLen = ext->bufLen;
428 if (extLen <= 0 || extLen > DCAMERA_MAX_RECV_EXT_LEN) {
429 DHLOGD("ExtLen is: %d.", extLen);
430 return DCAMERA_BAD_VALUE;
431 }
432
433 std::string jsonStr(reinterpret_cast<const char*>(ext->buf), ext->bufLen);
434 DCameraSinkFrameInfo sinkFrameInfo;
435 int32_t ret = sinkFrameInfo.Unmarshal(jsonStr);
436 if (ret != DCAMERA_OK) {
437 DHLOGE("Unmarshal sinkFrameInfo failed.");
438 return DCAMERA_BAD_VALUE;
439 }
440 int64_t recvT;
441 if (!buffer->FindInt64(RECV_TIME_US, recvT)) {
442 DHLOGD("HandleSourceStreamExt find %s failed.", RECV_TIME_US.c_str());
443 }
444 DCameraFrameInfo frameInfo;
445 frameInfo.type = sinkFrameInfo.type_;
446 frameInfo.pts = sinkFrameInfo.pts_;
447 frameInfo.index = sinkFrameInfo.index_;
448 frameInfo.ver = sinkFrameInfo.ver_;
449 frameInfo.timePonit.startEncode = sinkFrameInfo.startEncodeT_;
450 frameInfo.timePonit.finishEncode = sinkFrameInfo.finishEncodeT_;
451 frameInfo.timePonit.send = sinkFrameInfo.sendT_;
452 frameInfo.timePonit.recv = recvT;
453 buffer->frameInfo_ = frameInfo;
454 return DCAMERA_OK;
455 }
456
GetSourceSocketId()457 int32_t DCameraSoftbusAdapter::GetSourceSocketId()
458 {
459 return sourceSocketId_;
460 }
461
RecordSourceSocketSession(int32_t socket,std::shared_ptr<DCameraSoftbusSession> session)462 void DCameraSoftbusAdapter::RecordSourceSocketSession(int32_t socket, std::shared_ptr<DCameraSoftbusSession> session)
463 {
464 if (session == nullptr) {
465 DHLOGE("RecordSourceSocketSession error, session is null");
466 return;
467 }
468 {
469 std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
470 sourceSocketSessionMap_[socket] = session;
471 }
472 }
473
DCameraSoftbusSinkGetSession(int32_t socket,std::shared_ptr<DCameraSoftbusSession> & session)474 int32_t DCameraSoftbusAdapter::DCameraSoftbusSinkGetSession(int32_t socket,
475 std::shared_ptr<DCameraSoftbusSession>& session)
476 {
477 DHLOGI("sink find session start, socket: %d", socket);
478 {
479 std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
480 auto iter = sinkSocketSessionMap_.find(socket);
481 if (iter == sinkSocketSessionMap_.end()) {
482 DHLOGE("sink can not find socket %d", socket);
483 return DCAMERA_NOT_FOUND;
484 }
485 session = iter->second;
486 if (session->GetSessionId() < 0) {
487 DHLOGE("sink find session error, current sessionId is invalid");
488 return DCAMERA_BAD_VALUE;
489 }
490 }
491 DHLOGI("sink find session end, socket: %d", socket);
492 return DCAMERA_OK;
493 }
494
DCameraSoftBusGetSessionByPeerSocket(int32_t socket,std::shared_ptr<DCameraSoftbusSession> & session,PeerSocketInfo info)495 int32_t DCameraSoftbusAdapter::DCameraSoftBusGetSessionByPeerSocket(int32_t socket,
496 std::shared_ptr<DCameraSoftbusSession> &session, PeerSocketInfo info)
497 {
498 DHLOGI("find session by peer socket start, socket %d", socket);
499 std::string mySessionName = "";
500 {
501 std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
502 auto sessionNameIter = peerDevIdMySessionNameMap_.find(info.name);
503 if (sessionNameIter == peerDevIdMySessionNameMap_.end()) {
504 DHLOGE("find session by peer socket error, socket %d", socket);
505 return DCAMERA_NOT_FOUND;
506 }
507 mySessionName = sessionNameIter->second;
508 }
509 auto iter = sinkSessions_.find(std::string(mySessionName));
510 if (iter == sinkSessions_.end()) {
511 DHLOGE("find session by peer socket error, mySessionName %s",
512 GetAnonyString(mySessionName).c_str());
513 return DCAMERA_NOT_FOUND;
514 }
515 session = iter->second;
516 {
517 std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
518 sinkSocketSessionMap_[socket] = session;
519 }
520 DHLOGI("find session by peer socket end, socket %d", socket);
521 return DCAMERA_OK;
522 }
523
524 // sink
SinkOnBind(int32_t socket,PeerSocketInfo info)525 int32_t DCameraSoftbusAdapter::SinkOnBind(int32_t socket, PeerSocketInfo info)
526 {
527 DHLOGI("sink bind socket start, socket: %d", socket);
528 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
529 int32_t ret = DCameraSoftBusGetSessionByPeerSocket(socket, session, info);
530 if (ret != DCAMERA_OK) {
531 DHLOGE("sink bind socket error, can not find socket %d", socket);
532 return DCAMERA_NOT_FOUND;
533 }
534
535 ret = session->OnSessionOpened(socket);
536 if (ret != DCAMERA_OK) {
537 DHLOGE("sink bind socket error, not find socket %d", socket);
538 } else {
539 std::lock_guard<std::mutex> autoLock(idMapLock_);
540 sessionIdMap_.emplace(socket, session);
541 }
542 DHLOGI("sink bind socket end, socket: %d", socket);
543 return ret;
544 }
545
SinkOnShutDown(int32_t socket,ShutdownReason reason)546 void DCameraSoftbusAdapter::SinkOnShutDown(int32_t socket, ShutdownReason reason)
547 {
548 DHLOGI("sink on shutdown socket start, socket: %d", socket);
549 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
550 int32_t ret = DCameraSoftbusGetSessionById(socket, session);
551 if (ret != DCAMERA_OK) {
552 DHLOGE("sink on shutdown socket can not find socket %d", socket);
553 return;
554 }
555 {
556 std::lock_guard<std::mutex> autoLock(idMapLock_);
557 sessionIdMap_.erase(socket);
558 }
559 session->OnSessionClose(socket);
560 DHLOGI("sink on shutdown socket end, socket: %d", socket);
561 return;
562 }
563
SinkOnBytes(int32_t socket,const void * data,uint32_t dataLen)564 void DCameraSoftbusAdapter::SinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)
565 {
566 if (dataLen == 0 || dataLen > DCAMERA_MAX_RECV_DATA_LEN || data == nullptr) {
567 DHLOGE("sink on bytes error, dataLen: %d, socket: %d", dataLen, socket);
568 return;
569 }
570 DHLOGI("sink on bytes start, socket: %d", socket);
571 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
572 int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
573 if (ret != DCAMERA_OK) {
574 DHLOGE("sink on bytes error, can not find session %d", socket);
575 return;
576 }
577 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(dataLen);
578 ret = memcpy_s(buffer->Data(), buffer->Capacity(), data, dataLen);
579 if (ret != EOK) {
580 DHLOGE("sink on bytes memcpy_s failed ret: %d", ret);
581 return;
582 }
583 session->OnDataReceived(buffer);
584 DHLOGI("sink on bytes end, socket: %d", socket);
585 return;
586 }
587
SinkOnMessage(int32_t socket,const void * data,uint32_t dataLen)588 void DCameraSoftbusAdapter::SinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)
589 {
590 return;
591 }
592
SinkOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)593 void DCameraSoftbusAdapter::SinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
594 const StreamFrameInfo *param)
595 {
596 if (data == nullptr) {
597 DHLOGE("SinkOnStream error, data is null, socket: %d.", socket);
598 return;
599 }
600 int32_t dataLen = data->bufLen;
601 if (dataLen <= 0 || dataLen > static_cast<int32_t>(DCAMERA_MAX_RECV_DATA_LEN)) {
602 DHLOGE("SinkOnStream error, dataLen: %d socket: %d", dataLen, socket);
603 return;
604 }
605 std::shared_ptr<DCameraSoftbusSession> session = nullptr;
606 int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
607 if (ret != DCAMERA_OK) {
608 DHLOGE("SinkOnStream error, can not find socket %d", socket);
609 return;
610 }
611
612 std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(data->bufLen);
613 ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(data->buf), data->bufLen);
614 if (ret != EOK) {
615 DHLOGE("SinkOnStream error, memcpy_s failed ret: %d", ret);
616 return;
617 }
618 session->OnDataReceived(buffer);
619 return;
620 }
621
GetLocalNetworkId(std::string & myDevId)622 int32_t DCameraSoftbusAdapter::GetLocalNetworkId(std::string& myDevId)
623 {
624 NodeBasicInfo basicInfo = { { 0 } };
625 int32_t ret = GetLocalNodeDeviceInfo(PKG_NAME.c_str(), &basicInfo);
626 if (ret != DCAMERA_OK) {
627 DHLOGE("GetLocalNodeDeviceInfo failed ret: %d", ret);
628 return ret;
629 }
630
631 myDevId = std::string(basicInfo.networkId);
632 return DCAMERA_OK;
633 }
634 } // namespace DistributedHardware
635 } // namespace OHOS
636