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 e40ab91828b42bc78c264b42faf51dac2e697d82..e0111d1ff1c208866a268355d8ccca427c1aa35e 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 @@ -19,7 +19,7 @@ #include #include #include - +#include "idistributed_camera_sink.h" #include "idistributed_hardware_sink.h" #include "single_instance.h" @@ -36,18 +36,25 @@ public: int32_t PauseDistributedHardware(const std::string &networkId) override; int32_t ResumeDistributedHardware(const std::string &networkId) override; int32_t StopDistributedHardware(const std::string &networkId) 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 e7e1e1e80f599f5f69e669e689cd0cad38f3a1db..ead2b294cbfa2750cd52c4920e18b28facb12e02 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; @@ -165,6 +179,42 @@ int32_t DCameraSinkHandler::StopDistributedHardware(const std::string &networkId return DCAMERA_OK; } +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(producerMutex_); + 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_sink/src/dcamera_sink_load_callback.cpp b/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_load_callback.cpp index f7ea2632d70eb80331bed7cbb08747b4274f2c2b..cba754f55b5f19e981a011eff29b3dd06e1a9d07 100644 --- a/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_load_callback.cpp +++ b/interfaces/inner_kits/native_cpp/camera_sink/src/dcamera_sink_load_callback.cpp @@ -37,7 +37,7 @@ void DCameraSinkLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbilityId DHLOGE("remoteObject is null."); return; } - DCameraSinkHandler::GetInstance().FinishStartSA(params_); + DCameraSinkHandler::GetInstance().FinishStartSA(params_, remoteObject); } void DCameraSinkLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId) 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..95d9aa26d2721efcbec8491a129bde8eaae1e72e 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 @@ -24,6 +24,7 @@ #include "refbase.h" #include "dcamera_source_callback.h" +#include "idistributed_camera_source.h" #include "idistributed_hardware_source.h" #include "single_instance.h" @@ -47,13 +48,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 dCameraSourceCallback_ = 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..4920e5bbc9467d4fa2a464d7077431086bc98e6f 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) CameraSourceRecipient(); + } + + if (dCameraSourceCallback_ == nullptr) { + dCameraSourceCallback_ = new (std::nothrow) DCameraSourceCallback(); + } } 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(producerMutex_); + 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"); diff --git a/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_load_callback.cpp b/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_load_callback.cpp index d6e5243482f0897779132edc96f12ca56a9e64ce..fbb21f8473b28dd776d086c2d952e8a942952f27 100644 --- a/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_load_callback.cpp +++ b/interfaces/inner_kits/native_cpp/camera_source/src/dcamera_source_load_callback.cpp @@ -37,7 +37,7 @@ void DCameraSourceLoadCallback::OnLoadSystemAbilitySuccess(int32_t systemAbility DHLOGE("remoteObject is null."); return; } - DCameraSourceHandler::GetInstance().FinishStartSA(params_); + DCameraSourceHandler::GetInstance().FinishStartSA(params_, remoteObject); } void DCameraSourceLoadCallback::OnLoadSystemAbilityFail(int32_t systemAbilityId) diff --git a/interfaces/inner_kits/native_cpp/test/unittest/common/camera_sink/dcamera_sink_handler_test.cpp b/interfaces/inner_kits/native_cpp/test/unittest/common/camera_sink/dcamera_sink_handler_test.cpp index 7b0677c8d38141003b0ffee84913f24a162aeb5d..4f4b46460cfbc206111e385739f117d1cf80e082 100644 --- a/interfaces/inner_kits/native_cpp/test/unittest/common/camera_sink/dcamera_sink_handler_test.cpp +++ b/interfaces/inner_kits/native_cpp/test/unittest/common/camera_sink/dcamera_sink_handler_test.cpp @@ -93,7 +93,10 @@ HWTEST_F(DCameraSinkHandlerTest, dcamera_sink_handler_test_002, TestSize.Level1) EXPECT_EQ(DCAMERA_OK, ret); int32_t systemAbilityId = 4804; - DCameraSinkHandler::GetInstance().FinishStartSA(params); + sptr samgr = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); + sptr remoteObject = samgr->GetSystemAbility(systemAbilityId); + DCameraSinkHandler::GetInstance().FinishStartSA(params,remoteObject); DCameraSinkHandler::GetInstance().FinishStartSAFailed(systemAbilityId); ret = DCameraSinkHandler::GetInstance().ReleaseSink(); EXPECT_EQ(DCAMERA_OK, ret); diff --git a/interfaces/inner_kits/native_cpp/test/unittest/common/camera_source/dcamera_source_handler_test.cpp b/interfaces/inner_kits/native_cpp/test/unittest/common/camera_source/dcamera_source_handler_test.cpp index e65d9745d23e246622705ae1076579a367157d47..b036f2f9f286b2a1ebb15a8b6de946681a0fd754 100644 --- a/interfaces/inner_kits/native_cpp/test/unittest/common/camera_source/dcamera_source_handler_test.cpp +++ b/interfaces/inner_kits/native_cpp/test/unittest/common/camera_source/dcamera_source_handler_test.cpp @@ -94,8 +94,11 @@ HWTEST_F(DCameraSourceHandlerTest, dcamera_source_handler_test_002, TestSize.Lev int32_t ret = DCameraSourceHandler::GetInstance().InitSource(params); EXPECT_EQ(DCAMERA_OK, ret); + sptr samgr = + SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); int32_t systemAbilityId = 4803; - DCameraSourceHandler::GetInstance().FinishStartSA(params); + sptr remoteObject = samgr->GetSystemAbility(systemAbilityId); + DCameraSourceHandler::GetInstance().FinishStartSA(params, remoteObject); DCameraSourceHandler::GetInstance().FinishStartSAFailed(systemAbilityId); ret = DCameraSourceHandler::GetInstance().ReleaseSource(); EXPECT_EQ(DCAMERA_OK, ret);