fix:modify HDI-C code and add interface interface check

Signed-off-by: yue <yueyan4@huawei.com>
This commit is contained in:
yue
2022-03-16 20:25:54 +08:00
parent e72ada6a43
commit e204bca72d
21 changed files with 508 additions and 349 deletions
+2 -2
View File
@@ -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",
+19
View File
@@ -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
{
+15
View File
@@ -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<AutoPtr<ASTMethod>> methods_;
+2 -2
View File
@@ -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",
@@ -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<ASTMethod>& 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<ASTParameter> 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");
}
@@ -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<String> freeObjStatements_;
};
+5
View File
@@ -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()) {
+2 -9
View File
@@ -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";
@@ -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());
@@ -31,6 +31,8 @@ private:
void EmitPreDeclaration(StringBuilder& sb);
void EmitInterfaceDesc(StringBuilder& sb);
void EmitInterfaceVersionMacro(StringBuilder& sb);
void EmitInterfaceDefinition(StringBuilder& sb);
@@ -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");
}
@@ -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<ASTMethod>
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<ASTMethod> 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
@@ -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<ASTMethod>& method, StringBuilder& sb, const String& prefix);
void EmitServiceImplConstruct(StringBuilder& sb);
void EmitServiceImplGetMethod(StringBuilder& sb);
void EmitServiceImplReleaseMethod(StringBuilder& sb);
void EmitServiceImplInstance(StringBuilder& sb);
@@ -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<ASTMethod>&
"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<ASTType> 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<ASTMethod> 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<ASTMethod> 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<ASTMethod> 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<ASTMethod> 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
@@ -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<ASTMethod>& 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
@@ -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"));
-9
View File
@@ -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
@@ -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);
@@ -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();
}
}
@@ -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();
+20 -3
View File
@@ -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<ASTInterfaceType> 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<ASTMethod>& method)
}
lexer_->GetToken();
if (type->IsInterfaceType()) {
AutoPtr<ASTInterfaceType> interfaceType = dynamic_cast<ASTInterfaceType*>(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);