modify compilation of HDI

Signed-off-by: yue <yueyan4@huawei.com>
This commit is contained in:
yue
2022-02-25 17:37:34 +08:00
parent 234c94f1f0
commit 67b5acf5ee
24 changed files with 429 additions and 512 deletions
+111 -82
View File
@@ -7,7 +7,7 @@
# the GPL, or the BSD license, at your option.
# See the LICENSE file in the root of this repository for complete details.
import json
import os
import re
import sys
@@ -63,10 +63,10 @@ def c_interface_file_translate(idl_file, out_dir, part, outputs):
server_impl_header_file = os.path.join(out_dir, file_name + "_service.h")
server_impl_source_file = os.path.join(out_dir, file_name + "_service.c")
if part == "client_lib_source":
if part == "-c":
outputs.append(iface_header_file)
outputs.append(client_proxy_source_file)
elif part == "server_lib_source":
elif part == "-s":
outputs.append(iface_header_file)
outputs.append(server_stub_header_file)
outputs.append(server_stub_source_file)
@@ -91,11 +91,11 @@ def c_callback_file_translate(idl_file, out_dir, part, outputs):
server_impl_header_file = os.path.join(out_dir, file_name + "_service.h")
server_impl_source_file = os.path.join(out_dir, file_name + "_service.c")
if part == "client_lib_source":
if part == "-c":
outputs.append(iface_header_file)
outputs.append(server_stub_header_file)
outputs.append(server_stub_source_file)
elif part == "server_lib_source":
elif part == "-s":
outputs.append(iface_header_file)
outputs.append(client_proxy_source_file)
else:
@@ -118,19 +118,6 @@ def c_types_file_translate(idl_file, out_dir, outputs):
outputs.append(types_source_file)
def c_idl_translate(idl_files, out_dir):
outputs = []
for idl_file in idl_files:
idl_file_type = get_idl_file_type(idl_file)
if idl_file_type == IdlType.INTERFACE:
c_interface_file_translate(idl_file, out_dir, "all", outputs)
elif idl_file_type == IdlType.CALLBACK:
c_callback_file_translate(idl_file, out_dir, "all", outputs)
elif idl_file_type == IdlType.TYPES:
c_types_file_translate(idl_file, out_dir, outputs)
return outputs
def cpp_interface_file_translate(idl_file, out_dir, part, outputs):
get_file_name = idl_file.split("/")[-1]
file_name = translate_file_name(get_file_name.split(".")[0])
@@ -144,11 +131,11 @@ def cpp_interface_file_translate(idl_file, out_dir, part, outputs):
server_impl_header_file = os.path.join(out_dir, file_name + "_service.h")
server_impl_source_file = os.path.join(out_dir, file_name + "_service.cpp")
if part == "client_lib_source":
if part == "-c":
outputs.append(iface_header_file)
outputs.append(client_proxy_header_file)
outputs.append(client_proxy_source_file)
elif part == "server_lib_source":
elif part == "-s":
outputs.append(iface_header_file)
outputs.append(server_stub_header_file)
outputs.append(server_stub_source_file)
@@ -175,11 +162,11 @@ def cpp_callback_file_translate(idl_file, out_dir, part, outputs):
server_impl_header_file = os.path.join(out_dir, file_name + "_service.h")
server_impl_source_file = os.path.join(out_dir, file_name + "_service.cpp")
if part == "client_lib_source":
if part == "-c":
outputs.append(iface_header_file)
outputs.append(server_stub_header_file)
outputs.append(server_stub_source_file)
elif part == "server_lib_source":
elif part == "-s":
outputs.append(iface_header_file)
outputs.append(client_proxy_header_file)
outputs.append(client_proxy_source_file)
@@ -204,28 +191,6 @@ def cpp_types_file_translate(idl_file, out_dir, outputs):
outputs.append(types_source_file)
def cpp_idl_translate(idl_files, out_dir):
outputs = []
for idl_file in idl_files:
idl_file_type = get_idl_file_type(idl_file)
if idl_file_type == IdlType.INTERFACE:
cpp_interface_file_translate(idl_file, out_dir, "all", outputs)
elif idl_file_type == IdlType.CALLBACK:
cpp_callback_file_translate(idl_file, out_dir, "all", outputs)
elif idl_file_type == IdlType.TYPES:
cpp_types_file_translate(idl_file, out_dir, outputs)
return outputs
def idl_translate(idl_files, language, out_dir):
outputs = []
if language == "c":
outputs = c_idl_translate(idl_files, out_dir)
elif language == "cpp":
outputs = cpp_idl_translate(idl_files, out_dir)
return outputs
def c_get_compile_source_file(idl_files, out_dir, part):
outputs = []
for idl_file in idl_files:
@@ -261,57 +226,121 @@ def get_compile_source_file(idl_files, language, out_dir, part):
return outputs
def get_files(argv):
outputs = []
if len(argv) < 4:
return outputs
# ./build_hdi_files.py -o <language> <gen_dir> <part> <idl_files>
def get_output_files(argv):
result = []
if len(argv) >= 5:
language = argv[2]
gen_dir = argv[3]
part = argv[4]
idl_files = argv[5:]
option_mode = argv[1]
language = argv[2]
out_dir = argv[3]
files = argv[4:]
if option_mode == "-o":
outputs = idl_translate(files, language, out_dir)
elif option_mode == "-c":
outputs = get_compile_source_file(argv[4:], language, out_dir, "client_lib_source")
elif option_mode == "-s":
outputs = get_compile_source_file(argv[4:], language, out_dir, "server_lib_source")
sys.stdout.write('\n'.join(outputs))
result = get_compile_source_file(idl_files, language, gen_dir, part)
sys.stdout.write('\n'.join(result))
def get_file_version(file_path):
major_version = 0
minor_version = 0
file_option = open(file_path, "r")
file_str = file_option.read()
result = re.findall(r'package\s\w+(?:\.\w+)*\.[V|v](\d+)_(\d+);', file_str)
if len(result) > 0:
major_version = result[0][0]
minor_version = result[0][1]
file_option.close()
version = str(major_version) + "." + str(minor_version)
return version
# parse package name of this idl file
def parse_file_package(file_path):
package_str = ""
idl_file = open(file_path, "r")
file_str = idl_file.read()
result = re.findall(r'package\s(\w+(?:\.\w+)*);', file_str)
if (len(result) > 0):
package_str = result[0]
idl_file.close()
return package_str
def get_version(argv):
version = "0.0"
idl_files = argv[2:]
# search all idl files and parse package name
def parse_package(idl_files):
package_str = ""
for idl_file in idl_files:
idl_file_type = get_idl_file_type(idl_file)
if idl_file_type == IdlType.INTERFACE:
version = get_file_version(idl_file)
package_str = parse_file_package(idl_file)
break
sys.stdout.write(version)
return package_str
# parse version from package name
def parse_version(package_str):
# the version is empty by default
version_str = ""
result = re.findall(r'\w+(?:\.\w+)*\.[V|v](\d+)_(\d+)', package_str)
if len(result) > 0:
major_version = result[0][0]
minor_version = result[0][1]
version_str = str(major_version) + "." + str(minor_version)
return version_str
def parse_out_dir(gen_dir, package_str, path_map):
package_path_vec = path_map.split(":")
if (len(package_path_vec) != 2):
return gen_dir
root_package = package_path_vec[0]
root_package_path = package_path_vec[1]
temp_dir = package_str.replace(root_package, root_package_path)
temp_dir = temp_dir.replace(".", "/")
return gen_dir.replace(temp_dir, "")
def parse_root_package_dir(gen_dir, package_str, path_map):
package_path_vec = path_map.split(":")
if (len(package_path_vec) != 2):
return gen_dir
root_package = package_path_vec[0]
root_package_path = package_path_vec[1]
temp_dir = package_str.replace(root_package, "")
temp_dir = temp_dir.replace(".", "/")
return gen_dir.replace(temp_dir, "")
def parse_version_dir(gen_dir, version_str):
version_dir_name = "v" + version_str.replace(".", "_")
return gen_dir.replace(version_dir_name, "")
# get information of package, version and generation files from idl files
# ./build_hdi_files.py -i <language> <gen_dir> <path_mapping> <idl_files>
def get_information(argv):
result = {}
if len(argv) >= 5:
language = argv[2]
gen_dir = argv[3]
path_map = argv[4]
idl_files = argv[5:]
package_str = parse_package(idl_files)
version_str = parse_version(package_str)
out_dir = parse_out_dir(gen_dir, package_str, path_map)
root_package_dir = parse_root_package_dir(gen_dir, package_str, path_map)
version_dir = parse_version_dir(gen_dir, version_str)
result = {
"package" : package_str,
"version" : version_str,
"out_dir" : out_dir,
"root_package_dir" : root_package_dir,
"version_dir" : version_dir,
}
sys.stdout.write(json.dumps(result))
if __name__ == "__main__":
if len(sys.argv) < 1:
sys.stdout.write('\n')
option = sys.argv[1]
if option == "-v":
get_version(sys.argv)
if option == "-i":
get_information(sys.argv)
elif option == "-o":
get_output_files(sys.argv)
else:
get_files(sys.argv)
sys.stdout.write('\n')
@@ -85,7 +85,7 @@ void CClientProxyCodeEmitter::EmitProxyInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_)));
GetHeaderOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -119,7 +119,7 @@ void CClientProxyCodeEmitter::GetHeaderOtherLibInclusions(HeaderFile::HeaderFile
void CClientProxyCodeEmitter::EmitProxyDefinition(StringBuilder& sb)
{
sb.AppendFormat("struct %sProxy {\n", infName_.string());
sb.AppendFormat("struct %sProxy {\n", baseName_.string());
sb.Append(g_tab).AppendFormat("struct %s impl;\n", interfaceName_.string());
if (isKernelCode_) {
sb.Append(g_tab).Append("struct HdfIoService *serv;\n");
@@ -133,7 +133,7 @@ void CClientProxyCodeEmitter::EmitProxyDefinition(StringBuilder& sb)
void CClientProxyCodeEmitter::EmitProxyCallMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("static int32_t %sProxyCall(struct %s *self, int32_t id, struct HdfSBuf *data,\n",
infName_.string(), interfaceName_.string());
baseName_.string(), interfaceName_.string());
sb.Append(g_tab).Append("struct HdfSBuf *reply, bool isOneWay)\n");
sb.Append("{\n");
@@ -161,13 +161,13 @@ void CClientProxyCodeEmitter::EmitProxyCallMethodImpl(StringBuilder& sb)
void CClientProxyCodeEmitter::EmitProxyKernelCallMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("static int32_t %sProxyCall(struct %s *self, int32_t id, struct HdfSBuf *data,\n",
infName_.string(), interfaceName_.string());
baseName_.string(), interfaceName_.string());
sb.Append(g_tab).Append("struct HdfSBuf *reply)\n");
sb.Append("{\n");
String remoteName = "serv";
sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(self, struct %sProxy, impl);\n",
infName_.string(), infName_.string(), remoteName.string());
baseName_.string(), baseName_.string(), remoteName.string());
sb.Append(g_tab).AppendFormat("struct HdfIoService *%s = proxy->%s;\n", remoteName.string(), remoteName.string());
sb.Append(g_tab).AppendFormat("if (%s == NULL\n", remoteName.string());
@@ -202,10 +202,10 @@ void CClientProxyCodeEmitter::EmitProxyMethodImpl(const AutoPtr<ASTMethod>& meth
{
if (method->GetParameterNumber() == 0) {
sb.AppendFormat("static int32_t %sProxy%s(struct %s *self)\n",
infName_.string(), method->GetName().string(), interfaceName_.string());
baseName_.string(), method->GetName().string(), interfaceName_.string());
} else {
StringBuilder paramStr;
paramStr.AppendFormat("static int32_t %sProxy%s(", infName_.string(), method->GetName().string());
paramStr.AppendFormat("static int32_t %sProxy%s(", baseName_.string(), method->GetName().string());
paramStr.AppendFormat("struct %s *self, ", interfaceName_.string());
for (size_t i = 0; i < method->GetParameterNumber(); i++) {
AutoPtr<ASTParameter> param = method->GetParameter(i);
@@ -344,13 +344,13 @@ void CClientProxyCodeEmitter::EmitStubCallMethod(const AutoPtr<ASTMethod>& metho
void CClientProxyCodeEmitter::EmitProxyAsObjectMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("static struct HdfRemoteService *%sProxyAsObject(struct %s *self)\n",
infName_.string(), interfaceName_.string());
baseName_.string(), interfaceName_.string());
sb.Append("{\n");
sb.Append(g_tab).Append("if (self == NULL) {\n");
sb.Append(g_tab).Append(g_tab).Append("return NULL;\n");
sb.Append(g_tab).Append("}\n");
sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = CONTAINER_OF(self, struct %sProxy, impl);\n",
infName_.string(), infName_.string());
baseName_.string(), baseName_.string());
sb.Append(g_tab).Append("return proxy->remote;\n");
sb.Append("}\n");
}
@@ -359,21 +359,21 @@ void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb)
{
String objName = "impl";
sb.AppendFormat("static void %sProxyConstruct(struct %s *%s)\n",
infName_.string(), interfaceName_.string(), objName.string());
baseName_.string(), interfaceName_.string(), objName.string());
sb.Append("{\n");
for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
AutoPtr<ASTMethod> method = interface_->GetMethod(i);
sb.Append(g_tab).AppendFormat("%s->%s = %sProxy%s;\n",
objName.string(), method->GetName().string(), infName_.string(), method->GetName().string());
objName.string(), method->GetName().string(), baseName_.string(), method->GetName().string());
}
AutoPtr<ASTMethod> getVerMethod = interface_->GetVersionMethod();
sb.Append(g_tab).AppendFormat("%s->%s = %sProxy%s;\n", objName.string(), getVerMethod->GetName().string(),
infName_.string(), getVerMethod->GetName().string());
baseName_.string(), getVerMethod->GetName().string());
if (!isKernelCode_) {
sb.Append(g_tab).AppendFormat("%s->AsObject = %sProxyAsObject;\n", objName.string(), infName_.string());
sb.Append(g_tab).AppendFormat("%s->AsObject = %sProxyAsObject;\n", objName.string(), baseName_.string());
}
sb.Append("}\n");
@@ -381,9 +381,9 @@ void CClientProxyCodeEmitter::EmitProxyConstruction(StringBuilder& sb)
void CClientProxyCodeEmitter::EmitProxyGetMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("struct %s *%sGet()\n", interfaceName_.string(), infName_.string());
sb.AppendFormat("struct %s *%sGet()\n", interfaceName_.string(), baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("return %sGetInstance(\"%s\");\n", infName_.string(), FileName(implName_).string());
sb.Append(g_tab).AppendFormat("return %sGetInstance(\"%s\");\n", baseName_.string(), FileName(implName_).string());
sb.Append("}\n");
}
@@ -393,7 +393,7 @@ void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb)
String SerMajorName = "serMajorVer";
String SerMinorName = "serMinorVer";
sb.AppendFormat("struct %s *%sGetInstance(const char *instanceName)\n",
interfaceName_.string(), infName_.string());
interfaceName_.string(), baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).Append("struct HDIServiceManager *serviceMgr = HDIServiceManagerGet();\n");
sb.Append(g_tab).Append("if (serviceMgr == NULL) {\n");
@@ -405,12 +405,12 @@ void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb)
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",
infName_.string());
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 = ", infName_.string());
sb.AppendFormat("(struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", infName_.string(),
infName_.string());
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());
@@ -419,14 +419,14 @@ void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb)
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", infName_.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", infName_.string(), objName.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("if (%s != %s) {\n", SerMajorName.string(), majorVerName_.string());
@@ -434,7 +434,7 @@ void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb)
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", infName_.string(), objName.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());
@@ -443,19 +443,19 @@ void CClientProxyCodeEmitter::EmitProxyGetInstanceMethodImpl(StringBuilder& sb)
void CClientProxyCodeEmitter::EmitKernelProxyGetInstanceMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("struct %s *%sGetInstance(const char* serviceName)\n", interfaceName_.string(), infName_.string());
sb.AppendFormat("struct %s *%sGetInstance(const char* serviceName)\n", interfaceName_.string(), baseName_.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", infName_.string());
"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");
sb.Append("\n");
sb.Append(g_tab).AppendFormat("struct %sProxy *proxy = (struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n",
infName_.string(), infName_.string(), infName_.string());
baseName_.string(), 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());
@@ -465,7 +465,7 @@ void CClientProxyCodeEmitter::EmitKernelProxyGetInstanceMethodImpl(StringBuilder
sb.Append("\n");
sb.Append(g_tab).Append("proxy->serv = serv;\n");
sb.Append(g_tab).AppendFormat("%sProxyConstruct(&proxy->impl);\n", infName_.string());
sb.Append(g_tab).AppendFormat("%sProxyConstruct(&proxy->impl);\n", baseName_.string());
sb.Append(g_tab).Append("return &proxy->impl;\n");
sb.Append("}\n");
}
@@ -476,16 +476,16 @@ void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb)
String SerMajorName = "serMajorVer";
String SerMinorName = "serMinorVer";
sb.AppendFormat("struct %s *%sGet(struct HdfRemoteService *remote)\n",
interfaceName_.string(), infName_.string());
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",
infName_.string());
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 = ", infName_.string());
sb.AppendFormat("(struct %sProxy *)OsalMemAlloc(sizeof(struct %sProxy));\n", infName_.string(),
infName_.string());
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());
@@ -494,14 +494,14 @@ void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb)
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", infName_.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", infName_.string(), objName.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("if (%s != %s) {\n", SerMajorName.string(), majorVerName_.string());
@@ -509,7 +509,7 @@ void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb)
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", infName_.string(), objName.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());
@@ -518,13 +518,13 @@ void CClientProxyCodeEmitter::EmitCbProxyGetMethodImpl(StringBuilder& sb)
void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("void %sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string());
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",
infName_.string(), infName_.string());
baseName_.string(), baseName_.string());
sb.Append(g_tab).Append("HdfRemoteServiceRecycle(proxy->remote);\n");
sb.Append(g_tab).Append("OsalMemFree(proxy);\n");
sb.Append("}\n");
@@ -532,13 +532,13 @@ void CClientProxyCodeEmitter::EmitProxyReleaseMethodImpl(StringBuilder& sb)
void CClientProxyCodeEmitter::EmitKernelProxyReleaseMethodImpl(StringBuilder& sb)
{
sb.AppendFormat("void %sRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string());
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",
infName_.string(), infName_.string());
baseName_.string(), baseName_.string());
sb.Append(g_tab).Append("HdfIoServiceRecycle(proxy->serv);\n");
sb.Append(g_tab).Append("OsalMemFree(proxy);\n");
sb.Append("}\n");
+2 -67
View File
@@ -14,54 +14,12 @@
namespace OHOS {
namespace HDI {
String CCodeEmitter::FileName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
String subName = Options::GetInstance().GetSubPackage(name);
StringBuilder sb;
for (int i = 0; i < subName.GetLength(); i++) {
char c = subName[i];
if (isupper(c) != 0) {
// 2->Index of the last char array.
if (i > 1 && subName[i - 1] != '.' && subName[i - 2] != '.') {
sb.Append('_');
}
sb.Append(tolower(c));
} else {
sb.Append(c);
}
}
return sb.ToString().Replace('.', '/');
}
String CCodeEmitter::EmitMethodCmdID(const AutoPtr<ASTMethod>& method)
{
return String::Format("CMD_%s_%s", infName_.ToUnderLineUpper().string(),
method->GetName().ToUnderLineUpper().string());
}
void CCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb)
{
sb.Append("enum {\n");
for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
AutoPtr<ASTMethod> method = interface_->GetMethod(i);
sb.Append(g_tab).Append(EmitMethodCmdID(method)).Append(",\n");
}
sb.Append(g_tab).Append(EmitMethodCmdID(interface_->GetVersionMethod())).Append(",\n");
sb.Append("};\n");
}
void CCodeEmitter::GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles)
{
for (const auto& importPair : ast_->GetImports()) {
AutoPtr<AST> importAst = importPair.second;
String fileName = FileName(importAst->GetFullName());
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(importAst->GetFullName())));
String fileName = PackageToFilePath(importAst->GetFullName());
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, fileName));
}
}
@@ -146,29 +104,6 @@ String CCodeEmitter::MacroName(const String& name)
return macro;
}
String CCodeEmitter::ConstantName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (isupper(c) != 0) {
if (i > 1) {
sb.Append('_');
}
sb.Append(c);
} else {
sb.Append(toupper(c));
}
}
return sb.ToString();
}
String CCodeEmitter::SpecificationParam(StringBuilder& paramSb, const String& prefix)
{
int maxLineLen = 120;
-6
View File
@@ -20,13 +20,7 @@ namespace HDI {
class CCodeEmitter : public CodeEmitter {
public:
virtual ~CCodeEmitter() = default;
static String FileName(const String& name);
protected:
String EmitMethodCmdID(const AutoPtr<ASTMethod>& method);
void EmitInterfaceMethodCommands(StringBuilder& sb);
void GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles);
void EmitInterfaceMethodParameter(const AutoPtr<ASTParameter>& parameter, StringBuilder& sb, const String& prefix);
@@ -36,12 +36,12 @@ void CCustomTypesCodeEmitter::EmitCode()
void CCustomTypesCodeEmitter::EmitCustomTypesHeaderFile()
{
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(infName_).string());
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(baseName_).string());
File file(filePath, File::WRITE);
StringBuilder sb;
EmitLicense(sb);
EmitHeadMacro(sb, infName_);
EmitHeadMacro(sb, baseName_);
sb.Append("\n");
EmitHeaderInclusions(sb);
sb.Append("\n");
@@ -53,7 +53,7 @@ void CCustomTypesCodeEmitter::EmitCustomTypesHeaderFile()
sb.Append("\n");
EmitTailExternC(sb);
sb.Append("\n");
EmitTailMacro(sb, infName_);
EmitTailMacro(sb, baseName_);
String data = sb.ToString();
file.WriteData(data.string(), data.GetLength());
@@ -160,7 +160,7 @@ void CCustomTypesCodeEmitter::EmitCustomTypeFreeDecl(StringBuilder& sb,
void CCustomTypesCodeEmitter::EmitCustomTypesSourceFile()
{
String filePath = String::Format("%s/%s.c", directory_.string(), FileName(infName_).string());
String filePath = String::Format("%s/%s.c", directory_.string(), FileName(baseName_).string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -178,7 +178,7 @@ void CCustomTypesCodeEmitter::EmitCustomTypesSourceFile()
void CCustomTypesCodeEmitter::EmitSoucreIncludsions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(infName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(baseName_)));
GetSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -51,7 +51,7 @@ void CInterfaceCodeEmitter::EmitInterfaceHeaderFile()
sb.Append("\n");
EmitInterfaceVersionMacro(sb);
sb.Append("\n");
EmitInterfaceMethodCommands(sb);
EmitInterfaceMethodCommands(sb, "");
sb.Append("\n");
EmitInterfaceDefinition(sb);
sb.Append("\n");
@@ -153,17 +153,17 @@ 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(), infName_.string(), methodParamStr.string());
sb.AppendFormat("struct %s *%sGet(%s);\n", interfaceName_.string(), baseName_.string(), methodParamStr.string());
if (!isCallbackInterface()) {
sb.Append("\n");
sb.AppendFormat("struct %s *%sGetInstance(const char *instanceName);\n",
interfaceName_.string(), infName_.string());
interfaceName_.string(), baseName_.string());
}
}
void CInterfaceCodeEmitter::EmitInterfaceReleaseMethodDecl(StringBuilder& sb)
{
sb.AppendFormat("void %sRelease(struct %s *instance);\n", infName_.string(), interfaceName_.string());
sb.AppendFormat("void %sRelease(struct %s *instance);\n", baseName_.string(), interfaceName_.string());
}
} // namespace HDI
} // namespace OHOS
@@ -38,7 +38,7 @@ void CServiceDriverCodeEmitter::EmitCode()
void CServiceDriverCodeEmitter::EmitDriverSourceFile()
{
String filePath = String::Format("%s/%s.c", directory_.string(), FileName(infName_ + "Driver").string());
String filePath = String::Format("%s/%s.c", directory_.string(), FileName(baseName_ + "Driver").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -67,8 +67,8 @@ void CServiceDriverCodeEmitter::EmitDriverIncluions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(stubName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(implName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(stubName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(implName_)));
GetDriverSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -86,7 +86,7 @@ void CServiceDriverCodeEmitter::GetDriverSourceOtherLibInclusions(HeaderFile::He
void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb)
{
sb.AppendFormat("struct Hdf%sHost {\n", infName_.string());
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("};\n");
@@ -94,56 +94,56 @@ void CServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb)
void CServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb)
{
String hostName = infName_.ToLowerCase() + "Host";
String hostName = baseName_.ToLowerCase() + "Host";
sb.AppendFormat("static int32_t %sDriverDispatch(struct HdfDeviceIoClient *client, int cmdId,\n",
infName_.string());
baseName_.string());
sb.Append(g_tab).Append("struct HdfSBuf *data, struct HdfSBuf *reply)\n");
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(\n",
infName_.string(), hostName.string());
baseName_.string(), hostName.string());
sb.Append(g_tab).Append(g_tab).AppendFormat("client->device->service, struct Hdf%sHost, ioservice);\n",
infName_.string());
baseName_.string());
sb.Append(g_tab).AppendFormat("return %sServiceOnRemoteRequest(%s->service, cmdId, data, reply);\n",
infName_.string(), hostName.string());
baseName_.string(), hostName.string());
sb.Append("}\n");
}
void CServiceDriverCodeEmitter::EmitDriverInit(StringBuilder& sb)
{
sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", infName_.string());
sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter.\");\n", infName_.string());
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter.\");\n", baseName_.string());
sb.Append(g_tab).Append("return HDF_SUCCESS;\n");
sb.Append("}\n");
}
void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb)
{
String hostName = infName_.ToLowerCase() + "Host";
sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", infName_.string());
String hostName = baseName_.ToLowerCase() + "Host";
sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", infName_.string());
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter.\");\n", baseName_.string());
sb.Append("\n");
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = (struct Hdf%sHost *)OsalMemAlloc(\n",
infName_.string(), hostName.string(), infName_.string());
sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", infName_.string());
baseName_.string(), hostName.string(), baseName_.string());
sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", baseName_.string());
sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", hostName.string());
sb.Append(g_tab).Append(g_tab).AppendFormat(
"HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sHost failed!\");\n", infName_.string(), infName_.string());
"HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sHost failed!\");\n", baseName_.string(), baseName_.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("%s->ioservice.Dispatch = %sDriverDispatch;\n",
hostName.string(), infName_.string());
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(), infName_.string());
sb.Append(g_tab).AppendFormat("%s->service = %sStubGetInstance();\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", infName_.string(), hostName.string());
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");
@@ -151,29 +151,29 @@ void CServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb)
void CServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb)
{
String hostName = infName_.ToLowerCase() + "Host";
sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", infName_.string());
String hostName = baseName_.ToLowerCase() + "Host";
sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)\n", baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", infName_.string());
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", infName_.string(), hostName.string());
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter.\");\n", baseName_.string());
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.string(), hostName.string());
sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioservice);\n",
infName_.string());
sb.Append(g_tab).AppendFormat("%sStubRelease(%s->service);\n", infName_.string(), hostName.string());
baseName_.string());
sb.Append(g_tab).AppendFormat("%sStubRelease(%s->service);\n", baseName_.string(), hostName.string());
sb.Append(g_tab).AppendFormat("OsalMemFree(%s);\n", hostName.string());
sb.Append("}\n");
}
void CServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb)
{
sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string());
sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", baseName_.ToLowerCase().string());
sb.Append(g_tab).Append(".moduleVersion = 1,\n");
sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n",
Options::GetInstance().GetModuleName().string());
sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string());
sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string());
sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string());
sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", baseName_.string());
sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", baseName_.string());
sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", baseName_.string());
sb.Append("};\n\n");
sb.AppendFormat("HDF_INIT(g_%sDriverEntry);", infName_.ToLowerCase().string());
sb.AppendFormat("HDF_INIT(g_%sDriverEntry);", baseName_.ToLowerCase().string());
}
} // namespace HDI
} // namespace OHOS
@@ -37,7 +37,7 @@ void CServiceImplCodeEmitter::EmitCode()
void CServiceImplCodeEmitter::EmitServiceImplHeaderFile()
{
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(infName_ + "Service").string());
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(baseName_ + "Service").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -64,7 +64,7 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_)));
for (const auto& file : headerFiles) {
sb.AppendFormat("%s\n", file.ToString().string());
@@ -73,12 +73,12 @@ void CServiceImplCodeEmitter::EmitServiceImplHeaderInclusions(StringBuilder& sb)
void CServiceImplCodeEmitter::EmitServiceImplConstructDecl(StringBuilder& sb)
{
sb.AppendFormat("void %sServiceConstruct(struct %s* service);\n", infName_.string(), interfaceName_.string());
sb.AppendFormat("void %sServiceConstruct(struct %s* service);\n", baseName_.string(), interfaceName_.string());
}
void CServiceImplCodeEmitter::EmitServiceImplSourceFile()
{
String filePath = String::Format("%s/%s.c", directory_.string(), FileName(infName_ + "Service").string());
String filePath = String::Format("%s/%s.c", directory_.string(), FileName(baseName_ + "Service").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -99,7 +99,7 @@ void CServiceImplCodeEmitter::EmitServiceImplSourceInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(implName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(implName_)));
GetSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -131,11 +131,11 @@ void CServiceImplCodeEmitter::EmitServiceImplMethodImpl(const AutoPtr<ASTMethod>
{
if (method->GetParameterNumber() == 0) {
sb.Append(prefix).AppendFormat("int32_t %s%s(struct %s *self)\n",
infName_.string(), method->GetName().string(), interfaceName_.string());
baseName_.string(), method->GetName().string(), interfaceName_.string());
} else {
StringBuilder paramStr;
paramStr.Append(prefix).AppendFormat("int32_t %s%s(struct %s *self, ",
infName_.string(), method->GetName().string(), interfaceName_.string());
baseName_.string(), method->GetName().string(), interfaceName_.string());
for (size_t i = 0; i < method->GetParameterNumber(); i++) {
AutoPtr<ASTParameter> param = method->GetParameter(i);
EmitInterfaceMethodParameter(param, paramStr, "");
@@ -158,12 +158,12 @@ void CServiceImplCodeEmitter::EmitServiceImplConstruct(StringBuilder& sb)
{
String objName("instance");
sb.AppendFormat("void %sServiceConstruct(struct %s *%s)\n",
infName_.string(), interfaceName_.string(), objName.string());
baseName_.string(), interfaceName_.string(), objName.string());
sb.Append("{\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(), infName_.string(), method->GetName().string());
objName.string(), method->GetName().string(), baseName_.string(), method->GetName().string());
}
sb.Append("}");
}
@@ -65,7 +65,8 @@ void CServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf"));
for (const auto& file : headerFiles) {
sb.AppendFormat("%s\n", file.ToString().string());
@@ -75,14 +76,14 @@ void CServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb)
void CServiceStubCodeEmitter::EmitCbServiceStubMethodsDcl(StringBuilder& sb)
{
if (!isCallbackInterface()) {
sb.AppendFormat("int32_t %sServiceOnRemoteRequest(struct %s *serviceImpl, ", infName_.string(),
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("struct %s* %sStubGetInstance(void);\n", interfaceName_.string(), infName_.string());
sb.AppendFormat("struct %s* %sStubGetInstance(void);\n", interfaceName_.string(), baseName_.string());
sb.Append("\n");
sb.AppendFormat("void %sStubRelease(struct %s *instance);\n", infName_.string(), interfaceName_.string());
sb.AppendFormat("void %sStubRelease(struct %s *instance);\n", baseName_.string(), interfaceName_.string());
}
void CServiceStubCodeEmitter::EmitServiceStubSourceFile()
@@ -133,18 +134,7 @@ void CServiceStubCodeEmitter::EmitStubSourceInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_)));
if (!isKernelCode_ && !isCallbackInterface()) {
for (const auto& importPair : ast_->GetImports()) {
AutoPtr<AST> importAst = importPair.second;
if (importAst->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
String fileName = FileName(importAst->GetInterfaceDef()->GetFullName());
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, fileName));
}
}
}
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(stubName_)));
GetSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -171,13 +161,12 @@ void CServiceStubCodeEmitter::GetSourceOtherLibInclusions(HeaderFile::HeaderFile
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, "hdf_sbuf"));
headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem"));
}
void CServiceStubCodeEmitter::EmitStubDefinitions(StringBuilder& sb)
{
sb.AppendFormat("struct %sStub {\n", infName_.string());
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");
@@ -405,7 +394,7 @@ void CServiceStubCodeEmitter::EmitStubAsObjectMethodImpl(StringBuilder& sb, cons
{
String objName = "self";
sb.Append(prefix).AppendFormat("static struct HdfRemoteService *%sStubAsObject(struct %s *%s)\n",
infName_.string(), interfaceName_.string(), objName.string());
baseName_.string(), interfaceName_.string(), objName.string());
sb.Append(prefix).Append("{\n");
sb.Append(prefix + g_tab).AppendFormat("if (%s == NULL) {\n", objName.string());
@@ -413,7 +402,7 @@ void CServiceStubCodeEmitter::EmitStubAsObjectMethodImpl(StringBuilder& sb, cons
sb.Append(prefix + g_tab).Append("}\n");
sb.Append(prefix + g_tab).AppendFormat("struct %sStub *stub = CONTAINER_OF(%s, struct %sStub, impl);\n",
infName_.string(), objName.string(), infName_.string());
baseName_.string(), objName.string(), baseName_.string());
sb.Append(prefix + g_tab).Append("return stub->remote;\n");
sb.Append(prefix).Append("}\n");
}
@@ -456,7 +445,7 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder&
String implName = "serviceImpl";
String codeName = "cmdId";
sb.Append(prefix).AppendFormat("int32_t %sServiceOnRemoteRequest(struct %s *%s, int %s, ",
infName_.string(), interfaceName_.string(), implName.string(), codeName.string());
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());
@@ -484,10 +473,10 @@ void CServiceStubCodeEmitter::EmitServiceStubOnRequestMethodImpl(StringBuilder&
void CServiceStubCodeEmitter::EmitStubGetMethodImpl(StringBuilder& sb)
{
String stubTypeName = String::Format("%sStub", infName_.string());
String stubTypeName = String::Format("%sStub", baseName_.string());
String objName = "stub";
sb.AppendFormat("struct %s *%sStubGetInstance(void)\n", interfaceName_.string(), infName_.string());
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",
stubTypeName.string(), objName.string(), stubTypeName.string(), stubTypeName.string());
@@ -507,7 +496,7 @@ void CServiceStubCodeEmitter::EmitStubGetMethodImpl(StringBuilder& sb)
sb.Append(g_tab).Append(g_tab).Append("return NULL;\n");
sb.Append(g_tab).Append("}\n\n");
sb.Append(g_tab).AppendFormat("%s->impl.AsObject = %sStubAsObject;\n", objName.string(), infName_.string());
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");
}
@@ -515,7 +504,7 @@ void CServiceStubCodeEmitter::EmitStubGetMethodImpl(StringBuilder& sb)
void CServiceStubCodeEmitter::EmitKernelStubGetMethodImpl(StringBuilder& sb)
{
String objName("instance");
sb.AppendFormat("struct %s *%sStubGetInstance(void)\n", interfaceName_.string(), infName_.string());
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());
@@ -532,7 +521,7 @@ void CServiceStubCodeEmitter::EmitKernelStubGetMethodImpl(StringBuilder& sb)
void CServiceStubCodeEmitter::EmitStubReleaseImpl(StringBuilder& sb)
{
String objName = "instance";
sb.AppendFormat("void %sStubRelease(struct %s *%s)\n", infName_.string(), interfaceName_.string(),
sb.AppendFormat("void %sStubRelease(struct %s *%s)\n", baseName_.string(), interfaceName_.string(),
objName.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("if (%s == NULL) {\n", objName.string());
@@ -546,7 +535,7 @@ void CServiceStubCodeEmitter::EmitStubReleaseImpl(StringBuilder& sb)
void CServiceStubCodeEmitter::EmitKernelStubReleaseImpl(StringBuilder& sb)
{
sb.AppendFormat("void %sStubRelease(struct %s *instance)\n", infName_.string(), interfaceName_.string());
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");
+121 -9
View File
@@ -36,23 +36,23 @@ bool CodeEmitter::Reset(const AutoPtr<AST>& ast, const String& targetDirectory,
interface_ = ast_->GetInterfaceDef();
interfaceName_ = interface_->GetName();
interfaceFullName_ = interface_->GetNamespace()->ToString() + interfaceName_;
infName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_;
proxyName_ = infName_ + "Proxy";
baseName_ = interfaceName_.StartsWith("I") ? interfaceName_.Substring(1) : interfaceName_;
proxyName_ = baseName_ + "Proxy";
proxyFullName_ = interface_->GetNamespace()->ToString() + proxyName_;
stubName_ = infName_ + "Stub";
stubName_ = baseName_ + "Stub";
stubFullName_ = interface_->GetNamespace()->ToString() + stubName_;
implName_ = infName_ + "Service";
implName_ = baseName_ + "Service";
implFullName_ = interface_->GetNamespace()->ToString() + implName_;
} else if (ast_->GetASTFileType() == ASTFileType::AST_TYPES) {
infName_ = ast_->GetName();
baseName_ = ast_->GetName();
}
majorVerName_ = String::Format("%s_MAJOR_VERSION", interfaceName_.ToUnderLineUpper().string());
minorVerName_ = String::Format("%s_MINOR_VERSION", interfaceName_.ToUnderLineUpper().string());
majorVerName_ = String::Format("%s_MAJOR_VERSION", ConstantName(interfaceName_).string());
minorVerName_ = String::Format("%s_MINOR_VERSION", ConstantName(interfaceName_).string());
String prefix = String::Format("%c%s", tolower(infName_[0]), infName_.Substring(1).string());
String prefix = String::Format("%c%s", tolower(baseName_[0]), baseName_.Substring(1).string());
dataParcelName_ = prefix + "Data";
replyParcelName_ = prefix + "Reply";
optionName_ = prefix + "Option";
@@ -73,7 +73,7 @@ void CodeEmitter::CleanData()
directory_ = "";
interfaceName_ = "";
interfaceFullName_ = "";
infName_ = "";
baseName_ = "";
proxyName_ = "";
proxyFullName_ = "";
stubName_ = "";
@@ -97,5 +97,117 @@ String CodeEmitter::GetFilePath(const String& outDir)
return String::Format("%s/%s/", outPath.string(), packagePath.string());
}
}
String CodeEmitter::PackageToFilePath(const String& packageName)
{
std::vector<String> packageVec = Options::GetInstance().GetSubPackage(packageName).Split(".");
StringBuilder filePath;
for (auto iter = packageVec.begin(); iter != packageVec.end(); iter++) {
filePath.Append(FileName(*iter));
if (iter != packageVec.end() - 1) {
filePath.Append("/");
}
}
return filePath.ToString();
}
String CodeEmitter::EmitMethodCmdID(const AutoPtr<ASTMethod>& method)
{
return String::Format("CMD_%s_%s", ConstantName(baseName_).string(),
ConstantName(method->GetName()).string());
}
void CodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix)
{
sb.Append(prefix).AppendFormat("enum {\n");
for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
AutoPtr<ASTMethod> method = interface_->GetMethod(i);
sb.Append(prefix + g_tab).Append(EmitMethodCmdID(method)).Append(",\n");
}
sb.Append(prefix + g_tab).Append(EmitMethodCmdID(interface_->GetVersionMethod())).Append(",\n");
sb.Append(prefix).Append("};\n");
}
String CodeEmitter::EmitVersionHeaderName(const String& name)
{
return String::Format("v%u_%u/%s", ast_->GetMajorVer(), ast_->GetMinorVer(), FileName(name).string());
}
String CodeEmitter::ConstantName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (isupper(c) != 0) {
if (i > 1) {
sb.Append('_');
}
sb.Append(c);
} else {
sb.Append(toupper(c));
}
}
return sb.ToString();
}
String CodeEmitter::PascalName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (i == 0) {
if (islower(c)) {
c = toupper(c);
}
sb.Append(c);
} else {
if (c == '_') {
continue;
}
if (islower(c) && name[i - 1] == '_') {
c = toupper(c);
}
sb.Append(c);
}
}
return sb.ToString();
}
String CodeEmitter::FileName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (isupper(c) != 0) {
// 2->Index of the last char array.
if (i > 1) {
sb.Append('_');
}
sb.Append(tolower(c));
} else {
sb.Append(c);
}
}
return sb.ToString();
}
} // namespace HDI
} // namespace OHOS
+24 -1
View File
@@ -81,6 +81,29 @@ protected:
String GetFilePath(const String& outDir);
String PackageToFilePath(const String& packageName);
String EmitMethodCmdID(const AutoPtr<ASTMethod>& method);
void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix);
/* ForExample:
* MajorVersion: 1
* MinorVersion: 0
* name: IFoo
* result: v1_0/ifoo.h
*/
String EmitVersionHeaderName(const String& name);
// file_name -> FILE_NAME
String ConstantName(const String& name);
// file_name -> FileName
String PascalName(const String& name);
// FileName -> file_name
String FileName(const String& name);
bool isKernelCode_ = false;
AutoPtr<AST> ast_ = nullptr;
AutoPtr<ASTInterfaceType> interface_ = nullptr;
@@ -88,7 +111,7 @@ protected:
String interfaceName_;
String interfaceFullName_;
String infName_;
String baseName_;
String proxyName_;
String proxyFullName_;
String stubName_;
@@ -37,7 +37,7 @@ void CppClientProxyCodeEmitter::EmitCode()
void CppClientProxyCodeEmitter::EmitProxyHeaderFile()
{
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(infName_ + "Proxy").string());
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(baseName_ + "Proxy").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -64,7 +64,7 @@ void CppClientProxyCodeEmitter::EmitProxyHeaderInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(interfaceName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(interfaceName_)));
GetHeaderOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -146,7 +146,7 @@ void CppClientProxyCodeEmitter::EmitProxyMethodParameter(const AutoPtr<ASTParame
void CppClientProxyCodeEmitter::EmitProxySourceFile()
{
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(infName_ + "Proxy").string());
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(baseName_ + "Proxy").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -174,7 +174,7 @@ void CppClientProxyCodeEmitter::EmitProxySourceFile()
void CppClientProxyCodeEmitter::EmitProxySourceInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(proxyName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(proxyName_)));
GetSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
+12 -101
View File
@@ -16,77 +16,6 @@
namespace OHOS {
namespace HDI {
String CppCodeEmitter::FileName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
String subName = Options::GetInstance().GetSubPackage(name);
StringBuilder sb;
for (int i = 0; i < subName.GetLength(); i++) {
char c = subName[i];
if (isupper(c) != 0) {
// 2->Index of the last char array.
if (i > 1 && subName[i - 1] != '.' && subName[i - 2] != '.') {
sb.Append('_');
}
sb.Append(tolower(c));
} else {
sb.Append(c);
}
}
return sb.ToString().Replace('.', '/');
}
String CppCodeEmitter::PascalName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (i == 0) {
if (islower(c)) {
c = toupper(c);
}
sb.Append(c);
} else {
if (c == '_') {
continue;
}
if (islower(c) && name[i - 1] == '_') {
c = toupper(c);
}
sb.Append(c);
}
}
return sb.ToString();
}
String CppCodeEmitter::EmitMethodCmdID(const AutoPtr<ASTMethod>& method)
{
return String::Format("CMD_%s_%s", infName_.ToUnderLineUpper().string(),
method->GetName().ToUnderLineUpper().string());
}
void CppCodeEmitter::EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix)
{
sb.Append(prefix).AppendFormat("enum {\n");
for (size_t i = 0; i < interface_->GetMethodNumber(); i++) {
AutoPtr<ASTMethod> method = interface_->GetMethod(i);
sb.Append(prefix + g_tab).Append(EmitMethodCmdID(method)).Append(",\n");
}
sb.Append(g_tab).Append(EmitMethodCmdID(interface_->GetVersionMethod())).Append(",\n");
sb.Append(prefix).Append("};\n");
}
void CppCodeEmitter::GetStdlibInclusions(HeaderFile::HeaderFileSet& headerFiles)
{
bool includeString = false;
@@ -136,8 +65,8 @@ void CppCodeEmitter::GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles)
{
for (const auto& importPair : ast_->GetImports()) {
AutoPtr<AST> importAst = importPair.second;
String fileName = FileName(importAst->GetFullName());
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(importAst->GetFullName())));
String fileName = PackageToFilePath(importAst->GetFullName());
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, fileName));
}
}
@@ -194,16 +123,21 @@ std::vector<String> CppCodeEmitter::EmitCppNameSpaceVec(const String& namespaceS
std::vector<String> namespaceVec = namespaceStr.Split(".");
bool findVersion = false;
for (const auto& nspace : namespaceVec) {
String rootPackage = Options::GetInstance().GetRootPackage(namespaceStr);
size_t rootPackageNum = rootPackage.Split(".").size();
for (size_t i = 0; i < namespaceVec.size(); i++) {
String name;
if (!findVersion && isVersion(nspace)) {
name = nspace.Replace('v', 'V');
if (i < rootPackageNum) {
name = namespaceVec[i].ToUpperCase();
} else if (!findVersion && isVersion(namespaceVec[i])) {
name = namespaceVec[i].Replace('v', 'V');
findVersion = true;
} else {
if (findVersion) {
name = nspace;
name = namespaceVec[i];
} else {
name = PascalName(nspace);
name = PascalName(namespaceVec[i]);
}
}
@@ -321,29 +255,6 @@ String CppCodeEmitter::MacroName(const String& name)
return macro;
}
String CppCodeEmitter::ConstantName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (isupper(c) != 0) {
if (i > 1) {
sb.Append('_');
}
sb.Append(c);
} else {
sb.Append(toupper(c));
}
}
return sb.ToString();
}
String CppCodeEmitter::SpecificationParam(StringBuilder& paramSb, const String& prefix)
{
int maxLineLen = 120;
-8
View File
@@ -22,15 +22,7 @@ public:
virtual ~CppCodeEmitter() = default;
bool OutPut(const AutoPtr<AST>& ast, const String& targetDirectory);
static String FileName(const String& name);
static String PascalName(const String& name);
protected:
String EmitMethodCmdID(const AutoPtr<ASTMethod>& method);
void EmitInterfaceMethodCommands(StringBuilder& sb, const String& prefix);
void GetStdlibInclusions(HeaderFile::HeaderFileSet& headerFiles);
void GetImportInclusions(HeaderFile::HeaderFileSet& headerFiles);
@@ -35,9 +35,9 @@ void CppCustomTypesCodeEmitter::EmitCode()
void CppCustomTypesCodeEmitter::EmitCustomTypesHeaderFile()
{
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(infName_).string());
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(baseName_).string());
File file(filePath, File::WRITE);
String marcoName = String::Format("%s.%s", ast_->GetPackageName().string(), infName_.string());
String marcoName = String::Format("%s.%s", ast_->GetPackageName().string(), baseName_.string());
StringBuilder sb;
EmitLicense(sb);
@@ -147,7 +147,7 @@ void CppCustomTypesCodeEmitter::EmitCustomTypeUnmarshallingDecl(StringBuilder& s
void CppCustomTypesCodeEmitter::EmitCustomTypesSourceFile()
{
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(infName_).string());
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(baseName_).string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -170,7 +170,7 @@ void CppCustomTypesCodeEmitter::EmitSourceFileInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(infName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(baseName_)));
GetSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -38,7 +38,7 @@ void CppServiceDriverCodeEmitter::EmitCode()
void CppServiceDriverCodeEmitter::EmitDriverSourceFile()
{
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(infName_ + "Driver").string());
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(baseName_ + "Driver").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -74,7 +74,7 @@ void CppServiceDriverCodeEmitter::EmitDriverIncluions(StringBuilder& sb)
headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "osal_mem"));
headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_device_desc"));
headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_sbuf_ipc"));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(implName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(implName_)));
for (const auto& file : headerFiles) {
sb.AppendFormat("%s\n", file.ToString().string());
@@ -89,7 +89,7 @@ void CppServiceDriverCodeEmitter::EmitDriverUsings(StringBuilder& sb)
void CppServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb)
{
sb.AppendFormat("struct Hdf%sHost {\n", infName_.string());
sb.AppendFormat("struct Hdf%sHost {\n", baseName_.string());
sb.Append(g_tab).Append("struct IDeviceIoService ioservice;\n");
sb.Append(g_tab).AppendFormat("%s *service;\n", implName_.string());
sb.Append("};\n");
@@ -97,13 +97,13 @@ void CppServiceDriverCodeEmitter::EmitDriverServiceDecl(StringBuilder& sb)
void CppServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb)
{
String objName = String::Format("hdf%sHost", infName_.string());
sb.AppendFormat("static int32_t %sDriverDispatch(", infName_.string());
String objName = String::Format("hdf%sHost", baseName_.string());
sb.AppendFormat("static int32_t %sDriverDispatch(", baseName_.string());
sb.Append("struct HdfDeviceIoClient *client, int cmdId, struct HdfSBuf *data,\n");
sb.Append(g_tab).Append("struct HdfSBuf *reply)\n");
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", infName_.string(), objName.string());
sb.AppendFormat("client->device->service, struct Hdf%sHost, ioservice);\n\n", infName_.string());
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.string(), objName.string());
sb.AppendFormat("client->device->service, struct Hdf%sHost, ioservice);\n\n", baseName_.string());
sb.Append(g_tab).Append("OHOS::MessageParcel *dataParcel = nullptr;\n");
sb.Append(g_tab).Append("OHOS::MessageParcel *replyParcel = nullptr;\n");
@@ -123,31 +123,31 @@ void CppServiceDriverCodeEmitter::EmitDriverDispatch(StringBuilder& sb)
void CppServiceDriverCodeEmitter::EmitDriverInit(StringBuilder& sb)
{
sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", infName_.string());
sb.AppendFormat("int Hdf%sDriverInit(struct HdfDeviceObject *deviceObject)\n", baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter\");\n", infName_.string());
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverInit enter\");\n", baseName_.string());
sb.Append(g_tab).Append("return HDF_SUCCESS;\n");
sb.Append("}\n");
}
void CppServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb)
{
String objName = String::Format("hdf%sHost", infName_.string());
sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", infName_.string());
String objName = String::Format("hdf%sHost", baseName_.string());
sb.AppendFormat("int Hdf%sDriverBind(struct HdfDeviceObject *deviceObject)\n", baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter\");\n\n", infName_.string());
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverBind enter\");\n\n", baseName_.string());
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = (struct Hdf%sHost *)OsalMemAlloc(\n",
infName_.string(), objName.string(), infName_.string());
sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", infName_.string());
baseName_.string(), objName.string(), baseName_.string());
sb.Append(g_tab).Append(g_tab).AppendFormat("sizeof(struct Hdf%sHost));\n", baseName_.string());
sb.Append(g_tab).AppendFormat("if (%s == nullptr) {\n", objName.string());
sb.Append(g_tab).Append(g_tab).AppendFormat("HDF_LOGE(\"Hdf%sDriverBind OsalMemAlloc Hdf%sHost failed!\");\n",
infName_.string(), infName_.string());
baseName_.string(), baseName_.string());
sb.Append(g_tab).Append(g_tab).Append("return HDF_FAILURE;\n");
sb.Append(g_tab).Append("}\n\n");
sb.Append(g_tab).AppendFormat("%s->ioservice.Dispatch = %sDriverDispatch;\n",
objName.string(), infName_.string());
objName.string(), baseName_.string());
sb.Append(g_tab).AppendFormat("%s->ioservice.Open = NULL;\n", objName.string());
sb.Append(g_tab).AppendFormat("%s->ioservice.Release = NULL;\n", objName.string());
sb.Append(g_tab).AppendFormat("%s->service = new %s();\n\n", objName.string(), implName_.string());
@@ -159,12 +159,12 @@ void CppServiceDriverCodeEmitter::EmitDriverBind(StringBuilder& sb)
void CppServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb)
{
String objName = String::Format("hdf%sHost", infName_.string());
sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)", infName_.string());
String objName = String::Format("hdf%sHost", baseName_.string());
sb.AppendFormat("void Hdf%sDriverRelease(struct HdfDeviceObject *deviceObject)", baseName_.string());
sb.Append("{\n");
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter\");\n\n", infName_.string());
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", infName_.string(), objName.string());
sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioservice);\n", infName_.string());
sb.Append(g_tab).AppendFormat("HDF_LOGI(\"Hdf%sDriverRelease enter\");\n\n", baseName_.string());
sb.Append(g_tab).AppendFormat("struct Hdf%sHost *%s = CONTAINER_OF(", baseName_.string(), objName.string());
sb.AppendFormat("deviceObject->service, struct Hdf%sHost, ioservice);\n", baseName_.string());
sb.Append(g_tab).AppendFormat("delete %s->service;\n", objName.string());
sb.Append(g_tab).AppendFormat("OsalMemFree(%s);\n", objName.string());
sb.Append("}\n");
@@ -172,19 +172,19 @@ void CppServiceDriverCodeEmitter::EmitDriverRelease(StringBuilder& sb)
void CppServiceDriverCodeEmitter::EmitDriverEntryDefinition(StringBuilder& sb)
{
sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", infName_.ToLowerCase().string());
sb.AppendFormat("struct HdfDriverEntry g_%sDriverEntry = {\n", baseName_.ToLowerCase().string());
sb.Append(g_tab).Append(".moduleVersion = 1,\n");
sb.Append(g_tab).AppendFormat(".moduleName = \"%s\",\n",
Options::GetInstance().GetModuleName().string());
sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", infName_.string());
sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", infName_.string());
sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", infName_.string());
sb.Append(g_tab).AppendFormat(".Bind = Hdf%sDriverBind,\n", baseName_.string());
sb.Append(g_tab).AppendFormat(".Init = Hdf%sDriverInit,\n", baseName_.string());
sb.Append(g_tab).AppendFormat(".Release = Hdf%sDriverRelease,\n", baseName_.string());
sb.Append("};\n");
sb.Append("\n");
sb.Append("#ifndef __cplusplus\n");
sb.Append("extern \"C\" {\n");
sb.Append("#endif\n");
sb.AppendFormat("HDF_INIT(g_%sDriverEntry);\n", infName_.ToLowerCase().string());
sb.AppendFormat("HDF_INIT(g_%sDriverEntry);\n", baseName_.ToLowerCase().string());
sb.Append("#ifndef __cplusplus\n");
sb.Append("}\n");
sb.Append("#endif\n");
@@ -37,7 +37,7 @@ void CppServiceImplCodeEmitter::EmitCode()
void CppServiceImplCodeEmitter::EmitImplHeaderFile()
{
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(infName_ + "Service").string());
String filePath = String::Format("%s/%s.h", directory_.string(), FileName(baseName_ + "Service").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -59,7 +59,7 @@ void CppServiceImplCodeEmitter::EmitImplHeaderFile()
void CppServiceImplCodeEmitter::EmitServiceImplInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(stubName_)));
for (const auto& file : headerFiles) {
sb.AppendFormat("%s\n", file.ToString().string());
@@ -70,7 +70,7 @@ void CppServiceImplCodeEmitter::EmitServiceImplDecl(StringBuilder& sb)
{
EmitBeginNamespace(sb);
sb.Append("\n");
sb.AppendFormat("class %sService : public %s {\n", infName_.string(), stubName_.string());
sb.AppendFormat("class %sService : public %s {\n", baseName_.string(), stubName_.string());
sb.Append("public:\n");
EmitServiceImplBody(sb, g_tab);
sb.Append("};\n");
@@ -88,7 +88,7 @@ void CppServiceImplCodeEmitter::EmitServiceImplBody(StringBuilder& sb, const Str
void CppServiceImplCodeEmitter::EmitServiceImplDestruction(StringBuilder& sb, const String& prefix)
{
sb.Append(prefix).AppendFormat("virtual ~%sService() {}\n", infName_.string());
sb.Append(prefix).AppendFormat("virtual ~%sService() {}\n", baseName_.string());
}
void CppServiceImplCodeEmitter::EmitServiceImplMethodDecls(StringBuilder& sb, const String& prefix)
@@ -127,7 +127,7 @@ void CppServiceImplCodeEmitter::EmitServiceImplMethodDecl(const AutoPtr<ASTMetho
void CppServiceImplCodeEmitter::EmitImplSourceFile()
{
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(infName_ + "Service").string());
String filePath = String::Format("%s/%s.cpp", directory_.string(), FileName(baseName_ + "Service").string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -149,7 +149,7 @@ void CppServiceImplCodeEmitter::EmitImplSourceFile()
void CppServiceImplCodeEmitter::EmitImplSourceInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(implName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(implName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OTHER_MODULES_HEADER_FILE, "hdf_base"));
for (const auto& file : headerFiles) {
@@ -177,10 +177,10 @@ void CppServiceImplCodeEmitter::EmitServiceImplMethodImpl(const AutoPtr<ASTMetho
const String& prefix)
{
if (method->GetParameterNumber() == 0) {
sb.Append(prefix).AppendFormat("int32_t %sService::%s()\n", infName_.string(), method->GetName().string());
sb.Append(prefix).AppendFormat("int32_t %sService::%s()\n", baseName_.string(), method->GetName().string());
} else {
StringBuilder paramStr;
paramStr.Append(prefix).AppendFormat("int32_t %sService::%s(", infName_.string(), method->GetName().string());
paramStr.Append(prefix).AppendFormat("int32_t %sService::%s(", baseName_.string(), method->GetName().string());
for (size_t i = 0; i < method->GetParameterNumber(); i++) {
AutoPtr<ASTParameter> param = method->GetParameter(i);
EmitInterfaceMethodParameter(param, paramStr, "");
@@ -60,7 +60,7 @@ void CppServiceStubCodeEmitter::EmitStubHeaderInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, FileName(interfaceName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_MODULE_HEADER_FILE, EmitVersionHeaderName(interfaceName_)));
GetHeaderOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -183,7 +183,7 @@ void CppServiceStubCodeEmitter::EmitStubSourceFile()
void CppServiceStubCodeEmitter::EmitStubSourceInclusions(StringBuilder& sb)
{
HeaderFile::HeaderFileSet headerFiles;
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, FileName(stubName_)));
headerFiles.emplace(HeaderFile(HeaderFileType::OWN_HEADER_FILE, EmitVersionHeaderName(stubName_)));
GetSourceOtherLibInclusions(headerFiles);
for (const auto& file : headerFiles) {
@@ -222,13 +222,13 @@ void CppServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, c
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 %sStub%s(data, reply, option);\n",
infName_.string(), method->GetName().string());
baseName_.string(), method->GetName().string());
}
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 %sStub%s(data, reply, option);\n",
infName_.string(), getVerMethod->GetName().string());
baseName_.string(), getVerMethod->GetName().string());
sb.Append(prefix + g_tab + g_tab).Append("default: {\n");
sb.Append(prefix + g_tab + g_tab + g_tab).Append(
@@ -243,7 +243,7 @@ void CppServiceStubCodeEmitter::EmitStubOnRequestMethodImpl(StringBuilder& sb, c
void CppServiceStubCodeEmitter::EmitGetVersionMethodImpl(StringBuilder& sb, const String& prefix)
{
AutoPtr<ASTMethod> method = interface_->GetVersionMethod();
sb.Append(prefix).AppendFormat("int32_t %sStub::%s(", infName_.string(), method->GetName().string());
sb.Append(prefix).AppendFormat("int32_t %sStub::%s(", baseName_.string(), method->GetName().string());
for (size_t i = 0; i < method->GetParameterNumber(); i++) {
AutoPtr<ASTParameter> param = method->GetParameter(i);
EmitInterfaceMethodParameter(param, sb, "");
@@ -15,12 +15,9 @@ namespace OHOS {
namespace HDI {
bool JavaClientInterfaceCodeEmitter::ResolveDirectory(const String& targetDirectory)
{
if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) {
directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(),
FileName(ast_->GetPackageName()).string()));
} else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(),
FileName(ast_->GetPackageName()).string()));
if (ast_->GetASTFileType() == ASTFileType::AST_IFACE ||
ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
directory_ = GetFilePath(targetDirectory);
} else {
return false;
}
@@ -40,7 +37,7 @@ void JavaClientInterfaceCodeEmitter::EmitCode()
void JavaClientInterfaceCodeEmitter::EmitInterfaceFile()
{
String filePath = String::Format("%s%s.java", directory_.string(), FileName(interfaceName_).string());
String filePath = String::Format("%s/%s.java", directory_.string(), FileName(interfaceName_).string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -13,12 +13,9 @@ namespace OHOS {
namespace HDI {
bool JavaClientProxyCodeEmitter::ResolveDirectory(const String& targetDirectory)
{
if (ast_->GetASTFileType() == ASTFileType::AST_IFACE) {
directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(),
FileName(ast_->GetPackageName()).string()));
} else if (ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
directory_ = File::AdapterPath(String::Format("%s/%s/", targetDirectory.string(),
FileName(ast_->GetPackageName()).string()));
if (ast_->GetASTFileType() == ASTFileType::AST_IFACE ||
ast_->GetASTFileType() == ASTFileType::AST_ICALLBACK) {
directory_ = GetFilePath(targetDirectory);
} else {
return false;
}
@@ -38,7 +35,7 @@ void JavaClientProxyCodeEmitter::EmitCode()
void JavaClientProxyCodeEmitter::EmitProxyFile()
{
String filePath = String::Format("%s%s.java", directory_.string(), FileName(proxyName_).string());
String filePath = String::Format("%s/%s.java", directory_.string(), FileName(proxyName_).string());
File file(filePath, File::WRITE);
StringBuilder sb;
@@ -13,15 +13,6 @@
namespace OHOS {
namespace HDI {
String JavaCodeEmitter::FileName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
return name.Replace('.', '/');
}
void JavaCodeEmitter::EmitLicense(StringBuilder& sb)
{
if (ast_->GetLicense().IsEmpty()) {
@@ -53,29 +44,6 @@ String JavaCodeEmitter::MethodName(const String& name)
return String::Format("%c%s", tolower(name[0]), name.Substring(1).string());
}
String JavaCodeEmitter::ConstantName(const String& name)
{
if (name.IsEmpty()) {
return name;
}
StringBuilder sb;
for (int i = 0; i < name.GetLength(); i++) {
char c = name[i];
if (isupper(c) != 0) {
if (i > 1) {
sb.Append('_');
}
sb.Append(c);
} else {
sb.Append(toupper(c));
}
}
return sb.ToString();
}
String JavaCodeEmitter::SpecificationParam(StringBuilder& paramSb, const String& prefix)
{
int maxLineLen = 120;
@@ -21,8 +21,6 @@ namespace HDI {
class JavaCodeEmitter : public CodeEmitter {
public:
virtual ~JavaCodeEmitter() = default;
static String FileName(const String& name);
protected:
bool CreateDirectory();
@@ -34,8 +32,6 @@ protected:
String MethodName(const String& name);
String ConstantName(const String& name);
String SpecificationParam(StringBuilder& paramSb, const String& prefix);
};
} // namespace HDI
-24
View File
@@ -93,7 +93,6 @@ void SharedData::Release(const void* handle)
};
}
const char* String::TAG = "String";
String::String(const char* string)
@@ -499,29 +498,6 @@ String String::ToUpperCase() const
return *this;
}
String String::ToUnderLineUpper() const
{
if (IsEmpty()) {
return *this;
}
StringBuilder sb;
for (int i = 0; i < GetLength(); i++) {
char c = string_[i];
if (isupper(c) != 0) {
if (i > 1) {
sb.Append('_');
}
sb.Append(c);
} else {
sb.Append(toupper(c));
}
}
return sb.ToString();
}
String String::Substring(int begin) const
{
if (begin < 0 || begin >= GetLength()) {
-2
View File
@@ -87,8 +87,6 @@ public:
String ToUpperCase() const;
String ToUnderLineUpper() const;
String Substring(int begin) const;
String Substring(int begin, int end) const;