From cba4e4b379d805f1d37e0ebb74804cd34031b083 Mon Sep 17 00:00:00 2001 From: chen0088 Date: Wed, 9 Oct 2024 15:47:01 +0800 Subject: [PATCH] modify rpc Signed-off-by: chen0088 --- .../constants/distributed_camera_constants.h | 10 + common/include/utils/dcamera_utils_tools.h | 15 +- common/src/utils/dcamera_utils_tools.cpp | 21 ++ .../client/test/sample/BUILD.gn | 1 + .../dcamera_sink_controller.h | 3 +- ...dcamera_sink_controller_channel_listener.h | 4 +- .../dcamera_sink_output_channel_listener.h | 4 +- .../dcamera_sink_controller.cpp | 172 ++++++++--- ...amera_sink_controller_channel_listener.cpp | 6 +- .../dcamera_sink_output_channel_listener.cpp | 4 +- .../distributed_camera_sink_service_test.cpp | 16 +- .../dcamera_sink_controller_test.cpp | 12 +- .../dcamera_source_controller.h | 4 +- ...amera_source_controller_channel_listener.h | 4 +- .../dcamera_source_input_channel_listener.h | 4 +- .../dcamera_source_dev.cpp | 3 + .../dcamera_source_controller.cpp | 268 +++++++++++------- ...era_source_controller_channel_listener.cpp | 6 +- .../dcamera_source_input_channel_listener.cpp | 4 +- .../dcamera_source_controller_test.cpp | 6 +- .../include/dcamera_channel_sink_impl.h | 3 +- .../include/dcamera_channel_source_impl.h | 3 +- .../channel/include/dcamera_softbus_adapter.h | 7 +- .../channel/include/dcamera_softbus_session.h | 4 +- .../include/icamera_channel_listener.h | 4 +- .../channel/src/dcamera_channel_sink_impl.cpp | 12 +- .../src/dcamera_channel_source_impl.cpp | 2 +- .../channel/src/dcamera_softbus_adapter.cpp | 114 ++++++-- .../channel/src/dcamera_softbus_session.cpp | 8 +- .../dcamera_channel_sink_impl_test.cpp | 4 +- .../channel/dcamera_softbus_session_test.cpp | 4 +- 31 files changed, 483 insertions(+), 249 deletions(-) diff --git a/common/include/constants/distributed_camera_constants.h b/common/include/constants/distributed_camera_constants.h index ca57b9f6..6ecdd4c9 100644 --- a/common/include/constants/distributed_camera_constants.h +++ b/common/include/constants/distributed_camera_constants.h @@ -83,6 +83,15 @@ const uint32_t DCAMERA_MAX_RECV_DATA_LEN = 104857600; const uint16_t DCAMERA_MAX_RECV_EXT_LEN = 65535; const uint32_t DISTRIBUTED_HARDWARE_CAMERA_SOURCE_SA_ID = 4803; const uint32_t DISTRIBUTED_HARDWARE_CAMERA_SINK_SA_ID = 4804; +const std::string SESSION_HEAD = "ohos.dhardware.dcamera_"; +const std::string DEVICE_ID_0 = "device/0"; +const std::string DEVICE_ID_1 = "device/1"; +const std::string SENDER_SESSION_NAME_CONTROL = "_control_sender"; +const std::string SENDER_SESSION_NAME_DATA_SNAPSHOT = "_dataSnapshot_sender"; +const std::string SENDER_SESSION_NAME_DATA_CONTINUE = "_dataContinue_sender"; +const std::string RECEIVER_SESSION_NAME_CONTROL = "_control_receiver"; +const std::string RECEIVER_SESSION_NAME_DATA_SNAPSHOT = "_dataSnapshot_receiver"; +const std::string RECEIVER_SESSION_NAME_DATA_CONTINUE = "_dataContinue_receiver"; const std::string DCAMERA_PKG_NAME = "ohos.dhardware.dcamera"; const std::string SNAP_SHOT_SESSION_FLAG = "dataSnapshot"; const std::string CONTINUE_SESSION_FLAG = "dataContinue"; @@ -161,6 +170,7 @@ const std::string SINK_PHOTO = "_SinkPhoto.jpg"; const std::string AFTER_ENCODE = "SinkAfterEncode.h265"; const std::string BEFORE_DECODE = "SourceBeforeDecode.h265"; const std::string CAMERA_HICOLLIE = "CameraHicollie"; +const std::string SEPARATE_SINK_VERSION = "2.0"; } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DISTRIBUTED_CAMERA_CONSTANTS_H \ No newline at end of file diff --git a/common/include/utils/dcamera_utils_tools.h b/common/include/utils/dcamera_utils_tools.h index 5c61fb2f..8bede3cf 100644 --- a/common/include/utils/dcamera_utils_tools.h +++ b/common/include/utils/dcamera_utils_tools.h @@ -21,10 +21,10 @@ #include #include #include +#include "single_instance.h" #ifdef DCAMERA_MMAP_RESERVE #include "image_converter.h" -#include "single_instance.h" #endif namespace OHOS { @@ -75,6 +75,19 @@ private: static FILE *OpenDumpFileInner(std::string para, std::string fileName); static void ChangeDumpFileState(std::string para, FILE **dumpFile, std::string fileName); }; + +class ManageSelectChannel { +DECLARE_SINGLE_INSTANCE(ManageSelectChannel); + +public: + void SetSrcConnect(bool isSoftbusConnect); + void SetSinkConnect(bool isSoftbusConnect); + bool GetSrcConnect(); + bool GetSinkConnect(); +private: + bool isSoftbusConnectSource_ = false; + bool isSoftbusConnectSink_ = false; +}; } // namespace DistributedHardware } // namespace OHOS #endif // OHOS_DCAMERA_UTILS_TOOL_H diff --git a/common/src/utils/dcamera_utils_tools.cpp b/common/src/utils/dcamera_utils_tools.cpp index f26f140d..8d21d2d0 100644 --- a/common/src/utils/dcamera_utils_tools.cpp +++ b/common/src/utils/dcamera_utils_tools.cpp @@ -381,5 +381,26 @@ void DumpFileUtil::OpenDumpFile(std::string para, std::string fileName, FILE **f *file = DumpFileUtil::OpenDumpFileInner(para, fileName); } } + +IMPLEMENT_SINGLE_INSTANCE(ManageSelectChannel); +void ManageSelectChannel::SetSrcConnect(bool isSoftbusConnect) +{ + isSoftbusConnectSource_ = isSoftbusConnect; +} + +void ManageSelectChannel::SetSinkConnect(bool isSoftbusConnect) +{ + isSoftbusConnectSink_ = isSoftbusConnect; +} + +bool ManageSelectChannel::GetSrcConnect() +{ + return isSoftbusConnectSource_; +} + +bool ManageSelectChannel::GetSinkConnect() +{ + return isSoftbusConnectSink_; +} } // namespace DistributedHardware } // namespace OHOS diff --git a/services/cameraservice/cameraoperator/client/test/sample/BUILD.gn b/services/cameraservice/cameraoperator/client/test/sample/BUILD.gn index 0f4b8587..75e9f613 100644 --- a/services/cameraservice/cameraoperator/client/test/sample/BUILD.gn +++ b/services/cameraservice/cameraoperator/client/test/sample/BUILD.gn @@ -64,6 +64,7 @@ ohos_executable("dcamera_client_demo") { "cJSON:cjson", "c_utils:utils", "camera_framework:camera_framework", + "distributed_hardware_fwk:distributedhardwareutils", "drivers_interface_camera:metadata", "drivers_interface_distributed_camera:libdistributed_camera_provider_proxy_1.1", "drivers_peripheral_display:hdi_gralloc_client", diff --git a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h index efd2c765..e053ae9d 100644 --- a/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h +++ b/services/cameraservice/sinkservice/include/distributedcameramgr/dcamera_sink_controller.h @@ -57,7 +57,7 @@ public: void OnStateChanged(std::shared_ptr& event); void OnMetadataResult(std::vector>& settings); - void OnSessionState(int32_t state); + void OnSessionState(int32_t state, std::string networkId); void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail); void OnDataReceived(std::vector>& buffers); @@ -83,6 +83,7 @@ private: bool CheckPermission(); void ProcessFrameTrigger(const AppExecFwk::InnerEvent::Pointer &event); void ProcessPostAuthorization(const AppExecFwk::InnerEvent::Pointer &event); + int32_t CreateCtrlSession(); int32_t CheckSensitive(); bool isInit_; diff --git a/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.h b/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.h index 18c8f33a..55ebaa62 100644 --- a/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.h +++ b/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -27,7 +27,7 @@ public: explicit DCameraSinkControllerChannelListener(std::shared_ptr& controller); ~DCameraSinkControllerChannelListener() override = default; - void OnSessionState(int32_t state) override; + void OnSessionState(int32_t state, std::string networkId) override; void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) override; void OnDataReceived(std::vector>& buffers) override; diff --git a/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_output_channel_listener.h b/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_output_channel_listener.h index c390a457..48f2ced9 100644 --- a/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_output_channel_listener.h +++ b/services/cameraservice/sinkservice/include/distributedcameramgr/listener/dcamera_sink_output_channel_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -27,7 +27,7 @@ public: DCameraSinkOutputChannelListener(DCStreamType type, std::shared_ptr& output); ~DCameraSinkOutputChannelListener() override = default; - void OnSessionState(int32_t state) override; + void OnSessionState(int32_t state, std::string networkId) override; void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) override; void OnDataReceived(std::vector>& buffers) override; diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp index bf0f0d14..33ffeda2 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/dcamera_sink_controller.cpp @@ -135,16 +135,7 @@ int32_t DCameraSinkController::ChannelNeg(std::shared_ptr& i int32_t DCameraSinkController::DCameraNotify(std::shared_ptr& events) { DHLOGI("DCameraNotify dhId: %{public}s", GetAnonyString(dhId_).c_str()); - if (srcDevId_.empty()) { - DHLOGE("source deviceId is empty"); - return DCAMERA_BAD_VALUE; - } - - sptr sourceSA = DCameraSinkServiceIpc::GetInstance().GetSourceRemoteCamSrv(srcDevId_); - if (sourceSA == nullptr) { - DHLOGE("sourceSA is null"); - return DCAMERA_BAD_VALUE; - } + CHECK_AND_RETURN_RET_LOG(srcDevId_.empty(), DCAMERA_BAD_VALUE, "source deviceId is empty"); DCameraEventCmd eventCmd; std::string jsonStr = ""; @@ -159,20 +150,35 @@ int32_t DCameraSinkController::DCameraNotify(std::shared_ptr& even return ret; } - std::string sinkDevId; - ret = GetLocalDeviceNetworkId(sinkDevId); - if (ret != DCAMERA_OK) { - DHLOGE("GetLocalDeviceNetworkId failed, devId: %{public}s, dhId: %{public}s, ret: %{public}d", - GetAnonyString(sinkDevId).c_str(), GetAnonyString(dhId_).c_str(), ret); - return ret; - } + if (ManageSelectChannel::GetInstance().GetSinkConnect()) { + std::shared_ptr buffer = std::make_shared(jsonStr.length() + 1); + ret = memcpy_s(buffer->Data(), buffer->Capacity(), + reinterpret_cast(const_cast(jsonStr.c_str())), jsonStr.length()); + CHECK_AND_RETURN_RET_LOG(ret != EOK, DCAMERA_BAD_VALUE, "DCameraNotify memcpy_s failed, ret: %{public}d", ret); + ret = channel_->SendData(buffer); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraNotify channel send data failed, dhId: %{public}s ret: %{public}d", + GetAnonyString(dhId_).c_str(), ret); + return DCAMERA_BAD_VALUE; + } + } else { + std::string sinkDevId; + ret = GetLocalDeviceNetworkId(sinkDevId); + if (ret != DCAMERA_OK) { + DHLOGE("GetLocalDeviceNetworkId failed, devId: %{public}s, dhId: %{public}s, ret: %{public}d", + GetAnonyString(sinkDevId).c_str(), GetAnonyString(dhId_).c_str(), ret); + return ret; + } - ret = sourceSA->DCameraNotify(sinkDevId, dhId_, jsonStr); - if (ret != DCAMERA_OK) { - DHLOGE("SourceSA notify failed, srcId: %{public}s, sinkId: %{public}s, dhId: %{public}s, ret: %{public}d", - GetAnonyString(srcDevId_).c_str(), GetAnonyString(sinkDevId).c_str(), - GetAnonyString(dhId_).c_str(), ret); - return ret; + sptr sourceSA = DCameraSinkServiceIpc::GetInstance().GetSourceRemoteCamSrv(srcDevId_); + CHECK_AND_RETURN_RET_LOG(sourceSA == nullptr, DCAMERA_BAD_VALUE, "sourceSA is null"); + ret = sourceSA->DCameraNotify(sinkDevId, dhId_, jsonStr); + if (ret != DCAMERA_OK) { + DHLOGE("SourceSA notify failed, srcId: %{public}s, sinkId: %{public}s, dhId: %{public}s, ret: %{public}d", + GetAnonyString(srcDevId_).c_str(), GetAnonyString(sinkDevId).c_str(), + GetAnonyString(dhId_).c_str(), ret); + return ret; + } } DHLOGI("DCameraNotify %{public}s success", GetAnonyString(dhId_).c_str()); @@ -233,6 +239,7 @@ int32_t DCameraSinkController::CheckSensitive() int32_t DCameraSinkController::OpenChannel(std::shared_ptr& openInfo) { DHLOGI("DCameraSinkController OpenChannel Start, dhId: %{public}s", GetAnonyString(dhId_).c_str()); + ManageSelectChannel::GetInstance().SetSinkConnect(false); if (!CheckPermission()) { DHLOGE("DCameraSinkController OpenChannel fail, CheckPermission fail"); return DCAMERA_WRONG_STATE; @@ -244,10 +251,9 @@ int32_t DCameraSinkController::OpenChannel(std::shared_ptr& ope srcDevId_ = openInfo->sourceDevId_; int32_t ret = CheckSensitive(); if (ret != DCAMERA_OK) { - DHLOGE("Check sensitive error. ret %{public}d.", ret); + DHLOGE("check sensitive error, ret %{public}d", ret); return ret; } - DCameraLowLatency::GetInstance().EnableLowLatency(); std::vector indexs; indexs.push_back(DCameraIndex(srcDevId_, dhId_)); auto controller = std::shared_ptr(shared_from_this()); @@ -284,34 +290,37 @@ int32_t DCameraSinkController::CloseChannel() { DHLOGI("DCameraSinkController CloseChannel Start, dhId: %{public}s", GetAnonyString(dhId_).c_str()); std::lock_guard autoLock(channelLock_); - DCameraLowLatency::GetInstance().DisableLowLatency(); - DCameraSinkServiceIpc::GetInstance().DeleteSourceRemoteCamSrv(srcDevId_); - srcDevId_.clear(); - if (channel_ == nullptr) { - return DCAMERA_BAD_VALUE; - } - int32_t ret = channel_->ReleaseSession(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSinkController release channel failed, dhId: %{public}s, ret: %{public}d", - GetAnonyString(dhId_).c_str(), ret); - } + if (!ManageSelectChannel::GetInstance().GetSinkConnect()) { + DCameraSinkServiceIpc::GetInstance().DeleteSourceRemoteCamSrv(srcDevId_); + if (channel_ == nullptr) { + DHLOGE("DCameraSinkController CloseChannel channel_ is nullptr"); + return DCAMERA_BAD_VALUE; + } + int32_t ret = channel_->ReleaseSession(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController release channel failed, dhId: %{public}s, ret: %{public}d", + GetAnonyString(dhId_).c_str(), ret); + } - ret = output_->CloseChannel(); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSinkController CloseChannel failed, dhId: %{public}s, ret: %{public}d", - GetAnonyString(dhId_).c_str(), ret); + ret = output_->CloseChannel(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController CloseChannel failed, dhId: %{public}s, ret: %{public}d", + GetAnonyString(dhId_).c_str(), ret); + } } + srcDevId_.clear(); sessionState_ = DCAMERA_CHANNEL_STATE_DISCONNECTED; if (isPageStatus_.load()) { bool isSensitive = false; bool isSameAccout = false; - ret = sinkCallback_->OnNotifyResourceInfo(ResourceEventType::EVENT_TYPE_CLOSE_PAGE, PAGE_SUBTYPE, srcDevId_, - isSensitive, isSameAccout); + int32_t ret = sinkCallback_->OnNotifyResourceInfo(ResourceEventType::EVENT_TYPE_CLOSE_PAGE, PAGE_SUBTYPE, + srcDevId_, isSensitive, isSameAccout); if (ret != DCAMERA_OK) { DHLOGE("close page failed, ret: %{public}d", ret); } } isPageStatus_.store(false); + ManageSelectChannel::GetInstance().SetSinkConnect(false); DHLOGI("DCameraSinkController CloseChannel %{public}s success", GetAnonyString(dhId_).c_str()); return DCAMERA_OK; } @@ -343,10 +352,49 @@ int32_t DCameraSinkController::Init(std::vector& indexs) std::make_shared(runner, shared_from_this()); isInit_ = true; initCallback_ = std::make_shared(); + ManageSelectChannel::GetInstance().SetSinkConnect(true); + ret = CreateCtrlSession(); + if (ret != DCAMERA_OK) { + DHLOGE("CreateCtrlSessiion init failed, dhId: %{public}s, ret: %{public}d", GetAnonyString(dhId_).c_str(), ret); + return ret; + } + std::shared_ptr info = std::make_shared(); + info->sourceDevId_ = ""; + DCameraChannelDetail continueChInfo(CONTINUE_SESSION_FLAG, CONTINUOUS_FRAME); + DCameraChannelDetail snapShotChInfo(SNAP_SHOT_SESSION_FLAG, SNAPSHOT_FRAME); + info->detail_.push_back(continueChInfo); + info->detail_.push_back(snapShotChInfo); + ret = ChannelNeg(info); + if (ret != DCAMERA_OK) { + DHLOGE("ChannelNeg init failed, dhId: %{public}s, ret: %{public}d", GetAnonyString(dhId_).c_str(), ret); + return ret; + } DHLOGI("DCameraSinkController Init %{public}s success", GetAnonyString(dhId_).c_str()); return DCAMERA_OK; } +int32_t DCameraSinkController::CreateCtrlSession() +{ + DHLOGI("DCameraSinkController CreateCtrlSessiion Start, dhId: %{public}s", GetAnonyString(dhId_).c_str()); + if (sessionState_ != DCAMERA_CHANNEL_STATE_DISCONNECTED) { + DHLOGE("wrong state, dhId: %{public}s, sessionState: %{public}d", GetAnonyString(dhId_).c_str(), sessionState_); + return DCAMERA_WRONG_STATE; + } + DCameraLowLatency::GetInstance().EnableLowLatency(); + std::vector indexs; + indexs.push_back(DCameraIndex("", dhId_)); + auto controller = std::shared_ptr(shared_from_this()); + std::shared_ptr listener = + std::make_shared(controller); + int32_t ret = channel_->CreateSession(indexs, SESSION_FLAG, DCAMERA_SESSION_MODE_CTRL, listener); + if (ret != DCAMERA_OK) { + DHLOGE("channel create session failed, dhId: %{public}s, ret: %{public}d", GetAnonyString(dhId_).c_str(), ret); + return ret; + } + DHLOGI("DCameraSinkController CreateCtrlSessiion %{public}s success", GetAnonyString(dhId_).c_str()); + return DCAMERA_OK; +} + int32_t DCameraSinkController::UnInit() { DHLOGI("DCameraSinkController UnInit dhId: %{public}s", GetAnonyString(dhId_).c_str()); @@ -363,6 +411,24 @@ int32_t DCameraSinkController::UnInit() GetAnonyString(dhId_).c_str(), ret); } + DCameraLowLatency::GetInstance().DisableLowLatency(); + if (ManageSelectChannel::GetInstance().GetSinkConnect()) { + if (channel_ != nullptr) { + ret = channel_->ReleaseSession(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController release channel failed, dhId: %{public}s, ret: %{public}d", + GetAnonyString(dhId_).c_str(), ret); + } + } + if (output_ != nullptr) { + ret = output_->CloseChannel(); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSinkController output CloseChannel failed, dhId: %{public}s, ret: %{public}d", + GetAnonyString(dhId_).c_str(), ret); + } + } + } + if (output_ != nullptr) { ret = output_->UnInit(); if (ret != DCAMERA_OK) { @@ -475,7 +541,7 @@ void DCameraSinkController::OnMetadataResult(std::vector& d cJSON_Delete(rootValue); if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_CAPTURE) == 0)) { DCameraCaptureInfoCmd captureInfoCmd; - int ret = captureInfoCmd.Unmarshal(jsonStr); + int32_t ret = captureInfoCmd.Unmarshal(jsonStr); if (ret != DCAMERA_OK) { DHLOGE("Capture Info Unmarshal failed, dhId: %{public}s ret: %{public}d", GetAnonyString(dhId_).c_str(), ret); @@ -612,13 +690,15 @@ int32_t DCameraSinkController::HandleReceivedData(std::shared_ptr& d return StartCapture(captureInfoCmd.value_, sceneMode_); } else if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_UPDATE_METADATA) == 0)) { DCameraMetadataSettingCmd metadataSettingCmd; - int ret = metadataSettingCmd.Unmarshal(jsonStr); + int32_t ret = metadataSettingCmd.Unmarshal(jsonStr); if (ret != DCAMERA_OK) { DHLOGE("Metadata Setting Unmarshal failed, dhId: %{public}s ret: %{public}d", GetAnonyString(dhId_).c_str(), ret); return ret; } return UpdateSettings(metadataSettingCmd.value_); + } else if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_STOP_CAPTURE) == 0)) { + return StopCapture(); } return DCAMERA_BAD_VALUE; } diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.cpp index 4203ca53..30fd3d73 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_controller_channel_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,14 +24,14 @@ DCameraSinkControllerChannelListener::DCameraSinkControllerChannelListener( { } -void DCameraSinkControllerChannelListener::OnSessionState(int32_t state) +void DCameraSinkControllerChannelListener::OnSessionState(int32_t state, std::string networkId) { std::shared_ptr controller = controller_.lock(); if (controller == nullptr) { DHLOGE("DCameraSinkControllerChannelListener::OnSessionState controller is null"); return; } - controller->OnSessionState(state); + controller->OnSessionState(state, networkId); } void DCameraSinkControllerChannelListener::OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) diff --git a/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_output_channel_listener.cpp b/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_output_channel_listener.cpp index d2649c20..0ada4dc0 100644 --- a/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_output_channel_listener.cpp +++ b/services/cameraservice/sinkservice/src/distributedcameramgr/listener/dcamera_sink_output_channel_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -24,7 +24,7 @@ DCameraSinkOutputChannelListener::DCameraSinkOutputChannelListener( { } -void DCameraSinkOutputChannelListener::OnSessionState(int32_t state) +void DCameraSinkOutputChannelListener::OnSessionState(int32_t state, std::string networkId) { std::shared_ptr output = output_.lock(); if (output == nullptr) { diff --git a/services/cameraservice/sinkservice/test/unittest/common/distributedcamera/distributed_camera_sink_service_test.cpp b/services/cameraservice/sinkservice/test/unittest/common/distributedcamera/distributed_camera_sink_service_test.cpp index bcf0efe0..7421f152 100644 --- a/services/cameraservice/sinkservice/test/unittest/common/distributedcamera/distributed_camera_sink_service_test.cpp +++ b/services/cameraservice/sinkservice/test/unittest/common/distributedcamera/distributed_camera_sink_service_test.cpp @@ -96,7 +96,7 @@ HWTEST_F(DistributedCameraSinkServiceTest, dcamera_sink_service_test_001, TestSi EXPECT_EQ(sinkService_ == nullptr, false); int32_t ret = sinkService_->SubscribeLocalHardware(g_dhId, g_testParams); - EXPECT_EQ(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); } /** @@ -111,7 +111,7 @@ HWTEST_F(DistributedCameraSinkServiceTest, dcamera_sink_service_test_002, TestSi EXPECT_EQ(sinkService_ == nullptr, false); int32_t ret = sinkService_->UnsubscribeLocalHardware(g_dhId); - EXPECT_EQ(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); } /** @@ -126,7 +126,7 @@ HWTEST_F(DistributedCameraSinkServiceTest, dcamera_sink_service_test_003, TestSi EXPECT_EQ(sinkService_ == nullptr, false); int32_t ret = sinkService_->StopCapture(g_dhId); - EXPECT_EQ(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); } /** @@ -141,7 +141,7 @@ HWTEST_F(DistributedCameraSinkServiceTest, dcamera_sink_service_test_004, TestSi EXPECT_EQ(sinkService_ == nullptr, false); int32_t ret = sinkService_->ChannelNeg(g_dhId, g_testChannelInfoContinue); - EXPECT_NE(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); } /** @@ -156,7 +156,7 @@ HWTEST_F(DistributedCameraSinkServiceTest, dcamera_sink_service_test_005, TestSi EXPECT_EQ(sinkService_ == nullptr, false); int32_t ret = sinkService_->GetCameraInfo(g_dhId, g_testCameraInfo); - EXPECT_EQ(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); } /** @@ -171,13 +171,13 @@ HWTEST_F(DistributedCameraSinkServiceTest, dcamera_sink_service_test_006, TestSi EXPECT_EQ(sinkService_ == nullptr, false); int32_t ret = sinkService_->OpenChannel(g_dhId, g_testOpenInfoService); - EXPECT_NE(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); ret = sinkService_->ChannelNeg(g_dhId, g_testChannelInfoContinue); - EXPECT_NE(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); ret = sinkService_->CloseChannel(g_dhId); - EXPECT_EQ(DCAMERA_OK, ret); + EXPECT_EQ(DCAMERA_NOT_FOUND, ret); } /** diff --git a/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_controller_test.cpp b/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_controller_test.cpp index 16845901..c3302b09 100644 --- a/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_controller_test.cpp +++ b/services/cameraservice/sinkservice/test/unittest/common/distributedcameramgr/dcamera_sink_controller_test.cpp @@ -178,7 +178,7 @@ void DCameraSinkControllerTest::SetTokenID() HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_001, TestSize.Level1) { int32_t ret = controller_->Init(g_testCamIndex); - EXPECT_EQ(DCAMERA_OK, ret); + EXPECT_NE(DCAMERA_OK, ret); EXPECT_EQ(true, controller_->isInit_); ret = controller_->UnInit(); @@ -312,14 +312,14 @@ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_008, TestSize.L */ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_009, TestSize.Level1) { - controller_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTING); + controller_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTING, ""); DCameraInfoCmd cmd; cmd.value_ = std::make_shared(); int32_t ret = controller_->GetCameraInfo(cmd.value_); EXPECT_EQ(DCAMERA_OK, ret); int32_t state = -1; - controller_->OnSessionState(state); + controller_->OnSessionState(state, ""); int32_t eventType = 1; int32_t eventReason = 0; @@ -336,7 +336,7 @@ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_009, TestSize.L */ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_010, TestSize.Level1) { - controller_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTED); + controller_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTED, ""); DCameraInfoCmd cmd; cmd.value_ = std::make_shared(); @@ -364,7 +364,7 @@ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_010, TestSize.L */ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_011, TestSize.Level1) { - controller_->OnSessionState(DCAMERA_CHANNEL_STATE_DISCONNECTED); + controller_->OnSessionState(DCAMERA_CHANNEL_STATE_DISCONNECTED, ""); std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_MS)); DCameraInfoCmd cmd; @@ -397,7 +397,7 @@ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_012, TestSize.L */ HWTEST_F(DCameraSinkControllerTest, dcamera_sink_controller_test_013, TestSize.Level1) { - controller_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTED); + controller_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTED, ""); DCameraInfoCmd cmd; cmd.value_ = std::make_shared(); diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h index 03d0120c..e5c4aca0 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller.h @@ -49,7 +49,7 @@ public: int32_t ResumeDistributedHardware(const std::string &networkId) override; int32_t StopDistributedHardware(const std::string &networkId) override; - void OnSessionState(int32_t state); + void OnSessionState(int32_t state, std::string networkId); void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail); void OnDataReceived(std::vector>& buffers); @@ -57,6 +57,7 @@ private: void HandleMetaDataResult(std::string& jsonStr); void PostChannelDisconnectedEvent(); int32_t PublishEnableLatencyMsg(const std::string& devId); + void HandleReceivedData(std::shared_ptr &dataBuffer); class DCameraHdiRecipient : public IRemoteObject::DeathRecipient { public: void OnRemoteDied(const wptr &remote) override; @@ -79,6 +80,7 @@ private: const std::string SESSION_FLAG = "control"; static constexpr uint8_t CHANNEL_REL_SECONDS = 5; + const size_t DATABUFF_MAX_SIZE = 100 * 1024 * 1024; std::atomic isChannelConnected_ = false; std::mutex channelMtx_; std::condition_variable channelCond_; diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.h index bf865e14..4df7e85c 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -27,7 +27,7 @@ class DCameraSourceControllerChannelListener : public ICameraChannelListener { public: explicit DCameraSourceControllerChannelListener(std::shared_ptr& controller); ~DCameraSourceControllerChannelListener() override; - void OnSessionState(int32_t state) override; + void OnSessionState(int32_t state, std::string networkId) override; void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) override; void OnDataReceived(std::vector>& buffers) override; diff --git a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.h b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.h index 5c74d24f..8d4e79d6 100644 --- a/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.h +++ b/services/cameraservice/sourceservice/include/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -29,7 +29,7 @@ class DCameraSourceInputChannelListener : public ICameraChannelListener { public: DCameraSourceInputChannelListener(std::shared_ptr& Input, DCStreamType streamType); ~DCameraSourceInputChannelListener() override; - void OnSessionState(int32_t state) override; + void OnSessionState(int32_t state, std::string networkId) override; void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) override; void OnDataReceived(std::vector>& buffers) override; diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp index 0562d129..cad2f59b 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcamera_source_dev.cpp @@ -101,6 +101,9 @@ int32_t DCameraSourceDev::RegisterDistributedHardware(const std::string& devId, DHLOGI("DCameraSourceDev PostTask RegisterDistributedHardware devId %{public}s dhId %{public}s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); version_ = param.sinkVersion; + if (version_ >= SEPARATE_SINK_VERSION) { + ManageSelectChannel::GetInstance().SetSrcConnect(true); + } DCameraIndex index(devId, dhId); actualDevInfo_.insert(index); diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp index 65c6ee49..a4010c2b 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller.cpp @@ -119,16 +119,40 @@ int32_t DCameraSourceController::StopCapture() std::string devId = indexs_.begin()->devId_; DHLOGI("StopCapture devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); - sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); - if (camSinkSrv == nullptr) { - DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); - return DCAMERA_BAD_OPERATE; - } - int32_t ret = camSinkSrv->StopCapture(dhId); - if (ret != DCAMERA_OK) { - DHLOGE("StopCapture failed: %{public}d, devId: %{public}s, dhId: %{public}s", ret, - GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); - return DCAMERA_BAD_OPERATE; + if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { + sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); + CHECK_AND_RETURN_RET_LOG(camSinkSrv == nullptr, DCAMERA_BAD_VALUE, "stopCapture can not get sink service"); + int32_t ret = camSinkSrv->StopCapture(dhId); + if (ret != DCAMERA_OK) { + DHLOGE("StopCapture failed: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + return DCAMERA_BAD_OPERATE; + } + } else { + cJSON *rootValue = cJSON_CreateObject(); + if (rootValue == nullptr) { + return DCAMERA_BAD_VALUE; + } + cJSON_AddStringToObject(rootValue, "Command", DCAMERA_PROTOCOL_CMD_STOP_CAPTURE.c_str()); + char *data = cJSON_Print(rootValue); + if (data == nullptr) { + cJSON_Delete(rootValue); + return DCAMERA_BAD_VALUE; + } + std::string jsonStr = std::string(data); + cJSON_Delete(rootValue); + cJSON_free(data); + std::shared_ptr buffer = std::make_shared(jsonStr.length() + 1); + int32_t ret = memcpy_s(buffer->Data(), buffer->Capacity(), + reinterpret_cast(const_cast(jsonStr.c_str())), jsonStr.length()); + CHECK_AND_RETURN_RET_LOG(ret != EOK, ret, "StopCapture memcpy_s failed ret: %{public}d", ret); + CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "channel_ is null."); + ret = channel_->SendData(buffer); + if (ret != DCAMERA_OK) { + DHLOGE("StopCapture SendData failed %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + return ret; + } } DHLOGI("StopCapture devId: %{public}s, dhId: %{public}s success", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); @@ -137,42 +161,44 @@ int32_t DCameraSourceController::StopCapture() int32_t DCameraSourceController::ChannelNeg(std::shared_ptr& info) { - if (indexs_.size() > DCAMERA_MAX_NUM) { - DHLOGE("ChannelNeg not support operate %{public}zu camera", indexs_.size()); - return DCAMERA_BAD_OPERATE; - } + if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { + if (indexs_.size() > DCAMERA_MAX_NUM) { + DHLOGE("ChannelNeg not support operate %{public}zu camera", indexs_.size()); + return DCAMERA_BAD_OPERATE; + } - std::string dhId = indexs_.begin()->dhId_; - std::string devId = indexs_.begin()->devId_; - DHLOGI("ChannelNeg devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), - GetAnonyString(dhId).c_str()); - sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); - if (camSinkSrv == nullptr) { - DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); - return DCAMERA_BAD_OPERATE; - } - DCameraChannelInfoCmd cmd; - cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE; - cmd.dhId_ = dhId; - cmd.command_ = DCAMERA_PROTOCOL_CMD_CHAN_NEG; - cmd.value_ = info; - std::string jsonStr; - int32_t ret = cmd.Marshal(jsonStr); - if (ret != DCAMERA_OK) { - DHLOGE("Marshal failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, - GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); - return ret; - } - DHLOGD("devId: %{public}s, dhId: %{public}s channelNegCommand: %{public}s", - GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), cmd.command_.c_str()); - ret = camSinkSrv->ChannelNeg(dhId, jsonStr); - if (ret != DCAMERA_OK) { - DHLOGE("ChannelNeg rpc failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + std::string dhId = indexs_.begin()->dhId_; + std::string devId = indexs_.begin()->devId_; + DHLOGI("ChannelNeg devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), + GetAnonyString(dhId).c_str()); + sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); + if (camSinkSrv == nullptr) { + DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); + return DCAMERA_BAD_OPERATE; + } + DCameraChannelInfoCmd cmd; + cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE; + cmd.dhId_ = dhId; + cmd.command_ = DCAMERA_PROTOCOL_CMD_CHAN_NEG; + cmd.value_ = info; + std::string jsonStr; + int32_t ret = cmd.Marshal(jsonStr); + if (ret != DCAMERA_OK) { + DHLOGE("Marshal failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + return ret; + } + DHLOGD("devId: %{public}s, dhId: %{public}s channelNegCommand: %{public}s", + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str(), cmd.command_.c_str()); + ret = camSinkSrv->ChannelNeg(dhId, jsonStr); + if (ret != DCAMERA_OK) { + DHLOGE("ChannelNeg rpc failed ret: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + return ret; + } + DHLOGD("DCameraSourceController ChannelNeg devId: %{public}s, dhId: %{public}s success", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); - return ret; } - DHLOGD("DCameraSourceController ChannelNeg devId: %{public}s, dhId: %{public}s success", - GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); return DCAMERA_OK; } @@ -253,34 +279,36 @@ int32_t DCameraSourceController::UpdateSettings(std::vector& camInfo) { - if (indexs_.size() > DCAMERA_MAX_NUM) { - DHLOGE("GetCameraInfo not support operate %{public}zu camera", indexs_.size()); - return DCAMERA_BAD_OPERATE; - } + if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { + if (indexs_.size() > DCAMERA_MAX_NUM) { + DHLOGE("GetCameraInfo not support operate %{public}zu camera", indexs_.size()); + return DCAMERA_BAD_OPERATE; + } - std::string dhId = indexs_.begin()->dhId_; - std::string devId = indexs_.begin()->devId_; - DHLOGI("GetCameraInfo devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), - GetAnonyString(dhId).c_str()); - sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); - if (camSinkSrv == nullptr) { - DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); - return DCAMERA_BAD_OPERATE; - } - std::string camInfoJson; - int32_t ret = camSinkSrv->GetCameraInfo(dhId, camInfoJson); - if (ret != DCAMERA_OK) { - DHLOGE("GetCameraInfo failed: %{public}d, devId: %{public}s, dhId: %{public}s", ret, - GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); - return ret; - } - DCameraInfoCmd cmd; - ret = cmd.Unmarshal(camInfoJson); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraInfoCmd Unmarshal failed: %{public}d", ret); - return ret; + std::string dhId = indexs_.begin()->dhId_; + std::string devId = indexs_.begin()->devId_; + DHLOGI("GetCameraInfo devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), + GetAnonyString(dhId).c_str()); + sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); + if (camSinkSrv == nullptr) { + DHLOGE("can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); + return DCAMERA_BAD_OPERATE; + } + std::string camInfoJson; + int32_t ret = camSinkSrv->GetCameraInfo(dhId, camInfoJson); + if (ret != DCAMERA_OK) { + DHLOGE("GetCameraInfo failed: %{public}d, devId: %{public}s, dhId: %{public}s", ret, + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + return ret; + } + DCameraInfoCmd cmd; + ret = cmd.Unmarshal(camInfoJson); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraInfoCmd Unmarshal failed: %{public}d", ret); + return ret; + } + camInfo = cmd.value_; } - camInfo = cmd.value_; return DCAMERA_OK; } @@ -294,34 +322,36 @@ int32_t DCameraSourceController::OpenChannel(std::shared_ptr& o std::string devId = indexs_.begin()->devId_; DHLOGI("DCameraSourceController OpenChannel Start, devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); - sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); - if (camSinkSrv == nullptr) { - DHLOGE("DCameraSourceController can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); - return DCAMERA_BAD_OPERATE; - } - std::string jsonStr; - DCameraOpenInfoCmd cmd; - cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE; - cmd.dhId_ = dhId; - cmd.command_ = DCAMERA_PROTOCOL_CMD_OPEN_CHANNEL; - cmd.value_ = openInfo; - int32_t ret = cmd.Marshal(jsonStr); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSourceController Marshal OpenInfo failed %{public}d", ret); - return ret; - } - ret = camSinkSrv->OpenChannel(dhId, jsonStr); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSourceController SA OpenChannel failed %{public}d", ret); - return ret; + if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { + sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); + if (camSinkSrv == nullptr) { + DHLOGE("DCameraSourceController can not get service, devId: %{public}s", GetAnonyString(devId).c_str()); + return DCAMERA_BAD_OPERATE; + } + std::string jsonStr; + DCameraOpenInfoCmd cmd; + cmd.type_ = DCAMERA_PROTOCOL_TYPE_MESSAGE; + cmd.dhId_ = dhId; + cmd.command_ = DCAMERA_PROTOCOL_CMD_OPEN_CHANNEL; + cmd.value_ = openInfo; + int32_t ret = cmd.Marshal(jsonStr); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceController Marshal OpenInfo failed %{public}d", ret); + return ret; + } + ret = camSinkSrv->OpenChannel(dhId, jsonStr); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceController SA OpenChannel failed %{public}d", ret); + return ret; + } + DHLOGD("DCameraSourceController OpenChannel devId: %{public}s, dhId: %{public}s success", + GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); } - DHLOGD("DCameraSourceController OpenChannel devId: %{public}s, dhId: %{public}s success", - GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); std::vector indexs; indexs.push_back(DCameraIndex(devId, dhId)); - CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "channel_ is null."); - ret = channel_->CreateSession(indexs, SESSION_FLAG, DCAMERA_SESSION_MODE_CTRL, listener_); + CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "OpenChannel channel_ is null."); + int32_t ret = channel_->CreateSession(indexs, SESSION_FLAG, DCAMERA_SESSION_MODE_CTRL, listener_); if (ret != DCAMERA_OK) { DHLOGE("DCameraSourceController Bind Socket failed, ret: %{public}d", ret); PostChannelDisconnectedEvent(); @@ -342,6 +372,7 @@ int32_t DCameraSourceController::CloseChannel() std::string devId = indexs_.begin()->devId_; DHLOGI("DCameraSourceController CloseChannel Start, devId: %{public}s, dhId: %{public}s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + CHECK_AND_RETURN_RET_LOG(channel_ == nullptr, DCAMERA_BAD_VALUE, "CloseChannel channel_ is null."); int32_t ret = channel_->CloseSession(); if (ret != DCAMERA_OK) { DHLOGE("CloseSession failed %{public}d", ret); @@ -353,14 +384,17 @@ int32_t DCameraSourceController::CloseChannel() if (ret != DCAMERA_OK) { DHLOGE("ReleaseSession failed %{public}d", ret); } - sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); - if (camSinkSrv != nullptr) { - ret = camSinkSrv->CloseChannel(dhId); - if (ret != DCAMERA_OK) { - DHLOGE("DCameraSourceController SA CloseChannel failed %{public}d", ret); + if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { + sptr camSinkSrv = DCameraSourceServiceIpc::GetInstance().GetSinkRemoteCamSrv(devId); + if (camSinkSrv != nullptr) { + ret = camSinkSrv->CloseChannel(dhId); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceController SA CloseChannel failed %{public}d", ret); + } + DCameraSourceServiceIpc::GetInstance().DeleteSinkRemoteCamSrv(devId); } - DCameraSourceServiceIpc::GetInstance().DeleteSinkRemoteCamSrv(devId); } + ManageSelectChannel::GetInstance().SetSrcConnect(false); return ret; } @@ -405,7 +439,7 @@ int32_t DCameraSourceController::UnInit() return DCAMERA_OK; } -void DCameraSourceController::OnSessionState(int32_t state) +void DCameraSourceController::OnSessionState(int32_t state, std::string networkId) { DHLOGI("DCameraSourceController OnSessionState state %{public}d", state); channelState_ = state; @@ -446,13 +480,20 @@ void DCameraSourceController::OnSessionError(int32_t eventType, int32_t eventRea void DCameraSourceController::OnDataReceived(std::vector>& buffers) { - if (buffers.empty()) { - DHLOGI("DCameraSourceController OnDataReceived empty, devId: %{public}s, dhId: %{public}s", - GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); - return; + for (auto& buffer : buffers) { + if (buffer->Size() <= 0 || buffer->Size() > DATABUFF_MAX_SIZE) { + DHLOGI("buffer is invalid"); + return; + } + HandleReceivedData(buffer); } - std::shared_ptr buffer = *(buffers.begin()); - std::string jsonStr(reinterpret_cast(buffer->Data())); +} + +void DCameraSourceController::HandleReceivedData(std::shared_ptr& dataBuffer) +{ + DHLOGI("DCameraSourceController::HandleReceivedData dhId: %{public}s", GetAnonyString(dhId_).c_str()); + uint8_t *data = dataBuffer->Data(); + std::string jsonStr(reinterpret_cast(data), dataBuffer->Capacity()); cJSON *rootValue = cJSON_Parse(jsonStr.c_str()); if (rootValue == nullptr) { return; @@ -460,14 +501,23 @@ void DCameraSourceController::OnDataReceived(std::vectorvaluestring == nullptr)) { cJSON_Delete(rootValue); + DHLOGE("parse command failed"); return; } std::string command = std::string(comvalue->valuestring); - if (command == DCAMERA_PROTOCOL_CMD_METADATA_RESULT) { + cJSON_Delete(rootValue); + if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_METADATA_RESULT) == 0)) { HandleMetaDataResult(jsonStr); + } else if ((!command.empty()) && (command.compare(DCAMERA_PROTOCOL_CMD_STATE_NOTIFY) == 0)) { + DCameraEventCmd cmd; + int32_t ret = cmd.Unmarshal(jsonStr); + if (ret != DCAMERA_OK) { + DHLOGE("DCameraSourceController Unmarshal failed, ret: %{public}d, devId: %{public}s, " + "dhId: %{public}s", ret, GetAnonyString(devId_).c_str(), GetAnonyString(dhId_).c_str()); + return; + } + DCameraNotify(cmd.value_); } - cJSON_Delete(rootValue); - return; } void DCameraSourceController::HandleMetaDataResult(std::string& jsonStr) diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.cpp index 289c6024..63503866 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameracontrol/dcamera_source_controller_channel_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -31,7 +31,7 @@ DCameraSourceControllerChannelListener::~DCameraSourceControllerChannelListener( { } -void DCameraSourceControllerChannelListener::OnSessionState(int32_t state) +void DCameraSourceControllerChannelListener::OnSessionState(int32_t state, std::string networkId) { std::shared_ptr controller = controller_.lock(); if (controller == nullptr) { @@ -39,7 +39,7 @@ void DCameraSourceControllerChannelListener::OnSessionState(int32_t state) return; } - controller->OnSessionState(state); + controller->OnSessionState(state, networkId); } void DCameraSourceControllerChannelListener::OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) diff --git a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.cpp b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.cpp index 1dfe66ef..037289df 100644 --- a/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.cpp +++ b/services/cameraservice/sourceservice/src/distributedcameramgr/dcameradata/dcamera_source_input_channel_listener.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -31,7 +31,7 @@ DCameraSourceInputChannelListener::~DCameraSourceInputChannelListener() { } -void DCameraSourceInputChannelListener::OnSessionState(int32_t state) +void DCameraSourceInputChannelListener::OnSessionState(int32_t state, std::string networkId) { std::shared_ptr input = input_.lock(); if (input == nullptr) { diff --git a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_source_controller_test.cpp b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_source_controller_test.cpp index f289abf0..c4e2b206 100644 --- a/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_source_controller_test.cpp +++ b/services/cameraservice/sourceservice/test/unittest/common/distributedcameramgr/dcamera_source_controller_test.cpp @@ -172,7 +172,7 @@ HWTEST_F(DCameraSourceControllerTest, dcamera_source_controller_test_004, TestSi ret = controller_->StopCapture(); controller_->UnInit(); - EXPECT_EQ(ret, DCAMERA_BAD_OPERATE); + EXPECT_EQ(ret, DCAMERA_BAD_VALUE); } /** @@ -306,7 +306,7 @@ HWTEST_F(DCameraSourceControllerTest, dcamera_source_controller_test_010, TestSi std::shared_ptr listener = std::make_shared(controller_); int32_t state = 0; - listener->OnSessionState(state); + listener->OnSessionState(state, ""); int32_t eventType = 1; int32_t eventReason = 1; std::string detail = "OnSessionErrorTest"; @@ -503,7 +503,7 @@ HWTEST_F(DCameraSourceControllerTest, dcamera_source_controller_test_019, TestSi std::shared_ptr listener_ = std::make_shared(controller); int32_t state = 0; - listener_->OnSessionState(state); + listener_->OnSessionState(state, ""); int32_t eventType = 1; int32_t eventReason = 1; std::string detail = "OnSessionErrorTest"; diff --git a/services/channel/include/dcamera_channel_sink_impl.h b/services/channel/include/dcamera_channel_sink_impl.h index 638d13ec..441dab06 100644 --- a/services/channel/include/dcamera_channel_sink_impl.h +++ b/services/channel/include/dcamera_channel_sink_impl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -38,7 +38,6 @@ private: std::shared_ptr softbusSession_; std::string mySessionName_; DCameraSessionMode mode_ = DCAMERA_SESSION_MODE_CTRL; - const std::string SESSION_HEAD = "ohos.dhardware.dcamera_"; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/channel/include/dcamera_channel_source_impl.h b/services/channel/include/dcamera_channel_source_impl.h index 1d394ed7..4b545a50 100644 --- a/services/channel/include/dcamera_channel_source_impl.h +++ b/services/channel/include/dcamera_channel_source_impl.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -38,7 +38,6 @@ private: std::vector> softbusSessions_; std::string mySessionName_; DCameraSessionMode mode_ = DCAMERA_SESSION_MODE_CTRL; - const std::string SESSION_HEAD = "ohos.dhardware.dcamera_"; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/channel/include/dcamera_softbus_adapter.h b/services/channel/include/dcamera_softbus_adapter.h index 2af2bbd7..9aa91b7e 100644 --- a/services/channel/include/dcamera_softbus_adapter.h +++ b/services/channel/include/dcamera_softbus_adapter.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -77,6 +77,7 @@ private: PeerSocketInfo info); int32_t DCameraSoftbusSourceGetSession(int32_t socket, std::shared_ptr& session); int32_t DCameraSoftbusSinkGetSession(int32_t socket, std::shared_ptr& session); + std::string FindSessNameByPeerSessName(const std::string peerSessionName); private: std::mutex optLock_; @@ -91,8 +92,8 @@ private: std::map sessionModeAndDataTypeMap_; std::mutex mySessionNamePeerDevIdLock_; std::map peerDevIdMySessionNameMap_; - std::mutex mySessionNameLock_; - std::set mySessionNameSet_; + std::mutex mySocketSetLock_; + std::set mySocketSet_; std::mutex sinkSocketLock_; std::map> sinkSocketSessionMap_; diff --git a/services/channel/include/dcamera_softbus_session.h b/services/channel/include/dcamera_softbus_session.h index 13bdec34..1ae110ac 100644 --- a/services/channel/include/dcamera_softbus_session.h +++ b/services/channel/include/dcamera_softbus_session.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -37,7 +37,7 @@ public: std::string peerSessionName, std::shared_ptr listener, DCameraSessionMode mode); ~DCameraSoftbusSession(); int32_t CloseSession(); - int32_t OnSessionOpened(int32_t socket); + int32_t OnSessionOpened(int32_t socket, std::string networkId); int32_t OnSessionClose(int32_t sessionId); int32_t OnDataReceived(std::shared_ptr& buffer); int32_t SendData(DCameraSessionMode mode, std::shared_ptr& buffer); diff --git a/services/channel/include/icamera_channel_listener.h b/services/channel/include/icamera_channel_listener.h index 3fc269c8..d0bba8bd 100644 --- a/services/channel/include/icamera_channel_listener.h +++ b/services/channel/include/icamera_channel_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -34,7 +34,7 @@ class ICameraChannelListener { public: virtual ~ICameraChannelListener() = default; - virtual void OnSessionState(int32_t state) = 0; + virtual void OnSessionState(int32_t state, std::string networkId) = 0; virtual void OnSessionError(int32_t eventType, int32_t eventReason, std::string detail) = 0; virtual void OnDataReceived(std::vector>& buffers) = 0; }; diff --git a/services/channel/src/dcamera_channel_sink_impl.cpp b/services/channel/src/dcamera_channel_sink_impl.cpp index 6b277525..c30d3289 100644 --- a/services/channel/src/dcamera_channel_sink_impl.cpp +++ b/services/channel/src/dcamera_channel_sink_impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -56,10 +56,6 @@ int32_t DCameraChannelSinkImpl::CreateSession(std::vector& camInde if (camIndexs.size() > DCAMERA_MAX_NUM || listener == nullptr) { return DCAMERA_BAD_VALUE; } - if (softbusSession_ != nullptr) { - 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) { @@ -68,7 +64,11 @@ int32_t DCameraChannelSinkImpl::CreateSession(std::vector& camInde } camIndexs_.assign(camIndexs.begin(), camIndexs.end()); listener_ = listener; - mySessionName_ = SESSION_HEAD + camIndexs[0].dhId_ + std::string("_") + sessionFlag; + if (!ManageSelectChannel::GetInstance().GetSinkConnect()) { + mySessionName_ = SESSION_HEAD + camIndexs[0].dhId_ + std::string("_") + sessionFlag; + } else { + mySessionName_ = SESSION_HEAD + camIndexs[0].dhId_ + std::string("_") + sessionFlag + "_sender"; + } mode_ = sessionMode; std::string peerDevId = camIndexs[0].devId_; std::string peerSessionName = SESSION_HEAD + sessionFlag; diff --git a/services/channel/src/dcamera_channel_source_impl.cpp b/services/channel/src/dcamera_channel_source_impl.cpp index 4f955a16..cbad0775 100644 --- a/services/channel/src/dcamera_channel_source_impl.cpp +++ b/services/channel/src/dcamera_channel_source_impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021-2023 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at diff --git a/services/channel/src/dcamera_softbus_adapter.cpp b/services/channel/src/dcamera_softbus_adapter.cpp index e84d04fa..a945246e 100644 --- a/services/channel/src/dcamera_softbus_adapter.cpp +++ b/services/channel/src/dcamera_softbus_adapter.cpp @@ -36,6 +36,20 @@ static QosTV g_qosInfo[] = { { .qos = QOS_TYPE_MIN_LATENCY, .value = DCAMERA_QOS_TYPE_MIN_LATENCY} }; static uint32_t g_QosTV_Param_Index = static_cast(sizeof(g_qosInfo) / sizeof(QosTV)); +const static std::pair LOCAL_TO_PEER_SESS_NAME_MAP[] = { + {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + RECEIVER_SESSION_NAME_CONTROL, + SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + SENDER_SESSION_NAME_CONTROL}, + {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + RECEIVER_SESSION_NAME_DATA_SNAPSHOT, + SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + SENDER_SESSION_NAME_DATA_SNAPSHOT}, + {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + RECEIVER_SESSION_NAME_DATA_CONTINUE, + SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_0 + SENDER_SESSION_NAME_DATA_CONTINUE}, + {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + RECEIVER_SESSION_NAME_CONTROL, + SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + SENDER_SESSION_NAME_CONTROL}, + {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + RECEIVER_SESSION_NAME_DATA_SNAPSHOT, + SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + SENDER_SESSION_NAME_DATA_SNAPSHOT}, + {SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + RECEIVER_SESSION_NAME_DATA_CONTINUE, + SESSION_HEAD + CAMERA_ID_PREFIX + DEVICE_ID_1 + SENDER_SESSION_NAME_DATA_CONTINUE}, +}; } IMPLEMENT_SINGLE_INSTANCE(DCameraSoftbusAdapter); @@ -133,33 +147,42 @@ int32_t DCameraSoftbusAdapter::CreatSoftBusSinkSocketServer(std::string mySessio { DHLOGI("create socket server start, mySessionName: %{public}s,peerSessionName: %{public}s", GetAnonyString(mySessionName).c_str(), GetAnonyString(peerSessionName).c_str()); + SocketInfo serverSocketInfo {}; + if (!ManageSelectChannel::GetInstance().GetSinkConnect()) { + serverSocketInfo = { + .name = const_cast(mySessionName.c_str()), + .peerName = const_cast(peerSessionName.c_str()), + .peerNetworkId = const_cast(peerDevId.c_str()), + .pkgName = const_cast(PKG_NAME.c_str()), + .dataType = sessionModeAndDataTypeMap_[sessionMode], + }; + } else { + serverSocketInfo = { + .name = const_cast(mySessionName.c_str()), + .pkgName = const_cast(PKG_NAME.c_str()), + .dataType = sessionModeAndDataTypeMap_[sessionMode], + }; + } + int32_t socketId = Socket(serverSocketInfo); + if (socketId < 0) { + DHLOGE("create socket server error, socket is invalid, socketId: %{public}d", socketId); + return DCAMERA_BAD_VALUE; + } { - std::lock_guard autoLock(mySessionNameLock_); - if (mySessionNameSet_.find(mySessionName) != mySessionNameSet_.end()) { - DHLOGI("current mySessionName had Listened"); + std::lock_guard autoLock(mySocketSetLock_); + if (mySocketSet_.find(socketId) != mySocketSet_.end()) { + DHLOGI("current socketId had Listened"); return DCAMERA_OK; } - mySessionNameSet_.insert(mySessionName); - } - SocketInfo serverSocketInfo = { - .name = const_cast(mySessionName.c_str()), - .peerName = const_cast(peerSessionName.c_str()), - .peerNetworkId = const_cast(peerDevId.c_str()), - .pkgName = const_cast(PKG_NAME.c_str()), - .dataType = sessionModeAndDataTypeMap_[sessionMode], - }; - int socketId = Socket(serverSocketInfo); - if (socketId < 0) { - DHLOGE("create socket server error, socket is invalid"); - return DCAMERA_BAD_VALUE; + mySocketSet_.insert(socketId); } - int ret = Listen(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]); + int32_t ret = Listen(socketId, g_qosInfo, g_QosTV_Param_Index, &sessListeners_[role]); if (ret != DCAMERA_OK) { - DHLOGE("create socket server error"); + DHLOGE("create socket server error, ret: %{public}d", ret); Shutdown(socketId); return DCAMERA_BAD_VALUE; } - { + if (!ManageSelectChannel::GetInstance().GetSinkConnect()) { std::lock_guard autoLock(mySessionNamePeerDevIdLock_); std::string peerDevIdMySessionName = peerDevId + std::string("_") + mySessionName; peerDevIdMySessionNameMap_[peerDevIdMySessionName] = mySessionName; @@ -174,14 +197,29 @@ int32_t DCameraSoftbusAdapter::CreateSoftBusSourceSocketClient(std::string myDev { DHLOGI("create socket client start, myDevId: %{public}s, peerSessionName: %{public}s", GetAnonyString(myDevId).c_str(), GetAnonyString(peerSessionName).c_str()); - std::string myDevIdPeerSessionName = myDevId + std::string("_") + peerSessionName; - SocketInfo clientSocketInfo = { - .name = const_cast(myDevIdPeerSessionName.c_str()), - .peerName = const_cast(peerSessionName.c_str()), - .peerNetworkId = const_cast(peerDevId.c_str()), - .pkgName = const_cast(PKG_NAME.c_str()), - .dataType = sessionModeAndDataTypeMap_[sessionMode], - }; + SocketInfo clientSocketInfo {}; + std::string myDevIdPeerSessionName = ""; + std::string srcSessionName = ""; + if (!ManageSelectChannel::GetInstance().GetSrcConnect()) { + myDevIdPeerSessionName = myDevId + std::string("_") + peerSessionName; + clientSocketInfo = { + .name = const_cast(myDevIdPeerSessionName.c_str()), + .peerName = const_cast(peerSessionName.c_str()), + .peerNetworkId = const_cast(peerDevId.c_str()), + .pkgName = const_cast(PKG_NAME.c_str()), + .dataType = sessionModeAndDataTypeMap_[sessionMode], + }; + } else { + srcSessionName = peerSessionName + "_receiver"; + peerSessionName = peerSessionName + "_sender"; + clientSocketInfo = { + .name = const_cast(srcSessionName.c_str()), + .peerName = const_cast(peerSessionName.c_str()), + .peerNetworkId = const_cast(peerDevId.c_str()), + .pkgName = const_cast(PKG_NAME.c_str()), + .dataType = sessionModeAndDataTypeMap_[sessionMode], + }; + } int socketId = Socket(clientSocketInfo); if (socketId < 0) { DHLOGE("create socket client error, socket is invalid"); @@ -305,7 +343,7 @@ int32_t DCameraSoftbusAdapter::SourceOnBind(int32_t socket, PeerSocketInfo info) DHLOGE("source bind socket can not find socket %{public}d", socket); return DCAMERA_NOT_FOUND; } - ret = session->OnSessionOpened(socket); + ret = session->OnSessionOpened(socket, info.networkId); if (ret != DCAMERA_OK) { DHLOGE("source bind socket failed, ret: %{public}d socket: %{public}d", ret, socket); } @@ -465,12 +503,22 @@ int32_t DCameraSoftbusAdapter::DCameraSoftbusSinkGetSession(int32_t socket, return DCAMERA_OK; } +std::string DCameraSoftbusAdapter::FindSessNameByPeerSessName(const std::string peerSessionName) +{ + auto foundItem = std::find_if(std::begin(LOCAL_TO_PEER_SESS_NAME_MAP), std::end(LOCAL_TO_PEER_SESS_NAME_MAP), + [&](const auto& item) { return item.first == peerSessionName; }); + if (foundItem != std::end(LOCAL_TO_PEER_SESS_NAME_MAP)) { + return foundItem->second; + } + return ""; +} + int32_t DCameraSoftbusAdapter::DCameraSoftBusGetSessionByPeerSocket(int32_t socket, std::shared_ptr &session, PeerSocketInfo info) { DHLOGI("find session by peer socket start, socket %{public}d", socket); std::string mySessionName = ""; - { + if (!ManageSelectChannel::GetInstance().GetSinkConnect()) { std::lock_guard autoLock(mySessionNamePeerDevIdLock_); auto sessionNameIter = peerDevIdMySessionNameMap_.find(info.name); if (sessionNameIter == peerDevIdMySessionNameMap_.end()) { @@ -478,6 +526,12 @@ int32_t DCameraSoftbusAdapter::DCameraSoftBusGetSessionByPeerSocket(int32_t sock return DCAMERA_NOT_FOUND; } mySessionName = sessionNameIter->second; + } else { + mySessionName = FindSessNameByPeerSessName(info.name); + } + if (mySessionName.empty()) { + DHLOGE("find mySessionName is empty"); + return DCAMERA_BAD_VALUE; } auto iter = sinkSessions_.find(std::string(mySessionName)); if (iter == sinkSessions_.end()) { @@ -504,7 +558,7 @@ int32_t DCameraSoftbusAdapter::SinkOnBind(int32_t socket, PeerSocketInfo info) DHLOGE("sink bind socket error, can not find socket %{public}d", socket); return DCAMERA_NOT_FOUND; } - ret = session->OnSessionOpened(socket); + ret = session->OnSessionOpened(socket, info.networkId); if (ret != DCAMERA_OK) { DHLOGE("sink bind socket error, not find socket %{public}d", socket); } diff --git a/services/channel/src/dcamera_softbus_session.cpp b/services/channel/src/dcamera_softbus_session.cpp index ea261966..76ae3013 100644 --- a/services/channel/src/dcamera_softbus_session.cpp +++ b/services/channel/src/dcamera_softbus_session.cpp @@ -82,13 +82,13 @@ int32_t DCameraSoftbusSession::CloseSession() return DCAMERA_OK; } -int32_t DCameraSoftbusSession::OnSessionOpened(int32_t socket) +int32_t DCameraSoftbusSession::OnSessionOpened(int32_t socket, std::string networkId) { DHLOGI("open current session start, socket: %{public}d", socket); sessionId_ = socket; state_ = DCAMERA_SOFTBUS_STATE_OPENED; CHECK_AND_RETURN_RET_LOG(listener_ == nullptr, DCAMERA_BAD_VALUE, "listener_ is null."); - listener_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTED); + listener_->OnSessionState(DCAMERA_CHANNEL_STATE_CONNECTED, networkId); DHLOGI("open current session end, socket: %{public}d", socket); return DCAMERA_OK; } @@ -100,7 +100,7 @@ int32_t DCameraSoftbusSession::OnSessionClose(int32_t sessionId) sessionId_ = -1; state_ = DCAMERA_SOFTBUS_STATE_CLOSED; CHECK_AND_RETURN_RET_LOG(listener_ == nullptr, DCAMERA_BAD_VALUE, "listener_ is null."); - listener_->OnSessionState(DCAMERA_CHANNEL_STATE_DISCONNECTED); + listener_->OnSessionState(DCAMERA_CHANNEL_STATE_DISCONNECTED, ""); return DCAMERA_OK; } @@ -342,7 +342,7 @@ int32_t DCameraSoftbusSession::BindSocketServer() DHLOGE("DCameraSoftbusSession BindSocketServer Error, socketId %{public}d", socketId); return socketId; } - OnSessionOpened(socketId); + OnSessionOpened(socketId, myDevId_); return socketId; } diff --git a/services/channel/test/unittest/common/channel/dcamera_channel_sink_impl_test.cpp b/services/channel/test/unittest/common/channel/dcamera_channel_sink_impl_test.cpp index c603d8e8..6437f793 100644 --- a/services/channel/test/unittest/common/channel/dcamera_channel_sink_impl_test.cpp +++ b/services/channel/test/unittest/common/channel/dcamera_channel_sink_impl_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -259,7 +259,7 @@ HWTEST_F(DCameraChannelSinkImplTest, dcamera_channel_sink_impl_test_010, TestSiz int32_t eventType = 1; int32_t eventReason = 1; std::string detail = "test010"; - listener_->OnSessionState(state); + listener_->OnSessionState(state, ""); listener_->OnSessionError(eventType, eventReason, detail); size_t capacity = 1; std::shared_ptr dataBuffer = std::make_shared(capacity); diff --git a/services/channel/test/unittest/common/channel/dcamera_softbus_session_test.cpp b/services/channel/test/unittest/common/channel/dcamera_softbus_session_test.cpp index 89165202..e5404c89 100644 --- a/services/channel/test/unittest/common/channel/dcamera_softbus_session_test.cpp +++ b/services/channel/test/unittest/common/channel/dcamera_softbus_session_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Huawei Device Co., Ltd. + * Copyright (c) 2021-2024 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -114,7 +114,7 @@ HWTEST_F(DCameraSoftbusSessionTest, dcamera_softbus_session_test_002, TestSize.L std::string sessionName = "dcamera_softbus_session_test_002"; std::string pkgName = "ohos.dhardware.dcamera"; std::string networkId = "abcdefg123"; - int32_t ret = softbusSession_->OnSessionOpened(sessionId); + int32_t ret = softbusSession_->OnSessionOpened(sessionId, ""); EXPECT_EQ(DCAMERA_OK, ret); } -- Gitee