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