• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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_error_code.h"
27 #include "dcamera_utils_tools.h"
28 #include "dcamera_frame_info.h"
29 #include "distributed_camera_allconnect_manager.h"
30 #include "dcamera_event_cmd.h"
31 #include "dcamera_protocol.h"
32 
33 namespace OHOS {
34 namespace DistributedHardware {
35 namespace {
36 static QosTV g_qosInfo[] = {
37     { .qos = QOS_TYPE_MIN_BW, .value = DCAMERA_QOS_TYPE_MIN_BW },
38     { .qos = QOS_TYPE_MAX_LATENCY, .value = DCAMERA_QOS_TYPE_MAX_LATENCY },
39     { .qos = QOS_TYPE_MIN_LATENCY, .value = DCAMERA_QOS_TYPE_MIN_LATENCY}
40 };
41 static uint32_t g_QosTV_Param_Index = static_cast<uint32_t>(sizeof(g_qosInfo) / sizeof(QosTV));
42 }
43 IMPLEMENT_SINGLE_INSTANCE(DCameraSoftbusAdapter);
44 
DCameraSourceOnBind(int32_t socket,PeerSocketInfo info)45 static void DCameraSourceOnBind(int32_t socket, PeerSocketInfo info)
46 {
47     return;
48 }
49 
DCameraSourceOnShutDown(int32_t socket,ShutdownReason reason)50 static void DCameraSourceOnShutDown(int32_t socket, ShutdownReason reason)
51 {
52     DCameraSoftbusAdapter::GetInstance().SourceOnShutDown(socket, reason);
53     return;
54 }
55 
DCameraSourceOnBytes(int32_t socket,const void * data,uint32_t dataLen)56 static void DCameraSourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)
57 {
58     DCameraSoftbusAdapter::GetInstance().SourceOnBytes(socket, data, dataLen);
59     return;
60 }
61 
DCameraSourceOnMessage(int32_t socket,const void * data,uint32_t dataLen)62 static void DCameraSourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)
63 {
64     DCameraSoftbusAdapter::GetInstance().SourceOnMessage(socket, data, dataLen);
65     return;
66 }
67 
DCameraSourceOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)68 static void DCameraSourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
69     const StreamFrameInfo *param)
70 {
71     DCameraSoftbusAdapter::GetInstance().SourceOnStream(socket, data, ext, param);
72     return;
73 }
74 
75 // sink
DCameraSinkOnBind(int32_t socket,PeerSocketInfo info)76 static void DCameraSinkOnBind(int32_t socket, PeerSocketInfo info)
77 {
78     DCameraSoftbusAdapter::GetInstance().SinkOnBind(socket, info);
79     return;
80 }
81 
DCameraSinkOnShutDown(int32_t socket,ShutdownReason reason)82 static void DCameraSinkOnShutDown(int32_t socket, ShutdownReason reason)
83 {
84     DCameraSoftbusAdapter::GetInstance().SinkOnShutDown(socket, reason);
85     return;
86 }
87 
DCameraSinkOnBytes(int32_t socket,const void * data,uint32_t dataLen)88 static void DCameraSinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)
89 {
90     DCameraSoftbusAdapter::GetInstance().SinkOnBytes(socket, data, dataLen);
91     return;
92 }
93 
DCameraSinkOnMessage(int32_t socket,const void * data,uint32_t dataLen)94 static void DCameraSinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)
95 {
96     DCameraSoftbusAdapter::GetInstance().SinkOnMessage(socket, data, dataLen);
97     return;
98 }
99 
DCameraSinkOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)100 static void DCameraSinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
101     const StreamFrameInfo *param)
102 {
103     DCameraSoftbusAdapter::GetInstance().SinkOnStream(socket, data, ext, param);
104     return;
105 }
106 
DCameraSoftbusAdapter()107 DCameraSoftbusAdapter::DCameraSoftbusAdapter()
108 {
109     sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_CTRL] = TransDataType::DATA_TYPE_BYTES;
110     sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_VIDEO] = TransDataType::DATA_TYPE_VIDEO_STREAM;
111     sessionModeAndDataTypeMap_[DCAMERA_SESSION_MODE_JPEG] = TransDataType::DATA_TYPE_BYTES;
112 
113     ISocketListener sourceListener;
114     sourceListener.OnBind = DCameraSourceOnBind;
115     sourceListener.OnShutdown = DCameraSourceOnShutDown;
116     sourceListener.OnBytes = DCameraSourceOnBytes;
117     sourceListener.OnMessage = DCameraSourceOnMessage;
118     sourceListener.OnStream = DCameraSourceOnStream;
119     sessListeners_[DCAMERA_CHANNLE_ROLE_SOURCE] = sourceListener;
120 
121     ISocketListener sinkListener;
122     sinkListener.OnBind = DCameraSinkOnBind;
123     sinkListener.OnShutdown = DCameraSinkOnShutDown;
124     sinkListener.OnBytes = DCameraSinkOnBytes;
125     sinkListener.OnMessage = DCameraSinkOnMessage;
126     sinkListener.OnStream = DCameraSinkOnStream;
127     sessListeners_[DCAMERA_CHANNLE_ROLE_SINK] = sinkListener;
128 }
129 
~DCameraSoftbusAdapter()130 DCameraSoftbusAdapter::~DCameraSoftbusAdapter()
131 {
132 }
133 
ReplaceSuffix(std::string & mySessNmRep,const std::string & suffix,const std::string & replacement)134 void DCameraSoftbusAdapter::ReplaceSuffix(std::string &mySessNmRep, const std::string &suffix,
135                                           const std::string &replacement)
136 {
137     DHLOGI("replacing suffix in mySessionName: %{public}s", mySessNmRep.c_str());
138     bool isModified = false;
139     if (mySessNmRep.length() >= suffix.length() &&
140         mySessNmRep.compare(mySessNmRep.length() - suffix.length(), suffix.length(), suffix) == 0) {
141         mySessNmRep.replace(mySessNmRep.length() - suffix.length(), suffix.length(), replacement);
142         isModified = true;
143     }
144     DHLOGI("suffix replaced? %{public}s - Modified: %{public}s", isModified ? "Y" : "N", mySessNmRep.c_str());
145 }
146 
CreatSoftBusSinkSocketServer(std::string mySessionName,DCAMERA_CHANNEL_ROLE role,DCameraSessionMode sessionMode,std::string peerDevId,std::string peerSessionName)147 int32_t DCameraSoftbusAdapter::CreatSoftBusSinkSocketServer(std::string mySessionName, DCAMERA_CHANNEL_ROLE role,
148     DCameraSessionMode sessionMode, std::string peerDevId, std::string peerSessionName)
149 {
150     DHLOGI("create socket server start, mySessionName: %{public}s,peerSessionName: %{public}s",
151         GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str());
152     SocketInfo serverSocketInfo {};
153     if (!ManageSelectChannel::GetInstance().GetSinkConnect()) {
154         serverSocketInfo = {
155             .name =  const_cast<char*>(mySessionName.c_str()),
156             .peerName = const_cast<char*>(peerSessionName.c_str()),
157             .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
158             .pkgName = const_cast<char*>(PKG_NAME.c_str()),
159             .dataType = sessionModeAndDataTypeMap_[sessionMode],
160         };
161     } else {
162         serverSocketInfo = {
163             .name =  const_cast<char*>(mySessionName.c_str()),
164             .pkgName = const_cast<char*>(PKG_NAME.c_str()),
165             .dataType = sessionModeAndDataTypeMap_[sessionMode],
166         };
167     }
168     int32_t socketId = Socket(serverSocketInfo);
169     if (socketId < 0) {
170         DHLOGE("create socket server error, socket is invalid, socketId: %{public}d", socketId);
171         return DCAMERA_BAD_VALUE;
172     }
173     {
174         std::lock_guard<std::mutex> autoLock(mySocketSetLock_);
175         if (mySocketSet_.find(socketId) != mySocketSet_.end()) {
176             DHLOGI("current socketId had Listened");
177             return DCAMERA_OK;
178         }
179         mySocketSet_.insert(socketId);
180     }
181     int32_t ret = Listen(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]);
182     if (ret != DCAMERA_OK) {
183         DHLOGE("create socket server error, ret: %{public}d", ret);
184         Shutdown(socketId);
185         return DCAMERA_BAD_VALUE;
186     }
187     if (!ManageSelectChannel::GetInstance().GetSinkConnect()) {
188         std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
189         std::string peerDevIdMySessionName = peerDevId + std::string("_") + mySessionName;
190         peerDevIdMySessionNameMap_[peerDevIdMySessionName] = mySessionName;
191     } else {
192         std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
193         mySessionNameMapV2_[mySessionName] = mySessionName;
194     }
195     DHLOGI("create socket server end, mySessionName: %{public}s, peerSessionName: %{public}s",
196         GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str());
197     return DCAMERA_OK;
198 }
199 
CreateSoftBusSourceSocketClient(std::string myDevId,std::string peerSessionName,std::string peerDevId,DCameraSessionMode sessionMode,DCAMERA_CHANNEL_ROLE role)200 int32_t DCameraSoftbusAdapter::CreateSoftBusSourceSocketClient(std::string myDevId, std::string peerSessionName,
201     std::string peerDevId, DCameraSessionMode sessionMode, DCAMERA_CHANNEL_ROLE role)
202 {
203     DHLOGI("create socket client start, myDevId: %{public}s, peerSessionName: %{public}s",
204         GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str());
205     SocketInfo clientSocketInfo {};
206     std::string myDevIdPeerSessionName = "";
207     std::string srcSessionName = "";
208     if (!ManageSelectChannel::GetInstance().GetSrcConnect()) {
209         myDevIdPeerSessionName = myDevId + std::string("_") + peerSessionName;
210         clientSocketInfo = {
211             .name = const_cast<char*>(myDevIdPeerSessionName.c_str()),
212             .peerName = const_cast<char*>(peerSessionName.c_str()),
213             .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
214             .pkgName = const_cast<char*>(PKG_NAME.c_str()),
215             .dataType = sessionModeAndDataTypeMap_[sessionMode],
216         };
217     } else {
218         srcSessionName = peerSessionName + "_receiver";
219         peerSessionName = peerSessionName + "_sender";
220         clientSocketInfo = {
221             .name = const_cast<char*>(srcSessionName.c_str()),
222             .peerName = const_cast<char*>(peerSessionName.c_str()),
223             .peerNetworkId = const_cast<char*>(peerDevId.c_str()),
224             .pkgName = const_cast<char*>(PKG_NAME.c_str()),
225             .dataType = sessionModeAndDataTypeMap_[sessionMode],
226         };
227     }
228     DHLOGD("create socket client myDevIdPeerSessionName: %{public}s, srcSessionName: %{public}s",
229         GetAnonyString(myDevIdPeerSessionName).c_str(), GetAnonyString(srcSessionName).c_str());
230     int socketId = Socket(clientSocketInfo);
231     if (socketId < 0) {
232         DHLOGE("create socket client error, socket is invalid");
233         return DCAMERA_BAD_VALUE;
234     }
235     int ret = Bind(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]);
236     if (ret != DCAMERA_OK) {
237         DHLOGE("create socket client error");
238         Shutdown(socketId);
239         return DCAMERA_BAD_VALUE;
240     }
241     sourceSocketId_ = socketId;
242     if (peerSessionName.find("_control") != std::string::npos && DCameraAllConnectManager::IsInited()) {
243         DCameraAllConnectManager::GetInstance().PublishServiceState(peerDevId, SCM_CONNECTED);
244         DCameraAllConnectManager::SetSourceNetworkId(peerDevId, sourceSocketId_);
245     }
246     DHLOGI("create socket client end, myDevId: %{public}s, peerSessionName: %{public}s",
247         GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str());
248     return socketId;
249 }
250 
DestroySoftbusSessionServer(std::string sessionName)251 int32_t DCameraSoftbusAdapter::DestroySoftbusSessionServer(std::string sessionName)
252 {
253     std::lock_guard<std::mutex> autoLock(optLock_);
254     if (sessionTotal_.find(sessionName) == sessionTotal_.end()) {
255         DHLOGI("current sessionName already destroy, sessionName: %{public}s", GetAnonyString(sessionName).c_str());
256         return DCAMERA_OK;
257     }
258 
259     sessionTotal_[sessionName]--;
260     DHLOGI("sessionName destroy %{public}s totalnum: %{public}d", GetAnonyString(sessionName).c_str(),
261         sessionTotal_[sessionName]);
262     uint32_t total_ = sessionTotal_[sessionName];
263     if (total_ == 0) {
264         sessionTotal_.erase(sessionName);
265     }
266     return DCAMERA_OK;
267 }
268 
CloseSoftbusSession(int32_t socket)269 int32_t DCameraSoftbusAdapter::CloseSoftbusSession(int32_t socket)
270 {
271     DHLOGI("Shutdown softbus socket start: %{public}d", socket);
272     Shutdown(socket); // shutdown socket
273     {
274         std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
275         sinkSocketSessionMap_.erase(socket);
276     }
277     {
278         std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
279         sourceSocketSessionMap_.erase(socket);
280     }
281     DHLOGI("Shutdown softbus socket: %{public}d end", socket);
282     return DCAMERA_OK;
283 }
284 
SendSofbusBytes(int32_t socket,std::shared_ptr<DataBuffer> & buffer)285 int32_t DCameraSoftbusAdapter::SendSofbusBytes(int32_t socket, std::shared_ptr<DataBuffer>& buffer)
286 {
287     CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null");
288     return SendBytes(socket, buffer->Data(), buffer->Size());
289 }
290 
SendSofbusStream(int32_t socket,std::shared_ptr<DataBuffer> & buffer)291 int32_t DCameraSoftbusAdapter::SendSofbusStream(int32_t socket, std::shared_ptr<DataBuffer>& buffer)
292 {
293     CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null");
294     StreamData streamData = { reinterpret_cast<char *>(buffer->Data()), buffer->Size() };
295     int64_t timeStamp;
296     if (!buffer->FindInt64(TIME_STAMP_US, timeStamp)) {
297         DHLOGD("SendSofbusStream find %{public}s failed.", TIME_STAMP_US.c_str());
298     }
299     int32_t frameType;
300     if (!buffer->FindInt32(FRAME_TYPE, frameType)) {
301         DHLOGD("SendSofbusStream find %{public}s failed.", FRAME_TYPE.c_str());
302     }
303     int32_t index;
304     if (!buffer->FindInt32(INDEX, index)) {
305         DHLOGD("SendSofbusStream find %{public}s failed.", INDEX.c_str());
306     }
307     int64_t startEncodeT;
308     if (!buffer->FindInt64(START_ENCODE_TIME_US, startEncodeT)) {
309         DHLOGD("SendSofbusStream find %{public}s failed.", START_ENCODE_TIME_US.c_str());
310     }
311     int64_t finishEncodeT;
312     if (!buffer->FindInt64(FINISH_ENCODE_TIME_US, finishEncodeT)) {
313         DHLOGD("SendSofbusStream find %{public}s failed.", FINISH_ENCODE_TIME_US.c_str());
314     }
315     std::string jsonStr = "";
316     DCameraSinkFrameInfo sinkFrameInfo;
317     sinkFrameInfo.pts_ = timeStamp;
318     sinkFrameInfo.type_ = frameType;
319     sinkFrameInfo.index_ = index;
320     sinkFrameInfo.startEncodeT_ = startEncodeT;
321     sinkFrameInfo.finishEncodeT_ = finishEncodeT;
322     sinkFrameInfo.sendT_ = GetNowTimeStampUs();
323     sinkFrameInfo.Marshal(jsonStr);
324     StreamData ext = { const_cast<char *>(jsonStr.c_str()), jsonStr.length() };
325     StreamFrameInfo param = { 0 };
326     int32_t ret = SendStream(socket, &streamData, &ext, &param);
327     if (ret != SOFTBUS_OK) {
328         DHLOGD("SendSofbusStream failed, ret is %{public}d", ret);
329         return DCAMERA_BAD_VALUE;
330     }
331     return DCAMERA_OK;
332 }
333 
DCameraSoftbusSourceGetSession(int32_t socket,std::shared_ptr<DCameraSoftbusSession> & session)334 int32_t DCameraSoftbusAdapter::DCameraSoftbusSourceGetSession(int32_t socket,
335     std::shared_ptr<DCameraSoftbusSession>& session)
336 {
337     std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
338     auto iter =  sourceSocketSessionMap_.find(socket);
339     if (iter == sourceSocketSessionMap_.end()) {
340         DHLOGE("source can not find current socket %{public}d", socket);
341         return DCAMERA_NOT_FOUND;
342     }
343     session = iter->second;
344     return DCAMERA_OK;
345 }
346 
347 // source
SourceOnBind(int32_t socket,PeerSocketInfo info)348 int32_t DCameraSoftbusAdapter::SourceOnBind(int32_t socket, PeerSocketInfo info)
349 {
350     DHLOGI("source bind socket begin, socket: %{public}d", socket);
351     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
352     int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
353     if (ret != DCAMERA_OK || session == nullptr) {
354         DHLOGE("source bind socket can not find socket %{public}d", socket);
355         return DCAMERA_NOT_FOUND;
356     }
357     ret = session->OnSessionOpened(socket, info.networkId);
358     if (ret != DCAMERA_OK) {
359         DHLOGE("source bind socket failed, ret: %{public}d socket: %{public}d", ret, socket);
360     }
361     if (session->GetPeerSessionName().find("_control") != std::string::npos && DCameraAllConnectManager::IsInited()) {
362         ret = DCameraAllConnectManager::GetInstance().PublishServiceState(info.networkId, SCM_CONNECTED);
363         if (ret != DCAMERA_OK) {
364             DHLOGE("DCamera allconnect sourceonBind publish scm connected failed, ret: %{public}d", ret);
365         }
366         DCameraAllConnectManager::SetSourceNetworkId(info.networkId, socket);
367     }
368     DHLOGI("source bind socket end, socket: %{public}d end", socket);
369     return ret;
370 }
371 
SourceOnShutDown(int32_t socket,ShutdownReason reason)372 void DCameraSoftbusAdapter::SourceOnShutDown(int32_t socket, ShutdownReason reason)
373 {
374     DHLOGI("source on shutdown socket start, socket: %{public}d", socket);
375     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
376     int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
377     if (ret != DCAMERA_OK || session == nullptr) {
378         DHLOGE("SourceOnShutDown can not find socket %{public}d", socket);
379         return;
380     }
381     session->OnSessionClose(socket);
382     if (session->GetPeerSessionName().find("_control") != std::string::npos && DCameraAllConnectManager::IsInited()) {
383         DCameraAllConnectManager::RemoveSourceNetworkId(socket);
384     }
385     DHLOGI("source on shutdown socket end socket: %{public}d end", socket);
386     return;
387 }
388 
SourceOnBytes(int32_t socket,const void * data,uint32_t dataLen)389 void DCameraSoftbusAdapter::SourceOnBytes(int32_t socket, const void *data, uint32_t dataLen)
390 {
391     if (dataLen == 0 || dataLen > DCAMERA_MAX_RECV_DATA_LEN || data == nullptr) {
392         DHLOGE("source callback send bytes error, dataLen: %{public}d, socket: %{public}d", dataLen, socket);
393         return;
394     }
395     DHLOGI("source callback send bytes start, socket: %{public}d", socket);
396     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
397     int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
398     if (ret != DCAMERA_OK || session == nullptr) {
399         DHLOGE("source callback send bytes not find session %{public}d", socket);
400         return;
401     }
402 
403     std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(dataLen);
404     ret = memcpy_s(buffer->Data(), buffer->Capacity(), data, dataLen);
405     if (ret != EOK) {
406         DHLOGE("source callback send bytes memcpy_s failed ret: %{public}d", ret);
407         return;
408     }
409     session->OnDataReceived(buffer);
410     DHLOGI("source callback send bytes end, socket: %{public}d", socket);
411     return;
412 }
413 
SourceOnMessage(int32_t socket,const void * data,uint32_t dataLen)414 void DCameraSoftbusAdapter::SourceOnMessage(int32_t socket, const void *data, uint32_t dataLen)
415 {
416     (void)socket;
417     (void)data;
418     (void)dataLen;
419     return;
420 }
421 
SourceOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)422 void DCameraSoftbusAdapter::SourceOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
423     const StreamFrameInfo *param)
424 {
425     int64_t recvT = GetNowTimeStampUs();
426     if (data == nullptr) {
427         DHLOGE("SourceOnStream Error, data is null, socket: %{public}d.", socket);
428         return;
429     }
430     int32_t dataLen = data->bufLen;
431     if (dataLen <= 0 || dataLen > static_cast<int32_t>(DCAMERA_MAX_RECV_DATA_LEN)) {
432         DHLOGE("SourceOnStream Error, dataLen: %{public}d, socket: %{public}d", dataLen, socket);
433         return;
434     }
435     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
436     int32_t ret = DCameraSoftbusSourceGetSession(socket, session);
437     if (ret != DCAMERA_OK || session == nullptr) {
438         DHLOGE("SourceOnStream not find socket %{public}d", socket);
439         return;
440     }
441 
442     std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(data->bufLen);
443     buffer->SetInt64(RECV_TIME_US, recvT);
444     ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(data->buf), data->bufLen);
445     if (ret != EOK) {
446         DHLOGE("SourceOnStream memcpy_s failed ret: %{public}d", ret);
447         return;
448     }
449     ret = HandleSourceStreamExt(buffer, ext);
450     if (ret != DCAMERA_OK) {
451         DHLOGE("Handle source stream ext failed, ret is: %{public}d", ret);
452     }
453     session->OnDataReceived(buffer);
454 }
455 
HandleSourceStreamExt(std::shared_ptr<DataBuffer> & buffer,const StreamData * ext)456 int32_t DCameraSoftbusAdapter::HandleSourceStreamExt(std::shared_ptr<DataBuffer>& buffer, const StreamData *ext)
457 {
458     if (ext == nullptr) {
459         DHLOGE("Source stream ext is null.");
460         return DCAMERA_BAD_VALUE;
461     }
462     int32_t extLen = ext->bufLen;
463     if (extLen <= 0 || extLen > DCAMERA_MAX_RECV_EXT_LEN) {
464         DHLOGD("ExtLen is: %{public}d.", extLen);
465         return DCAMERA_BAD_VALUE;
466     }
467 
468     std::string jsonStr(reinterpret_cast<const char*>(ext->buf), ext->bufLen);
469     DCameraSinkFrameInfo sinkFrameInfo;
470     int32_t ret = sinkFrameInfo.Unmarshal(jsonStr);
471     if (ret != DCAMERA_OK) {
472         DHLOGE("Unmarshal sinkFrameInfo failed.");
473         return DCAMERA_BAD_VALUE;
474     }
475     int64_t recvT;
476     CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null");
477     if (!buffer->FindInt64(RECV_TIME_US, recvT)) {
478         DHLOGD("HandleSourceStreamExt find %{public}s failed.", RECV_TIME_US.c_str());
479     }
480     DCameraFrameInfo frameInfo;
481     frameInfo.type = sinkFrameInfo.type_;
482     frameInfo.pts = sinkFrameInfo.pts_;
483     frameInfo.index = sinkFrameInfo.index_;
484     frameInfo.ver = sinkFrameInfo.ver_;
485     frameInfo.timePonit.startEncode = sinkFrameInfo.startEncodeT_;
486     frameInfo.timePonit.finishEncode = sinkFrameInfo.finishEncodeT_;
487     frameInfo.timePonit.send = sinkFrameInfo.sendT_;
488     frameInfo.timePonit.recv = recvT;
489     buffer->frameInfo_ = frameInfo;
490     return DCAMERA_OK;
491 }
492 
RecordSourceSocketSession(int32_t socket,std::shared_ptr<DCameraSoftbusSession> session)493 void DCameraSoftbusAdapter::RecordSourceSocketSession(int32_t socket, std::shared_ptr<DCameraSoftbusSession> session)
494 {
495     if (session == nullptr) {
496         DHLOGE("RecordSourceSocketSession error, session is null");
497         return;
498     }
499     {
500         std::lock_guard<std::mutex> autoLock(sourceSocketLock_);
501         sourceSocketSessionMap_[socket] = session;
502     }
503 }
504 
DCameraSoftbusSinkGetSession(int32_t socket,std::shared_ptr<DCameraSoftbusSession> & session)505 int32_t DCameraSoftbusAdapter::DCameraSoftbusSinkGetSession(int32_t socket,
506     std::shared_ptr<DCameraSoftbusSession>& session)
507 {
508     DHLOGI("sink find session start, socket: %{public}d", socket);
509     {
510         std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
511         auto iter = sinkSocketSessionMap_.find(socket);
512         if (iter == sinkSocketSessionMap_.end()) {
513             DHLOGE("sink can not find socket %{public}d", socket);
514             return DCAMERA_NOT_FOUND;
515         }
516         session = iter->second;
517         CHECK_AND_RETURN_RET_LOG(session == nullptr, DCAMERA_BAD_VALUE, "Softbus session is null");
518         if (session->GetSessionId() < 0) {
519             DHLOGE("sink find session error, current sessionId is invalid");
520             return DCAMERA_BAD_VALUE;
521         }
522     }
523     DHLOGI("sink find session end, socket: %{public}d", socket);
524     return DCAMERA_OK;
525 }
526 
DCameraSoftBusGetSessionByPeerSocket(int32_t socket,std::shared_ptr<DCameraSoftbusSession> & session,PeerSocketInfo info)527 int32_t DCameraSoftbusAdapter::DCameraSoftBusGetSessionByPeerSocket(int32_t socket,
528     std::shared_ptr<DCameraSoftbusSession> &session, PeerSocketInfo info)
529 {
530     DHLOGI("find session by peer socket start, socket %{public}d", socket);
531     std::string mySessionName = "";
532     if (!ManageSelectChannel::GetInstance().GetSinkConnect()) {
533         std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
534         auto sessionNameIter = peerDevIdMySessionNameMap_.find(info.name);
535         if (sessionNameIter == peerDevIdMySessionNameMap_.end()) {
536             DHLOGE("find session by peer socket error, socket %{public}d", socket);
537             return DCAMERA_NOT_FOUND;
538         }
539         mySessionName = sessionNameIter->second;
540     } else {
541         std::lock_guard<std::mutex> autoLock(mySessionNamePeerDevIdLock_);
542         mySessionName = info.name;
543         ReplaceSuffix(mySessionName, "_receiver", "_sender");
544         auto sessionNameIter = mySessionNameMapV2_.find(mySessionName);
545         if (sessionNameIter == mySessionNameMapV2_.end()) {
546             DHLOGE("find session by peer socket error, socket %{public}d", socket);
547             return DCAMERA_NOT_FOUND;
548         }
549         mySessionName = sessionNameIter->second;
550         if (mySessionName.empty()) {
551             DHLOGE("find mySessionName is empty");
552             return DCAMERA_BAD_VALUE;
553         }
554     }
555     auto iter = sinkSessions_.find(mySessionName);
556     if (iter == sinkSessions_.end()) {
557         DHLOGE("find session by peer socket error, mySessionName %{public}s",
558             GetAnonyString(mySessionName).c_str());
559         return DCAMERA_NOT_FOUND;
560     }
561     session = iter->second;
562     {
563         std::lock_guard<std::mutex> autoLock(sinkSocketLock_);
564         sinkSocketSessionMap_[socket] = session;
565     }
566     DHLOGI("find session by peer socket end, socket %{public}d", socket);
567     return DCAMERA_OK;
568 }
569 
570 // sink
SinkOnBind(int32_t socket,PeerSocketInfo info)571 int32_t DCameraSoftbusAdapter::SinkOnBind(int32_t socket, PeerSocketInfo info)
572 {
573     DHLOGI("sink bind socket start, socket: %{public}d", socket);
574     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
575     int32_t ret = DCameraSoftBusGetSessionByPeerSocket(socket, session, info);
576     if (ret != DCAMERA_OK || session == nullptr) {
577         DHLOGE("sink bind socket error, can not find socket %{public}d", socket);
578         return DCAMERA_NOT_FOUND;
579     }
580     ret = session->OnSessionOpened(socket, info.networkId);
581     if (ret != DCAMERA_OK) {
582         DHLOGE("sink bind socket error, not find socket %{public}d", socket);
583     }
584     if (session->GetPeerSessionName().find("_control") != std::string::npos && DCameraAllConnectManager::IsInited()) {
585         ret =  DCameraAllConnectManager::GetInstance().RegisterLifecycleCallback();
586         if (ret == DCAMERA_OK) {
587             ret = DCameraAllConnectManager::GetInstance().PublishServiceState(info.networkId, SCM_CONNECTED);
588             if (ret != DCAMERA_OK) {
589                 DHLOGE("DCamera allconnect sink on bind, publish service state failed %{public}d", ret);
590             }
591         } else {
592             DHLOGE("DCamera allconnect sink on bind, InitDCameraAllConnectManager failed %{public}d", ret);
593         }
594 
595         DCameraAllConnectManager::SetSinkNetWorkId(info.networkId, socket);
596     }
597     DHLOGI("sink bind socket end, socket: %{public}d", socket);
598     return ret;
599 }
600 
SinkOnShutDown(int32_t socket,ShutdownReason reason)601 void DCameraSoftbusAdapter::SinkOnShutDown(int32_t socket, ShutdownReason reason)
602 {
603     DHLOGI("sink on shutdown socket start, socket: %{public}d", socket);
604     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
605     int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
606     if (ret != DCAMERA_OK || session == nullptr) {
607         DHLOGE("sink on shutdown socket can not find socket %{public}d", socket);
608         return;
609     }
610     session->OnSessionClose(socket);
611     if (session->GetPeerSessionName().find("_control") != std::string::npos && DCameraAllConnectManager::IsInited()) {
612         std::string devId = DCameraAllConnectManager::GetSinkDevIdBySocket(socket);
613         if (!devId.empty()) {
614             ret = DCameraAllConnectManager::GetInstance().PublishServiceState(devId, SCM_IDLE);
615             if (ret != DCAMERA_OK) {
616                 DHLOGE("DCamera allconnect sinkDown PublishServiceState failed, ret: %{public}d, devId: %{public}s ",
617                     ret, GetAnonyString(devId).c_str());
618             }
619 
620             ret = DCameraAllConnectManager::GetInstance().UnRegisterLifecycleCallback();
621             if (ret != DCAMERA_OK) {
622                 DHLOGE("DCamera allconnect sinkdown UnInitDCameraAllConn failed, ret: %{public}d, devId: %{public}s",
623                     ret, GetAnonyString(devId).c_str());
624             }
625         }
626         DCameraAllConnectManager::RemoveSinkNetworkId(socket);
627     }
628 
629     DHLOGI("sink on shutdown socket end, socket: %{public}d", socket);
630     return;
631 }
632 
SinkOnBytes(int32_t socket,const void * data,uint32_t dataLen)633 void DCameraSoftbusAdapter::SinkOnBytes(int32_t socket, const void *data, uint32_t dataLen)
634 {
635     if (dataLen == 0 || dataLen > DCAMERA_MAX_RECV_DATA_LEN || data == nullptr) {
636         DHLOGE("sink on bytes error, dataLen: %{public}d, socket: %{public}d", dataLen, socket);
637         return;
638     }
639     DHLOGI("sink on bytes start, socket: %{public}d", socket);
640     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
641     int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
642     if (ret != DCAMERA_OK || session == nullptr) {
643         DHLOGE("sink on bytes error, can not find session %{public}d", socket);
644         return;
645     }
646     std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(dataLen);
647     ret = memcpy_s(buffer->Data(), buffer->Capacity(), data, dataLen);
648     if (ret != EOK) {
649         DHLOGE("sink on bytes memcpy_s failed ret: %{public}d", ret);
650         return;
651     }
652     session->OnDataReceived(buffer);
653     DHLOGI("sink on bytes end, socket: %{public}d", socket);
654     return;
655 }
656 
SinkOnMessage(int32_t socket,const void * data,uint32_t dataLen)657 void DCameraSoftbusAdapter::SinkOnMessage(int32_t socket, const void *data, uint32_t dataLen)
658 {
659     return;
660 }
661 
SinkOnStream(int32_t socket,const StreamData * data,const StreamData * ext,const StreamFrameInfo * param)662 void DCameraSoftbusAdapter::SinkOnStream(int32_t socket, const StreamData *data, const StreamData *ext,
663     const StreamFrameInfo *param)
664 {
665     if (data == nullptr) {
666         DHLOGE("SinkOnStream error, data is null, socket: %{public}d.", socket);
667         return;
668     }
669     int32_t dataLen = data->bufLen;
670     if (dataLen <= 0 || dataLen > static_cast<int32_t>(DCAMERA_MAX_RECV_DATA_LEN)) {
671         DHLOGE("SinkOnStream error, dataLen: %{public}d socket: %{public}d", dataLen, socket);
672         return;
673     }
674     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
675     int32_t ret = DCameraSoftbusSinkGetSession(socket, session);
676     if (ret != DCAMERA_OK || session == nullptr) {
677         DHLOGE("SinkOnStream error, can not find socket %{public}d", socket);
678         return;
679     }
680 
681     std::shared_ptr<DataBuffer> buffer = std::make_shared<DataBuffer>(data->bufLen);
682     ret = memcpy_s(buffer->Data(), buffer->Capacity(), reinterpret_cast<uint8_t *>(data->buf), data->bufLen);
683     if (ret != EOK) {
684         DHLOGE("SinkOnStream error, memcpy_s failed ret: %{public}d", ret);
685         return;
686     }
687     session->OnDataReceived(buffer);
688     return;
689 }
690 
GetLocalNetworkId(std::string & myDevId)691 int32_t DCameraSoftbusAdapter::GetLocalNetworkId(std::string& myDevId)
692 {
693     NodeBasicInfo basicInfo = { { 0 } };
694     int32_t ret = GetLocalNodeDeviceInfo(PKG_NAME.c_str(), &basicInfo);
695     if (ret != DCAMERA_OK) {
696         DHLOGE("GetLocalNodeDeviceInfo failed ret: %{public}d", ret);
697         return ret;
698     }
699 
700     myDevId = std::string(basicInfo.networkId);
701     return DCAMERA_OK;
702 }
CloseSessionWithNetWorkId(const std::string & networkId)703 void DCameraSoftbusAdapter::CloseSessionWithNetWorkId(const std::string &networkId)
704 {
705     DHLOGI("DCamera allconnect CloseSessionWithNetworkId begin");
706     if (networkId.empty()) {
707         DHLOGE("DCamera allconnect peerNetworkId is empty");
708         return;
709     }
710     int32_t  sessionId = DCameraAllConnectManager::GetSinkSocketByNetWorkId(networkId);
711     std::shared_ptr<DCameraSoftbusSession> session = nullptr;
712     int32_t ret = DCAMERA_OK;
713     bool bSinkConflict = false;
714     if (sessionId != -1) {
715         ret = DCameraSoftbusSinkGetSession(sessionId, session);
716         bSinkConflict = true;
717     } else {
718         sessionId = DCameraAllConnectManager::GetSourceSocketByNetworkId(networkId);
719         if (sessionId != -1) {
720             ret = DCameraSoftbusSourceGetSession(sessionId, session);
721         } else {
722             DHLOGE("DCamera allconnect CloseSessionWithNetWorkId can not find socket");
723             return;
724         }
725     }
726     if (ret != DCAMERA_OK || session == nullptr) {
727         DHLOGE("DCamera allconnect CloseSessionWithNetWorkId can not find session %{public}d", sessionId);
728         return;
729     }
730     session->OnSessionClose(sessionId);
731     Shutdown(sessionId);
732     if (bSinkConflict) {
733         ret = DCameraAllConnectManager::GetInstance().PublishServiceState(networkId, SCM_IDLE);
734         if (ret != DCAMERA_OK) {
735             DHLOGE("DCamera allconnect CloseSessionWithNetworkId publish service state failed");
736         }
737         ret = DCameraAllConnectManager::GetInstance().UnRegisterLifecycleCallback();
738         if (ret != DCAMERA_OK) {
739             DHLOGE("DCamera allconnect CloseSessionWithNetworkId UnInitDCameraAllConnectManager failed");
740         }
741     }
742 }
743 
744 } // namespace DistributedHardware
745 } // namespace OHOS
746