From db76c099258a98afb0b6f3872c7c0d06f424f79b Mon Sep 17 00:00:00 2001 From: chenbushan Date: Wed, 3 Apr 2024 19:19:49 +0800 Subject: [PATCH 1/7] bugfix : add devmgr deathrecipient in hdi proxy Signed-off-by: chenbushan Change-Id: I64c7cc164ab67dd81016c24601b1896b17f1722a --- .../codegen/cpp_client_proxy_code_emitter.cpp | 128 +++++++++++++++++- .../codegen/cpp_client_proxy_code_emitter.h | 21 ++- 2 files changed, 142 insertions(+), 7 deletions(-) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 2e2b7f102..e57f896f7 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -92,6 +92,11 @@ void CppClientProxyCodeEmitter::EmitProxyHeaderInclusions(StringBuilder &sb) void CppClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet &headerFiles) const { headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iproxy_broker"); + if (!interface_->IsSerializable() && (!interface_->IsCallback())) { + headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iservmgr_hdi"); + headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log"); + headerFiles.emplace(HeaderFileType::C_STD_HEADER_FILE, "unistd"); + } } void CppClientProxyCodeEmitter::EmitProxyDecl(StringBuilder &sb, const std::string &prefix) @@ -100,20 +105,69 @@ void CppClientProxyCodeEmitter::EmitProxyDecl(StringBuilder &sb, const std::stri sb.AppendFormat("class %s : public IProxyBroker<%s> {\n", proxyName_.c_str(), EmitDefinitionByInterface(interface_, interfaceName_).c_str()); sb.Append("public:\n"); + if (!interface_->IsSerializable() && (!interface_->IsCallback())) { + EmitProxyDevmgrDeathRecipient(sb, TAB); + sb.Append("\n"); + } EmitProxyConstructor(sb, TAB); sb.Append("\n"); EmitProxyMethodDecls(sb, TAB); sb.Append("\n"); + if (!interface_->IsSerializable() && (!interface_->IsCallback())) { + EmitProxyPublicMembers(sb, TAB); + } sb.Append("private:\n"); EmitProxyConstants(sb, TAB); sb.Append("};\n"); } +void CppClientProxyCodeEmitter::EmitProxyDevmgrDeathRecipient(StringBuilder &sb, const std::string &prefix) const +{ + std::string doubleTab = prefix + TAB; + sb.Append(prefix).AppendFormat("class %s : public IRemoteObject::DeathRecipient {\n", + devmgrDeathRecipientName_.c_str()); + sb.Append(prefix).Append("public:\n"); + sb.Append(doubleTab).AppendFormat("%s(wptr<%s> proxy) : proxy_(proxy) {} \n", devmgrDeathRecipientName_.c_str(), + EmitDefinitionByInterface(interface_, proxyName_).c_str()); + sb.Append(doubleTab).AppendFormat("~%s() override = default;\n", devmgrDeathRecipientName_.c_str()); + EmitProxyDevmgrDeathCallBack(sb, doubleTab); + sb.Append(prefix).Append("private:\n"); + sb.Append(doubleTab).AppendFormat("wptr<%s> proxy_;\n", + EmitDefinitionByInterface(interface_, proxyName_).c_str()); + sb.Append(prefix).Append("};\n"); +} + +void CppClientProxyCodeEmitter::EmitProxyDevmgrDeathCallBack(StringBuilder &sb, const std::string &prefix) const +{ + std::string trebleTab = prefix + TAB; + sb.Append(prefix).Append("void OnRemoteDied(const wptr &remote) override\n"); + sb.Append(prefix).Append("{\n"); + sb.Append(trebleTab).Append("int32_t result = HDF_FAILURE;\n"); + sb.Append(trebleTab).Append("const int sleepInterval = 50000;\n"); + sb.Append(trebleTab).Append("const int waitTimes = 20;\n"); + sb.Append(trebleTab).Append("int currentTime = waitTimes;\n"); + sb.Append(trebleTab).Append("HDF_LOGI(\"hdf_devmgr is dead, reconnecting\");\n"); + sb.Append(trebleTab).Append("do {\n"); + sb.Append(trebleTab + TAB).Append("usleep(sleepInterval);\n"); + sb.Append(trebleTab + TAB).Append("auto proxy = proxy_.promote();\n"); + sb.Append(trebleTab + TAB).Append("if (proxy != nullptr) {\n"); + sb.Append(trebleTab + TAB + TAB).Append("result = proxy->Reconnect();\n"); + sb.Append(trebleTab + TAB).Append("}\n"); + sb.Append(trebleTab + TAB).Append("--currentTime;\n"); + sb.Append(trebleTab).Append("} while (result != HDF_SUCCESS && currentTime >0);\n"); + sb.Append(trebleTab).Append("HDF_LOGI(\"hdf_devmgr is dead, reconnect result is %{public}d\", result);\n"); + sb.Append(prefix).Append("}\n"); +} + void CppClientProxyCodeEmitter::EmitProxyConstructor(StringBuilder &sb, const std::string &prefix) const { sb.Append(prefix).AppendFormat("explicit %s(const sptr& remote)", proxyName_.c_str()); sb.AppendFormat( - " : IProxyBroker<%s>(remote) {}\n\n", EmitDefinitionByInterface(interface_, interfaceName_).c_str()); + " : IProxyBroker<%s>(remote) {\n", EmitDefinitionByInterface(interface_, interfaceName_).c_str()); + if (!interface_->IsSerializable() && (!interface_->IsCallback())) { + sb.Append(prefix + TAB).Append("reconnectRemote_ = nullptr;\n"); + } + sb.Append(prefix).AppendFormat("}\n"); sb.Append(prefix).AppendFormat("virtual ~%s() = default;\n", proxyName_.c_str()); } @@ -137,6 +191,12 @@ void CppClientProxyCodeEmitter::EmitProxyMethodDecls(StringBuilder &sb, const st sb.Append("\n"); EmitProxyStaticMethodDecl(interface_->GetVersionMethod(), sb, prefix); } + if (!interface_->IsSerializable() && (!interface_->IsCallback())) { + sb.Append("\n"); + EmitProxyReconnectMethodDecl(sb, prefix); + sb.Append("\n"); + EmitProxyGetRemoteMethodDecl(sb, prefix); + } } void CppClientProxyCodeEmitter::EmitProxyMethodDecl( @@ -187,6 +247,45 @@ void CppClientProxyCodeEmitter::EmitProxyStaticMethodDecl( } } +void CppClientProxyCodeEmitter::EmitProxyReconnectMethodDecl(StringBuilder &sb, const std::string &prefix) const +{ + std::string doubleTab = prefix + TAB; + sb.Append(prefix).Append("int32_t Reconnect() {\n"); + sb.Append(doubleTab).AppendFormat("using namespace %s;\n", devmgrVersionName_.c_str()); + sb.Append(doubleTab).Append("isReconnected_ = false;\n"); + sb.Append(doubleTab).Append("servMgr_ = IServiceManager::Get();\n"); + sb.Append(doubleTab).Append("if (servMgr_ == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); + sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); + sb.Append(doubleTab).Append("}\n"); + sb.Append(doubleTab).Append("reconnectRemote_ = servMgr_->GetService(serviceName_.c_str());\n"); + sb.Append(doubleTab).Append("if (reconnectRemote_ == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get remote object failed!\", __func__);\n"); + sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); + sb.Append(doubleTab).Append("}\n"); + sb.Append(doubleTab).Append("OHOS::HDI::hdi_objcast(servMgr_)->AddDeathRecipient(\n"); + sb.Append(doubleTab + TAB).AppendFormat("new %s::%s(this));\n", + proxyName_.c_str(), devmgrDeathRecipientName_.c_str()); + sb.Append(doubleTab).Append("isReconnected_ = true;\n"); + sb.Append(doubleTab).Append("return HDF_SUCCESS;\n"); + sb.Append(prefix).Append("}\n"); +} + +void CppClientProxyCodeEmitter::EmitProxyGetRemoteMethodDecl(StringBuilder &sb, const std::string &prefix) const +{ + sb.Append(prefix).Append("sptr GetCurrentRemote() {\n"); + sb.Append(prefix + TAB).Append("return isReconnected_ ? reconnectRemote_ : Remote();\n"); + sb.Append(prefix).Append("}\n"); +} + +void CppClientProxyCodeEmitter::EmitProxyPublicMembers(StringBuilder &sb, const std::string &prefix) const +{ + sb.Append(prefix).Append("bool isReconnected_;\n"); + sb.Append(prefix).Append("std::string serviceName_;\n"); + sb.Append(prefix).AppendFormat("sptr<%s::IServiceManager> servMgr_;\n", devmgrVersionName_.c_str()); + sb.Append(prefix).Append("sptr reconnectRemote_;\n"); +} + void CppClientProxyCodeEmitter::EmitProxyConstants(StringBuilder &sb, const std::string &prefix) const { sb.Append(prefix).AppendFormat( @@ -372,15 +471,13 @@ void CppClientProxyCodeEmitter::EmitGetMethodImpl(StringBuilder &sb, const std:: void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder &sb, const std::string &prefix) { std::string objName = "proxy"; - std::string serMajorName = "serMajorVer"; - std::string serMinorName = "serMinorVer"; std::string interfaceNamespace = GetNameSpaceByInterface(interface_, interfaceName_); sb.Append(prefix).AppendFormat("sptr<%s> %s::Get(const std::string& serviceName, bool isStub)\n", EmitDefinitionByInterface(interface_, interfaceName_).c_str(), EmitDefinitionByInterface(interface_, interfaceName_).c_str()); sb.Append(prefix).Append("{\n"); EmitProxyPassthroughtLoadImpl(sb, prefix + TAB); - sb.Append(prefix + TAB).Append("using namespace OHOS::HDI::ServiceManager::V1_0;\n"); + sb.Append(prefix + TAB).AppendFormat("using namespace %s;\n", devmgrVersionName_.c_str()); sb.Append(prefix + TAB).Append("auto servMgr = IServiceManager::Get();\n"); sb.Append(prefix + TAB).Append("if (servMgr == nullptr) {\n"); sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); @@ -393,7 +490,7 @@ void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder &sb, con sb.Append(prefix + TAB + TAB).Append("return nullptr;\n"); sb.Append(prefix + TAB).Append("}\n\n"); sb.Append(prefix + TAB).AppendFormat("sptr<%s> %s = new %s(remote);\n", - EmitDefinitionByInterface(interface_, interfaceName_).c_str(), objName.c_str(), + EmitDefinitionByInterface(interface_, proxyName_).c_str(), objName.c_str(), (interfaceNamespace + (StringHelper::StartWith(interfaceName_, "I") ? interfaceName_.substr(1) : interfaceName_) + "Proxy").c_str()); @@ -401,6 +498,21 @@ void CppClientProxyCodeEmitter::EmitGetInstanceMethodImpl(StringBuilder &sb, con sb.Append(prefix + TAB + TAB).Append("HDF_LOGE(\"%{public}s:iface_cast failed!\", __func__);\n"); sb.Append(prefix + TAB + TAB).Append("return nullptr;\n"); sb.Append(prefix + TAB).Append("}\n\n"); + EmitGetInstanceMethodInitProxyImpl(sb, prefix); +} + +void CppClientProxyCodeEmitter::EmitGetInstanceMethodInitProxyImpl(StringBuilder &sb, const std::string &prefix) const +{ + std::string objName = "proxy"; + std::string serMajorName = "serMajorVer"; + std::string serMinorName = "serMinorVer"; + sb.Append(prefix + TAB).AppendFormat("%s->servMgr_ = servMgr;\n", objName.c_str()); + sb.Append(prefix + TAB).AppendFormat("OHOS::HDI::hdi_objcast"); + sb.AppendFormat("(%s->servMgr_)->AddDeathRecipient(\n", objName.c_str()); + sb.Append(prefix + TAB + TAB).AppendFormat("new %s::%s(%s));\n", + proxyName_.c_str(), devmgrDeathRecipientName_.c_str(), objName.c_str()); + sb.Append(prefix + TAB).AppendFormat("%s->isReconnected_ = false;\n", objName.c_str()); + sb.Append(prefix + TAB).AppendFormat("%s->serviceName_ = serviceName;\n", objName.c_str()); sb.Append(prefix + TAB).AppendFormat("uint32_t %s = 0;\n", serMajorName.c_str()); sb.Append(prefix + TAB).AppendFormat("uint32_t %s = 0;\n", serMinorName.c_str()); @@ -623,7 +735,11 @@ void CppClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtrIsSerializable() && (!interface_->IsCallback())) { + sb.Append("GetCurrentRemote());\n"); + } else { + sb.Append("Remote());\n"); + } sb.Append(prefix).Append("}\n"); } diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index f04dc1513..c52a1a693 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -15,10 +15,17 @@ namespace OHOS { namespace HDI { class CppClientProxyCodeEmitter : public CppCodeEmitter { public: - CppClientProxyCodeEmitter() : CppCodeEmitter() {} + CppClientProxyCodeEmitter() : CppCodeEmitter() { + devmgrDeathRecipientName_ = "IServiceManagerDeathRecipient"; + devmgrVersionName_ = "OHOS::HDI::ServiceManager::V1_0"; + } ~CppClientProxyCodeEmitter() override = default; +protected: + std::string devmgrDeathRecipientName_; + std::string devmgrVersionName_; + private: bool ResolveDirectory(const std::string &targetDirectory) override; @@ -91,6 +98,18 @@ private: void EmitProxyCastFromMethodImpl(const AutoPtr interface, StringBuilder &sb, const std::string &prefix) const; void EmitProxyCastFromMethodImplTemplate(StringBuilder &sb, const std::string &prefix) const; + + void EmitProxyDevmgrDeathRecipient(StringBuilder &sb, const std::string &prefix) const; + + void EmitProxyPublicMembers(StringBuilder &sb, const std::string &prefix) const; + + void EmitProxyDevmgrDeathCallBack(StringBuilder &sb, const std::string &prefix) const; + + void EmitProxyReconnectMethodDecl(StringBuilder &sb, const std::string &prefix) const; + + void EmitProxyGetRemoteMethodDecl(StringBuilder &sb, const std::string &prefix) const; + + void EmitGetInstanceMethodInitProxyImpl(StringBuilder &sb, const std::string &prefix) const; }; } // namespace HDI } // namespace OHOS -- Gitee From f16fbdcdad0ee7a192d364ebc086c1a95811724a Mon Sep 17 00:00:00 2001 From: chenbushan Date: Wed, 10 Apr 2024 10:21:16 +0000 Subject: [PATCH 2/7] update framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp. Signed-off-by: chenbushan --- .../codegen/cpp_client_proxy_code_emitter.cpp | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index e57f896f7..726d91043 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -93,9 +93,7 @@ void CppClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFi { headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iproxy_broker"); if (!interface_->IsSerializable() && (!interface_->IsCallback())) { - headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iservmgr_hdi"); - headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log"); - headerFiles.emplace(HeaderFileType::C_STD_HEADER_FILE, "unistd"); + headerFiles.emplace(HeaderFileType::C_STD_HEADER_FILE, "unistd"); } } @@ -146,16 +144,15 @@ void CppClientProxyCodeEmitter::EmitProxyDevmgrDeathCallBack(StringBuilder &sb, sb.Append(trebleTab).Append("const int sleepInterval = 50000;\n"); sb.Append(trebleTab).Append("const int waitTimes = 20;\n"); sb.Append(trebleTab).Append("int currentTime = waitTimes;\n"); - sb.Append(trebleTab).Append("HDF_LOGI(\"hdf_devmgr is dead, reconnecting\");\n"); sb.Append(trebleTab).Append("do {\n"); sb.Append(trebleTab + TAB).Append("usleep(sleepInterval);\n"); sb.Append(trebleTab + TAB).Append("auto proxy = proxy_.promote();\n"); sb.Append(trebleTab + TAB).Append("if (proxy != nullptr) {\n"); - sb.Append(trebleTab + TAB + TAB).Append("result = proxy->Reconnect();\n"); + sb.Append(trebleTab + TAB + TAB).AppendFormat("result = %s::Reconnect(proxy);\n", + EmitDefinitionByInterface(interface_, proxyName_).c_str()); sb.Append(trebleTab + TAB).Append("}\n"); sb.Append(trebleTab + TAB).Append("--currentTime;\n"); sb.Append(trebleTab).Append("} while (result != HDF_SUCCESS && currentTime >0);\n"); - sb.Append(trebleTab).Append("HDF_LOGI(\"hdf_devmgr is dead, reconnect result is %{public}d\", result);\n"); sb.Append(prefix).Append("}\n"); } @@ -250,25 +247,8 @@ void CppClientProxyCodeEmitter::EmitProxyStaticMethodDecl( void CppClientProxyCodeEmitter::EmitProxyReconnectMethodDecl(StringBuilder &sb, const std::string &prefix) const { std::string doubleTab = prefix + TAB; - sb.Append(prefix).Append("int32_t Reconnect() {\n"); - sb.Append(doubleTab).AppendFormat("using namespace %s;\n", devmgrVersionName_.c_str()); - sb.Append(doubleTab).Append("isReconnected_ = false;\n"); - sb.Append(doubleTab).Append("servMgr_ = IServiceManager::Get();\n"); - sb.Append(doubleTab).Append("if (servMgr_ == nullptr) {\n"); - sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); - sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); - sb.Append(doubleTab).Append("}\n"); - sb.Append(doubleTab).Append("reconnectRemote_ = servMgr_->GetService(serviceName_.c_str());\n"); - sb.Append(doubleTab).Append("if (reconnectRemote_ == nullptr) {\n"); - sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get remote object failed!\", __func__);\n"); - sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); - sb.Append(doubleTab).Append("}\n"); - sb.Append(doubleTab).Append("OHOS::HDI::hdi_objcast(servMgr_)->AddDeathRecipient(\n"); - sb.Append(doubleTab + TAB).AppendFormat("new %s::%s(this));\n", - proxyName_.c_str(), devmgrDeathRecipientName_.c_str()); - sb.Append(doubleTab).Append("isReconnected_ = true;\n"); - sb.Append(doubleTab).Append("return HDF_SUCCESS;\n"); - sb.Append(prefix).Append("}\n"); + sb.Append(prefix).AppendFormat("static int32_t Reconnect(sptr<%s> proxy);\n", + EmitDefinitionByInterface(interface_, proxyName_).c_str()); } void CppClientProxyCodeEmitter::EmitProxyGetRemoteMethodDecl(StringBuilder &sb, const std::string &prefix) const @@ -379,6 +359,8 @@ void CppClientProxyCodeEmitter::EmitProxySourceFile() sb.Append("\n"); EmitGetInstanceMethodImpl(sb, ""); sb.Append("\n"); + EmitProxyCppReconnectMethodImpl(sb, ""); + sb.Append("\n"); } EmitProxyCastFromMethodImpls(sb, ""); EmitUtilMethods(sb, "", utilMethods, false); @@ -506,11 +488,12 @@ void CppClientProxyCodeEmitter::EmitGetInstanceMethodInitProxyImpl(StringBuilder std::string objName = "proxy"; std::string serMajorName = "serMajorVer"; std::string serMinorName = "serMinorVer"; - sb.Append(prefix + TAB).AppendFormat("%s->servMgr_ = servMgr;\n", objName.c_str()); - sb.Append(prefix + TAB).AppendFormat("OHOS::HDI::hdi_objcast"); - sb.AppendFormat("(%s->servMgr_)->AddDeathRecipient(\n", objName.c_str()); + sb.Append(prefix + TAB).AppendFormat("%s->servMgr_ = ", objName.c_str()); + sb.Append("OHOS::HDI::hdi_objcast(servMgr);\n"); + sb.Append(prefix + TAB).AppendFormat("%s->servMgr_->AddDeathRecipient(\n", objName.c_str()); sb.Append(prefix + TAB + TAB).AppendFormat("new %s::%s(%s));\n", - proxyName_.c_str(), devmgrDeathRecipientName_.c_str(), objName.c_str()); + EmitDefinitionByInterface(interface_, proxyName_).c_str(), + devmgrDeathRecipientName_.c_str(), objName.c_str()); sb.Append(prefix + TAB).AppendFormat("%s->isReconnected_ = false;\n", objName.c_str()); sb.Append(prefix + TAB).AppendFormat("%s->serviceName_ = serviceName;\n", objName.c_str()); @@ -534,6 +517,40 @@ void CppClientProxyCodeEmitter::EmitGetInstanceMethodInitProxyImpl(StringBuilder sb.Append(prefix).Append("}\n"); } +void CppClientProxyCodeEmitter::EmitProxyCppReconnectMethodImpl(StringBuilder &sb, const std::string &prefix) const +{ + std::string doubleTab = prefix + TAB; + sb.Append(prefix).AppendFormat("int32_t %s::Reconnect(\n", + EmitDefinitionByInterface(interface_, proxyName_).c_str()); + sb.Append(doubleTab).AppendFormat("sptr<%s> proxy) \n", + EmitDefinitionByInterface(interface_, proxyName_).c_str()); + sb.Append(prefix).Append("{\n"); + sb.Append(doubleTab).Append("if (proxy == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGW(\"Reconnect failed : input proxy is null\");\n"); + sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); + sb.Append(doubleTab).Append("}\n"); + sb.Append(doubleTab).AppendFormat("using namespace %s;\n", devmgrVersionName_.c_str()); + sb.Append(doubleTab).Append("proxy->isReconnected_ = false;\n"); + sb.Append(doubleTab).Append("proxy->servMgr_ = \n"); + sb.Append(doubleTab + TAB).Append("OHOS::HDI::hdi_objcast(IServiceManager::Get());\n"); + sb.Append(doubleTab).Append("if (proxy->servMgr_ == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); + sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); + sb.Append(doubleTab).Append("}\n"); + sb.Append(doubleTab).Append("proxy->reconnectRemote_ = \n"); + sb.Append(doubleTab + TAB).Append("proxy->servMgr_->GetService(proxy->serviceName_.c_str());\n"); + sb.Append(doubleTab).Append("if (proxy->reconnectRemote_ == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get remote object failed!\", __func__);\n"); + sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); + sb.Append(doubleTab).Append("}\n"); + sb.Append(doubleTab).Append("proxy->servMgr_->AddDeathRecipient(\n"); + sb.Append(doubleTab + TAB).AppendFormat("new %s::%s(proxy));\n", + EmitDefinitionByInterface(interface_, proxyName_).c_str(), devmgrDeathRecipientName_.c_str()); + sb.Append(doubleTab).Append("proxy->isReconnected_ = true;\n"); + sb.Append(doubleTab).Append("return HDF_SUCCESS;\n"); + sb.Append(prefix).Append("}\n"); +} + void CppClientProxyCodeEmitter::EmitProxyPassthroughtLoadImpl(StringBuilder &sb, const std::string &prefix) const { sb.Append(prefix).AppendFormat("if (isStub) {\n"); -- Gitee From 1d5fad4f0b348f74fe681210335e7345a7e9ffb0 Mon Sep 17 00:00:00 2001 From: chenbushan Date: Wed, 10 Apr 2024 10:21:50 +0000 Subject: [PATCH 3/7] update framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h. Signed-off-by: chenbushan --- framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index c52a1a693..86495cc5e 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -110,6 +110,8 @@ private: void EmitProxyGetRemoteMethodDecl(StringBuilder &sb, const std::string &prefix) const; void EmitGetInstanceMethodInitProxyImpl(StringBuilder &sb, const std::string &prefix) const; + + void EmitProxyCppReconnectMethodImpl(StringBuilder &sb, const std::string &prefix) const; }; } // namespace HDI } // namespace OHOS -- Gitee From ba1b82d3a57600554f2642a13c155a3aea60d7bb Mon Sep 17 00:00:00 2001 From: chenbushan Date: Wed, 10 Apr 2024 13:29:15 +0000 Subject: [PATCH 4/7] update framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp. Signed-off-by: chenbushan --- .../tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 726d91043..c273fdb13 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -262,7 +262,7 @@ void CppClientProxyCodeEmitter::EmitProxyPublicMembers(StringBuilder &sb, const { sb.Append(prefix).Append("bool isReconnected_;\n"); sb.Append(prefix).Append("std::string serviceName_;\n"); - sb.Append(prefix).AppendFormat("sptr<%s::IServiceManager> servMgr_;\n", devmgrVersionName_.c_str()); + sb.Append(prefix).AppendFormat("sptr servMgr_;\n", devmgrVersionName_.c_str()); sb.Append(prefix).Append("sptr reconnectRemote_;\n"); } @@ -538,7 +538,8 @@ void CppClientProxyCodeEmitter::EmitProxyCppReconnectMethodImpl(StringBuilder &s sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); sb.Append(doubleTab).Append("}\n"); sb.Append(doubleTab).Append("proxy->reconnectRemote_ = \n"); - sb.Append(doubleTab + TAB).Append("proxy->servMgr_->GetService(proxy->serviceName_.c_str());\n"); + sb.Append(doubleTab + TAB).Append( + "OHOS::HDI::hdi_facecast(proxy->servMgr_)->GetService(proxy->serviceName_.c_str());\n"); sb.Append(doubleTab).Append("if (proxy->reconnectRemote_ == nullptr) {\n"); sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get remote object failed!\", __func__);\n"); sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); -- Gitee From 074a37688a0a19a54183a2cc786d181c365c61b3 Mon Sep 17 00:00:00 2001 From: chenbushan Date: Thu, 11 Apr 2024 07:12:38 +0000 Subject: [PATCH 5/7] update framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h. Signed-off-by: chenbushan --- .../tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h index 86495cc5e..7c5239274 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.h @@ -15,7 +15,8 @@ namespace OHOS { namespace HDI { class CppClientProxyCodeEmitter : public CppCodeEmitter { public: - CppClientProxyCodeEmitter() : CppCodeEmitter() { + CppClientProxyCodeEmitter() : CppCodeEmitter() + { devmgrDeathRecipientName_ = "IServiceManagerDeathRecipient"; devmgrVersionName_ = "OHOS::HDI::ServiceManager::V1_0"; } -- Gitee From ed3bf7ae0da3587d83540d8850e9a7aded7bd50f Mon Sep 17 00:00:00 2001 From: chenbushan Date: Thu, 11 Apr 2024 07:13:08 +0000 Subject: [PATCH 6/7] update framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp. Signed-off-by: chenbushan --- .../hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index c273fdb13..124029800 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -123,7 +123,7 @@ void CppClientProxyCodeEmitter::EmitProxyDevmgrDeathRecipient(StringBuilder &sb, { std::string doubleTab = prefix + TAB; sb.Append(prefix).AppendFormat("class %s : public IRemoteObject::DeathRecipient {\n", - devmgrDeathRecipientName_.c_str()); + devmgrDeathRecipientName_.c_str()); sb.Append(prefix).Append("public:\n"); sb.Append(doubleTab).AppendFormat("%s(wptr<%s> proxy) : proxy_(proxy) {} \n", devmgrDeathRecipientName_.c_str(), EmitDefinitionByInterface(interface_, proxyName_).c_str()); @@ -247,7 +247,7 @@ void CppClientProxyCodeEmitter::EmitProxyStaticMethodDecl( void CppClientProxyCodeEmitter::EmitProxyReconnectMethodDecl(StringBuilder &sb, const std::string &prefix) const { std::string doubleTab = prefix + TAB; - sb.Append(prefix).AppendFormat("static int32_t Reconnect(sptr<%s> proxy);\n", + sb.Append(prefix).AppendFormat("static int32_t Reconnect(sptr<%s> proxy);\n", EmitDefinitionByInterface(interface_, proxyName_).c_str()); } @@ -522,7 +522,7 @@ void CppClientProxyCodeEmitter::EmitProxyCppReconnectMethodImpl(StringBuilder &s std::string doubleTab = prefix + TAB; sb.Append(prefix).AppendFormat("int32_t %s::Reconnect(\n", EmitDefinitionByInterface(interface_, proxyName_).c_str()); - sb.Append(doubleTab).AppendFormat("sptr<%s> proxy) \n", + sb.Append(doubleTab).AppendFormat("sptr<%s> proxy) \n", EmitDefinitionByInterface(interface_, proxyName_).c_str()); sb.Append(prefix).Append("{\n"); sb.Append(doubleTab).Append("if (proxy == nullptr) {\n"); @@ -545,7 +545,7 @@ void CppClientProxyCodeEmitter::EmitProxyCppReconnectMethodImpl(StringBuilder &s sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); sb.Append(doubleTab).Append("}\n"); sb.Append(doubleTab).Append("proxy->servMgr_->AddDeathRecipient(\n"); - sb.Append(doubleTab + TAB).AppendFormat("new %s::%s(proxy));\n", + sb.Append(doubleTab + TAB).AppendFormat("new %s::%s(proxy));\n", EmitDefinitionByInterface(interface_, proxyName_).c_str(), devmgrDeathRecipientName_.c_str()); sb.Append(doubleTab).Append("proxy->isReconnected_ = true;\n"); sb.Append(doubleTab).Append("return HDF_SUCCESS;\n"); -- Gitee From f5f9cf5783c8f3ae957003c4968c8bd82243c1af Mon Sep 17 00:00:00 2001 From: chenbushan Date: Fri, 12 Apr 2024 11:52:12 +0000 Subject: [PATCH 7/7] update framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp. Signed-off-by: chenbushan --- .../codegen/cpp_client_proxy_code_emitter.cpp | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 124029800..50b5eb261 100644 --- a/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/framework/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -531,17 +531,21 @@ void CppClientProxyCodeEmitter::EmitProxyCppReconnectMethodImpl(StringBuilder &s sb.Append(doubleTab).Append("}\n"); sb.Append(doubleTab).AppendFormat("using namespace %s;\n", devmgrVersionName_.c_str()); sb.Append(doubleTab).Append("proxy->isReconnected_ = false;\n"); - sb.Append(doubleTab).Append("proxy->servMgr_ = \n"); - sb.Append(doubleTab + TAB).Append("OHOS::HDI::hdi_objcast(IServiceManager::Get());\n"); - sb.Append(doubleTab).Append("if (proxy->servMgr_ == nullptr) {\n"); - sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); + sb.Append(doubleTab).Append("auto iServMgr = IServiceManager::Get();\n"); + sb.Append(doubleTab).Append("if (iServMgr == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGW(\"Reconnect failed : iServMgr is null\");\n"); sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); - sb.Append(doubleTab).Append("}\n"); - sb.Append(doubleTab).Append("proxy->reconnectRemote_ = \n"); - sb.Append(doubleTab + TAB).Append( - "OHOS::HDI::hdi_facecast(proxy->servMgr_)->GetService(proxy->serviceName_.c_str());\n"); + sb.Append(doubleTab).Append("};\n"); + sb.Append(doubleTab).Append("proxy->reconnectRemote_ = "); + sb.Append("iServMgr->GetService(proxy->serviceName_.c_str());\n"); sb.Append(doubleTab).Append("if (proxy->reconnectRemote_ == nullptr) {\n"); - sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get remote object failed!\", __func__);\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGW(\"Reconnect failed : reconnectRemote_ is null\");\n"); + sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); + sb.Append(doubleTab).Append("}\n"); + sb.Append(doubleTab).Append("proxy->servMgr_ = "); + sb.Append("OHOS::HDI::hdi_objcast(iServMgr);\n"); + sb.Append(doubleTab).Append("if (proxy->servMgr_ == nullptr) {\n"); + sb.Append(doubleTab + TAB).Append("HDF_LOGE(\"%{public}s:get IServiceManager failed!\", __func__);\n"); sb.Append(doubleTab + TAB).Append("return HDF_FAILURE;\n"); sb.Append(doubleTab).Append("}\n"); sb.Append(doubleTab).Append("proxy->servMgr_->AddDeathRecipient(\n"); -- Gitee