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, ¶m);
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