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