diff --git a/adapter/uhdf2/host/src/devmgr_service_proxy.c b/adapter/uhdf2/host/src/devmgr_service_proxy.c deleted file mode 100644 index 8cf1fe2d2c9726f5c3f0e7d3ebddaeaa4eace1e9..0000000000000000000000000000000000000000 --- a/adapter/uhdf2/host/src/devmgr_service_proxy.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright (c) 2021-2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "devmgr_service_proxy.h" -#include "devhost_service_stub.h" -#include "devmgr_service_if.h" -#include "devmgr_service_stub.h" -#include "devsvc_manager_clnt.h" -#include "hdf_base.h" -#include "hdf_log.h" -#include "hdf_sbuf.h" -#include "osal_mem.h" - -#define HDF_LOG_TAG devmgr_service_proxy - -int DevmgrServiceProxyAttachDeviceHost(struct IDevmgrService *inst, uint16_t hostId, struct IDevHostService *service) -{ - int status = HDF_FAILURE; - struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC); - struct HdfSBuf *reply = HdfSbufTypedObtain(SBUF_IPC); - struct HdfRemoteDispatcher *dipatcher = NULL; - struct HdfRemoteService *remoteService = NULL; - struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst; - struct DevHostServiceStub *hostStub = (struct DevHostServiceStub *)service; - if ((serviceProxy->remote == NULL) || (data == NULL) || (reply == NULL) || (hostStub == NULL)) { - HDF_LOGE("DevmgrServiceProxyAttachDeviceHost failed, host id is %{public}u", hostId); - goto FINISHED; - } - remoteService = serviceProxy->remote; - dipatcher = remoteService->dispatcher; - if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteInt32(data, hostId) || - HdfSbufWriteRemoteService(data, hostStub->remote) != HDF_SUCCESS) { - HDF_LOGE("failed to attach host, write sbuf error"); - goto FINISHED; - } - status = dipatcher->Dispatch(remoteService, DEVMGR_SERVICE_ATTACH_DEVICE_HOST, data, reply); - HDF_LOGI("Attach device host dispatch finish, status is %{public}d", status); -FINISHED: - HdfSbufRecycle(reply); - HdfSbufRecycle(data); - return status; -} - -int DevmgrServiceProxyAttachDevice(struct IDevmgrService *inst, struct IHdfDeviceToken *token) -{ - int status = HDF_FAILURE; - struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC); - struct HdfSBuf *reply = HdfSbufTypedObtain(SBUF_IPC); - struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst; - if (serviceProxy == NULL || serviceProxy->remote == NULL || data == NULL || reply == NULL || token == NULL) { - HDF_LOGE("DevmgrServiceProxyAttachDevice failed"); - goto FINISHED; - } - struct HdfRemoteService *remoteService = serviceProxy->remote; - const char *srvName = (token->servName == NULL) ? "" : token->servName; - const char *deviceName = (token->deviceName == NULL) ? "" : token->deviceName; - if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteInt32(data, token->devid) || - !HdfSbufWriteString(data, srvName) || !HdfSbufWriteString(data, deviceName)) { - goto FINISHED; - } - - status = remoteService->dispatcher->Dispatch(remoteService, DEVMGR_SERVICE_ATTACH_DEVICE, data, reply); -FINISHED: - HdfSbufRecycle(reply); - HdfSbufRecycle(data); - return status; -} - -int DevmgrServiceProxyDetachDevice(struct IDevmgrService *inst, devid_t devid) -{ - int status = HDF_FAILURE; - struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC); - struct HdfSBuf *reply = HdfSbufTypedObtain(SBUF_IPC); - struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst; - if (serviceProxy == NULL || serviceProxy->remote == NULL || data == NULL || reply == NULL) { - HDF_LOGE("DevmgrServiceProxyDetachDevice failed"); - goto FINISHED; - } - struct HdfRemoteService *remoteService = serviceProxy->remote; - if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteInt32(data, devid)) { - goto FINISHED; - } - - status = remoteService->dispatcher->Dispatch(remoteService, DEVMGR_SERVICE_DETACH_DEVICE, data, reply); -FINISHED: - HdfSbufRecycle(reply); - HdfSbufRecycle(data); - return status; -} - -static int DevmgrServiceProxyProcessLoad(struct IDevmgrService *inst, const char *svcName, int code) -{ - struct DevmgrServiceProxy *serviceProxy = (struct DevmgrServiceProxy *)inst; - if (serviceProxy == NULL || serviceProxy->remote == NULL || svcName == NULL) { - HDF_LOGE("DevmgrServiceProxyProcessLoad code: %{public}d failed", code); - return HDF_ERR_INVALID_PARAM; - } - - struct HdfSBuf *data = HdfSbufTypedObtain(SBUF_IPC); - struct HdfRemoteService *remoteService = serviceProxy->remote; - if (!HdfRemoteServiceWriteInterfaceToken(remoteService, data) || !HdfSbufWriteString(data, svcName)) { - HdfSbufRecycle(data); - return HDF_FAILURE; - } - - int status = remoteService->dispatcher->Dispatch(remoteService, code, data, NULL); - HdfSbufRecycle(data); - return status; -} - -int DevmgrServiceProxyLoadDevice(struct IDevmgrService *inst, const char *svcName) -{ - return DevmgrServiceProxyProcessLoad(inst, svcName, DEVMGR_SERVICE_LOAD_DEVICE); -} - -int DevmgrServiceProxyUnLoadDevice(struct IDevmgrService *inst, const char *svcName) -{ - return DevmgrServiceProxyProcessLoad(inst, svcName, DEVMGR_SERVICE_UNLOAD_DEVICE); -} - -static void DevmgrServiceProxyConstruct(struct DevmgrServiceProxy *inst) -{ - struct IDevmgrService *pvtbl = (struct IDevmgrService *)inst; - pvtbl->AttachDeviceHost = DevmgrServiceProxyAttachDeviceHost; - pvtbl->AttachDevice = DevmgrServiceProxyAttachDevice; - pvtbl->DetachDevice = DevmgrServiceProxyDetachDevice; - pvtbl->LoadDevice = DevmgrServiceProxyLoadDevice; - pvtbl->UnloadDevice = DevmgrServiceProxyUnLoadDevice; - pvtbl->StartService = NULL; -} - -static struct IDevmgrService *DevmgrServiceProxyObtain(struct HdfRemoteService *service) -{ - if (service != NULL) { - struct DevmgrServiceProxy *demgrServicProxy = - (struct DevmgrServiceProxy *)OsalMemCalloc(sizeof(struct DevmgrServiceProxy)); - if (demgrServicProxy != NULL) { - demgrServicProxy->remote = service; - DevmgrServiceProxyConstruct(demgrServicProxy); - return &demgrServicProxy->super; - } - } - HDF_LOGE("DevmgrServiceProxyObtain failed"); - return NULL; -} - -struct HdfObject *DevmgrServiceProxyCreate(void) -{ - static struct IDevmgrService *instance = NULL; - if (instance != NULL) { - return (struct HdfObject *)instance; - } - struct IDevSvcManager *serviceManagerIf = NULL; - struct DevSvcManagerClnt *serviceManager = (struct DevSvcManagerClnt *)DevSvcManagerClntGetInstance(); - if ((serviceManager == NULL) || (serviceManager->devSvcMgrIf == NULL)) { - HDF_LOGE("Fail to Create Service Manager Client"); - return NULL; - } - serviceManagerIf = serviceManager->devSvcMgrIf; - if (serviceManagerIf->GetService == NULL) { - HDF_LOGE("Get Service is not implement!!!"); - return NULL; - } - struct HdfRemoteService *remote = - (struct HdfRemoteService *)serviceManagerIf->GetService(serviceManagerIf, DEVICE_MANAGER_SERVICE); - if (remote != NULL) { - if (!HdfRemoteServiceSetInterfaceDesc(remote, "HDI.IDeviceManager.V1_0")) { - HDF_LOGE("%{public}s: failed to init interface desc", __func__); - HdfRemoteServiceRecycle(remote); - return NULL; - } - instance = DevmgrServiceProxyObtain(remote); - } - - return (struct HdfObject *)instance; -} - -void DevmgrServiceProxyRelease(struct HdfObject *object) -{ - struct DevmgrServiceProxy *instance = (struct DevmgrServiceProxy *)object; - if (instance != NULL) { - if (instance->remote != NULL) { - HdfRemoteServiceRecycle(instance->remote); - instance->remote = NULL; - } - OsalMemFree(instance); - } -} diff --git a/framework/core/manager/src/devmgr_service.c b/framework/core/manager/src/devmgr_service.c index 38c7b3bddafdf7a38d96e298c8c6fb0c4472d2b3..7462974a636c9c4aa542eeaf5eb554a547685108 100644 --- a/framework/core/manager/src/devmgr_service.c +++ b/framework/core/manager/src/devmgr_service.c @@ -403,10 +403,10 @@ int DevmgrServiceStartService(struct IDevmgrService *inst) return HDF_FAILURE; } - ret = DevSvcManagerStartService(); - HDF_LOGI("start svcmgr result %{public}d", ret); - - return DevmgrServiceStartDeviceHosts(dmService); + ret = DevmgrServiceStartDeviceHosts(dmService); + HDF_LOGI("init DeviceHosts info result: %{public}d", ret); + HDF_LOGI("start svcmgr result %{public}d", DevSvcManagerStartService()); + return ret; } int DevmgrServicePowerStateChange(struct IDevmgrService *devmgrService, enum HdfPowerState powerState) 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 a94942b9e936856f8e76d467bf3720797e3b1de6..31d06650ea3f51fa9b5c9c3c710839143f119e6e 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 @@ -59,6 +59,8 @@ void CppClientProxyCodeEmitter::EmitProxyHeaderFile() sb.Append("\n"); EmitProxyHeaderInclusions(sb); sb.Append("\n"); + EmitLogTagMacro(sb, FileName(proxyName_)); + sb.Append("\n"); EmitBeginNamespace(sb); sb.Append("\n"); EmitProxyDecl(sb, ""); @@ -92,6 +94,9 @@ void CppClientProxyCodeEmitter::EmitProxyHeaderInclusions(StringBuilder &sb) void CppClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFileSet &headerFiles) const { headerFiles.emplace(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iproxy_broker"); + 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,15 +105,54 @@ 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"); + EmitProxyDevmgrDeathRecipient(sb, TAB); + sb.Append("\n"); EmitProxyConstructor(sb, TAB); sb.Append("\n"); EmitProxyMethodDecls(sb, TAB); sb.Append("\n"); + 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 IRmoteObject::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(doubleTab).Append("private:\n"); + sb.Append(doubleTab + TAB).AppendFormat("wptr<%s> proxy_;\n", + EmitDefinitionByInterface(interface_, proxyName_).c_str()); + sb.Append(doubleTab).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 inst sleepInterval = 50000;\n"); + sb.Append(trebleTab).Append("const int waitTimes = 20;\n"); + sb.Append(trebleTab).Append("int currentTime = waitTimes;\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()); @@ -137,6 +181,9 @@ void CppClientProxyCodeEmitter::EmitProxyMethodDecls(StringBuilder &sb, const st sb.Append("\n"); EmitProxyStaticMethodDecl(interface_->GetVersionMethod(), sb, prefix); } + EmitProxyReconnectMethodDecl(sb, prefix); + sb.Append("\n"); + EmitProxyGetRemoteMethodDecl(sb, prefix); } void CppClientProxyCodeEmitter::EmitProxyMethodDecl( @@ -187,6 +234,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,14 +458,12 @@ 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"; 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"); @@ -392,13 +476,26 @@ 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(), - ((StringHelper::StartWith(interfaceName_, "I") ? interfaceName_.substr(1) : interfaceName_) + - "Proxy").c_str()); + EmitDefinitionByInterface(interface_, interfaceName_).c_str(), objName.c_str(), proxyName_.c_str()); sb.Append(prefix + TAB).AppendFormat("if (%s == nullptr) {\n", objName.c_str()); 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()); @@ -621,7 +718,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodBody(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