diff --git a/common/include/dscreen_errcode.h b/common/include/dscreen_errcode.h index 0ffc29c2362446abe63f91a027fe7a6c36f8b8d5..303979d01d3409f4027fb7798e1e14127e55535a 100644 --- a/common/include/dscreen_errcode.h +++ b/common/include/dscreen_errcode.h @@ -92,6 +92,8 @@ enum DScreenErrorCode { ERR_DH_SCREEN_SCREENCLIENT_ADD_WINDOW_ERROR = -54002, ERR_DH_SCREEN_SCREENCLIENT_MOVE_WINDOW_ERROR = -54003, ERR_DH_SCREEN_SCREENCLIENT_HIDE_WINDOW_ERROR = -54004, + // screen register callback + ERR_DH_SCREEN_REGISTER_CALLBACK_NOT_INIT = -55000, }; } // namespace DistributedHardware } // namespace OHOS diff --git a/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp b/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp index 33884aac85cdae75df5804b6bf202d0dce925635..a97426479a583d9fc9f1638f6ce8e9e252789f5b 100644 --- a/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp +++ b/interfaces/innerkits/native_cpp/screen_sink/src/dscreen_sink_handler.cpp @@ -40,8 +40,8 @@ DScreenSinkHandler::DScreenSinkHandler() { DHLOGI("DScreenSinkHandler construct."); std::lock_guard lock(proxyMutex_); - if (!sinkSvrRecipient_) { - sinkSvrRecipient_ = new DScreenSinkSvrRecipient(); + if (sinkSvrRecipient_ == nullptr) { + sinkSvrRecipient_ = new (std::nothrow) DScreenSinkSvrRecipient(); } } @@ -63,6 +63,12 @@ int32_t DScreenSinkHandler::InitSink(const std::string ¶ms) return ERR_DH_SCREEN_SA_GET_SAMGR_FAIL; } sptr loadCallback = new DScreenSinkLoadCallback(params); + if (loadCallback == nullptr) { + DHLOGE("loadCallback is nullptr."); + ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_GET_SAMGR_FAIL, DISTRIBUTED_HARDWARE_SCREEN_SINK_SA_ID, + "loadCallback is nullptr."); + return ERR_DH_SCREEN_SA_GET_SAMGR_FAIL; + } StartTrace(DSCREEN_HITRACE_LABEL, DSCREEN_SINK_LOAD_SYSTEM_ABILITY_START); int32_t ret = samgr->LoadSystemAbility(DISTRIBUTED_HARDWARE_SCREEN_SINK_SA_ID, loadCallback); if (ret != ERR_OK) { @@ -92,6 +98,12 @@ void DScreenSinkHandler::FinishStartSA(const std::string ¶ms, { DHLOGD("FinishStartSA"); std::unique_lock lock(proxyMutex_); + if (sinkSvrRecipient_ == nullptr) { + DHLOGE("sinkSvrRecipient is nullptr."); + ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SINKPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SINK_SA_ID, + "sinkSvrRecipient is nullptr."); + return; + } remoteObject->AddDeathRecipient(sinkSvrRecipient_); dScreenSinkProxy_ = iface_cast(remoteObject); if ((!dScreenSinkProxy_) || (!dScreenSinkProxy_->AsObject())) { @@ -160,7 +172,7 @@ void DScreenSinkHandler::OnRemoteSinkSvrDied(const wptr &remote) return; } std::lock_guard lock(proxyMutex_); - if (dScreenSinkProxy_ != nullptr) { + if (dScreenSinkProxy_ != nullptr && sinkSvrRecipient_ != nullptr) { dScreenSinkProxy_->AsObject()->RemoveDeathRecipient(sinkSvrRecipient_); dScreenSinkProxy_ = nullptr; } diff --git a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp index 73d8509ca68ef99c5213bed4797d2aa6fc909efb..86e3c20639ef61fa265e007d4e6facf25a970cc4 100644 --- a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp +++ b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp @@ -44,11 +44,11 @@ DScreenSourceHandler::DScreenSourceHandler() DHLOGI("DScreenSourceHandler construct."); std::lock_guard lock(proxyMutex_); if (!sourceSvrRecipient_) { - sourceSvrRecipient_ = new DScreenSourceSvrRecipient(); + sourceSvrRecipient_ = new (std::nothrow) DScreenSourceSvrRecipient(); } if (!dScreenSourceCallback_) { - dScreenSourceCallback_ = new DScreenSourceCallback(); + dScreenSourceCallback_ = new (std::nothrow) DScreenSourceCallback(); } } @@ -99,6 +99,12 @@ void DScreenSourceHandler::FinishStartSA(const std::string ¶ms, { DHLOGD("FinishStartSA"); std::unique_lock lock(proxyMutex_); + if (sourceSvrRecipient_ == nullptr) { + DHLOGE("sourceSvrRecipient is nullptr."); + ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SOURCEPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID, + "sourceSvrRecipient is nullptr."); + return; + } remoteObject->AddDeathRecipient(sourceSvrRecipient_); dScreenSourceProxy_ = iface_cast(remoteObject); if ((!dScreenSourceProxy_) || (!dScreenSourceProxy_->AsObject())) { @@ -107,6 +113,12 @@ void DScreenSourceHandler::FinishStartSA(const std::string ¶ms, "dscreen source get proxy failed."); return; } + if (dScreenSourceCallback_ == nullptr) { + DHLOGE("dScreenSourceCallback is nullptr."); + ReportSaFail(DSCREEN_INIT_FAIL, ERR_DH_SCREEN_SA_SOURCEPROXY_NOT_INIT, DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID, + "dScreenSourceCallback is nullptr."); + return; + } dScreenSourceProxy_->InitSource(params, dScreenSourceCallback_); proxyConVar_.notify_one(); ReportSaEvent(DSCREEN_INIT, DISTRIBUTED_HARDWARE_SCREEN_SOURCE_SA_ID, "dscreen source sa load success."); @@ -132,6 +144,10 @@ int32_t DScreenSourceHandler::RegisterDistributedHardware(const std::string &dev { DHLOGD("RegisterDistributedHardware, devId: %s, dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + if (callback == nullptr) { + DHLOGE("callback is nullptr."); + return ERR_DH_SCREEN_REGISTER_CALLBACK_NOT_INIT; + } std::lock_guard lock(proxyMutex_); if (!dScreenSourceProxy_) { DHLOGE("screen source proxy not init."); @@ -153,6 +169,10 @@ int32_t DScreenSourceHandler::UnregisterDistributedHardware(const std::string &d { DHLOGD("UnregisterDistributedHardware, devId: %s, dhId: %s", GetAnonyString(devId).c_str(), GetAnonyString(dhId).c_str()); + if (callback == nullptr) { + DHLOGE("callback is nullptr."); + return ERR_DH_SCREEN_REGISTER_CALLBACK_NOT_INIT; + } std::lock_guard lock(proxyMutex_); if (!dScreenSourceProxy_) { DHLOGE("screen source proxy not init."); @@ -191,7 +211,7 @@ void DScreenSourceHandler::OnRemoteSourceSvrDied(const wptr &remo return; } std::lock_guard lock(proxyMutex_); - if (dScreenSourceProxy_ != nullptr) { + if (dScreenSourceProxy_ != nullptr && sourceSvrRecipient_ != nullptr) { dScreenSourceProxy_->AsObject()->RemoveDeathRecipient(sourceSvrRecipient_); dScreenSourceProxy_ = nullptr; } diff --git a/screenhandler/src/dscreen_handler.cpp b/screenhandler/src/dscreen_handler.cpp index 1e51bd301246506d1d63c733dfc2f8094bce08c2..099c2151587222aec19859a2630e902123bf91aa 100644 --- a/screenhandler/src/dscreen_handler.cpp +++ b/screenhandler/src/dscreen_handler.cpp @@ -107,23 +107,31 @@ std::vector DScreenHandler::Query() DHLOGI("DScreenHandler query hardware info"); std::vector dhItemVec; std::vector> screens = Rosen::ScreenManager::GetInstance().GetAllScreens(); - sptr screen = screens[SCREEN_ID_DEFAULT]; - std::string dhId = SCREEN_PREFIX + SEPERATOR + std::to_string(screen->GetId()); - uint32_t screenWidth = screen->GetWidth(); - uint32_t screenHeight = screen->GetHeight(); - - json attrJson; - attrJson[KEY_VERSION] = DSCREEN_VERSION; - attrJson[KEY_SCREEN_WIDTH] = screenWidth; - attrJson[KEY_SCREEN_HEIGHT] = screenHeight; - attrJson[KEY_CODECTYPE] = QueryCodecInfo(); - - DHItem dhItem; - dhItem.dhId = dhId; - dhItem.attrs = attrJson.dump(); - dhItemVec.push_back(dhItem); - DHLOGD("query result: dhId: %s, attrs: %s", GetAnonyString(dhId).c_str(), attrJson.dump().c_str()); - + DHLOGI("screens size is: %d.", screens.size()); + for (const auto &screen : screens) { + if (screen == nullptr) { + DHLOGE("screen is nullptr."); + continue; + } + if (screen->GetWidth() <= 0) { + continue; + } + std::string dhId = SCREEN_PREFIX + SEPERATOR + std::to_string(screen->GetId()); + uint32_t screenWidth = screen->GetWidth(); + uint32_t screenHeight = screen->GetHeight(); + + json attrJson; + attrJson[KEY_VERSION] = DSCREEN_VERSION; + attrJson[KEY_SCREEN_WIDTH] = screenWidth; + attrJson[KEY_SCREEN_HEIGHT] = screenHeight; + attrJson[KEY_CODECTYPE] = QueryCodecInfo(); + + DHItem dhItem; + dhItem.dhId = dhId; + dhItem.attrs = attrJson.dump(); + dhItemVec.push_back(dhItem); + DHLOGD("query result: dhId: %s, attrs: %s", GetAnonyString(dhId).c_str(), attrJson.dump().c_str()); + } return dhItemVec; } @@ -161,11 +169,20 @@ std::string DScreenHandler::QueryCodecInfo() // query codec info std::shared_ptr codecList = Media::AVCodecListFactory::CreateAVCodecList(); + if (codecList == nullptr) { + return codecInfoStr_; + } std::vector> caps = codecList->GetVideoEncoderCaps(); json codecTypeArray = json::array(); for (const auto &cap : caps) { + if (cap == nullptr) { + continue; + } std::shared_ptr codecInfo = cap->GetCodecInfo(); + if (codecInfo == nullptr) { + continue; + } codecTypeArray.push_back(codecInfo->GetName()); } diff --git a/services/screenclient/src/screen_client_window_adapter.cpp b/services/screenclient/src/screen_client_window_adapter.cpp index 4dec7ed121991660975799885fa18e0cd91aafb0..8499d1977ed60123a754cbc48ebf79161b4a3481 100644 --- a/services/screenclient/src/screen_client_window_adapter.cpp +++ b/services/screenclient/src/screen_client_window_adapter.cpp @@ -58,6 +58,10 @@ sptr ScreenClientWindowAdapter::CreateWindow(std::shared_ptr option = new Rosen::WindowOption(); + if (option == nullptr) { + DHLOGE("option is nullptr."); + return nullptr; + } option->SetWindowType(Rosen::WindowType::WINDOW_TYPE_APP_LAUNCHING); option->SetWindowMode(Rosen::WindowMode::WINDOW_MODE_FLOATING); option->SetDisplayId(windowProperty->displayId); diff --git a/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp b/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp index 408c9ca2611b0a4ac25db4435104da846d514f30..317cb0d373d86c64c1a8a186dd9b572185e23693 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp @@ -65,6 +65,7 @@ uint64_t ScreenMgrAdapter::CreateVirtualScreen(const std::string &devId, const s }; uint64_t screenId = Rosen::ScreenManager::GetInstance().CreateVirtualScreen(option); + DHLOGI("virtualScreen id is: %" PRIu64, screenId); screenIdMap_.emplace(screenName, screenId); return screenId; }