mirror of
https://github.com/openharmony/drivers_framework.git
synced 2026-08-26 18:17:07 -04:00
fix:modify HDI-C code and add interface interface check Signed-off-by: yue <yueyan4@huawei.com>
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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_;
|
||||
};
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user