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 782c3cf28dff195575dad3573b7d872675ef98e8..ce5b40668a7f8be4e42054b7afeab83015e5376e 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 2e1a622d77bfac838572baee0d0f41e1b2515266..59bc4ac3fb0add0beff9a3c5ee5dc972344ce24d 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 7675c899d9d477d2df46a59001e01a638fe69f8c..b3bcf59f3f1604f462b92bb4173ff5b2ae482197 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 cb66085f456149535c027200442ba88b78708908..40e9d96ddbfef1cfa3757471e2c292e7ae7ed3c3 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");