From 3d5017041d7b024d625c2d7228b50bb00361645d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cry521=E2=80=9D?= Date: Tue, 14 Nov 2023 16:38:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=BB=E4=BA=A1=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: “ry521” --- .../include/dcamera_sink_handler.h | 11 +++- .../camera_sink/src/dcamera_sink_handler.cpp | 52 ++++++++++++++++++- .../include/dcamera_source_handler.h | 10 +++- .../src/dcamera_source_handler.cpp | 52 ++++++++++++++++++- 4 files changed, 119 insertions(+), 6 deletions(-) diff --git a/interfaces/inner_kits/native_cpp/camera_sink/include/dcamera_sink_handler.h b/interfaces/inner_kits/native_cpp/camera_sink/include/dcamera_sink_handler.h index 782c3cf2..ce5b4066 100644 --- a/interfaces/inner_kits/native_cpp/camera_sink/include/dcamera_sink_handler.h +++ b/interfaces/inner_kits/native_cpp/camera_sink/include/dcamera_sink_handler.h @@ -32,18 +32,25 @@ public: int32_t ReleaseSink() override; int32_t SubscribeLocalHardware(const std::string& dhId, const std::string& parameters) override; int32_t UnsubscribeLocalHardware(const std::string& dhId) override; + void OnRemoteSinkSvrDied(const wptr &remote); private: typedef enum { DCAMERA_SA_STATE_STOP = 0, DCAMERA_SA_STATE_START = 1, } DCameraSAState; - DCameraSinkHandler() = default; + DCameraSinkHandler(); ~DCameraSinkHandler(); - void FinishStartSA(const std::string ¶ms); + void FinishStartSA(const std::string ¶ms, const sptr &remoteObject); void FinishStartSAFailed(const int32_t systemAbilityId); + class CameraSinkRecipient : public IRemoteObject::DeathRecipient { + public: + void OnRemoteDied(const wptr &remote) override; + }; private: std::condition_variable producerCon_; std::mutex producerMutex_; + sptr dCameraSinkProxy_ = nullptr; + sptr sinkSvrRecipient_ = nullptr; DCameraSAState state_ = DCAMERA_SA_STATE_STOP; friend class DCameraSinkLoadCallback; }; diff --git a/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_handler.cpp b/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_handler.cpp index 2e1a622d..59bc4ac3 100644 --- a/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_handler.cpp +++ b/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_handler.cpp @@ -36,6 +36,14 @@ namespace OHOS { namespace DistributedHardware { IMPLEMENT_SINGLE_INSTANCE(DCameraSinkHandler); +DCameraSinkHandler::DCameraSinkHandler() +{ + DHLOGI("DCameraSinkHandler construct."); + if (sinkSvrRecipient_ == nullptr) { + sinkSvrRecipient_ = new (std::nothrow) CameraSinkRecipient(); + } +} + DCameraSinkHandler::~DCameraSinkHandler() { DHLOGI("~DCameraSinkHandler"); @@ -78,10 +86,16 @@ int32_t DCameraSinkHandler::InitSink(const std::string& params) return DCAMERA_OK; } -void DCameraSinkHandler::FinishStartSA(const std::string& params) +void DCameraSinkHandler::FinishStartSA(const std::string& params, const sptr &remoteObject) { DCameraSinkHandlerIpc::GetInstance().Init(); sptr dCameraSinkSrv = DCameraSinkHandlerIpc::GetInstance().GetSinkLocalCamSrv(); + remoteObject->AddDeathRecipient(sinkSvrRecipient_); + dCameraSinkProxy_ = iface_cast(remoteObject); + if ((dCameraSinkProxy_ == nullptr) || (dCameraSinkProxy_->AsObject() == nullptr)) { + DHLOGE("Faild to get input sink proxy."); + return; + } if (dCameraSinkSrv == nullptr) { DHLOGE("get Service failed"); return; @@ -145,6 +159,42 @@ int32_t DCameraSinkHandler::UnsubscribeLocalHardware(const std::string& dhId) return dCameraSinkSrv->UnsubscribeLocalHardware(dhId); } +void DCameraSinkHandler::CameraSinkRecipient::OnRemoteDied(const wptr &remote) +{ + if (remote == nullptr) { + DHLOGE("OnRemoteDied remote is nullptr."); + return; + } + DHLOGI("DInputSinkSvrRecipient OnRemoteDied."); + DCameraSinkHandler::GetInstance().OnRemoteSinkSvrDied(remote); +} + +void DCameraSinkHandler::OnRemoteSinkSvrDied(const wptr &remote) +{ + DHLOGI("DCameraSinkHandle OnRemoteSinkSvrDied."); + std::lock_guard lock(proxyMutex_); + if (dCameraSinkProxy_ == nullptr) { + DHLOGE("dCameraSinkProxy_ is nullptr."); + return; + } + if (dCameraSinkProxy_->AsObject() == nullptr) { + DHLOGE("AsObject is nullptr."); + return; + } + sptr remoteObject = remote.promote(); + if (remoteObject == nullptr) { + DHLOGE("OnRemoteDied remote promoted failed"); + return; + } + + if (dCameraSinkProxy_->AsObject() != remoteObject) { + DHLOGE("OnRemoteSinkSvrDied not found remote object."); + return; + } + dCameraSinkProxy_->AsObject()->RemoveDeathRecipient(sinkSvrRecipient_); + dCameraSinkProxy_ = nullptr; +} + IDistributedHardwareSink *GetSinkHardwareHandler() { DHLOGI("DCameraSinkHandler::GetSinkHardwareHandler"); diff --git a/interfaces/inner_kits/native_cpp/camera_source/include/dcamera_source_handler.h b/interfaces/inner_kits/native_cpp/camera_source/include/dcamera_source_handler.h index 7675c899..b3bcf59f 100644 --- a/interfaces/inner_kits/native_cpp/camera_source/include/dcamera_source_handler.h +++ b/interfaces/inner_kits/native_cpp/camera_source/include/dcamera_source_handler.h @@ -47,13 +47,21 @@ private: } DCameraSAState; DCameraSourceHandler(); ~DCameraSourceHandler(); - void FinishStartSA(const std::string ¶ms); + void FinishStartSA(const std::string ¶ms, const sptr &remoteObject); void FinishStartSAFailed(const int32_t systemAbilityId); + void OnRemoteSourceSvrDied(const wptr &remote); + class CameraSourceRecipient : public IRemoteObject::DeathRecipient { + public: + void OnRemoteDied(const wptr &remote) override; + }; private: std::mutex optLock_; sptr callback_; std::condition_variable producerCon_; std::mutex producerMutex_; + sptr dCameraSourceProxy_ = nullptr; + sptr dInputSourceCallback_ = nullptr; + sptr sourceSvrRecipient_ = nullptr; DCameraSAState state_ = DCAMERA_SA_STATE_STOP; friend class DCameraSourceLoadCallback; }; diff --git a/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_handler.cpp b/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_handler.cpp index cb66085f..40e9d96d 100644 --- a/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_handler.cpp +++ b/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_handler.cpp @@ -33,7 +33,13 @@ IMPLEMENT_SINGLE_INSTANCE(DCameraSourceHandler); DCameraSourceHandler::DCameraSourceHandler() { DHLOGI("DCameraSourceHandler construct."); - callback_ = new DCameraSourceCallback(); + if (sourceSvrRecipient_ == nullptr) { + sourceSvrRecipient_ = new (std::nothrow) DInputSourceSvrRecipient(); + } + + if (dInputSourceCallback_ == nullptr) { + dInputSourceCallback_ = new (std::nothrow) LoadDInputSourceCallback(); + } } DCameraSourceHandler::~DCameraSourceHandler() @@ -77,10 +83,16 @@ int32_t DCameraSourceHandler::InitSource(const std::string& params) return DCAMERA_OK; } -void DCameraSourceHandler::FinishStartSA(const std::string ¶ms) +void DCameraSourceHandler::FinishStartSA(const std::string ¶ms, const sptr &remoteObject); { DCameraSourceHandlerIpc::GetInstance().Init(); sptr dCameraSourceSrv = DCameraSourceHandlerIpc::GetInstance().GetSourceLocalCamSrv(); + remoteObject->AddDeathRecipient(sourceSvrRecipient_); + dCameraSourceProxy_ = iface_cast(remoteObject); + if ((dCameraSourceProxy_ == nullptr) || (dCameraSourceProxy_->AsObject() == nullptr)) { + DHLOGE("Faild to get camera source proxy."); + return; + } if (dCameraSourceSrv == nullptr) { DHLOGE("get Service failed"); return; @@ -179,6 +191,42 @@ int32_t DCameraSourceHandler::ConfigDistributedHardware(const std::string& devId return DCAMERA_OK; } +void DCameraSourceHandler::CameraSourceRecipient::OnRemoteDied(const wptr &remote) +{ + if (remote == nullptr) { + DHLOGE("OnRemoteDied remote is nullptr."); + return; + } + DHLOGI("DCameraSourceSvrRecipient OnRemoteDied."); + DCameraSourceHandler::GetInstance().OnRemoteSourceSvrDied(remote); +} + +void DCameraSourceHandler::OnRemoteSourceSvrDied(const wptr &remote) +{ + DHLOGI("OnRemoteSourceSvrDied."); + std::lock_guard lock(proxyMutex_); + if (dCameraSourceProxy_ == nullptr) { + DHLOGE("dCameraSourceProxy is nullptr."); + return; + } + if (dCameraSourceProxy_->AsObject() == nullptr) { + DHLOGE("AsObject is nullptr."); + return; + } + sptr remoteObject = remote.promote(); + if (remoteObject == nullptr) { + DHLOGE("OnRemoteDied remote promoted failed"); + return; + } + + if (dCameraSourceProxy_->AsObject() != remoteObject) { + DHLOGE("OnRemoteSourceSvrDied not found remote object."); + return; + } + dCameraSourceProxy_->AsObject()->RemoveDeathRecipient(sourceSvrRecipient_); + dCameraSourceProxy_ = nullptr; +} + IDistributedHardwareSource *GetSourceHardwareHandler() { DHLOGI("DCameraSourceHandler GetSourceHardwareHandler Start"); -- Gitee