• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &param);
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