feature move gen to grammar
This commit is contained in:
parent
73846e885a
commit
41663e1c2f
31
.gitea/workflows/build.yaml
Normal file
31
.gitea/workflows/build.yaml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
name: build-crpc
|
||||||
|
on:
|
||||||
|
- push
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
build_type:
|
||||||
|
- Debug
|
||||||
|
- Release
|
||||||
|
toolchain:
|
||||||
|
- hisiv500.toolchain.cmake
|
||||||
|
- himix200.toolchain.cmake
|
||||||
|
- mips64el-linux-gnuabi64.toolchain.cmake
|
||||||
|
- mipsel-openwrt-linux-musl.toolchain.cmake
|
||||||
|
- mipsel-openwrt-linux.toolchain.cmake
|
||||||
|
- host.toolchain.cmake
|
||||||
|
steps:
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: |
|
||||||
|
apt-get update -y
|
||||||
|
apt-get install -y \
|
||||||
|
cmake make g++ libssl-dev pkg-config autoconf libtool libantlr4-runtime-dev
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Generate Lexer and Parser
|
||||||
|
run: |
|
||||||
|
wget https://www.antlr.org/download/antlr-4.13.1-complete.jar -o antlr.jar
|
||||||
|
cd ${{ github.workspace }}/src/grammar
|
||||||
|
java -jar antlr.jar -Dlanguage=Cpp -o ./ ProtoLexer.g4
|
||||||
|
java -jar antlr.jar -Dlanguage=Cpp -o ./ ProtoParser.g4
|
4
.gitignore
vendored
4
.gitignore
vendored
@ -2,3 +2,7 @@
|
|||||||
cmake-build-*
|
cmake-build-*
|
||||||
build/
|
build/
|
||||||
*gen*/
|
*gen*/
|
||||||
|
src/grammar/*.cpp
|
||||||
|
src/grammar/*.h
|
||||||
|
src/grammar/*.tokens
|
||||||
|
src/grammar/*.interp
|
||||||
|
@ -24,14 +24,12 @@ add_executable(crpc
|
|||||||
)
|
)
|
||||||
target_link_libraries(crpc PRIVATE antlr4_static)
|
target_link_libraries(crpc PRIVATE antlr4_static)
|
||||||
target_include_directories(crpc PRIVATE /opt/dev/vcpkg/installed/arm64-osx/include/antlr4-runtime)
|
target_include_directories(crpc PRIVATE /opt/dev/vcpkg/installed/arm64-osx/include/antlr4-runtime)
|
||||||
target_include_directories(crpc PRIVATE src/gen/ src/)
|
target_include_directories(crpc PRIVATE src/grammar/ src/)
|
||||||
|
|
||||||
FILE(GLOB_RECURSE TEST_SRC_LIST ${CMAKE_CURRENT_BINARY_DIR}/gen/*.c)
|
FILE(GLOB_RECURSE TEST_SRC_LIST ${CMAKE_CURRENT_BINARY_DIR}/grammar/*.c)
|
||||||
add_executable(test ${TEST_SRC_LIST}
|
add_executable(test ${TEST_SRC_LIST}
|
||||||
test/test.c
|
test/test.c
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3party/tpl/tpl.c
|
|
||||||
)
|
)
|
||||||
target_include_directories(test PRIVATE
|
target_include_directories(test PRIVATE
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/gen/
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/3party/tpl
|
${CMAKE_CURRENT_SOURCE_DIR}/3party/tpl
|
||||||
)
|
)
|
25
main.cpp
25
main.cpp
@ -76,6 +76,13 @@ public:
|
|||||||
int
|
int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
if (argc < 3) {
|
||||||
|
std::cout << "usage: " << argv[0] << " <proto file> <output dir>" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
std::string proto_file = argv[1];
|
||||||
|
std::string output_dir = argv[2];
|
||||||
|
|
||||||
// show current working directory
|
// show current working directory
|
||||||
char cwd[1024];
|
char cwd[1024];
|
||||||
if (getcwd(cwd, sizeof(cwd)) != NULL) {
|
if (getcwd(cwd, sizeof(cwd)) != NULL) {
|
||||||
@ -86,7 +93,7 @@ main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::ifstream ifs;
|
std::ifstream ifs;
|
||||||
ifs.open(argv[1]);
|
ifs.open(proto_file);
|
||||||
|
|
||||||
antlr4::ANTLRInputStream input(ifs);
|
antlr4::ANTLRInputStream input(ifs);
|
||||||
ProtoLexer lexer(&input);
|
ProtoLexer lexer(&input);
|
||||||
@ -98,18 +105,18 @@ main(int argc, char *argv[])
|
|||||||
Listener listener;
|
Listener listener;
|
||||||
Listener listener2;
|
Listener listener2;
|
||||||
antlr4::tree::ParseTreeWalker::DEFAULT.walk(&listener, parser.program());
|
antlr4::tree::ParseTreeWalker::DEFAULT.walk(&listener, parser.program());
|
||||||
for (const auto& item : listener.message_map) {
|
// for (const auto& item : listener.message_map) {
|
||||||
std::cout << item.second->ToString() << std::endl;
|
// std::cout << item.second->ToString() << std::endl;
|
||||||
}
|
// }
|
||||||
|
|
||||||
for (const auto& service : listener.services) {
|
// for (const auto& service : listener.services) {
|
||||||
std::cout << service->ToString() << std::endl;
|
// std::cout << service->ToString() << std::endl;
|
||||||
}
|
// }
|
||||||
|
|
||||||
tqcq::CMessagePlugin message_plugin("./gen/");
|
tqcq::CMessagePlugin message_plugin(output_dir);
|
||||||
message_plugin.Generate(listener.message_map);
|
message_plugin.Generate(listener.message_map);
|
||||||
|
|
||||||
tqcq::CServiceServerPlugin service_server_plugin("./gen/");
|
tqcq::CServiceServerPlugin service_server_plugin(output_dir);
|
||||||
service_server_plugin.Generate(listener.services);
|
service_server_plugin.Generate(listener.services);
|
||||||
// tqcq::CServiceClientPlugin service_client_plugin("./gen/");
|
// tqcq::CServiceClientPlugin service_client_plugin("./gen/");
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ CLOSE_BRACE: '}';
|
|||||||
OPEN_PAREN: '(';
|
OPEN_PAREN: '(';
|
||||||
CLOSE_PAREN: ')';
|
CLOSE_PAREN: ')';
|
||||||
SLASH: '/';
|
SLASH: '/';
|
||||||
|
COMMENT: '//' .*? '\n' -> skip;
|
||||||
|
|
||||||
NUMBER: [0-9]+;
|
NUMBER: [0-9]+;
|
||||||
ID: [a-zA-Z_][a-zA-Z_0-9]*;
|
ID: [a-zA-Z_][a-zA-Z_0-9]*;
|
@ -1,14 +1,14 @@
|
|||||||
parser grammar ProtoParser;
|
parser grammar ProtoParser;
|
||||||
|
|
||||||
options{ tokenVocab='gen/ProtoLexer'; language=Cpp; }
|
options{ tokenVocab='ProtoLexer'; language=Cpp; }
|
||||||
|
|
||||||
program: syntaxStatement baseStatement* EOF;
|
program: syntaxStatement baseStatement* EOF;
|
||||||
|
|
||||||
commentStatement : SLASH SLASH .*? NEWLINE;
|
|
||||||
syntaxStatement: SYNTAX_TYPE '=' '"' (VERSION2 | VERSION3) '"' ';';
|
syntaxStatement: SYNTAX_TYPE '=' '"' (VERSION2 | VERSION3) '"' ';';
|
||||||
baseStatement: messageStatement | serviceStatement | ';';
|
baseStatement: messageStatement | serviceStatement | ';' ;
|
||||||
messageStatement: MESSAGE_TYPE ID '{' (itemStatement | ';')* '}';
|
messageStatement: MESSAGE_TYPE ID '{' (itemStatement | ';')* '}';
|
||||||
serviceStatement: SERVICE_TYPE ID '{' (rpcStatement | ';')* '}';
|
serviceStatement: SERVICE_TYPE ID '{' (rpcStatement | ';')* '}';
|
||||||
|
|
||||||
itemStatement: (INT32 | STRING) ID '=' NUMBER ';';
|
itemStatement: (INT32 | STRING) ID '=' NUMBER ';';
|
||||||
rpcStatement: RPC_TYPE ID '(' ID ')' 'returns' '(' ID ')' '{' '}';
|
rpcStatement: RPC_TYPE ID '(' ID ')' 'returns' '(' ID ')' '{' '}';
|
||||||
|
|
@ -53,7 +53,7 @@ CMessagePlugin::GenerateHeader(tqcq::Message::Ptr message)
|
|||||||
ss << GenerateIncludeGuardEnd(message);
|
ss << GenerateIncludeGuardEnd(message);
|
||||||
std::ofstream ofs(generate_path() + "/" + GenerateHeaderFileName(message->id()));
|
std::ofstream ofs(generate_path() + "/" + GenerateHeaderFileName(message->id()));
|
||||||
ofs << ss.str();
|
ofs << ss.str();
|
||||||
std::cout << ss.str() << std::endl;
|
// std::cout << ss.str() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -120,6 +120,9 @@ CMessagePlugin::GenerateStructItem(Message::Ptr message)
|
|||||||
for (auto &item : message->items()) {
|
for (auto &item : message->items()) {
|
||||||
ss << CItem::Create(item)->GenerateStructDeclareCodeBlock(message->id()) << std::endl;
|
ss << CItem::Create(item)->GenerateStructDeclareCodeBlock(message->id()) << std::endl;
|
||||||
}
|
}
|
||||||
|
if (message->items().empty()) {
|
||||||
|
ss << " char:8; " << std::endl;
|
||||||
|
}
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,4 +10,88 @@ namespace tqcq {
|
|||||||
CServiceClientPlugin::CServiceClientPlugin(std::string generate_path, std::string generate_prefix)
|
CServiceClientPlugin::CServiceClientPlugin(std::string generate_path, std::string generate_prefix)
|
||||||
: CServicePlugin(std::move(generate_path), std::move(generate_prefix))
|
: CServicePlugin(std::move(generate_path), std::move(generate_prefix))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderFileName(std::string service_id)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateSourceFileName(std::string service_id)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CServiceClientPlugin::GenerateHeader(Service::Ptr service)
|
||||||
|
{
|
||||||
|
CServicePlugin::GenerateHeader(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
CServiceClientPlugin::GenerateSource(Service::Ptr service)
|
||||||
|
{
|
||||||
|
CServicePlugin::GenerateSource(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderIncludeFiles(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderStructStart(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderStructItems(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderStructEnd(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderStructAPIStart(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderStructAPIItems(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderStructAPIEnd(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateHeaderFunctionDeclaration(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateSourceIncludeFiles(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceClientPlugin::GenerateSourceFunctionDefinition(Service::Ptr service)
|
||||||
|
{
|
||||||
|
return std::string();
|
||||||
|
}
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -14,6 +14,20 @@ public:
|
|||||||
CServiceClientPlugin(std::string generate_path, std::string generate_prefix = "CService");
|
CServiceClientPlugin(std::string generate_path, std::string generate_prefix = "CService");
|
||||||
virtual ~CServiceClientPlugin() = default;
|
virtual ~CServiceClientPlugin() = default;
|
||||||
protected:
|
protected:
|
||||||
|
std::string GenerateHeaderFileName(std::string service_id) override;
|
||||||
|
std::string GenerateSourceFileName(std::string service_id) override;
|
||||||
|
void GenerateHeader(Service::Ptr service) override;
|
||||||
|
void GenerateSource(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderIncludeFiles(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructStart(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructItems(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructEnd(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructAPIStart(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructAPIItems(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructAPIEnd(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderFunctionDeclaration(Service::Ptr service) override;
|
||||||
|
std::string GenerateSourceIncludeFiles(Service::Ptr service) override;
|
||||||
|
std::string GenerateSourceFunctionDefinition(Service::Ptr service) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -32,16 +32,16 @@ CServicePlugin::GenerateHeader(Service::Ptr service)
|
|||||||
ss << GenerateHeaderIncludeFiles(service);
|
ss << GenerateHeaderIncludeFiles(service);
|
||||||
ss << std::endl;
|
ss << std::endl;
|
||||||
|
|
||||||
ss << GenerateHeaderStructStart(service);
|
|
||||||
ss << GenerateHeaderStructItems(service);
|
|
||||||
ss << GenerateHeaderStructEnd(service);
|
|
||||||
ss << std::endl;
|
|
||||||
|
|
||||||
ss << GenerateHeaderStructAPIStart(service);
|
ss << GenerateHeaderStructAPIStart(service);
|
||||||
ss << GenerateHeaderStructAPIItems(service);
|
ss << GenerateHeaderStructAPIItems(service);
|
||||||
ss << GenerateHeaderStructAPIEnd(service);
|
ss << GenerateHeaderStructAPIEnd(service);
|
||||||
ss << std::endl;
|
ss << std::endl;
|
||||||
|
|
||||||
|
ss << GenerateHeaderStructStart(service);
|
||||||
|
ss << GenerateHeaderStructItems(service);
|
||||||
|
ss << GenerateHeaderStructEnd(service);
|
||||||
|
ss << std::endl;
|
||||||
|
|
||||||
ss << GenerateHeaderFunctionDeclaration(service);
|
ss << GenerateHeaderFunctionDeclaration(service);
|
||||||
ss << std::endl;
|
ss << std::endl;
|
||||||
|
|
||||||
@ -53,5 +53,31 @@ CServicePlugin::GenerateHeader(Service::Ptr service)
|
|||||||
void
|
void
|
||||||
CServicePlugin::GenerateSource(Service::Ptr service)
|
CServicePlugin::GenerateSource(Service::Ptr service)
|
||||||
{
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << GenerateSourceIncludeFiles(service);
|
||||||
|
ss << std::endl;
|
||||||
|
|
||||||
|
ss << GenerateSourceFunctionDefinition(service);
|
||||||
|
std::ofstream ofs(generate_path() + "/" + GenerateSourceFileName(service->id()));
|
||||||
|
ofs << ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServicePlugin::GenerateHeaderGuardStart(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
auto guard_macro = GenerateGuardMacro(service->id(), generate_prefix());
|
||||||
|
ss << "#ifndef " << guard_macro << std::endl;
|
||||||
|
ss << "#define " << guard_macro << std::endl;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServicePlugin::GenerateHeaderGuardEnd(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
auto guard_macro = GenerateGuardMacro(service->id(), generate_prefix());
|
||||||
|
ss << "#endif // " << guard_macro << std::endl;
|
||||||
|
return ss.str();
|
||||||
}
|
}
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -23,9 +23,9 @@ protected:
|
|||||||
virtual void GenerateHeader(Service::Ptr service) override;
|
virtual void GenerateHeader(Service::Ptr service) override;
|
||||||
virtual void GenerateSource(Service::Ptr service) override;
|
virtual void GenerateSource(Service::Ptr service) override;
|
||||||
|
|
||||||
virtual std::string GenerateHeaderGuardStart(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderGuardStart(Service::Ptr service);
|
||||||
virtual std::string GenerateHeaderIncludeFiles(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderIncludeFiles(Service::Ptr service) = 0;
|
||||||
virtual std::string GenerateHeaderGuardEnd(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderGuardEnd(Service::Ptr service);
|
||||||
|
|
||||||
virtual std::string GenerateHeaderStructStart(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderStructStart(Service::Ptr service) = 0;
|
||||||
virtual std::string GenerateHeaderStructItems(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderStructItems(Service::Ptr service) = 0;
|
||||||
@ -36,6 +36,9 @@ protected:
|
|||||||
virtual std::string GenerateHeaderStructAPIEnd(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderStructAPIEnd(Service::Ptr service) = 0;
|
||||||
|
|
||||||
virtual std::string GenerateHeaderFunctionDeclaration(Service::Ptr service) = 0;
|
virtual std::string GenerateHeaderFunctionDeclaration(Service::Ptr service) = 0;
|
||||||
|
|
||||||
|
virtual std::string GenerateSourceIncludeFiles(Service::Ptr service) = 0;
|
||||||
|
virtual std::string GenerateSourceFunctionDefinition(Service::Ptr service) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -12,17 +12,6 @@ CServiceServerPlugin::CServiceServerPlugin(std::string generate_path, std::strin
|
|||||||
: CServicePlugin(std::move(generate_path), std::move(generate_prefix))
|
: CServicePlugin(std::move(generate_path), std::move(generate_prefix))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
std::string
|
|
||||||
CServiceServerPlugin::GenerateHeaderGuardStart(Service::Ptr service)
|
|
||||||
{
|
|
||||||
std::stringstream ss;
|
|
||||||
auto guard_macro = GenerateGuardMacro(service->id(), generate_prefix());
|
|
||||||
ss << "#ifndef " << guard_macro << std::endl;
|
|
||||||
ss << "#define " << guard_macro << std::endl;
|
|
||||||
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
CServiceServerPlugin::GenerateHeaderIncludeFiles(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderIncludeFiles(Service::Ptr service)
|
||||||
{
|
{
|
||||||
@ -30,16 +19,13 @@ CServiceServerPlugin::GenerateHeaderIncludeFiles(Service::Ptr service)
|
|||||||
ss << "#include <stdint.h>" << std::endl;
|
ss << "#include <stdint.h>" << std::endl;
|
||||||
ss << "#include <string.h>" << std::endl;
|
ss << "#include <string.h>" << std::endl;
|
||||||
ss << "#include <stdlib.h>" << std::endl;
|
ss << "#include <stdlib.h>" << std::endl;
|
||||||
ss << "#include <crpc/service.h>" << std::endl;
|
|
||||||
std::set<std::string> message_set;
|
std::set<std::string> message_set;
|
||||||
for (const auto& rpc : service->rpcs()) {
|
for (const auto &rpc : service->rpcs()) {
|
||||||
auto crpc = CRPCServer::Create(rpc);
|
auto crpc = CRPCServer::Create(rpc);
|
||||||
message_set.insert(crpc->request_id());
|
message_set.insert(crpc->request_id());
|
||||||
message_set.insert(crpc->response_id());
|
message_set.insert(crpc->response_id());
|
||||||
}
|
}
|
||||||
for (const auto& message_id : message_set) {
|
for (const auto &message_id : message_set) { ss << "#include \"" << message_id << ".h\"" << std::endl; }
|
||||||
ss << "#include \"" << message_id << ".h\"" << std::endl;
|
|
||||||
}
|
|
||||||
ss << std::endl;
|
ss << std::endl;
|
||||||
|
|
||||||
ss << "#ifdef __cplusplus" << std::endl;
|
ss << "#ifdef __cplusplus" << std::endl;
|
||||||
@ -48,23 +34,12 @@ CServiceServerPlugin::GenerateHeaderIncludeFiles(Service::Ptr service)
|
|||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
|
||||||
CServiceServerPlugin::GenerateHeaderGuardEnd(Service::Ptr service)
|
|
||||||
{
|
|
||||||
std::stringstream ss;
|
|
||||||
auto guard_macro = GenerateGuardMacro(service->id(), generate_prefix());
|
|
||||||
ss << "#ifdef __cplusplus" << std::endl;
|
|
||||||
ss << "}" << std::endl;
|
|
||||||
ss << "#endif" << std::endl;
|
|
||||||
ss << "#endif // " << guard_macro << std::endl;
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
CServiceServerPlugin::GenerateHeaderStructAPIStart(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderStructAPIStart(Service::Ptr service)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "typedef struct " << "{" << std::endl;
|
ss << "typedef struct "
|
||||||
|
<< "{" << std::endl;
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +47,7 @@ std::string
|
|||||||
CServiceServerPlugin::GenerateHeaderStructAPIItems(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderStructAPIItems(Service::Ptr service)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
for (const auto& rpc : service->rpcs()) {
|
for (const auto &rpc : service->rpcs()) {
|
||||||
auto crpc = CRPCServer::Create(rpc);
|
auto crpc = CRPCServer::Create(rpc);
|
||||||
ss << crpc->GenerateStructDeclareCodeBlock(service->id());
|
ss << crpc->GenerateStructDeclareCodeBlock(service->id());
|
||||||
}
|
}
|
||||||
@ -83,14 +58,8 @@ std::string
|
|||||||
CServiceServerPlugin::GenerateHeaderStructAPIEnd(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderStructAPIEnd(Service::Ptr service)
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << "} " << service->id() << "_API" << ";" << std::endl;
|
ss << "} " << service->id() << "_API"
|
||||||
return ss.str();
|
<< ";" << std::endl;
|
||||||
}
|
|
||||||
|
|
||||||
std::string
|
|
||||||
CServiceServerPlugin::GenerateHeaderFunctionDeclaration(Service::Ptr service)
|
|
||||||
{
|
|
||||||
std::stringstream ss;
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,19 +82,148 @@ CServiceServerPlugin::GenerateSourceFileName(std::string service_id)
|
|||||||
std::string
|
std::string
|
||||||
CServiceServerPlugin::GenerateHeaderStructStart(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderStructStart(Service::Ptr service)
|
||||||
{
|
{
|
||||||
return std::string();
|
std::stringstream ss;
|
||||||
|
ss << "typedef struct "
|
||||||
|
<< "{" << std::endl;
|
||||||
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
CServiceServerPlugin::GenerateHeaderStructItems(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderStructItems(Service::Ptr service)
|
||||||
{
|
{
|
||||||
return std::string();
|
std::stringstream ss;
|
||||||
|
ss << " void* impl;" << std::endl;
|
||||||
|
ss << " DeviceService_API api;" << std::endl;
|
||||||
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string
|
std::string
|
||||||
CServiceServerPlugin::GenerateHeaderStructEnd(Service::Ptr service)
|
CServiceServerPlugin::GenerateHeaderStructEnd(Service::Ptr service)
|
||||||
{
|
{
|
||||||
return std::string();
|
std::stringstream ss;
|
||||||
|
ss << "} " << service->id() << "_Server"
|
||||||
|
<< ";" << std::endl;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateHeaderFunctionDeclaration(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "int32_t " << service->id() << "_Server_Init(" << service->id() << "_Server* server, " << service->id()
|
||||||
|
<< "_API* api);" << std::endl;
|
||||||
|
ss << "int32_t " << service->id() << "_Server_Bind(" << service->id() << "_Server* server, const char* format, ...);"
|
||||||
|
<< std::endl;
|
||||||
|
ss << "int32_t " << service->id() << "_Server_Listen(" << service->id() << "_Server* server);" << std::endl;
|
||||||
|
ss << "void " << service->id() << "_Server_Destroy(" << service->id() << "_Server* server);" << std::endl;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateSourceIncludeFiles(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "#include <assert.h>" << std::endl;
|
||||||
|
ss << "#include <stdarg.h>" << std::endl;
|
||||||
|
ss << "#include <stdio.h>" << std::endl;
|
||||||
|
ss << "#include <crpc/service.h>" << std::endl;
|
||||||
|
ss << "#include \"" << GenerateHeaderFileName(service->id()) << "\"" << std::endl;
|
||||||
|
std::set<std::string> message_set;
|
||||||
|
for (const auto &rpc : service->rpcs()) {
|
||||||
|
auto crpc = CRPCServer::Create(rpc);
|
||||||
|
message_set.insert(crpc->request_id());
|
||||||
|
message_set.insert(crpc->response_id());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &message_id : message_set) { ss << "#include \"" << message_id << ".h\"" << std::endl; }
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateSourceFunctionDefinition(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
for (const auto &rpc : service->rpcs()) {
|
||||||
|
auto crpc = CRPCServer::Create(rpc);
|
||||||
|
ss << crpc->GenerateStructAPIWrapper(service->id());
|
||||||
|
ss << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
ss << std::endl;
|
||||||
|
|
||||||
|
ss << GenerateSourceInitFunctionDefinition(service) << std::endl;
|
||||||
|
ss << GenerateSourceBindFunctionDefinition(service) << std::endl;
|
||||||
|
ss << GenerateSourceListenFunctionDefinition(service) << std::endl;
|
||||||
|
ss << GenerateSourceDestroyFunctionDefinition(service) << std::endl;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateSourceInitFunctionDefinition(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "int32_t " << service->id() << "_Server_Init(" << service->id() << "_Server* server, " << service->id()
|
||||||
|
<< "_API* api)" << std::endl;
|
||||||
|
ss << "{" << std::endl;
|
||||||
|
ss << " assert(server != NULL);" << std::endl;
|
||||||
|
ss << " server->impl = Service_New();" << std::endl;
|
||||||
|
ss << " if (api) {" << std::endl;
|
||||||
|
ss << " memcpy(&server->api, api, sizeof(" << service->id() << "_API));" << std::endl;
|
||||||
|
ss << " } else {" << std::endl;
|
||||||
|
ss << " memset(&server->api, 0, sizeof(" << service->id() << "_API));" << std::endl;
|
||||||
|
ss << " }" << std::endl;
|
||||||
|
ss << " if (server->impl == NULL) { return -1; }" << std::endl;
|
||||||
|
ss << " return 0;" << std::endl;
|
||||||
|
ss << "}" << std::endl;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateSourceBindFunctionDefinition(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "int32_t " << service->id() << "_Server_Bind(" << service->id() << "_Server* server, const char* format, ...)"
|
||||||
|
<< std::endl;
|
||||||
|
ss << "{" << std::endl;
|
||||||
|
ss << " assert(server != NULL);" << std::endl;
|
||||||
|
ss << " assert(server->impl != NULL);" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
ss << " char address_str[1024];" << std::endl;
|
||||||
|
ss << " va_list args;" << std::endl;
|
||||||
|
ss << " va_start(args, format);" << std::endl;
|
||||||
|
ss << " vsnprintf(address_str, sizeof(address_str), format, args);" << std::endl;
|
||||||
|
ss << " va_end(args);" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
ss << " return Service_Bind(server->impl, address_str);" << std::endl;
|
||||||
|
ss << "}" << std::endl;
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateSourceListenFunctionDefinition(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "int32_t " << service->id() << "_Server_Listen(" << service->id() << "_Server* server)" << std::endl;
|
||||||
|
ss << "{" << std::endl;
|
||||||
|
ss << " assert(server != NULL);" << std::endl;
|
||||||
|
ss << " assert(server->impl != NULL);" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
ss << " return Service_Listen(server->impl);" << std::endl;
|
||||||
|
ss << "}" << std::endl;
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CServiceServerPlugin::GenerateSourceDestroyFunctionDefinition(Service::Ptr service)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "void " << service->id() << "_Server_Destroy(" << service->id() << "_Server* server)" << std::endl;
|
||||||
|
ss << "{" << std::endl;
|
||||||
|
ss << " if (server == NULL) { return; }" << std::endl;
|
||||||
|
ss << " if (server->impl != NULL) { Service_Free(server->impl); }" << std::endl;
|
||||||
|
ss << "}" << std::endl;
|
||||||
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -16,19 +16,26 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
std::string GenerateHeaderFileName(std::string service_id) override;
|
std::string GenerateHeaderFileName(std::string service_id) override;
|
||||||
std::string GenerateSourceFileName(std::string service_id) override;
|
std::string GenerateSourceFileName(std::string service_id) override;
|
||||||
std::string GenerateHeaderGuardStart(Service::Ptr service) override;
|
|
||||||
std::string GenerateHeaderIncludeFiles(Service::Ptr service) override;
|
|
||||||
std::string GenerateHeaderGuardEnd(Service::Ptr service) override;
|
|
||||||
|
|
||||||
std::string GenerateHeaderStructStart(Service::Ptr service) override;
|
std::string GenerateHeaderIncludeFiles(Service::Ptr service) override;
|
||||||
std::string GenerateHeaderStructItems(Service::Ptr service) override;
|
|
||||||
std::string GenerateHeaderStructEnd(Service::Ptr service) override;
|
|
||||||
|
|
||||||
std::string GenerateHeaderStructAPIStart(Service::Ptr service) override;
|
std::string GenerateHeaderStructAPIStart(Service::Ptr service) override;
|
||||||
std::string GenerateHeaderStructAPIItems(Service::Ptr service) override;
|
std::string GenerateHeaderStructAPIItems(Service::Ptr service) override;
|
||||||
std::string GenerateHeaderStructAPIEnd(Service::Ptr service) override;
|
std::string GenerateHeaderStructAPIEnd(Service::Ptr service) override;
|
||||||
|
|
||||||
|
std::string GenerateHeaderStructStart(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructItems(Service::Ptr service) override;
|
||||||
|
std::string GenerateHeaderStructEnd(Service::Ptr service) override;
|
||||||
|
|
||||||
std::string GenerateHeaderFunctionDeclaration(Service::Ptr service) override;
|
std::string GenerateHeaderFunctionDeclaration(Service::Ptr service) override;
|
||||||
|
|
||||||
|
std::string GenerateSourceIncludeFiles(Service::Ptr service) override;
|
||||||
|
std::string GenerateSourceFunctionDefinition(Service::Ptr service) override;
|
||||||
|
|
||||||
|
std::string GenerateSourceInitFunctionDefinition(Service::Ptr service);
|
||||||
|
std::string GenerateSourceBindFunctionDefinition(Service::Ptr service);
|
||||||
|
std::string GenerateSourceListenFunctionDefinition(Service::Ptr service);
|
||||||
|
std::string GenerateSourceDestroyFunctionDefinition(Service::Ptr service);
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -20,6 +20,7 @@ public:
|
|||||||
|
|
||||||
virtual std::string GenerateStructDeclareCodeBlock(std::string service_id) const = 0;
|
virtual std::string GenerateStructDeclareCodeBlock(std::string service_id) const = 0;
|
||||||
virtual std::string GenerateStructAPIDeclareCodeBlock(std::string service_id) const = 0;
|
virtual std::string GenerateStructAPIDeclareCodeBlock(std::string service_id) const = 0;
|
||||||
|
virtual std::string GenerateStructAPIWrapper(std::string service_id) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -10,6 +10,9 @@
|
|||||||
namespace tqcq {
|
namespace tqcq {
|
||||||
|
|
||||||
class CRPCClient : public CRPC {
|
class CRPCClient : public CRPC {
|
||||||
|
public:
|
||||||
|
CRPCClient() = default;
|
||||||
|
~CRPCClient() override = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
}// namespace tqcq
|
}// namespace tqcq
|
||||||
|
@ -24,7 +24,48 @@ std::string
|
|||||||
CRPCServer::GenerateStructDeclareCodeBlock(std::string service_id) const
|
CRPCServer::GenerateStructDeclareCodeBlock(std::string service_id) const
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
ss << " int32_t (*" << id() << ")(" << request_id() << " *request, " << response_id() << " **response);\n";
|
ss << " int32_t (*" << id() << ")(const " << request_id() << " *request, " << response_id() << " *response);\n";
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
CRPCServer::GenerateStructAPIWrapper(std::string service_id) const
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "int32_t " << id() << "_Wrapper(" << service_id << "_Server *server, char *msg, int32_t msg_len)" << std::endl;
|
||||||
|
ss << "{" << std::endl;
|
||||||
|
ss << " assert(server != NULL);" << std::endl;
|
||||||
|
ss << " assert(msg != NULL || msg_len == 0);" << std::endl;
|
||||||
|
ss << " if (server->api." << id() << " == NULL) { return 0; }" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
ss << " int32_t status = 0;" << std::endl;
|
||||||
|
ss << " " << request_id() << " request;" << std::endl;
|
||||||
|
ss << " " << response_id() << " response;" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
|
||||||
|
ss << " do {" << std::endl;
|
||||||
|
ss << " " << request_id() << "_Init(&request);" << std::endl;
|
||||||
|
ss << " status = " << request_id() << "_Deserialize(&request, msg, msg_len);" << std::endl;
|
||||||
|
ss << " if (status != 0) {" << std::endl;
|
||||||
|
ss << " " << request_id() << "_Destroy(&request);" << std::endl;
|
||||||
|
ss << " break;" << std::endl;
|
||||||
|
ss << " }" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
ss << " " << response_id() << "_Init(&response);" << std::endl;
|
||||||
|
ss << " " << response_id() << "_set_code(&response, 200);" << std::endl;
|
||||||
|
ss << " " << response_id() << "_set_msg_string(&response, \"OK\");" << std::endl;
|
||||||
|
ss << " status = server->api." << id() << "(&request, &response);" << std::endl;
|
||||||
|
ss << " if (status != 0) {" << std::endl;
|
||||||
|
ss << " printf(\"" << id() << " failed: %d\\n\", status);" << std::endl;
|
||||||
|
ss << " " << response_id() << "_set_code(&response, 500);" << std::endl;
|
||||||
|
ss << " " << response_id() << "_set_msg_string(&response, \"Internal Server Error\");" << std::endl;
|
||||||
|
ss << " }" << std::endl;
|
||||||
|
ss << std::endl;
|
||||||
|
ss << " } while (0);" << std::endl;
|
||||||
|
ss << " " << response_id() << "_Destroy(&response);" << std::endl;
|
||||||
|
ss << " " << request_id() << "_Destroy(&request);" << std::endl;
|
||||||
|
ss << " return status;" << std::endl;
|
||||||
|
ss << "}" << std::endl;
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ public:
|
|||||||
CRPCServer(RPC::Ptr rpc);
|
CRPCServer(RPC::Ptr rpc);
|
||||||
~CRPCServer() override = default;
|
~CRPCServer() override = default;
|
||||||
|
|
||||||
|
std::string GenerateStructAPIWrapper(std::string service_id) const override;
|
||||||
std::string GenerateStructDeclareCodeBlock(std::string service_id) const override;
|
std::string GenerateStructDeclareCodeBlock(std::string service_id) const override;
|
||||||
std::string GenerateStructAPIDeclareCodeBlock(std::string service_id) const override;
|
std::string GenerateStructAPIDeclareCodeBlock(std::string service_id) const override;
|
||||||
};
|
};
|
||||||
|
@ -10,10 +10,11 @@ namespace tqcq {
|
|||||||
static void EnsureDirectoryExist(std::string path)
|
static void EnsureDirectoryExist(std::string path)
|
||||||
{
|
{
|
||||||
std::string::size_type pos = 0;
|
std::string::size_type pos = 0;
|
||||||
while (true) {
|
bool is_end = false;
|
||||||
|
while (!is_end) {
|
||||||
pos = path.find('/', pos);
|
pos = path.find('/', pos);
|
||||||
if (pos == std::string::npos) {
|
if (pos == std::string::npos) {
|
||||||
break;
|
is_end = true;
|
||||||
}
|
}
|
||||||
std::string dir = path.substr(0, pos);
|
std::string dir = path.substr(0, pos);
|
||||||
int status = mkdir(dir.c_str(), 0755);
|
int status = mkdir(dir.c_str(), 0755);
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
message Empty {
|
message EmptyRequest {
|
||||||
|
}
|
||||||
|
message EmptyResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string msg = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -54,21 +58,35 @@ message GenerateSignatureByExternalPrivateKeyRequest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
message VerifySignatureRequest {
|
message VerifySignatureRequest {
|
||||||
int32 code = 1;
|
// int32 code = 1;
|
||||||
string msg = 2;
|
// string msg = 2;
|
||||||
|
|
||||||
string source_data = 3;
|
string source_data = 3;
|
||||||
string ecc_public_key = 4;
|
string ecc_public_key = 4;
|
||||||
string ecc_signature = 5;
|
string ecc_signature = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message SMSymmetricRequest {
|
||||||
|
int32 operator_mode = 1; // alg mode
|
||||||
|
string iv = 2;
|
||||||
|
string key = 3;
|
||||||
|
string in_data = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SMSymmetricResponse {
|
||||||
|
int32 code = 1;
|
||||||
|
string msg = 2;
|
||||||
|
|
||||||
|
string out_data = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
service DeviceService {
|
service DeviceService {
|
||||||
rpc Init(Empty) returns (StatusResponse) {}
|
rpc Init(EmptyRequest) returns (StatusResponse) {}
|
||||||
rpc Status(Empty) returns (StatusResponse) {}
|
rpc Status(EmptyRequest) returns (StatusResponse) {}
|
||||||
rpc GetHWCode(Empty) returns (SingleDataResponse) {}
|
rpc GetHWCode(EmptyRequest) returns (SingleDataResponse) {}
|
||||||
rpc Close(Empty) returns (StatusResponse) {}
|
rpc Close(EmptyRequest) returns (StatusResponse) {}
|
||||||
rpc ClearApp(Empty) returns (Empty) {}
|
rpc ClearApp(EmptyRequest) returns (EmptyResponse) {}
|
||||||
|
|
||||||
rpc UnlockApplicationPIN(ApplicationPINRequest) returns (StatusResponse) {}
|
rpc UnlockApplicationPIN(ApplicationPINRequest) returns (StatusResponse) {}
|
||||||
rpc ChangeApplicationPIN(ApplicationPINRequest) returns (StatusResponse) {}
|
rpc ChangeApplicationPIN(ApplicationPINRequest) returns (StatusResponse) {}
|
||||||
@ -79,4 +97,10 @@ service DeviceService {
|
|||||||
|
|
||||||
rpc GenerateSignatureByInternalPrivateKey(GenerateSignatureByInternalPrivateKeyRequest) returns (SingleDataResponse) {}
|
rpc GenerateSignatureByInternalPrivateKey(GenerateSignatureByInternalPrivateKeyRequest) returns (SingleDataResponse) {}
|
||||||
rpc GenerateSignatureByExternalPrivateKey(GenerateSignatureByExternalPrivateKeyRequest) returns (SingleDataResponse) {}
|
rpc GenerateSignatureByExternalPrivateKey(GenerateSignatureByExternalPrivateKeyRequest) returns (SingleDataResponse) {}
|
||||||
|
rpc VerifySignature(VerifySignatureRequest) returns (StatusResponse) {}
|
||||||
|
|
||||||
|
rpc SM1Encrypt(SMSymmetricRequest) returns (SMSymmetricResponse) {}
|
||||||
|
rpc SM1Decrypt(SMSymmetricRequest) returns (SMSymmetricResponse) {}
|
||||||
|
rpc SM4Encrypt(SMSymmetricRequest) returns (SMSymmetricResponse) {}
|
||||||
|
rpc SM4Decrypt(SMSymmetricRequest) returns (SMSymmetricResponse) {}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user