From e204bca72d3c2bfc43676640ddc4ab533a170cb5 Mon Sep 17 00:00:00 2001 From: yue Date: Wed, 16 Mar 2022 20:25:54 +0800 Subject: [PATCH] fixed 7e6666b from https://gitee.com/yueyan233/drivers_framework/pulls/789 fix:modify HDI-C code and add interface interface check Signed-off-by: yue --- tools/hdi-gen/ast/ast_array_type.cpp | 4 +- tools/hdi-gen/ast/ast_interface_type.cpp | 19 ++ tools/hdi-gen/ast/ast_interface_type.h | 15 + tools/hdi-gen/ast/ast_list_type.cpp | 4 +- .../codegen/c_client_proxy_code_emitter.cpp | 309 +++++++++--------- .../codegen/c_client_proxy_code_emitter.h | 27 +- tools/hdi-gen/codegen/c_code_emitter.cpp | 5 + tools/hdi-gen/codegen/c_code_emitter.h | 11 +- .../codegen/c_interface_code_emitter.cpp | 15 +- .../codegen/c_interface_code_emitter.h | 2 + .../codegen/c_service_driver_code_emitter.cpp | 43 ++- .../codegen/c_service_impl_code_emitter.cpp | 98 +++++- .../codegen/c_service_impl_code_emitter.h | 6 +- .../codegen/c_service_stub_code_emitter.cpp | 247 +++++++------- .../codegen/c_service_stub_code_emitter.h | 10 +- .../codegen/cpp_client_proxy_code_emitter.cpp | 4 +- tools/hdi-gen/codegen/cpp_code_emitter.h | 9 - .../codegen/cpp_interface_code_emitter.cpp | 2 +- .../cpp_service_driver_code_emitter.cpp | 2 +- .../codegen/cpp_service_stub_code_emitter.cpp | 2 +- tools/hdi-gen/parser/parser.cpp | 23 +- 21 files changed, 508 insertions(+), 349 deletions(-) diff --git a/tools/hdi-gen/ast/ast_array_type.cpp b/tools/hdi-gen/ast/ast_array_type.cpp index 38fbd262..870378e6 100644 --- a/tools/hdi-gen/ast/ast_array_type.cpp +++ b/tools/hdi-gen/ast/ast_array_type.cpp @@ -317,14 +317,14 @@ void ASTArrayType::EmitCStringElementUnMarshalling(const String& name, const Str sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), element.string()); sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n\n"); sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", name.string(), element.string(), element.string()); sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", element.string()); - sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n"); } else { sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", diff --git a/tools/hdi-gen/ast/ast_interface_type.cpp b/tools/hdi-gen/ast/ast_interface_type.cpp index 5db83ea2..41157275 100644 --- a/tools/hdi-gen/ast/ast_interface_type.cpp +++ b/tools/hdi-gen/ast/ast_interface_type.cpp @@ -141,6 +141,25 @@ void ASTInterfaceType::EmitCWriteVar(const String& parcelName, const String& nam sb.Append(prefix).Append("}\n"); } +void ASTInterfaceType::EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, + const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const +{ + String remoteName = String::Format("%sRemote", name.string()); + String miName = name_.StartsWith("I") ? name_.Substring(1) : name_; + + sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = HdfSbufReadRemoteService(%s);\n", + remoteName.string(), parcelName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string()); + sb.Append(prefix + g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", remoteName.string()); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", ecName.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); + sb.Append(prefix).Append("}\n"); + + sb.Append(prefix).AppendFormat("*%s = %sGet(%s);\n", + name.string(), miName.string(), remoteName.string()); +} + void ASTInterfaceType::EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const { diff --git a/tools/hdi-gen/ast/ast_interface_type.h b/tools/hdi-gen/ast/ast_interface_type.h index 08fbb295..3a9465a0 100644 --- a/tools/hdi-gen/ast/ast_interface_type.h +++ b/tools/hdi-gen/ast/ast_interface_type.h @@ -43,6 +43,7 @@ public: inline void SetCallback(bool callback) { isCallback_ = callback; + SetSerializable(callback); } inline bool IsCallback() @@ -50,6 +51,16 @@ public: return isCallback_; } + inline void SetSerializable(bool isSerializable) + { + isSerializable_ = isSerializable; + } + + inline bool IsSerializable() + { + return isSerializable_; + } + inline void SetFull(bool full) { isFull_ = full; @@ -108,6 +119,9 @@ public: void EmitCWriteVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + void EmitCProxyReadVar(const String& parcelName, const String& name, bool isInnerType, const String& ecName, + const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; + void EmitCStubReadVar(const String& parcelName, const String& name, const String& ecName, const String& gotoLabel, StringBuilder& sb, const String& prefix) const override; @@ -129,6 +143,7 @@ private: String license_; bool isOneWay_ = false; bool isCallback_ = false; + bool isSerializable_ = false; bool isFull_ = false; bool isLite_ = false; std::vector> methods_; diff --git a/tools/hdi-gen/ast/ast_list_type.cpp b/tools/hdi-gen/ast/ast_list_type.cpp index f515a080..4d74150e 100644 --- a/tools/hdi-gen/ast/ast_list_type.cpp +++ b/tools/hdi-gen/ast/ast_list_type.cpp @@ -320,13 +320,13 @@ void ASTListType::EmitCStringElementUnMarshalling(const String& name, const Stri sb.Append(newPrefix).AppendFormat("%s[i] = (char*)OsalMemCalloc(strlen(%s) + 1);\n", name.string(), element.string()); sb.Append(newPrefix).AppendFormat("if (%s[i] == NULL) {\n", name.string()); - sb.Append(newPrefix + g_tab).AppendFormat("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n\n"); sb.Append(newPrefix).AppendFormat("if (strcpy_s((%s)[i], (strlen(%s) + 1), %s) != HDF_SUCCESS) {\n", name.string(), element.string(), element.string()); sb.Append(newPrefix + g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: read %s failed!\", __func__);\n", element.string()); - sb.Append(newPrefix + g_tab).Append("goto errors;\n"); + sb.Append(newPrefix + g_tab).AppendFormat("goto %s;\n", gotoLabel.string()); sb.Append(newPrefix).Append("}\n"); } else { sb.Append(newPrefix).Append(g_tab).AppendFormat("%s[i] = strdup(%s);\n", diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp index c2caafa0..c99bc368 100644 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.cpp @@ -55,25 +55,8 @@ void CClientProxyCodeEmitter::EmitProxySourceFile() EmitProxyMethodImpls(sb); sb.Append("\n"); EmitProxyConstruction(sb); - if (!isCallbackInterface()) { - sb.Append("\n"); - EmitProxyGetMethodImpl(sb); - sb.Append("\n"); - if (isKernelCode_) { - EmitKernelProxyGetInstanceMethodImpl(sb); - sb.Append("\n"); - EmitKernelProxyReleaseMethodImpl(sb); - } else { - EmitProxyGetInstanceMethodImpl(sb); - sb.Append("\n"); - EmitProxyReleaseMethodImpl(sb); - } - } else { - sb.Append("\n"); - EmitCbProxyGetMethodImpl(sb); - sb.Append("\n"); - EmitProxyReleaseMethodImpl(sb); - } + sb.Append("\n"); + EmitProxyExternalMethodImpl(sb); String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -233,8 +216,13 @@ void CClientProxyCodeEmitter::EmitProxyMethodBody(const AutoPtr& meth sb.Append("\n"); EmitCreateBuf(dataParcelName_, replyParcelName_, sb, prefix + g_tab); - sb.Append("\n"); + if (!isKernelCode_) { + sb.Append("\n"); + EmitWriteInterfaceToken(dataParcelName_, sb, prefix + g_tab); + } + + sb.Append("\n"); for (size_t i = 0; i < method->GetParameterNumber(); i++) { AutoPtr param = method->GetParameter(i); if (param->GetAttribute() == ParamAttr::PARAM_IN) { @@ -285,6 +273,17 @@ void CClientProxyCodeEmitter::EmitCreateBuf(const String& dataBufName, const Str sb.Append(prefix).Append("}\n"); } +void CClientProxyCodeEmitter::EmitWriteInterfaceToken(const String& dataBufName, StringBuilder& sb, + const String& prefix) +{ + sb.Append(prefix).AppendFormat("if (!HdfRemoteServiceWriteInterfaceToken(self->AsObject(self), %s)) {\n", + dataBufName.string()); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: write interface token failed!\", __func__);\n"); + sb.Append(prefix + g_tab).AppendFormat("%s = HDF_ERR_INVALID_PARAM;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("goto %s;\n", finishedLabelName_); + sb.Append(prefix).Append("}\n"); +} + void CClientProxyCodeEmitter::EmitReleaseBuf(const String& dataBufName, const String& replyBufName, StringBuilder& sb, const String& prefix) { @@ -379,6 +378,34 @@ void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb) sb.Append("}\n"); } +void CClientProxyCodeEmitter::EmitProxyExternalMethodImpl(StringBuilder& sb) +{ + String objName = "client"; + String serMajorName = "serMajorVer"; + String serMinorName = "serMinorVer"; + String remoteName = "remote"; + String serviceName = "serviceName"; + + if (isKernelCode_) { + remoteName = "serv"; + EmitProxyGetMethodImpl(sb); + sb.Append("\n"); + EmitKernelProxyGetInstanceMethodImpl(objName, serMajorName, serMinorName, remoteName, serviceName, sb); + sb.Append("\n"); + EmitProxyReleaseMethodImpl(remoteName, "HdfIoServiceRecycle", sb); + } else if (interface_->IsSerializable()) { + EmitCbProxyGetMethodImpl(objName, serMajorName, serMinorName, remoteName, sb); + sb.Append("\n"); + EmitProxyReleaseMethodImpl(remoteName, "HdfRemoteServiceRecycle", sb); + } else { + EmitProxyGetMethodImpl(sb); + sb.Append("\n"); + EmitProxyGetInstanceMethodImpl(objName, serMajorName, serMinorName, remoteName, serviceName, sb); + sb.Append("\n"); + EmitProxyReleaseMethodImpl(remoteName, "HdfRemoteServiceRecycle", sb); + } +} + void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) { sb.AppendFormat("struct %s *%sGet()\n", interfaceName_.string(), baseName_.string()); @@ -387,136 +414,140 @@ void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb) sb.Append("}\n"); } -void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb) +void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(const String& objName, const String& serMajorName, + const String& serMinorName, const String& remoteName, const String& serviceName, StringBuilder& sb) { - String objName = "client"; - String SerMajorName = "serMajorVer"; - String SerMinorName = "serMinorVer"; - sb.AppendFormat("struct %s *%sGetInstance(const char *instanceName)\n", - interfaceName_.string(), baseName_.string()); + sb.AppendFormat("struct %s *%sGetInstance(const char *%s)\n", interfaceName_.string(), baseName_.string(), + serviceName.string()); sb.Append("{\n"); - sb.Append(g_tab).Append("struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();\n"); - sb.Append(g_tab).Append("if (serviceMgr == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: HDIServiceManager not found!\", __func__);\n"); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).Append("struct HdfRemoteService *remote = "); - sb.Append("serviceMgr->GetService(serviceMgr, instanceName);\n"); - sb.Append(g_tab).Append("HDIServiceManagerRelease(serviceMgr);\n"); - sb.Append(g_tab).Append("if (remote == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", - baseName_.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = ", baseName_.string()); - sb.AppendFormat("(struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", baseName_.string(), - baseName_.string()); - sb.Append(g_tab).Append("if (proxy == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: malloc %s proxy failed!\", __func__);\n", interfaceName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HdfRemoteServiceRecycle(remote);\n"); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).Append("proxy->remote = remote;\n"); - sb.Append(g_tab).AppendFormat("struct %s *%s = &proxy->impl;\n", interfaceName_.string(), objName.string()); - sb.Append(g_tab).AppendFormat("%sProxyConstruct(%s);\n", baseName_.string(), objName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMajorName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMinorName.string()); - sb.Append(g_tab).AppendFormat("int32_t %s = %s->GetVersion(%s, &%s, &%s);\n", - errorCodeName_.string(), objName.string(), objName.string(), SerMajorName.string(), SerMinorName.string()); - sb.Append(g_tab).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: get version failed!\", __func__);\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", baseName_.string(), objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("if (%s != %s) {\n", SerMajorName.string(), majorVerName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s:check version failed! "); - sb.Append("version of service:%u.%u, version of client:%u.%u\", __func__,\n"); - sb.Append(g_tab).Append(g_tab).Append(g_tab).AppendFormat("%s, %s, %s, %s);\n", SerMajorName.string(), - SerMinorName.string(), majorVerName_.string(), minorVerName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", baseName_.string(), objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); + EmitProxyGetRemoteService(remoteName, serviceName, sb, g_tab); + sb.Append("\n"); + EmitProxySetInterfaceDesc(remoteName, "HdfRemoteServiceRecycle", sb, g_tab); + sb.Append("\n"); + EmitProxyCreateProxyObject(objName, remoteName, "HdfRemoteServiceRecycle", sb, g_tab); + sb.Append("\n"); + EmitProxyCheckVersion(objName, serMajorName, serMinorName, sb, g_tab); + sb.Append("\n"); sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); sb.Append("}\n"); } -void CClientProxyCodeEmitter::EmitKernelProxyGetInstanceMethodImpl(StringBuilder& sb) +void CClientProxyCodeEmitter::EmitKernelProxyGetInstanceMethodImpl(const String& objName, const String& serMajorName, + const String& serMinorName, const String& remoteName, const String& serviceName, StringBuilder& sb) { - sb.AppendFormat("struct %s *%sGetInstance(const char* serviceName)\n", interfaceName_.string(), baseName_.string()); + sb.AppendFormat("struct %s *%sGetInstance(const char* %s)\n", interfaceName_.string(), baseName_.string(), + serviceName.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct HdfIoService *serv = "); - sb.Append("HdfIoServiceBind(serviceName);\n"); - sb.Append(g_tab).Append("if (serv == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", baseName_.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n"); + EmitProxyGetRemoteService(remoteName, serviceName, sb, g_tab); sb.Append("\n"); + EmitProxyCreateProxyObject(objName, remoteName, "HdfIoServiceRecycle", sb, g_tab); + sb.Append("\n"); + EmitProxyCheckVersion(objName, serMajorName, serMinorName, sb, g_tab); + sb.Append("\n"); + sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); + sb.Append("}\n"); +} - sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = (struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", +void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(const String& objName, const String& serMajorName, + const String& serMinorName, const String& remoteName, StringBuilder& sb) +{ + sb.AppendFormat("struct %s *%sGet(struct HdfRemoteService *%s)\n", interfaceName_.string(), baseName_.string(), + remoteName.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", remoteName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: remote is null\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + EmitProxySetInterfaceDesc(remoteName, "HdfRemoteServiceRecycle", sb, g_tab); + sb.Append("\n"); + EmitProxyCreateProxyObject(objName, remoteName, "HdfRemoteServiceRecycle", sb, g_tab); + sb.Append("\n"); + EmitProxyCheckVersion(objName, serMajorName, serMinorName, sb, g_tab); + sb.Append("\n"); + sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); + sb.Append("}\n"); +} + +void CClientProxyCodeEmitter::EmitProxyGetRemoteService(const String& remoteName, const String& serviceName, + StringBuilder& sb, const String& prefix) +{ + if (!isKernelCode_) { + sb.Append(prefix).Append("struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();\n"); + sb.Append(prefix).Append("if (serviceMgr == NULL) {\n"); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: HDIServiceManager not found!\", __func__);\n"); + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("struct HdfRemoteService *%s = ", remoteName.string()); + sb.AppendFormat("serviceMgr->GetService(serviceMgr, %s);\n", serviceName.string()); + sb.Append(prefix).Append("HDIServiceManagerRelease(serviceMgr);\n"); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string()); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: failed to get remote!\", __func__);\n"); + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n"); + } else { + sb.Append(prefix).AppendFormat("struct HdfIoService *%s = ", remoteName.string()); + sb.AppendFormat("HdfIoServiceBind(%s);\n", serviceName.string()); + sb.Append(prefix).AppendFormat("if (%s == NULL) {\n", remoteName.string()); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: failed to get io service!\", __func__);\n"); + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n"); + } +} + +void CClientProxyCodeEmitter::EmitProxySetInterfaceDesc(const String& remoteName, const String& recycleFuncName, + StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).AppendFormat("if (!HdfRemoteServiceSetInterfaceDesc(%s, %s)) {\n", + remoteName.string(), EmitDescMacroName().string()); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: set interface token failed!\", __func__);\n"); + sb.Append(prefix + g_tab).AppendFormat("%s(%s);\n", recycleFuncName.string(), remoteName.string()); + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n"); +} + +void CClientProxyCodeEmitter::EmitProxyCreateProxyObject(const String& clientObjName, const String& remoteName, + const String& recycleFuncName, StringBuilder& sb, const String& prefix) +{ + sb.Append(prefix).AppendFormat("struct %sProxy *proxy = (struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", baseName_.string(), baseName_.string(), baseName_.string()); - sb.Append(g_tab).Append("if (proxy == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat( + sb.Append(prefix).Append("if (proxy == NULL) {\n"); + sb.Append(prefix + g_tab).AppendFormat( "HDF_LOGE(\"%%{public}s: malloc %s proxy failed!\", __func__);\n", interfaceName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HdfIoServiceRecycle(serv);\n"); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n"); + if (!interface_->IsSerializable()) { + sb.Append(prefix + g_tab).AppendFormat("%s(%s);\n", recycleFuncName.string(), remoteName.string()); + } + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n"); sb.Append("\n"); - - sb.Append(g_tab).Append("proxy->serv = serv;\n"); - sb.Append(g_tab).AppendFormat("%sProxyConstruct(&proxy->impl);\n", baseName_.string()); - sb.Append(g_tab).Append("return &proxy->impl;\n"); - sb.Append("}\n"); + sb.Append(prefix).AppendFormat("proxy->%s = %s;\n", remoteName.string(), remoteName.string()); + sb.Append(prefix).AppendFormat("%sProxyConstruct(&proxy->impl);\n", baseName_.string()); + sb.Append(prefix).AppendFormat("struct %s *%s = &proxy->impl;\n", interfaceName_.string(), clientObjName.string()); } -void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb) +void CClientProxyCodeEmitter::EmitProxyCheckVersion(const String& clientObjName, const String& serMajorName, + const String& serMinorName, StringBuilder& sb, const String& prefix) { - String objName = "client"; - String SerMajorName = "serMajorVer"; - String SerMinorName = "serMinorVer"; - sb.AppendFormat("struct %s *%sGet(struct HdfRemoteService *remote)\n", - interfaceName_.string(), baseName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).Append("if (remote == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: %sService not found!\", __func__);\n", - baseName_.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = ", baseName_.string()); - sb.AppendFormat("(struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", baseName_.string(), - baseName_.string()); - sb.Append(g_tab).Append("if (proxy == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: malloc %s proxy failed!\", __func__);\n", interfaceName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HdfRemoteServiceRecycle(remote);\n"); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).Append("proxy->remote = remote;\n"); - sb.Append(g_tab).AppendFormat("struct %s *%s = &proxy->impl;\n", interfaceName_.string(), objName.string()); - sb.Append(g_tab).AppendFormat("%sProxyConstruct(%s);\n", baseName_.string(), objName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMajorName.string()); - sb.Append(g_tab).AppendFormat("uint32_t %s = 0;\n", SerMinorName.string()); - sb.Append(g_tab).AppendFormat("int32_t %s = %s->GetVersion(%s, &%s, &%s);\n", - errorCodeName_.string(), objName.string(), objName.string(), SerMajorName.string(), SerMinorName.string()); - sb.Append(g_tab).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: get version failed!\", __func__);\n"); - sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", baseName_.string(), objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("if (%s != %s) {\n", SerMajorName.string(), majorVerName_.string()); - sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s:check version failed! "); + sb.Append(prefix).AppendFormat("uint32_t %s = 0;\n", serMajorName.string()); + sb.Append(prefix).AppendFormat("uint32_t %s = 0;\n", serMinorName.string()); + sb.Append(prefix).AppendFormat("int32_t %s = %s->GetVersion(%s, &%s, &%s);\n", errorCodeName_.string(), + clientObjName.string(), clientObjName.string(), serMajorName.string(), serMinorName.string()); + sb.Append(prefix).AppendFormat("if (%s != HDF_SUCCESS) {\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s: get version failed!\", __func__);\n"); + sb.Append(prefix + g_tab).AppendFormat("%sRelease(%s);\n", baseName_.string(), clientObjName.string()); + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n\n"); + sb.Append(prefix).AppendFormat("if (%s != %s) {\n", serMajorName.string(), majorVerName_.string()); + sb.Append(prefix + g_tab).Append("HDF_LOGE(\"%{public}s:check version failed! "); sb.Append("version of service:%u.%u, version of client:%u.%u\", __func__,\n"); - sb.Append(g_tab).Append(g_tab).Append(g_tab).AppendFormat("%s, %s, %s, %s);\n", SerMajorName.string(), - SerMinorName.string(), majorVerName_.string(), minorVerName_.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", baseName_.string(), objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); - sb.Append("}\n"); + sb.Append(prefix + g_tab + g_tab).AppendFormat("%s, %s, %s, %s);\n", serMajorName.string(), + serMinorName.string(), majorVerName_.string(), minorVerName_.string()); + sb.Append(prefix + g_tab).AppendFormat("%sRelease(%s);\n", baseName_.string(), clientObjName.string()); + sb.Append(prefix + g_tab).Append("return NULL;\n"); + sb.Append(prefix).Append("}\n"); } -void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) +void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(const String& remoteName, const String& recycleFuncName, + StringBuilder& sb) { sb.AppendFormat("void %sRelease(struct %s *instance)\n", baseName_.string(), interfaceName_.string()); sb.Append("{\n"); @@ -525,21 +556,7 @@ void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb) sb.Append(g_tab).Append("}\n"); sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(instance, struct %sProxy, impl);\n", baseName_.string(), baseName_.string()); - sb.Append(g_tab).Append("HdfRemoteServiceRecycle(proxy->remote);\n"); - sb.Append(g_tab).Append("OsalMemFree(proxy);\n"); - sb.Append("}\n"); -} - -void CClientProxyCodeEmitter::EmitKernelProxyReleaseMethodImpl(StringBuilder& sb) -{ - sb.AppendFormat("void %sRelease(struct %s *instance)\n", baseName_.string(), interfaceName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).Append("if (instance == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).Append("return;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(instance, struct %sProxy, impl);\n", - baseName_.string(), baseName_.string()); - sb.Append(g_tab).Append("HdfIoServiceRecycle(proxy->serv);\n"); + sb.Append(g_tab).AppendFormat("%s(proxy->%s);\n", recycleFuncName.string(), remoteName.string()); sb.Append(g_tab).Append("OsalMemFree(proxy);\n"); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h index 1467d869..61695714 100644 --- a/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h +++ b/tools/hdi-gen/codegen/c_client_proxy_code_emitter.h @@ -43,6 +43,8 @@ private: void EmitCreateBuf(const String& dataBufName, const String& replyBufName, StringBuilder& sb, const String& prefix); + void EmitWriteInterfaceToken(const String& dataBufName, StringBuilder& sb, const String& prefix); + void EmitReleaseBuf(const String& dataBufName, const String& replyBufName, StringBuilder& sb, const String& prefix); @@ -55,17 +57,32 @@ private: void EmitProxyConstruction(StringBuilder&); + void EmitProxyExternalMethodImpl(StringBuilder& sb); + void EmitProxyGetMethodImpl(StringBuilder& sb); - void EmitProxyGetInstanceMethodImpl(StringBuilder& sb); + void EmitProxyGetInstanceMethodImpl(const String& objName, const String& serMajorName, const String& serMinorName, + const String& remoteName, const String& serviceName, StringBuilder& sb); - void EmitKernelProxyGetInstanceMethodImpl(StringBuilder& sb); + void EmitKernelProxyGetInstanceMethodImpl(const String& objName, const String& serMajorName, + const String& serMinorName, const String& remoteName, const String& serviceName, StringBuilder& sb); - void EmitCbProxyGetMethodImpl(StringBuilder& sb); + void EmitCbProxyGetMethodImpl(const String& objName, const String& serMajorName, const String& serMinorName, + const String& remoteName, StringBuilder& sb); - void EmitProxyReleaseMethodImpl(StringBuilder& sb); + void EmitProxyGetRemoteService(const String& remoteName, const String& serviceName, StringBuilder& sb, + const String& prefix); - void EmitKernelProxyReleaseMethodImpl(StringBuilder& sb); + void EmitProxySetInterfaceDesc(const String& remoteName, const String& recycleFuncName, StringBuilder& sb, + const String& prefix); + + void EmitProxyCreateProxyObject(const String& clientObjName, const String& remoteName, + const String& recycleFuncName, StringBuilder& sb, const String& prefix); + + void EmitProxyCheckVersion(const String& clientObjName, const String& serMajorName, const String& serMinorName, + StringBuilder& sb, const String& prefix); + + void EmitProxyReleaseMethodImpl(const String& remoteName, const String& recycleFuncName, StringBuilder& sb); std::vector freeObjStatements_; }; diff --git a/tools/hdi-gen/codegen/c_code_emitter.cpp b/tools/hdi-gen/codegen/c_code_emitter.cpp index 98ff3eea..20ed2046 100644 --- a/tools/hdi-gen/codegen/c_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_code_emitter.cpp @@ -91,6 +91,11 @@ void CCodeEmitter::EmitTailExternC(StringBuilder& sb) sb.Append("#endif /* __cplusplus */\n"); } +String CCodeEmitter::EmitDescMacroName() +{ + return String::Format("%s_INTERFACE_DESC", interfaceName_.ToUpperCase().string()); +} + String CCodeEmitter::MacroName(const String& name) { if (name.IsEmpty()) { diff --git a/tools/hdi-gen/codegen/c_code_emitter.h b/tools/hdi-gen/codegen/c_code_emitter.h index 59dd44ae..3e20ba3e 100644 --- a/tools/hdi-gen/codegen/c_code_emitter.h +++ b/tools/hdi-gen/codegen/c_code_emitter.h @@ -40,19 +40,12 @@ protected: void EmitTailExternC(StringBuilder& sb); + String EmitDescMacroName(); + String MacroName(const String& name); String ConstantName(const String& name); - bool isCallbackInterface() - { - if (interface_ == nullptr) { - return false; - } - - return interface_->IsCallback(); - } - String SpecificationParam(StringBuilder& sb, const String& prefix); static constexpr const char *errorsLabelName_ = "ERRORS"; diff --git a/tools/hdi-gen/codegen/c_interface_code_emitter.cpp b/tools/hdi-gen/codegen/c_interface_code_emitter.cpp index 835b94b6..67730a51 100644 --- a/tools/hdi-gen/codegen/c_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_interface_code_emitter.cpp @@ -49,6 +49,8 @@ void CInterfaceCodeEmitter::EmitInterfaceHeaderFile() sb.Append("\n"); EmitPreDeclaration(sb); sb.Append("\n"); + EmitInterfaceDesc(sb); + sb.Append("\n"); EmitInterfaceVersionMacro(sb); sb.Append("\n"); EmitInterfaceMethodCommands(sb, ""); @@ -91,6 +93,11 @@ void CInterfaceCodeEmitter::EmitPreDeclaration(StringBuilder& sb) sb.Append("struct HdfRemoteService;\n"); } +void CInterfaceCodeEmitter::EmitInterfaceDesc(StringBuilder& sb) +{ + sb.AppendFormat("#define %s \"%s\"\n", EmitDescMacroName().string(), interfaceFullName_.string()); +} + void CInterfaceCodeEmitter::EmitInterfaceVersionMacro(StringBuilder& sb) { sb.AppendFormat("#define %s %u\n", majorVerName_.string(), ast_->GetMajorVer()); @@ -152,9 +159,11 @@ void CInterfaceCodeEmitter::EmitAsObjectMethod(StringBuilder& sb, const String& void CInterfaceCodeEmitter::EmitInterfaceGetMethodDecl(StringBuilder& sb) { - String methodParamStr = isCallbackInterface() ? "struct HdfRemoteService *remote" : "void"; - sb.AppendFormat("struct %s *%sGet(%s);\n", interfaceName_.string(), baseName_.string(), methodParamStr.string()); - if (!isCallbackInterface()) { + if (interface_->IsSerializable()) { + sb.AppendFormat("struct %s *%sGet(struct HdfRemoteService *remote);\n", + interfaceName_.string(), baseName_.string()); + } else { + sb.AppendFormat("struct %s *%sGet(void);\n", interfaceName_.string(), baseName_.string()); sb.Append("\n"); sb.AppendFormat("struct %s *%sGetInstance(const char *instanceName);\n", interfaceName_.string(), baseName_.string()); diff --git a/tools/hdi-gen/codegen/c_interface_code_emitter.h b/tools/hdi-gen/codegen/c_interface_code_emitter.h index 33ae81b8..efa609b5 100644 --- a/tools/hdi-gen/codegen/c_interface_code_emitter.h +++ b/tools/hdi-gen/codegen/c_interface_code_emitter.h @@ -31,6 +31,8 @@ private: void EmitPreDeclaration(StringBuilder& sb); + void EmitInterfaceDesc(StringBuilder& sb); + void EmitInterfaceVersionMacro(StringBuilder& sb); void EmitInterfaceDefinition(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp index e3cd402e..35878033 100644 --- a/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_driver_code_emitter.cpp @@ -30,8 +30,8 @@ bool CServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory) void CServiceDriverCodeEmitter::EmitCode() { - // the callback interface have no driver file. - if (!isCallbackInterface()) { + // the callback interface or interface as method parameter have no driver file. + if (!interface_->IsSerializable()) { EmitDriverSourceFile(); } } @@ -67,7 +67,6 @@ void CServiceDriverCodeEmitter::EmitDriverIncluions(StringBuilder& sb) { HeaderFile::HeaderFileSet headerFiles; - headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(stubName_))); headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(implName_))); GetDriverSourceOtherLibInclusions(headerFiles); @@ -82,13 +81,16 @@ void CServiceDriverCodeEmitter::GetDriverSourceOtherLibInclusions(HeaderFile::He headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc")); + if (!isKernelCode_) { + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_object")); + } } void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb) { sb.AppendFormat("struct Hdf%sHost {\n", baseName_.string()); sb.Append(g_tab).AppendFormat("struct IDeviceIoService ioservice;\n"); - sb.Append(g_tab).AppendFormat("struct %s *service;\n", interfaceName_.string()); + sb.Append(g_tab).AppendFormat("struct %s *service;\n", implName_.string()); sb.Append("};\n"); } @@ -103,8 +105,22 @@ void CServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb) baseName_.string(), hostName.string()); sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sHost, ioservice);\n", baseName_.string()); - sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(%s->service, cmdId, data, reply);\n", - baseName_.string(), hostName.string()); + + sb.Append(g_tab).AppendFormat("if (%s->service == NULL || %s->service->stub.OnRemoteRequest == NULL) {\n", + hostName.string(), hostName.string()); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: invalid service obj\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_OBJECT;\n"); + sb.Append(g_tab).Append("}\n\n"); + + if (!isKernelCode_) { + sb.Append(g_tab).AppendFormat("if (!HdfDeviceObjectCheckInterfaceDesc(client->device, data)) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: check interface desc failed!\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(g_tab).Append("}\n\n"); + } + + sb.Append(g_tab).AppendFormat("return %s->service->stub.OnRemoteRequest(", hostName.string()); + sb.AppendFormat("&%s->service->stub.interface, cmdId, data, reply);\n", hostName.string()); sb.Append("}\n"); } @@ -124,6 +140,16 @@ void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb) sb.Append("{\n"); sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", baseName_.string()); sb.Append("\n"); + + if (!isKernelCode_) { + sb.Append(g_tab).AppendFormat("int32_t ret = HdfDeviceObjectSetInterfaceDesc(deviceObject, %s);\n", + EmitDescMacroName().string()); + sb.Append(g_tab).Append("if (ret != HDF_SUCCESS) {\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"failed to set interface descriptor of device object\");\n"); + sb.Append(g_tab).Append(g_tab).Append("return ret;\n"); + sb.Append(g_tab).Append("}\n\n"); + } + sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = (struct Hdf%sHost *)OsalMemAlloc(\n", baseName_.string(), hostName.string(), baseName_.string()); sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", baseName_.string()); @@ -137,13 +163,12 @@ void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb) hostName.string(), baseName_.string()); sb.Append(g_tab).AppendFormat("%s->ioservice.Open = NULL;\n", hostName.string()); sb.Append(g_tab).AppendFormat("%s->ioservice.Release = NULL;\n", hostName.string()); - sb.Append(g_tab).AppendFormat("%s->service = %sStubGetInstance();\n", hostName.string(), baseName_.string()); + sb.Append(g_tab).AppendFormat("%s->service = %sServiceGet();\n", hostName.string(), baseName_.string()); sb.Append(g_tab).AppendFormat("if (%s->service == NULL) {\n", hostName.string()); sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", hostName.string()); sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n"); sb.Append(g_tab).Append("}\n"); sb.Append("\n"); - sb.Append(g_tab).AppendFormat("%sServiceConstruct(%s->service);\n", baseName_.string(), hostName.string()); sb.Append(g_tab).AppendFormat("deviceObject->service = &%s->ioservice;\n", hostName.string()); sb.Append(g_tab).Append("return HDF_SUCCESS;\n"); sb.Append("}\n"); @@ -158,7 +183,7 @@ void CServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb) sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.string(), hostName.string()); sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioservice);\n", baseName_.string()); - sb.Append(g_tab).AppendFormat("%sStubRelease(%s->service);\n", baseName_.string(), hostName.string()); + sb.Append(g_tab).AppendFormat("%sServiceRelease(%s->service);\n", baseName_.string(), hostName.string()); sb.Append(g_tab).AppendFormat("OsalMemFree(%s);\n", hostName.string()); sb.Append("}\n"); } diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp index e13b2472..6ae07f01 100644 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.cpp @@ -47,6 +47,10 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderFile() EmitServiceImplHeaderInclusions(sb); sb.Append("\n"); EmitHeadExternC(sb); + if (!interface_->IsSerializable()) { + sb.Append("\n"); + EmitServiceImplDef(sb); + } sb.Append("\n"); EmitServiceImplConstructDecl(sb); sb.Append("\n"); @@ -64,7 +68,7 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderInclusions(StringBuilder& sb) { HeaderFile::HeaderFileSet headerFiles; - headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_))); + headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(stubName_))); for (const auto& file : headerFiles) { sb.AppendFormat("%s\n", file.ToString().string()); @@ -73,7 +77,9 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderInclusions(StringBuilder& sb) void CServiceImplCodeEmitter::EmitServiceImplConstructDecl(StringBuilder& sb) { - sb.AppendFormat("void %sServiceConstruct(struct %s* service);\n", baseName_.string(), interfaceName_.string()); + String instTypeName = interface_->IsSerializable() ? interfaceName_ : implName_; + sb.AppendFormat("struct %s *%sServiceGet(void);\n\n", instTypeName.string(), baseName_.string()); + sb.AppendFormat("void %sServiceRelease(struct %s *instance);\n", baseName_.string(), instTypeName.string()); } void CServiceImplCodeEmitter::EmitServiceImplSourceFile() @@ -84,10 +90,17 @@ void CServiceImplCodeEmitter::EmitServiceImplSourceFile() EmitLicense(sb); EmitServiceImplSourceInclusions(sb); + if (interface_->IsSerializable()) { + sb.Append("\n"); + EmitServiceImplDef(sb); + } + sb.Append("\n"); EmitServiceImplMethodImpls(sb, ""); sb.Append("\n"); - EmitServiceImplConstruct(sb); + EmitServiceImplGetMethod(sb); + sb.Append("\n"); + EmitServiceImplReleaseMethod(sb); String data = sb.ToString(); file.WriteData(data.string(), data.GetLength()); @@ -115,6 +128,15 @@ void CServiceImplCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFile headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); } +void CServiceImplCodeEmitter::EmitServiceImplDef(StringBuilder& sb) +{ + sb.AppendFormat("struct %sService\n", baseName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct %sStub stub;\n\n", baseName_.string()); + sb.Append(g_tab).Append("// please add private data here\n"); + sb.Append("};\n"); +} + void CServiceImplCodeEmitter::EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix) { for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { @@ -154,18 +176,74 @@ void CServiceImplCodeEmitter::EmitServiceImplMethodImpl(const AutoPtr sb.Append(prefix).Append("}\n"); } -void CServiceImplCodeEmitter::EmitServiceImplConstruct(StringBuilder& sb) +void CServiceImplCodeEmitter::EmitServiceImplGetMethod(StringBuilder& sb) { - String objName("instance"); - sb.AppendFormat("void %sServiceConstruct(struct %s *%s)\n", - baseName_.string(), interfaceName_.string(), objName.string()); + String implTypeName = String::Format("%sService", baseName_.string()); + String objName = "service"; + + if (!interface_->IsSerializable()) { + sb.AppendFormat("struct %s *%sGet(void)\n", implName_.string(), implTypeName.string()); + } else { + sb.AppendFormat("struct %s *%sGet(void)\n", interfaceName_.string(), implTypeName.string()); + } sb.Append("{\n"); + + sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s *)OsalMemCalloc(sizeof(struct %s));\n", + implTypeName.string(), objName.string(), implTypeName.string(), implTypeName.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: malloc %s obj failed!\", __func__);\n", + implTypeName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + + sb.Append(g_tab).AppendFormat("if (!%sStubConstruct(&%s->stub)) {\n", baseName_.string(), objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: construct %sStub obj failed!\", __func__);\n", + baseName_.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append("}\n\n"); + for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); - sb.Append(g_tab).AppendFormat("%s->%s = %s%s;\n", - objName.string(), method->GetName().string(), baseName_.string(), method->GetName().string()); + sb.Append(g_tab).AppendFormat("%s->stub.interface.%s = %s%s;\n", objName.string(), method->GetName().string(), + baseName_.string(), method->GetName().string()); } - sb.Append("}"); + + if (interface_->IsSerializable()) { + sb.Append(g_tab).AppendFormat("return &%s->stub.interface;\n", objName.string()); + } else { + sb.Append(g_tab).AppendFormat("return service;\n", objName.string()); + } + sb.Append("}\n"); +} + +void CServiceImplCodeEmitter::EmitServiceImplReleaseMethod(StringBuilder& sb) +{ + String implTypeName = String::Format("%sService", baseName_.string()); + String instName = "instance"; + String objName = "service"; + + if (interface_->IsSerializable()) { + sb.AppendFormat("void %sRelease(struct %s *%s)\n", implTypeName.string(), interfaceName_.string(), + instName.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s *)%s;\n", implTypeName.string(), objName.string(), + implTypeName.string(), instName.string()); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("%sStubRelease(&%s->stub);\n", baseName_.string(), objName.string()); + sb.Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string()); + } else { + sb.AppendFormat("void %sRelease(struct %s *%s)\n", implTypeName.string(), implTypeName.string(), + instName.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", instName.string()); + sb.Append(g_tab).Append(g_tab).Append("return;\n"); + sb.Append(g_tab).Append("}\n\n"); + sb.Append(g_tab).AppendFormat("OsalMemFree(%s);\n", instName.string()); + } + sb.Append("}\n"); } } // namespace HDI } // namespace OHOS \ No newline at end of file diff --git a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h index c2bc8420..229b7de9 100644 --- a/tools/hdi-gen/codegen/c_service_impl_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_impl_code_emitter.h @@ -35,11 +35,15 @@ private: void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); + void EmitServiceImplDef(StringBuilder& sb); + void EmitServiceImplMethodImpls(StringBuilder& sb, const String& prefix); void EmitServiceImplMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); - void EmitServiceImplConstruct(StringBuilder& sb); + void EmitServiceImplGetMethod(StringBuilder& sb); + + void EmitServiceImplReleaseMethod(StringBuilder& sb); void EmitServiceImplInstance(StringBuilder& sb); diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp index f597d4c3..76792528 100644 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.cpp @@ -49,6 +49,8 @@ void CServiceStubCodeEmitter::EmitServiceStubHeaderFile() sb.Append("\n"); EmitHeadExternC(sb); sb.Append("\n"); + EmitCbServiceStubDef(sb); + sb.Append("\n"); EmitCbServiceStubMethodsDcl(sb); sb.Append("\n"); EmitTailExternC(sb); @@ -67,23 +69,41 @@ void CServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb) headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_))); headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf")); + + if (interface_->IsSerializable()) { + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_remote_service")); + } for (const auto& file : headerFiles) { sb.AppendFormat("%s\n", file.ToString().string()); } } +void CServiceStubCodeEmitter::EmitCbServiceStubDef(StringBuilder& sb) +{ + sb.AppendFormat("struct %sStub\n", baseName_.string()); + sb.Append("{\n"); + sb.Append(g_tab).AppendFormat("struct %s interface;\n", interfaceName_.string()); + + if (interface_->IsSerializable()) { + sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); + sb.Append(g_tab).Append("struct HdfRemoteDispatcher dispatcher;\n"); + } else { + sb.Append(g_tab).AppendFormat("int32_t (*OnRemoteRequest)(struct %s *serviceImpl, ", + interfaceName_.string()); + sb.Append("int code, struct HdfSBuf *data, struct HdfSBuf *reply);\n"); + } + + sb.Append("};\n"); +} + void CServiceStubCodeEmitter::EmitCbServiceStubMethodsDcl(StringBuilder& sb) { - if (!isCallbackInterface()) { - sb.AppendFormat("int32_t %sServiceOnRemoteRequest(struct %s *serviceImpl, ", baseName_.string(), - interfaceName_.string()); - sb.Append("int cmdId, struct HdfSBuf *data, struct HdfSBuf *reply);\n"); - sb.Append("\n"); + sb.AppendFormat("bool %sStubConstruct(struct %sStub *stub);\n", baseName_.string(), baseName_.string()); + + if (interface_->IsSerializable()) { + sb.AppendFormat("void %sStubRelease(struct %sStub *stub);\n", baseName_.string(), baseName_.string()); } - sb.AppendFormat("struct %s* %sStubGetInstance(void);\n", interfaceName_.string(), baseName_.string()); - sb.Append("\n"); - sb.AppendFormat("void %sStubRelease(struct %s *instance);\n", baseName_.string(), interfaceName_.string()); } void CServiceStubCodeEmitter::EmitServiceStubSourceFile() @@ -95,32 +115,14 @@ void CServiceStubCodeEmitter::EmitServiceStubSourceFile() EmitLicense(sb); EmitStubSourceInclusions(sb); sb.Append("\n"); - - if (!isKernelCode_) { - EmitStubDefinitions(sb); - sb.Append("\n"); - } - EmitServiceStubMethodImpls(sb, ""); sb.Append("\n"); - if (isKernelCode_) { - EmitServiceStubOnRequestMethodImpl(sb, ""); - sb.Append("\n"); - EmitKernelStubGetMethodImpl(sb); - } else { - EmitStubOnRequestMethodImpl(sb, ""); - sb.Append("\n"); - if (!isCallbackInterface()) { - EmitServiceStubOnRequestMethodImpl(sb, ""); - sb.Append("\n"); - } - EmitStubGetMethodImpl(sb); - } - + EmitStubOnRequestMethodImpl(sb, ""); sb.Append("\n"); - if (isKernelCode_) { - EmitKernelStubReleaseImpl(sb); - } else { + EmitStubGetMethodImpl(sb); + + if (!isKernelCode_ && interface_->IsSerializable()) { + sb.Append("\n"); EmitStubReleaseImpl(sb); } @@ -146,7 +148,6 @@ void CServiceStubCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFile { if (!isKernelCode_) { headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); - headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_remote_service")); } else { const AST::TypeStringMap& types = ast_->GetTypes(); for (const auto& pair : types) { @@ -158,21 +159,15 @@ void CServiceStubCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFile } } + if (interface_->IsSerializable()) { + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_dlist")); + } + headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); - headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc")); headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_log")); headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem")); } -void CServiceStubCodeEmitter::EmitStubDefinitions(StringBuilder& sb) -{ - sb.AppendFormat("struct %sStub {\n", baseName_.string()); - sb.Append(g_tab).AppendFormat("struct %s impl;\n", interfaceName_.string()); - sb.Append(g_tab).Append("struct HdfRemoteService *remote;\n"); - sb.Append(g_tab).Append("struct HdfRemoteDispatcher dispatcher;\n"); - sb.Append("};\n"); -} - void CServiceStubCodeEmitter::EmitServiceStubMethodImpls(StringBuilder& sb, const String& prefix) { for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { @@ -377,7 +372,7 @@ void CServiceStubCodeEmitter::EmitStubGetVerMethodImpl(const AutoPtr& "static int32_t SerStub%s(struct %s *serviceImpl, struct HdfSBuf *%s, struct HdfSBuf *%s)\n", method->GetName().string(), interfaceName_.string(), dataParcelName_.string(), replyParcelName_.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("int32_t %s = HDF_FAILURE;\n", errorCodeName_.string()); + sb.Append(prefix + g_tab).AppendFormat("int32_t %s = HDF_SUCCESS;\n", errorCodeName_.string()); AutoPtr type = new ASTUintType(); type->EmitCWriteVar(replyParcelName_, majorVerName_, errorCodeName_, finishedLabelName_, sb, prefix + g_tab); @@ -397,59 +392,51 @@ void CServiceStubCodeEmitter::EmitStubAsObjectMethodImpl(StringBuilder& sb, cons baseName_.string(), interfaceName_.string(), objName.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(prefix + g_tab + g_tab).Append("return NULL;\n"); - sb.Append(prefix + g_tab).Append("}\n"); + if (interface_->IsSerializable()) { + sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); + sb.Append(prefix + g_tab + g_tab).Append("return NULL;\n"); + sb.Append(prefix + g_tab).Append("}\n"); + + sb.Append(prefix + g_tab).AppendFormat("struct %sStub *stub = CONTAINER_OF(%s, struct %sStub, interface);\n", + baseName_.string(), objName.string(), baseName_.string()); + sb.Append(prefix + g_tab).Append("return stub->remote;\n"); + } else { + sb.Append(prefix + g_tab).Append("return NULL;\n"); + } - sb.Append(prefix + g_tab).AppendFormat("struct %sStub *stub = CONTAINER_OF(%s, struct %sStub, impl);\n", - baseName_.string(), objName.string(), baseName_.string()); - sb.Append(prefix + g_tab).Append("return stub->remote;\n"); sb.Append(prefix).Append("}\n"); } void CServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) { - String implName = "remote"; + String remoteName = "remote"; + String implName = "serviceImpl"; String codeName = "code"; - sb.Append(prefix).AppendFormat("static int32_t OnRemoteRequest(struct HdfRemoteService *%s, int %s, ", - implName.string(), codeName.string()); - sb.Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); + String funcName = String::Format("%sOnRemoteRquest", baseName_.string()); + if (interface_->IsSerializable()) { + sb.Append(prefix).AppendFormat("static int32_t %s(struct HdfRemoteService *%s, ", + funcName.string(), remoteName.string()); + } else { + sb.Append(prefix).AppendFormat("static int32_t %s(struct %s *%s, ", + funcName.string(), interfaceName_.string(), implName.string()); + } + sb.AppendFormat("int %s, struct HdfSBuf *data, struct HdfSBuf *reply)\n", codeName.string()); sb.Append(prefix).Append("{\n"); - sb.Append(prefix + g_tab).AppendFormat("struct %s *serviceImpl = (struct %s*)%s;\n", - interfaceName_.string(), interfaceName_.string(), implName.string()); - sb.Append(prefix + g_tab).AppendFormat("switch (%s) {\n", codeName.string()); - for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { - AutoPtr method = interface_->GetMethod(i); - sb.Append(prefix + g_tab + g_tab).AppendFormat("case %s:\n", EmitMethodCmdID(method).string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", - method->GetName().string()); + if (interface_->IsSerializable()) { + sb.Append(prefix + g_tab).AppendFormat("struct %s *%s = (struct %s*)%s;\n", + interfaceName_.string(), implName.string(), interfaceName_.string(), remoteName.string()); + + sb.Append(prefix + g_tab).AppendFormat( + "if (!HdfRemoteServiceCheckInterfaceToken(%s->AsObject(%s), data)) {\n", + implName.string(), implName.string()); + sb.Append(prefix + g_tab + g_tab).Append( + "HDF_LOGE(\"%{public}s: interface token check failed\", __func__);\n"); + sb.Append(prefix + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); + sb.Append(prefix + g_tab).Append("}\n\n"); } - AutoPtr getVerMethod = interface_->GetVersionMethod(); - sb.Append(prefix + g_tab + g_tab).AppendFormat("case %s:\n", EmitMethodCmdID(getVerMethod).string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", - getVerMethod->GetName().string()); - - sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: not support cmd %%{public}d\", __func__, %s);\n", codeName.string()); - sb.Append(prefix + g_tab + g_tab + g_tab).Append("return HDF_ERR_INVALID_PARAM;\n"); - sb.Append(prefix + g_tab + g_tab).Append("}\n"); - sb.Append(prefix + g_tab).Append("}\n"); - sb.Append("}\n"); -} - -void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix) -{ - String implName = "serviceImpl"; - String codeName = "cmdId"; - sb.Append(prefix).AppendFormat("int32_t %sServiceOnRemoteRequest(struct %s *%s, int %s, ", - baseName_.string(), interfaceName_.string(), implName.string(), codeName.string()); - sb.Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n"); - sb.Append(prefix).Append("{\n"); sb.Append(prefix + g_tab).AppendFormat("switch (%s) {\n", codeName.string()); - for (size_t i = 0; i < interface_->GetMethodNumber(); i++) { AutoPtr method = interface_->GetMethod(i); sb.Append(prefix + g_tab + g_tab).AppendFormat("case %s:\n", EmitMethodCmdID(method).string()); @@ -459,8 +446,8 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder& AutoPtr getVerMethod = interface_->GetVersionMethod(); sb.Append(prefix + g_tab + g_tab).AppendFormat("case %s:\n", EmitMethodCmdID(getVerMethod).string()); - sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(serviceImpl, data, reply);\n", - getVerMethod->GetName().string()); + sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat("return SerStub%s(%s, data, reply);\n", + getVerMethod->GetName().string(), implName.string()); sb.Append(prefix + g_tab + g_tab).Append("default: {\n"); sb.Append(prefix + g_tab + g_tab + g_tab).AppendFormat( @@ -475,72 +462,58 @@ void CServiceStubCodeEmitter::EmitStubGetMethodImpl(StringBuilder& sb) { String stubTypeName = String::Format("%sStub", baseName_.string()); String objName = "stub"; + String funcName = String::Format("%sOnRemoteRquest", baseName_.string()); - sb.AppendFormat("struct %s *%sStubGetInstance(void)\n", interfaceName_.string(), baseName_.string()); + sb.AppendFormat("bool %sConstruct(struct %s *%s)\n", stubTypeName.string(), stubTypeName.string(), + objName.string()); sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s *)OsalMemAlloc(sizeof(struct %s));\n", - stubTypeName.string(), objName.string(), stubTypeName.string(), stubTypeName.string()); sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"%%{public}s: OsalMemAlloc obj failed!\", __func__);\n", - stubTypeName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("%s->dispatcher.Dispatch = OnRemoteRequest;\n", objName.string()); - sb.Append(g_tab).AppendFormat( - "%s->remote = HdfRemoteServiceObtain((struct HdfObject*)%s, &(%s->dispatcher));\n", - objName.string(), objName.string(), objName.string()); - sb.Append(g_tab).AppendFormat("if (%s->remote == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: %s->remote is null\", __func__);\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: stub is null!\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).Append("return false;\n"); sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("%s->impl.AsObject = %sStubAsObject;\n", objName.string(), baseName_.string()); - sb.Append(g_tab).AppendFormat("return &%s->impl;\n", objName.string()); - sb.Append("}\n"); -} + if (interface_->IsSerializable()) { + sb.Append(g_tab).AppendFormat("%s->dispatcher.Dispatch = %s;\n", objName.string(), funcName.string()); + sb.Append(g_tab).AppendFormat( + "%s->remote = HdfRemoteServiceObtain((struct HdfObject*)%s, &(%s->dispatcher));\n", + objName.string(), objName.string(), objName.string()); + sb.Append(g_tab).AppendFormat("if (%s->remote == NULL) {\n", objName.string()); + sb.Append(g_tab).Append(g_tab).AppendFormat( + "HDF_LOGE(\"%%{public}s: %s->remote is null\", __func__);\n", objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return false;\n"); + sb.Append(g_tab).Append("}\n\n"); -void CServiceStubCodeEmitter::EmitKernelStubGetMethodImpl(StringBuilder& sb) -{ - String objName("instance"); - sb.AppendFormat("struct %s *%sStubGetInstance(void)\n", interfaceName_.string(), baseName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).AppendFormat("struct %s *%s = (struct %s*)OsalMemAlloc(sizeof(struct %s));\n", - interfaceName_.string(), objName.string(), interfaceName_.string(), interfaceName_.string()); - sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); - sb.Append(g_tab).Append(g_tab).AppendFormat( - "HDF_LOGE(\"%%{public}s: OsalMemAlloc struct %s %s failed!\", __func__);\n", - interfaceName_.string(), objName.string()); - sb.Append(g_tab).Append(g_tab).Append("return NULL;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).AppendFormat("return %s;\n", objName.string()); + sb.Append(g_tab).AppendFormat("if (!HdfRemoteServiceSetInterfaceDesc(%s->remote, %s)) {\n", objName.string(), + EmitDescMacroName().string()); + sb.Append(g_tab).Append(g_tab).Append("HDF_LOGE(\"%{public}s: "); + sb.Append("failed to set remote service interface descriptor\", __func__);\n"); + sb.Append(g_tab).Append(g_tab).AppendFormat("%sRelease(%s);\n", stubTypeName.string(), objName.string()); + sb.Append(g_tab).Append(g_tab).Append("return false;\n"); + sb.Append(g_tab).Append("}\n\n"); + } else { + sb.Append(g_tab).AppendFormat("%s->OnRemoteRequest = %s;\n", objName.string(), funcName.string()); + } + + if (!isKernelCode_) { + sb.Append(g_tab).AppendFormat("%s->interface.AsObject = %sAsObject;\n", objName.string(), + stubTypeName.string()); + } + sb.Append(g_tab).Append("return true;\n"); sb.Append("}\n"); } void CServiceStubCodeEmitter::EmitStubReleaseImpl(StringBuilder& sb) { - String objName = "instance"; - sb.AppendFormat("void %sStubRelease(struct %s *%s)\n", baseName_.string(), interfaceName_.string(), - objName.string()); + String objName = "stub"; + String stubTypeName = String::Format("%sStub", baseName_.string()); + sb.AppendFormat("void %sRelease(struct %s *%s)\n", stubTypeName.string(), stubTypeName.string(), objName.string()); sb.Append("{\n"); sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string()); sb.Append(g_tab).Append(g_tab).Append("return;\n"); sb.Append(g_tab).Append("}\n\n"); - sb.Append(g_tab).AppendFormat("struct %s *stub = CONTAINER_OF(%s, struct %s, impl);\n", stubName_.string(), - objName.string(), stubName_.string()); - sb.Append(g_tab).Append("OsalMemFree(stub);\n"); - sb.Append("}"); -} - -void CServiceStubCodeEmitter::EmitKernelStubReleaseImpl(StringBuilder& sb) -{ - sb.AppendFormat("void %sStubRelease(struct %s *instance)\n", baseName_.string(), interfaceName_.string()); - sb.Append("{\n"); - sb.Append(g_tab).Append("if (instance == NULL) {\n"); - sb.Append(g_tab).Append(g_tab).Append("return;\n"); - sb.Append(g_tab).Append("}\n"); - sb.Append(g_tab).Append("OsalMemFree(instance);\n"); + + sb.Append(g_tab).AppendFormat("HdfRemoteServiceRecycle(%s->remote);\n", objName.string()); + sb.Append(g_tab).AppendFormat("%s->remote = NULL;\n", objName.string()); sb.Append("}"); } } // namespace HDI diff --git a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h index 88b0e812..6cac0159 100644 --- a/tools/hdi-gen/codegen/c_service_stub_code_emitter.h +++ b/tools/hdi-gen/codegen/c_service_stub_code_emitter.h @@ -27,6 +27,8 @@ private: void EmitStubHeaderInclusions(StringBuilder& sb); + void EmitCbServiceStubDef(StringBuilder& sb); + void EmitCbServiceStubMethodsDcl(StringBuilder& sb); void EmitServiceStubSourceFile(); @@ -35,8 +37,6 @@ private: void GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles); - void EmitStubDefinitions(StringBuilder& sb); - void EmitServiceStubMethodImpls(StringBuilder& sb, const String& prefix); void EmitServiceStubMethodImpl(const AutoPtr& method, StringBuilder& sb, const String& prefix); @@ -60,15 +60,9 @@ private: void EmitStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); - void EmitServiceStubOnRequestMethodImpl(StringBuilder& sb, const String& prefix); - void EmitStubGetMethodImpl(StringBuilder& sb); - void EmitKernelStubGetMethodImpl(StringBuilder& sb); - void EmitStubReleaseImpl(StringBuilder& sb); - - void EmitKernelStubReleaseImpl(StringBuilder& sb); }; } // namespace HDI } // namespace OHOS diff --git a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp index 7c00ea2b..be254bb0 100644 --- a/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_client_proxy_code_emitter.cpp @@ -155,7 +155,7 @@ void CppClientProxyCodeEmitter::EmitProxySourceFile() sb.Append("\n"); EmitBeginNamespace(sb); sb.Append("\n"); - if (!isCallbackInterface()) { + if (!interface_->IsSerializable()) { EmitGetMethodImpl(sb, ""); sb.Append("\n"); EmitGetInstanceMethodImpl(sb, ""); @@ -184,7 +184,7 @@ void CppClientProxyCodeEmitter::EmitProxySourceInclusions(StringBuilder& sb) void CppClientProxyCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - if (!isCallbackInterface()) { + if (!interface_->IsSerializable()) { headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "iservmgr_hdi")); } headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base")); diff --git a/tools/hdi-gen/codegen/cpp_code_emitter.h b/tools/hdi-gen/codegen/cpp_code_emitter.h index 9c44f7e6..68bc2209 100644 --- a/tools/hdi-gen/codegen/cpp_code_emitter.h +++ b/tools/hdi-gen/codegen/cpp_code_emitter.h @@ -67,15 +67,6 @@ protected: String ConstantName(const String& name); - bool isCallbackInterface() - { - if (interface_ == nullptr) { - return false; - } - - return interface_->IsCallback(); - } - String SpecificationParam(StringBuilder& sb, const String& prefix); }; } // namespace HDI diff --git a/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp index 2dba26f8..3b541a3e 100644 --- a/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_interface_code_emitter.cpp @@ -90,7 +90,7 @@ void CppInterfaceCodeEmitter::EmitInterfaceVersionMacro(StringBuilder& sb) void CppInterfaceCodeEmitter::EmitInterfaceDefinition(StringBuilder& sb) { - if (!isCallbackInterface()) { + if (!interface_->IsSerializable()) { sb.AppendFormat("class %s : public IRemoteBroker {\n", interfaceName_.string()); sb.Append("public:\n"); EmitInterfaceDescriptor(sb, g_tab); diff --git a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp index e31b3710..05815590 100644 --- a/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_driver_code_emitter.cpp @@ -31,7 +31,7 @@ bool CppServiceDriverCodeEmitter::ResolveDirectory(const String& targetDirectory void CppServiceDriverCodeEmitter::EmitCode() { // the callback interface have no driver file. - if (!isCallbackInterface()) { + if (!interface_->IsSerializable()) { EmitDriverSourceFile(); } } diff --git a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp index f3404ae0..b0441fc8 100644 --- a/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp +++ b/tools/hdi-gen/codegen/cpp_service_stub_code_emitter.cpp @@ -193,7 +193,7 @@ void CppServiceStubCodeEmitter::EmitStubSourceInclusions(StringBuilder& sb) void CppServiceStubCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFileSet& headerFiles) { - if (!isCallbackInterface()) { + if (!interface_->IsSerializable()) { headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "securec")); } else { const AST::TypeStringMap& types = ast_->GetTypes(); diff --git a/tools/hdi-gen/parser/parser.cpp b/tools/hdi-gen/parser/parser.cpp index d5494d10..ebe6929e 100644 --- a/tools/hdi-gen/parser/parser.cpp +++ b/tools/hdi-gen/parser/parser.cpp @@ -328,9 +328,7 @@ bool Parser::ParserPackageInfo(const String& packageName) bool Parser::ParseImport() { lexer_->GetToken(); - String packageFullName; - Token token = lexer_->PeekToken(); if (token != Token::IDENTIFIER) { if (token == Token::SEMICOLON) { @@ -367,11 +365,15 @@ bool Parser::ParseImport() return false; } + AutoPtr interfaceType = importAst->GetInterfaceDef(); + if (interfaceType != nullptr) { + interfaceType->SetSerializable(true); + } + if (!ast_->AddImport(importAst)) { LogError(String::Format("the package '%s' has been import", packageFullName.string())); return false; } - return true; } @@ -727,6 +729,21 @@ bool Parser::ParseParameter(const AutoPtr& method) } lexer_->GetToken(); + if (type->IsInterfaceType()) { + AutoPtr interfaceType = dynamic_cast(type.Get()); + if (interfaceType->IsCallback() && parameter->GetAttribute() != ParamAttr::PARAM_IN) { + LogError(String::Format("The attribute of callback interface parameter '%s' does not be 'in'", + lexer_->GetIdentifier().string())); + return false; + } + + if (!interfaceType->IsCallback() && parameter->GetAttribute() != ParamAttr::PARAM_OUT) { + LogError(String::Format("The attribute of interface parameter '%s' does not be 'in'", + lexer_->GetIdentifier().string())); + return false; + } + } + parameter->SetName(lexer_->GetIdentifier()); parameter->SetType(type);