diff --git a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h index 44d67ec1cbc0325613af70f4f0f932422b89fc87..efd2c765f34d51de6f5ecf406150a22cac561732 100644 --- a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h +++ b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h @@ -83,6 +83,7 @@ private: bool CheckPermission(); void ProcessFrameTrigger(const AppExecFwk::InnerEvent::Pointer &event); void ProcessPostAuthorization(const AppExecFwk::InnerEvent::Pointer &event); + int32_t CheckSensitive(); bool isInit_; int32_t sessionState_; diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp index 7b258cc97446e59e0ba91341cfd8c51b4debaa8a..4c174f9794a1d00f8aa15e79b95ed3d9ac6f4840 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp @@ -200,18 +200,12 @@ int32_t DCameraSinkController::GetCameraInfo(std::shared_ptr& camIn return DCAMERA_OK; } -int32_t DCameraSinkController::OpenChannel(std::shared_ptr& openInfo) +int32_t DCameraSinkController::CheckSensitive() { - DHLOGI("DCameraSinkController OpenChannel Start, dhId: %{public}s", GetAnonyString(dhId_).c_str()); - if (!CheckPermission()) { - DHLOGE("DCameraSinkController OpenChannel fail, CheckPermission fail"); - return DCAMERA_WRONG_STATE; - } - if (sessionState_ != DCAMERA_CHANNEL_STATE_DISCONNECTED) { - DHLOGE("wrong state, dhId: %{public}s, sessionState: %{public}d", GetAnonyString(dhId_).c_str(), sessionState_); - return DCAMERA_WRONG_STATE; + if (sinkCallback_ == nullptr) { + DHLOGE("check sensitive callback is nullptr."); + return DCAMERA_BAD_VALUE; } - srcDevId_ = openInfo->sourceDevId_; int32_t ret = sinkCallback_->OnNotifyResourceInfo(ResourceEventType::EVENT_TYPE_QUERY_RESOURCE, PAGE_SUBTYPE, srcDevId_, isSensitive_, isSameAccount_); CHECK_AND_RETURN_RET_LOG(ret != DCAMERA_OK, ret, "Query resource failed, ret: %{public}d", ret); @@ -230,6 +224,26 @@ int32_t DCameraSinkController::OpenChannel(std::shared_ptr& ope return DCAMERA_BAD_VALUE; } } + return DCAMERA_OK; +} + +int32_t DCameraSinkController::OpenChannel(std::shared_ptr& openInfo) +{ + DHLOGI("DCameraSinkController OpenChannel Start, dhId: %{public}s", GetAnonyString(dhId_).c_str()); + if (!CheckPermission()) { + DHLOGE("DCameraSinkController OpenChannel fail, CheckPermission fail"); + return DCAMERA_WRONG_STATE; + } + if (sessionState_ != DCAMERA_CHANNEL_STATE_DISCONNECTED) { + DHLOGE("wrong state, dhId: %{public}s, sessionState: %{public}d", GetAnonyString(dhId_).c_str(), sessionState_); + return DCAMERA_WRONG_STATE; + } + srcDevId_ = openInfo->sourceDevId_; + int32_t ret = CheckSensitive(); + if (ret != DCAMERA_OK) { + DHLOGE("Check sensitive error. ret %{public}d.", ret); + return ret; + } DCameraLowLatency::GetInstance().EnableLowLatency(); std::vector indexs; indexs.push_back(DCameraIndex(srcDevId_, dhId_)); diff --git a/services/channel/include/dcamera_softbus_adapter.h b/services/channel/include/dcamera_softbus_adapter.h index 90b6818664052fd87509b0965bac895d6ad95cfe..2af2bbd7eb84e9a70f7a89958f864e6f89752d14 100644 --- a/services/channel/include/dcamera_softbus_adapter.h +++ b/services/channel/include/dcamera_softbus_adapter.h @@ -64,11 +64,9 @@ public: const StreamFrameInfo *param); int32_t HandleSourceStreamExt(std::shared_ptr& buffer, const StreamData *ext); - int32_t GetSourceSocketId(); void RecordSourceSocketSession(int32_t socket, std::shared_ptr session); public: - std::map> sourceSessions_; std::map> sinkSessions_; private: @@ -79,7 +77,6 @@ private: PeerSocketInfo info); int32_t DCameraSoftbusSourceGetSession(int32_t socket, std::shared_ptr& session); int32_t DCameraSoftbusSinkGetSession(int32_t socket, std::shared_ptr& session); - int32_t DCameraSoftbusGetSessionById(int32_t socket, std::shared_ptr& session); private: std::mutex optLock_; @@ -89,8 +86,6 @@ private: std::map sessionTotal_; static const uint32_t DCAMERA_LINK_TYPE_MAX = 4; static const uint32_t DCAMERA_LINK_TYPE_INDEX_2 = 2; - std::mutex idMapLock_; - std::map> sessionIdMap_; int32_t sourceSocketId_ = -1; std::map sessionModeAndDataTypeMap_; diff --git a/services/channel/include/dcamera_softbus_session.h b/services/channel/include/dcamera_softbus_session.h index 429b9f7066e15926ae0f7a27e845e28249e349a9..13bdec34da0c3a146bf28ed63cf55bf41d35fe18 100644 --- a/services/channel/include/dcamera_softbus_session.h +++ b/services/channel/include/dcamera_softbus_session.h @@ -45,6 +45,9 @@ public: std::string GetPeerSessionName(); std::string GetMySessionName(); int32_t GetSessionId(); + int32_t CreateSocketServer(); + int32_t BindSocketServer(); + void ReleaseSession(); private: struct SessionDataHeader { diff --git a/services/channel/src/dcamera_channel_sink_impl.cpp b/services/channel/src/dcamera_channel_sink_impl.cpp index f90338ce9a2646f04485f623fbf7d72d740b8f04..6b277525aee41991dc1c6f61b92ace7b36362432 100644 --- a/services/channel/src/dcamera_channel_sink_impl.cpp +++ b/services/channel/src/dcamera_channel_sink_impl.cpp @@ -16,6 +16,7 @@ #include "dcamera_channel_sink_impl.h" #include "dcamera_softbus_adapter.h" +#include "dcamera_utils_tools.h" #include "anonymous_string.h" #include "distributed_camera_constants.h" @@ -59,24 +60,27 @@ int32_t DCameraChannelSinkImpl::CreateSession(std::vector& camInde DHLOGI("DCameraChannelSinkImpl session has already create %{public}s", sessionFlag.c_str()); return DCAMERA_OK; } + std::string myDevId; + int32_t ret = GetLocalDeviceNetworkId(myDevId); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraChannelSinkImpl get local device networkId error, ret%{public}d", ret); + return ret; + } camIndexs_.assign(camIndexs.begin(), camIndexs.end()); listener_ = listener; mySessionName_ = SESSION_HEAD + camIndexs[0].dhId_ + std::string("_") + sessionFlag; mode_ = sessionMode; - std::string myDevId; - DCameraSoftbusAdapter::GetInstance().GetLocalNetworkId(myDevId); std::string peerDevId = camIndexs[0].devId_; std::string peerSessionName = SESSION_HEAD + sessionFlag; DHLOGI("DCameraChannelSinkImpl CreateSession Listen Start, devId: %{public}s", GetAnonyString(myDevId).c_str()); // sink_server_listen - int32_t ret = DCameraSoftbusAdapter::GetInstance().CreatSoftBusSinkSocketServer(mySessionName_, - DCAMERA_CHANNLE_ROLE_SINK, sessionMode, peerDevId, peerSessionName); + softbusSession_ = std::make_shared(myDevId, mySessionName_, peerDevId, peerSessionName, + listener, sessionMode); + ret = softbusSession_->CreateSocketServer(); if (ret != DCAMERA_OK) { DHLOGE("DCameraChannelSinkImpl CreateSession Error, ret %{public}d", ret); return ret; } - softbusSession_ = std::make_shared(myDevId, mySessionName_, peerDevId, peerSessionName, - listener, sessionMode); DCameraSoftbusAdapter::GetInstance().sinkSessions_[mySessionName_] = softbusSession_; DHLOGI("DCameraChannelSinkImpl CreateSession Listen End, devId: %{public}s", GetAnonyString(myDevId).c_str()); return DCAMERA_OK; @@ -88,14 +92,10 @@ int32_t DCameraChannelSinkImpl::ReleaseSession() if (softbusSession_ == nullptr) { return DCAMERA_OK; } + softbusSession_->ReleaseSession(); DCameraSoftbusAdapter::GetInstance().sinkSessions_.erase(softbusSession_->GetMySessionName()); - int32_t ret = DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(softbusSession_->GetMySessionName()); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraChannelSinkImpl ReleaseSession %{public}s failed, ret: %{public}d", - GetAnonyString(mySessionName_).c_str(), ret); - } softbusSession_ = nullptr; - return ret; + return DCAMERA_OK; } int32_t DCameraChannelSinkImpl::SendData(std::shared_ptr& buffer) diff --git a/services/channel/src/dcamera_channel_source_impl.cpp b/services/channel/src/dcamera_channel_source_impl.cpp index 0a3eec3889969d40a0ebd59df05225f70d9dd166..4f955a1689148228db10303fb2c9127202aeec12 100644 --- a/services/channel/src/dcamera_channel_source_impl.cpp +++ b/services/channel/src/dcamera_channel_source_impl.cpp @@ -16,6 +16,7 @@ #include "dcamera_channel_source_impl.h" #include "dcamera_softbus_adapter.h" +#include "dcamera_utils_tools.h" #include "anonymous_string.h" #include "distributed_camera_constants.h" @@ -65,31 +66,31 @@ int32_t DCameraChannelSourceImpl::CreateSession(std::vector& camIn DHLOGI("DCameraChannelSourceImpl session has already create %{public}s", sessionFlag.c_str()); return DCAMERA_OK; } + std::string myDevId; + int32_t ret = GetLocalDeviceNetworkId(myDevId); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraChannelSourceImpl get local networkId error. ret %{public}d", ret); + return ret; + } camIndexs_.assign(camIndexs.begin(), camIndexs.end()); listener_ = listener; mySessionName_ = SESSION_HEAD + sessionFlag; mode_ = sessionMode; - std::string myDevId; - DCameraSoftbusAdapter::GetInstance().GetLocalNetworkId(myDevId); DHLOGI("DCameraChannelSourceImpl CreateSession Start, name: %{public}s devId: %{public}s", GetAnonyString(mySessionName_).c_str(), GetAnonyString(myDevId).c_str()); for (auto iter = camIndexs.begin(); iter != camIndexs.end(); iter++) { std::string peerDevId = (*iter).devId_; std::string peerSessionName = SESSION_HEAD + (*iter).dhId_ + std::string("_") + sessionFlag; // source_bind - int32_t ret = DCameraSoftbusAdapter::GetInstance().CreateSoftBusSourceSocketClient(myDevId, peerSessionName, - peerDevId, sessionMode, DCAMERA_CHANNLE_ROLE_SOURCE); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraChannelSourceImpl CreateSession failed, ret: %{public}d", ret); - return ret; - } - int32_t sourceSocket = DCameraSoftbusAdapter::GetInstance().GetSourceSocketId(); std::shared_ptr softbusSess = std::make_shared(myDevId, mySessionName_, peerDevId, peerSessionName, listener, sessionMode); - softbusSess->OnSessionOpened(sourceSocket); - DCameraSoftbusAdapter::GetInstance().RecordSourceSocketSession(sourceSocket, softbusSess); + int32_t socketId = softbusSess->BindSocketServer(); + if (socketId <= 0) { + DHLOGE("DCameraChannelSourceImpl Create Session failed. socketId: %{public}d.", socketId); + return DCAMERA_BAD_VALUE; + } + DCameraSoftbusAdapter::GetInstance().RecordSourceSocketSession(socketId, softbusSess); softbusSessions_.push_back(softbusSess); - DCameraSoftbusAdapter::GetInstance().sourceSessions_[peerDevId + peerSessionName] = softbusSess; } DHLOGI("DCameraChannelSourceImpl CreateSession End"); return DCAMERA_OK; @@ -102,16 +103,10 @@ int32_t DCameraChannelSourceImpl::ReleaseSession() if ((*iter) == nullptr) { continue; } - std::string sessKey = (*iter)->GetPeerDevId() + (*iter)->GetPeerSessionName(); - DCameraSoftbusAdapter::GetInstance().sourceSessions_.erase(sessKey); + (*iter)->ReleaseSession(); } std::vector>().swap(softbusSessions_); - int32_t ret = DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(mySessionName_); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraChannelSourceImpl ReleaseSession %{public}s failed, ret: %{public}d", - GetAnonyString(mySessionName_).c_str(), ret); - } - return ret; + return DCAMERA_OK; } int32_t DCameraChannelSourceImpl::SendData(std::shared_ptr& buffer) diff --git a/services/channel/src/dcamera_softbus_adapter.cpp b/services/channel/src/dcamera_softbus_adapter.cpp index 59d499d79f47e9c37b59d42df1bae9f01fd56b73..e84d04fa2343a654b4894067eac470325de1bf9f 100644 --- a/services/channel/src/dcamera_softbus_adapter.cpp +++ b/services/channel/src/dcamera_softbus_adapter.cpp @@ -196,7 +196,7 @@ int32_t DCameraSoftbusAdapter::CreateSoftBusSourceSocketClient(std::string myDev sourceSocketId_ = socketId; DHLOGI("create socket client end, myDevId: %{public}s, peerSessionName: %{public}s", GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str()); - return DCAMERA_OK; + return socketId; } int32_t DCameraSoftbusAdapter::DestroySoftbusSessionServer(std::string sessionName) @@ -221,10 +221,6 @@ int32_t DCameraSoftbusAdapter::CloseSoftbusSession(int32_t socket) { DHLOGI("Shutdown softbus socket start: %{public}d", socket); Shutdown(socket); // shutdown socket - { - std::lock_guard autoLock(idMapLock_); - sessionIdMap_.erase(socket); - } { std::lock_guard autoLock(sinkSocketLock_); sinkSocketSessionMap_.erase(socket); @@ -286,20 +282,6 @@ int32_t DCameraSoftbusAdapter::SendSofbusStream(int32_t socket, std::shared_ptr< return DCAMERA_OK; } -int32_t DCameraSoftbusAdapter::DCameraSoftbusGetSessionById(int32_t sessionId, - std::shared_ptr& session) -{ - DHLOGI("get softbus session by sessionId: %{public}d", sessionId); - std::lock_guard autoLock(idMapLock_); - auto iter = sessionIdMap_.find(sessionId); - if (iter == sessionIdMap_.end()) { - DHLOGE("get softbus session by id not find session %{public}d", sessionId); - return DCAMERA_NOT_FOUND; - } - session = iter->second; - return DCAMERA_OK; -} - int32_t DCameraSoftbusAdapter::DCameraSoftbusSourceGetSession(int32_t socket, std::shared_ptr& session) { @@ -326,9 +308,6 @@ int32_t DCameraSoftbusAdapter::SourceOnBind(int32_t socket, PeerSocketInfo info) ret = session->OnSessionOpened(socket); if (ret != DCAMERA_OK) { DHLOGE("source bind socket failed, ret: %{public}d socket: %{public}d", ret, socket); - } else { - std::lock_guard autoLock(idMapLock_); - sessionIdMap_.emplace(socket, session); } DHLOGI("source bind socket end, socket: %{public}d end", socket); return ret; @@ -338,15 +317,11 @@ void DCameraSoftbusAdapter::SourceOnShutDown(int32_t socket, ShutdownReason reas { DHLOGI("source on shutdown socket start, socket: %{public}d", socket); std::shared_ptr session = nullptr; - int32_t ret = DCameraSoftbusGetSessionById(socket, session); + int32_t ret = DCameraSoftbusSourceGetSession(socket, session); if (ret != DCAMERA_OK || session == nullptr) { DHLOGE("SourceOnShutDown can not find socket %{public}d", socket); return; } - { - std::lock_guard autoLock(idMapLock_); - sessionIdMap_.erase(socket); - } session->OnSessionClose(socket); DHLOGI("source on shutdown socket end socket: %{public}d end", socket); return; @@ -456,11 +431,6 @@ int32_t DCameraSoftbusAdapter::HandleSourceStreamExt(std::shared_ptr return DCAMERA_OK; } -int32_t DCameraSoftbusAdapter::GetSourceSocketId() -{ - return sourceSocketId_; -} - void DCameraSoftbusAdapter::RecordSourceSocketSession(int32_t socket, std::shared_ptr session) { if (session == nullptr) { @@ -537,9 +507,6 @@ int32_t DCameraSoftbusAdapter::SinkOnBind(int32_t socket, PeerSocketInfo info) ret = session->OnSessionOpened(socket); if (ret != DCAMERA_OK) { DHLOGE("sink bind socket error, not find socket %{public}d", socket); - } else { - std::lock_guard autoLock(idMapLock_); - sessionIdMap_.emplace(socket, session); } DHLOGI("sink bind socket end, socket: %{public}d", socket); return ret; @@ -549,15 +516,11 @@ void DCameraSoftbusAdapter::SinkOnShutDown(int32_t socket, ShutdownReason reason { DHLOGI("sink on shutdown socket start, socket: %{public}d", socket); std::shared_ptr session = nullptr; - int32_t ret = DCameraSoftbusGetSessionById(socket, session); + int32_t ret = DCameraSoftbusSinkGetSession(socket, session); if (ret != DCAMERA_OK || session == nullptr) { DHLOGE("sink on shutdown socket can not find socket %{public}d", socket); return; } - { - std::lock_guard autoLock(idMapLock_); - sessionIdMap_.erase(socket); - } session->OnSessionClose(socket); DHLOGI("sink on shutdown socket end, socket: %{public}d", socket); return; diff --git a/services/channel/src/dcamera_softbus_session.cpp b/services/channel/src/dcamera_softbus_session.cpp index 5b492f84367fd2c4b937465e5cc84411cf3ac0a7..ea26196669a08cb48d6dec1405bab2c8a18b03b5 100644 --- a/services/channel/src/dcamera_softbus_session.cpp +++ b/services/channel/src/dcamera_softbus_session.cpp @@ -323,6 +323,34 @@ int32_t DCameraSoftbusSession::SendData(DCameraSessionMode mode, std::shared_ptr return DCAMERA_NOT_FOUND; } +int32_t DCameraSoftbusSession::CreateSocketServer() +{ + int32_t ret = DCameraSoftbusAdapter::GetInstance().CreatSoftBusSinkSocketServer(mySessionName_, + DCAMERA_CHANNLE_ROLE_SINK, mode_, peerDevId_, peerSessionName_); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSoftbusSession CreateSocketServer Error, ret %{public}d", ret); + return ret; + } + return DCAMERA_OK; +} + +int32_t DCameraSoftbusSession::BindSocketServer() +{ + int32_t socketId = DCameraSoftbusAdapter::GetInstance().CreateSoftBusSourceSocketClient(myDevId_, peerSessionName_, + peerDevId_, mode_, DCAMERA_CHANNLE_ROLE_SOURCE); + if (socketId <= 0) { + DHLOGE("DCameraSoftbusSession BindSocketServer Error, socketId %{public}d", socketId); + return socketId; + } + OnSessionOpened(socketId); + return socketId; +} + +void DCameraSoftbusSession::ReleaseSession() +{ + DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(mySessionName_); +} + int32_t DCameraSoftbusSession::UnPackSendData(std::shared_ptr& buffer, DCameraSendFuc memberFunc) { CHECK_AND_RETURN_RET_LOG(buffer == nullptr, DCAMERA_BAD_VALUE, "Data buffer is null"); diff --git a/services/channel/test/unittest/common/channel/dcamera_softbus_adapter_test.cpp b/services/channel/test/unittest/common/channel/dcamera_softbus_adapter_test.cpp index 5047e4b9ae6db9837ed10a3b794d4c5966cb5598..46785afdb9f85b175a43e4d410be4554d9e12d14 100644 --- a/services/channel/test/unittest/common/channel/dcamera_softbus_adapter_test.cpp +++ b/services/channel/test/unittest/common/channel/dcamera_softbus_adapter_test.cpp @@ -230,7 +230,6 @@ HWTEST_F(DCameraSoftbusAdapterTest, dcamera_softbus_adapter_test_008, TestSize.L .dataType = TransDataType::DATA_TYPE_VIDEO_STREAM, }; std::shared_ptr session = std::make_shared(); - DCameraSoftbusAdapter::GetInstance().sourceSessions_.emplace(peerDevId + mySessName, session); ret = DCameraSoftbusAdapter::GetInstance().SourceOnBind(sessionId, info); DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(sessionName); EXPECT_EQ(DCAMERA_NOT_FOUND, ret); @@ -643,7 +642,6 @@ HWTEST_F(DCameraSoftbusAdapterTest, dcamera_softbus_adapter_test_020, TestSize.L }; std::shared_ptr session = std::make_shared(); ret = DCameraSoftbusAdapter::GetInstance().SinkOnBind(sessionId, info); - ret = DCameraSoftbusAdapter::GetInstance().DCameraSoftbusGetSessionById(sessionId, session); DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(sessionName); EXPECT_EQ(DCAMERA_NOT_FOUND, ret); @@ -675,7 +673,6 @@ HWTEST_F(DCameraSoftbusAdapterTest, dcamera_softbus_adapter_test_023, TestSize.L }; std::shared_ptr session = std::make_shared(); ret = DCameraSoftbusAdapter::GetInstance().SinkOnBind(sessionId, info); - ret = DCameraSoftbusAdapter::GetInstance().DCameraSoftbusGetSessionById(sessionId, session); DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(sessionName); EXPECT_EQ(DCAMERA_NOT_FOUND, ret); @@ -713,7 +710,6 @@ HWTEST_F(DCameraSoftbusAdapterTest, dcamera_softbus_adapter_test_027, TestSize.L ret = DCameraSoftbusAdapter::GetInstance().DCameraSoftbusSourceGetSession(sessionId, session); EXPECT_EQ(DCAMERA_NOT_FOUND, ret); sessionId = 2; - DCameraSoftbusAdapter::GetInstance().sourceSessions_.clear(); DCameraSoftbusAdapter::GetInstance().DestroySoftbusSessionServer(sessionName); EXPECT_EQ(DCAMERA_NOT_FOUND, ret); }