blob: ad87e7ba279a89e90f5743197fa8d35b34013157 [file] [log] [blame]
#/******************************************************************************
#* Copyright (c) 2000-2019 Ericsson Telecom AB
#* All rights reserved. This program and the accompanying materials
#* are made available under the terms of the Eclipse Public License v2.0
#* which accompanies this distribution, and is available at
#* https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
#*
#******************************************************************************/
function cc_prefix_thrift_type(typename,orig_module, type_module,dot_pos,tn,prefix,enum_suffix){
dot_pos=index(typename,".")
if(dot_pos>0){
type_module=substr(typename,1,dot_pos-1)
tn=substr(typename,dot_pos+1)
} else {
type_module=orig_module
tn=typename
}
if(is_basetype(tn,type_module)!=0){
if( type_module SUBSEP "TYPEDEF" SUBSEP tn in AST){
if(type_module SUBSEP "NAMESPACE" in AST){
prefix="::" dot_to_colon(AST[type_module SUBSEP "NAMESPACE"]) "::"
} else {
prefix="::"
}
} else {
prefix=""
}
} else if ( type_module SUBSEP "LIST_TYPES" SUBSEP tn in AST ) {
return "std::vector<" cc_prefix_thrift_type(AST[type_module SUBSEP "LIST_TYPES" SUBSEP tn],type_module) ">"
} else {
if(type_module SUBSEP "NAMESPACE" in AST){
prefix="::" dot_to_colon(AST[type_module SUBSEP "NAMESPACE"]) "::"
} else {
prefix="::"
}
if(is_enum(tn,type_module)!=0){
enum_suffix="::type"
} else {
enum_suffix=""
}
}
return prefix get_basetype(tn) enum_suffix
}
function basename(pn) {
sub(/^.*\//, "", pn)
return pn
}
function gen_outgoing_hh(services_data,s,module_name,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,func_num){
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print " void outgoing_call(const "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_call& call_par," >> hh_file_name
print " const INTEGER *destination_address);" >> hh_file_name
print " void outgoing_reply(const "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_reply& reply_par," >> hh_file_name
print " const INTEGER *destination_address);" >> hh_file_name
print " void outgoing_raise(const "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_exception& raise_par," >> hh_file_name
print " const INTEGER *destination_address);" >> hh_file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_outgoing_hh(temp_serv,s,serv_mod)
}
}
function gen_service_hh(services_data,s,module_name,i,k,exception_data,comm,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,arg_data,func_num,arg_num,except_num,temp_cc_prefix,ret_name,first_arg,ref){
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print "" >> hh_file_name
delete arg_data
get_subarray(func_data,i SUBSEP "FIELDS",arg_data)
arg_num=get_array_length(arg_data)
if (func_data[i SUBSEP "RETTYPE"] != "void") {
if(is_basetype(func_data[i SUBSEP "RETTYPE"],module_name) == 1){
ret_name=get_basetype(func_data[i SUBSEP "RETTYPE"]) " "
first_arg=""
} else {
if(arg_num==0){
comm = ""
} else {
comm =", "
}
ret_name="void "
first_arg=cc_prefix_thrift_type(func_data[i SUBSEP "RETTYPE"],module_name) "& " comm
}
} else {
ret_name="void "
first_arg=""
}
print " " ret_name " " func_data[i SUBSEP "NAME"] " ( " first_arg >> hh_file_name
for(k=1;k<=arg_num;k++){
if(k==arg_num){
comm = ""
} else {
comm =","
}
if((is_basetype(arg_data[k SUBSEP "TYPE"],module_name)==1) || (is_enum(arg_data[k SUBSEP "TYPE"],module_name)==1)){
ref = ""
} else {
ref = "&"
}
print " const " cc_prefix_thrift_type(arg_data[k SUBSEP "TYPE"],module_name) ref comm >> hh_file_name
}
print " );" >> hh_file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_service_hh(temp_serv,s,serv_mod)
}
}
function gen_service_event_call_cc(services_data,s,module_name,func_num_base,i,k,exception_data,comm,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,arg_data,func_num,arg_num,except_num,temp_cc_prefix,ret_name,first_arg,ref){
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print "" >> cc_file_name
delete arg_data
get_subarray(func_data,i SUBSEP "FIELDS",arg_data)
arg_num=get_array_length(arg_data)
print " case "func_num_base+i":{" >> cc_file_name
print " "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_call call_par;" >> cc_file_name
for(k=1;k<=arg_num;k++){
print " conv_thrift_ttcn(*(("cc_prefix_thrift_type(arg_data[k SUBSEP "TYPE"],module_name)"*)(_push_data["k-1"])),call_par."double_und(arg_data[k SUBSEP "NAME"])"());" >> cc_file_name
}
print " incoming_call(call_par,&addr);" >> cc_file_name
print " }" >> cc_file_name
print " break;" >> cc_file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_service_event_call_cc(temp_serv,s,serv_mod,func_num_base+func_num)
}
}
function gen_service_outgoing_cc(services_data,s,module_name,func_num_base,i,k,exception_data,comm,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,arg_data,func_num,arg_num,except_num,temp_cc_prefix,ret_name,first_arg,ref){
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print "void "double_und(s)"__PT::outgoing_call(const "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_call& call_par," >> cc_file_name
print " const INTEGER * /*destination_address*/)" >> cc_file_name
print "{" >> cc_file_name
print " if(port_mode!=1){" >> cc_file_name
print " Thrift__Common::Thrift__port__error error_exception;" >> cc_file_name
print " error_exception.error__code()=1;" >> cc_file_name
print " error_exception.error__text()=\"The port is not in client mode\";" >> cc_file_name
print " "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_exception ex(error_exception);" >> cc_file_name
print " incoming_exception(ex,NULL);" >> cc_file_name
print " return;" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
delete arg_data
get_subarray(func_data,i SUBSEP "FIELDS",arg_data)
arg_num=get_array_length(arg_data)
for(k=1;k<=arg_num;k++){
print " " cc_prefix_thrift_type(arg_data[k SUBSEP "TYPE"],module_name) " " arg_data[k SUBSEP "NAME"] ";" >> cc_file_name
print " conv_ttcn_thrift(call_par." double_und(arg_data[k SUBSEP "NAME"]) "()," arg_data[k SUBSEP "NAME"] ");" >> cc_file_name
}
if (func_data[i SUBSEP "RETTYPE"] != "void") {
print " "cc_prefix_thrift_type(func_data[i SUBSEP "RETTYPE"],module_name)" _return_val;" >> cc_file_name
}
print " " >> cc_file_name
print "" >> cc_file_name
print " try{" >> cc_file_name
first_arg=""
if (func_data[i SUBSEP "RETTYPE"] != "void") {
if(is_basetype(func_data[i SUBSEP "RETTYPE"],module_name)==1){
print " _return_val=" >> cc_file_name
} else {
if(arg_num==0){
comm = ""
} else {
comm =", "
}
first_arg=" _return_val" comm
}
}
print " client_handler->"func_data[i SUBSEP "NAME"]"(" first_arg >> cc_file_name
for(k=1;k<=arg_num;k++){
if(k==arg_num){
comm = ""
} else {
comm =", "
}
print " "arg_data[k SUBSEP "NAME"] comm >> cc_file_name
}
print " );" >> cc_file_name
delete exception_data
get_subarray(func_data,i SUBSEP "THROWS",exception_data)
except_num=get_array_length(exception_data)
for(k=1;k<=except_num;k++){
print " } catch ( " cc_prefix_thrift_type(exception_data[k SUBSEP "TYPE"],module_name) " " exception_data[k SUBSEP "NAME"] " ) {" >> cc_file_name
print " "double_und(exception_data[k SUBSEP "TYPE"])" _"exception_data[k SUBSEP "NAME"]";" >> cc_file_name
print " conv_thrift_ttcn("exception_data[k SUBSEP "NAME"]",_"exception_data[k SUBSEP "NAME"]");" >> cc_file_name
print " " >> cc_file_name
print " "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_exception ex(_ouch);" >> cc_file_name
print " incoming_exception(ex,NULL);" >> cc_file_name
print " return;" >> cc_file_name
}
print " } catch (...) {" >> cc_file_name
print " Thrift__Common::Thrift__port__error error_exception;" >> cc_file_name
print " error_exception.error__code()=1;" >> cc_file_name
print " error_exception.error__text()=\"The Thrift libary have thrown an exception\";" >> cc_file_name
print " "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_exception ex(error_exception);" >> cc_file_name
print " incoming_exception(ex,NULL);" >> cc_file_name
print " return;" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_reply _reply;" >> cc_file_name
if (func_data[i SUBSEP "RETTYPE"] != "void") {
print " conv_thrift_ttcn(_return_val,_reply.return_value());" >> cc_file_name
}
print " incoming_reply(_reply,NULL);" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::outgoing_reply(const "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_reply& reply_par," >> cc_file_name
print " const INTEGER * destination_address)" >> cc_file_name
print "{" >> cc_file_name
print " if(destination_address==NULL){" >> cc_file_name
print " TTCN_error(\"Reply can not be sent. There address is missing\");" >> cc_file_name
print " }" >> cc_file_name
print " int cp=*destination_address;" >> cc_file_name
print " if(clients.count(cp)==0){" >> cc_file_name
print " TTCN_error(\"Reply can not be sent. Wrong address %d\",cp);" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " std::map<int,void*>::iterator it=client_data.find(cp);" >> cc_file_name
print " " >> cc_file_name
print " if(it==client_data.end()){" >> cc_file_name
print " TTCN_error(\"Reply can not be sent. Wrong address %d\",cp);" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " struct internal_comm_struct *comm_buff=(struct internal_comm_struct *)it->second;" >> cc_file_name
print " comm_buff->code=0;" >> cc_file_name
if (func_data[i SUBSEP "RETTYPE"] != "void") {
print " conv_ttcn_thrift(reply_par.return_value(),*("cc_prefix_thrift_type(func_data[i SUBSEP "RETTYPE"],module_name)"*)comm_buff->data["arg_num"]);" >> cc_file_name
}
print " write(cp,&comm_buff,sizeof(void*));" >> cc_file_name
print " client_data.erase(it);" >> cc_file_name
print "}" >> cc_file_name
print "void "double_und(s)"__PT::outgoing_raise(const "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_exception& raise_exception," >> cc_file_name
print " const INTEGER * destination_address)" >> cc_file_name
print "{" >> cc_file_name
print " if(destination_address==NULL){" >> cc_file_name
print " TTCN_error(\"Exception can not be sent. There address is missing\");" >> cc_file_name
print " }" >> cc_file_name
print " int cp=*destination_address;" >> cc_file_name
print " if(clients.count(cp)==0){" >> cc_file_name
print " TTCN_error(\"Exception can not be sent. Wrong address %d\",cp);" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " std::map<int,void*>::iterator it=client_data.find(cp);" >> cc_file_name
print " " >> cc_file_name
print " if(it==client_data.end()){" >> cc_file_name
print " TTCN_error(\"Exception can not be sent. Wrong address %d\",cp);" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " switch(raise_exception.get_selection()){" >> cc_file_name
for(k=1;k<=except_num;k++){
print " case "double_und(s)"__"double_und(func_data[i SUBSEP "NAME"])"_exception::ALT_"double_und(f)"__TypesAndPorts_"double_und(exception_data[k SUBSEP "TYPE"])":{" >> cc_file_name
print " struct internal_comm_struct *comm_buff=(struct internal_comm_struct *)it->second;" >> cc_file_name
print "" >> cc_file_name
print " comm_buff->code=1;" >> cc_file_name
print " conv_ttcn_thrift(raise_exception."double_und(f)"__TypesAndPorts_"double_und(exception_data[k SUBSEP "TYPE"])"_field(),*(" cc_prefix_thrift_type(exception_data[k SUBSEP "TYPE"],module_name)"*)comm_buff->data["arg_num+k"]);" >> cc_file_name
print " write(cp,&comm_buff,sizeof(void*));" >> cc_file_name
print " client_data.erase(it);" >> cc_file_name
print " }" >> cc_file_name
print " break;" >> cc_file_name
}
print " default:" >> cc_file_name
print " TTCN_error(\"Invalid exception was sent.\");" >> cc_file_name
print " break;" >> cc_file_name
print " }" >> cc_file_name
print "}" >> cc_file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_service_outgoing_cc(temp_serv,s,serv_mod,func_num_base+func_num)
}
}
function gen_service_cc(services_data,s,module_name,func_num_base,i,k,exception_data,comm,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,arg_data,func_num,arg_num,except_num,temp_cc_prefix,ret_name,first_arg,ref){
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print "" >> cc_file_name
delete arg_data
get_subarray(func_data,i SUBSEP "FIELDS",arg_data)
arg_num=get_array_length(arg_data)
if (func_data[i SUBSEP "RETTYPE"] != "void") {
if(is_basetype(func_data[i SUBSEP "RETTYPE"],module_name) == 1){
ret_name=get_basetype(func_data[i SUBSEP "RETTYPE"]) " "
first_arg=""
} else {
if(arg_num==0){
comm = ""
} else {
comm =", "
}
ret_name="void "
first_arg=cc_prefix_thrift_type(func_data[i SUBSEP "RETTYPE"],module_name) "& _ret_val" comm
}
} else {
ret_name="void "
first_arg=""
}
print " " ret_name " "s"Handler::" func_data[i SUBSEP "NAME"] " ( " first_arg >> cc_file_name
for(k=1;k<=arg_num;k++){
if(k==arg_num){
comm = ""
} else {
comm =","
}
if((is_basetype(arg_data[k SUBSEP "TYPE"],module_name)==1) || (is_enum(arg_data[k SUBSEP "TYPE"],module_name)==1)){
ref = ""
} else {
ref = "&"
}
print " const " cc_prefix_thrift_type(arg_data[k SUBSEP "TYPE"],module_name) ref " " arg_data[k SUBSEP "NAME"] comm >> cc_file_name
}
print " ){" >> cc_file_name
is_return=0
if (func_data[i SUBSEP "RETTYPE"] != "void") {
if(is_basetype(func_data[i SUBSEP "RETTYPE"],module_name) == 1){
print " " get_basetype(func_data[i SUBSEP "RETTYPE"]) " _ret_val;" >> cc_file_name
is_return=1
}
} else {
is_return=2
}
delete exception_data
get_subarray(func_data,i SUBSEP "THROWS",exception_data)
except_num=get_array_length(exception_data)
for(k=1;k<=except_num;k++){
print " " cc_prefix_thrift_type(exception_data[k SUBSEP "TYPE"],module_name) " " exception_data[k SUBSEP "NAME"] ";" >> cc_file_name
}
print "" >> cc_file_name
print " int _s=connect();" >> cc_file_name
print " void * _push_data["arg_num+1+except_num"];" >> cc_file_name
print " struct internal_comm_struct _comm_buff;" >> cc_file_name
print "" >> cc_file_name
for(k=1;k<=arg_num;k++){
print " _push_data["k-1"]=(void*)&"arg_data[k SUBSEP "NAME"]";" >> cc_file_name
}
if(is_return!=2){
print " _push_data["arg_num"]=(void*)&_ret_val;" >> cc_file_name
}
for(k=1;k<=except_num;k++){
print " _push_data["k+arg_num"]=(void*)&"exception_data[k SUBSEP "NAME"]";" >> cc_file_name
}
print "" >> cc_file_name
print " _comm_buff.code="func_num_base+i";" >> cc_file_name
print " _comm_buff.data=(void **)&_push_data;" >> cc_file_name
print "" >> cc_file_name
print " void *_dp=(void*)&_comm_buff;" >> cc_file_name
print " write(_s,&_dp,sizeof(void *));" >> cc_file_name
print " read(_s,&_dp,sizeof(void *));" >> cc_file_name
print "" >> cc_file_name
print " int code=((struct internal_comm_struct*)_dp)->code;" >> cc_file_name
print "" >> cc_file_name
print " switch(code){" >> cc_file_name
print " case 0:" >> cc_file_name
print " break;" >> cc_file_name
for(k=1;k<=except_num;k++){
print " case "k":" >> cc_file_name
print " throw "exception_data[k SUBSEP "NAME"]";" >> cc_file_name
print " break;" >> cc_file_name
}
print " default:" >> cc_file_name
print " break;" >> cc_file_name
print " }" >> cc_file_name
print " close(_s);" >> cc_file_name
if(is_return==1){
print " return _ret_val;" >> cc_file_name
}
print "}" >> cc_file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_service_cc(temp_serv,s,serv_mod,func_num_base+func_num)
}
}
function is_basetype(tn,module,type_list, type_module,dot_pos,typename){
type_list["bool"]=1
type_list["byte"]=1
type_list["i16"]=1
type_list["i32"]=1
type_list["i64"]=1
type_list["double"]=1
type_list["string"]=2
type_list["binary"]=2
if(tn in type_list ){
return type_list[tn]
} else {
typename=tn
dot_pos=index(typename,".")
if(dot_pos>0){
type_module=substr(typename,1,dot_pos-1)
tn=substr(typename,dot_pos+1)
return is_basetype(tn,type_module)
} else {
if( module SUBSEP "TYPEDEF" SUBSEP tn in AST){
return is_basetype(AST[module SUBSEP "TYPEDEF" SUBSEP tn],module)
}
}
return 0
}
}
function is_enum(tn,module, type_module,dot_pos){
if(is_basetype(tn,module)!=0){
return 0
} else {
dot_pos=index(typename,".")
if(dot_pos>0){
type_module=substr(typename,1,dot_pos-1)
tn=substr(typename,dot_pos+1)
return is_enum(tn,type_module)
} else {
if( module SUBSEP "ENUMS" SUBSEP tn SUBSEP "NAME" in AST){
return 1
}
}
return 0
}
}
function is_basetype_ttcn(tn,type_list){
type_list["bool"]=1
type_list["byte"]=1
type_list["i16"]=1
type_list["i32"]=1
type_list["i64"]=1
type_list["double"]=1
type_list["string"]=1
type_list["binary"]=1
if(tn in type_list ){
return 1
} else {
return 0
}
}
function get_basetype(tn,type_list){
type_list["bool"]="bool"
type_list["byte"]="int8_t"
type_list["i16"]="int16_t"
type_list["i32"]="int32_t"
type_list["i64"]="int64_t"
type_list["double"]="double"
type_list["string"]="std::string"
type_list["binary"]="std::string"
if(tn in type_list ){
return type_list[tn]
} else {
return tn
}
}
function prefix_type(typename,orig_module, type_module,dot_pos,tn){
dot_pos=index(typename,".")
if(dot_pos>0){
type_module=substr(typename,1,dot_pos-1)
tn=substr(typename,dot_pos+1)
} else {
type_module=orig_module
tn=typename
}
if(is_basetype_ttcn(tn)==1){
type_module=f
}
if(type_module!=f){
return type_module "_TypesAndPorts." res_word(tn)
} else {
return res_word(tn)
}
}
function gen_service(services_data,s,module_name,i,k,exception_data,comm,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,arg_data,func_num,arg_num,except_num){
print "" >> file_name
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print " signature " s "_" func_data[i SUBSEP "NAME"] " ( " >> file_name
delete arg_data
get_subarray(func_data,i SUBSEP "FIELDS",arg_data)
arg_num=get_array_length(arg_data)
for(k=1;k<=arg_num;k++){
if(k==arg_num){
comm = ""
} else {
comm =","
}
print " in " prefix_type(arg_data[k SUBSEP "TYPE"],module_name) " " res_word(arg_data[k SUBSEP "NAME"]) comm >> file_name
}
print " )" >> file_name
if( func_data[i SUBSEP "RETTYPE"] != "void") {
print " return " prefix_type(func_data[i SUBSEP "RETTYPE"],module_name) >> file_name
}
delete exception_data
get_subarray(func_data,i SUBSEP "THROWS",exception_data)
except_num=get_array_length(exception_data)
print " exception (" >> file_name
if(except_num>0){
comm = ","
} else {
comm =""
}
print " Thrift_port_error" comm >> file_name
if(except_num>0){
for(k=1;k<=except_num;k++){
if(k==except_num){
comm = ""
} else {
comm =","
}
print " " prefix_type(exception_data[k SUBSEP "TYPE"],module_name) comm >> file_name
}
}
print " )" >> file_name
print "" >> file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_service(temp_serv,s,serv_mod)
}
}
function gen_port_proc(services_data,s,module_name,temp_serv_name,temp_serv,serv_mod,dot_ind,func_data,func_num){
delete func_data
get_subarray(services_data,"FUNCS",func_data)
func_num=get_array_length(func_data)
for(i=1;i<=func_num;i++){
print " inout " s "_" func_data[i SUBSEP "NAME"] >> file_name
}
if("EXTENDS" in services_data){
delete temp_serv
dot_ind=index(services_data["EXTENDS"],".")
if(dot_ind>0){
serv_mod=substr(services_data["EXTENDS"],1,dot_ind-1)
temp_serv_name=substr(services_data["EXTENDS"],dot_ind+1)
} else {
serv_mod=module_name
temp_serv_name=services_data["EXTENDS"]
}
get_subarray(AST,serv_mod SUBSEP "SERVICES" SUBSEP temp_serv_name,temp_serv)
gen_port_proc(temp_serv,s,serv_mod)
}
}
function res_word(data,map){
map["value"]="value_"
if(data in map){
return map[data]
} else {
return data
}
}
function double_und(orig,ret_val){
ret_val=orig;
gsub(/_/,"__",ret_val);
return ret_val;
}
function dot_to_colon(orig,ret_val){
ret_val=orig;
gsub(/\./,"::",ret_val);
return ret_val;
}
function get_subarray(arr, ind, ret_val,x){
# ret_val[1]=1;
# delete ret_val;
for(x in arr){
match(x,"^"ind SUBSEP )
if(RSTART > 0 ){
ret_val[substr(x,RLENGTH+1)]=arr[x]
}
}
# return ret_val;
}
function get_array_length(arr,ret_val,a,x){
delete ret_val
for(x in arr){
split(x,a,SUBSEP);
ret_val[a[1]]=a[1]
}
return length(ret_val)
}
function push_state(new_state){
++state_stack_level;
state_stack[state_stack_level]=parser_state;
parser_state=new_state;
# print "push " state_stack_level, " " state_stack[state_stack_level]
}
function walk_array(arr, name, i,k,l,p)
{
#print "walk array start " name
delete p
for (i in arr) {
#print "process " i
split(i,k,SUBSEP)
if(length(k)>1){
#print "subaaray found"
if(!(k[1] in p)){
#print "subaaray process"
delete l;
get_subarray(arr,k[1],l)
walk_array(l, name "[" k[1] "]")
p[k[1]]=k[1]
}
} else {
printf("%s[%s] = %s\n", name, i, arr[i])
}
}
#print "walk array end " name
}
function pop_state(){
parser_state=state_stack[state_stack_level];
--state_stack_level;
# print "pop " state_stack_level, " " state_stack[state_stack_level]
}
function start_state(){
parser_state="START";
state_stack_level=1;
}
BEGIN {
comment= 0;
parser_state="START";
processed_files[ARGV[1]]=ARGV[1];
state_stack_level=1;
state_stack[1]="NONE"
definition_type_name=""
const_name=""
enum_name=""
field_id=""
fieldReq=""
fieldName=""
struct_name=""
save_def_val=0;
oneway=0;
if(!myserver){
myserver_name="TThreadedServer";
myserver_include="<thrift/server/TThreadedServer.h>"
} else {
myserver_name="myTThreadedServer";
myserver_include="\"myTThreadedServer.h\""
}
for(i=1;i<ARGC;i++){
match(ARGV[i],/\.thrift/)
AST["FILES" SUBSEP basename(substr(ARGV[i],1,RSTART-1))]=basename(substr(ARGV[i],1,RSTART-1));
}
}
{
# print " !!! ", $0
match(FILENAME,/\.thrift/)
t_file=basename(substr(FILENAME,1,RSTART-1))
while($0) # Get fields by pattern, not by delimiter
{
# should be run with gawk < 4.0.0 so FPAT can not be used
match($0, "((//)|[#]|([/][\\*])|([\\*]/)|[,]|[=]|(\"[^\"]+\")|('[^']+')|[{]|[}]|[<]|[>]|[:]|[(]|[)]|[;]|([[:alnum:]._+-]+))") # Find a token
if(RSTART > 0) { # token found
token = substr($0, RSTART, RLENGTH) # Get the located token
if(token ~ /(\"[^\"]+\")|('[^']+')/){
token=substr(token,2,RLENGTH-2)
}
# printf("$0 before = <%s>\n",$0)
# printf("token = <%s>\n",token)
# print "RSTART = ",RSTART, " RLENGTH = " ,RLENGTH;
if( token ~ "(//)|[#]" ) { # Skip line comments
next;
} else if ( token ~ "[/][*].*" ){ # Skip block comment
comment = 1;
} else if (token ~ ".*[*][/].*" ) { # end of block comment
comment = 0;
} else if (comment == 0) { # process the token
# printf("%s = <%s>\n",parser_state , token)
if(!( token ~ /[,]|[;]/ ) ){ # always skip the list separator
if(parser_state== "START"){
if ( token == "include"){
push_state("INCLUDE")
} else if ( token == "cpp_include"){
} else if ( token == "php_namespace"){
} else if ( token == "xsd_namespace"){
} else if ( token == "smalltalk.category"){
} else if ( token == "smalltalk.prefix"){
push_state("SKIP_1")
} else if ( token == "namespace"){
push_state("NAMESPACE");
} else if ( token == "typedef"){
push_state("TYPEDEF");
push_state("DEFINITIONTYPE")
} else if ( token == "const"){
push_state("CONSTDEF");
push_state("DEFINITIONTYPE")
} else if ( token == "enum"){
push_state("ENUMNAME");
enum_senum="ENUMS"
} else if ( token == "senum"){
push_state("ENUMNAME");
enum_senum="SENUMS"
} else if ( token == "struct"){
push_state("STRUCTNAME");
struct_execption="STRUCTS"
} else if ( token == "exception"){
push_state("STRUCTNAME");
struct_execption="EXCEPTIONS"
} else if ( token == "service"){
push_state("SERVICE_ID")
} #default{
} else if (parser_state== "SERVICE_ID"){
if ( token == "extends"){
pop_state()
push_state("SERVICE_EXTENDS")
} else if ( token == "{"){
func_num=0;
pop_state()
push_state("SERVICE_FUNCTIONS")
} else {
service_name=token;
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "NAME"]=service_name;
}
} else if (parser_state== "SERVICE_EXTENDS"){
if(token == "{" ){
func_num=0;
pop_state()
push_state("SERVICE_FUNCTIONS")
} else {
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "EXTENDS"]=token;
}
} else if (parser_state== "SERVICE_FUNCTIONS"){
if ( token == "oneway"){
oneway=1;
} else if ( token == "throws"){
push_state("THROWS")
} else if ( token == "}"){
pop_state()
} else if ( token == "map"){
print "map is unsupported"
definition_type_name="dummy";
push_state("FUNCNAME")
push_state("MAP_END");
} else if ( token == "list"){
push_state("FUNCNAME")
push_state("LIST_BEGIN");
} else if ( token == "set"){
push_state("FUNCNAME")
push_state("SET_BEGIN");
} else {
definition_type_name=token;
push_state("FUNCNAME")
}
} else if (parser_state== "FUNCNAME"){
if(token=="("){
filed_num=0
pop_state()
push_state("FUNCFIELD")
} else {
func_num++
if(oneway==1) {
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "ONEWAY"]=fieldReq
oneway=0
}
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "RETTYPE"]=definition_type_name
definition_type_name=""
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "NAME"]=token
}
} else if (parser_state== "FUNCFIELD"){
if(save_def_val == 1){
save_def_val=0;
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "DEFVAL"]=builded_const
builded_const="";
}
if ( token ~ /^[0-9+-]+$/ ){
field_id=token
} else if ( token == ":"){ # just skip it
} else if ( token == "optional"){
fieldReq=token
} else if ( token == "required"){
fieldReq=token
} else if ( token == "="){
save_def_val=1;
push_state("CONST_VALUE_BUILD")
} else if ( token == ")"){
pop_state()
} else if ( token == "map"){
print "map is unsupported"
definition_type_name="dummy";
pop_state()
push_state("FUNCFIELDNAME")
push_state("MAP_END");
} else if ( token == "list"){
pop_state()
push_state("FUNCFIELDNAME")
push_state("LIST_BEGIN");
} else if ( token == "set"){
pop_state()
push_state("FUNCFIELDNAME")
push_state("SET_BEGIN");
} else {
definition_type_name=token;
pop_state()
push_state("FUNCFIELDNAME")
}
} else if (parser_state== "FUNCFIELDNAME"){
filed_num++
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "ID"]=field_id
field_id=""
if(fieldReq!="optional") {fieldReq="required"}
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "REQ"]=fieldReq
fieldReq=""
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "TYPE"]=definition_type_name
definition_type_name=""
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "NAME"]=token
pop_state()
push_state("FUNCFIELD")
} else if (parser_state== "THROWS"){
if(token=="("){
filed_num=0
pop_state()
push_state("THROWSFIELD")
}
} else if (parser_state== "THROWSFIELD"){
if(save_def_val == 1){
save_def_val=0;
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "THROWS" SUBSEP filed_num SUBSEP "DEFVAL"]=builded_const
builded_const="";
}
if ( token ~ /^[0-9+-]+$/ ){
field_id=token
} else if ( token == ":"){ # just skip it
} else if ( token == "optional"){
fieldReq=token
} else if ( token == "required"){
fieldReq=token
} else if ( token == "="){
save_def_val=1;
push_state("CONST_VALUE_BUILD")
} else if ( token == ")"){
pop_state()
} else if ( token == "map"){
print "map is unsupported"
definition_type_name="dummy";
pop_state()
push_state("THROWSFIELDNAME")
push_state("MAP_END");
} else if ( token == "list"){
pop_state()
push_state("THROWSFIELDNAME")
push_state("LIST_BEGIN");
} else if ( token == "set"){
pop_state()
push_state("THROWSFIELDNAME")
push_state("SET_BEGIN");
} else {
definition_type_name=token;
pop_state()
push_state("THROWSFIELDNAME")
}
} else if (parser_state== "THROWSFIELDNAME"){
filed_num++
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "THROWS" SUBSEP filed_num SUBSEP "ID"]=field_id
field_id=""
if(fieldReq!="optional") {fieldReq="required"}
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "THROWS" SUBSEP filed_num SUBSEP "REQ"]=fieldReq
fieldReq=""
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "THROWS" SUBSEP filed_num SUBSEP "TYPE"]=definition_type_name
definition_type_name=""
AST[t_file SUBSEP "SERVICES" SUBSEP service_name SUBSEP "FUNCS" SUBSEP func_num SUBSEP "THROWS" SUBSEP filed_num SUBSEP "NAME"]=token
pop_state()
push_state("THROWSFIELD")
} else if (parser_state== "STRUCTNAME"){
if (token == "{") {
pop_state()
push_state("FIELDTYPE")
filed_num=0;
} else {
struct_name=token
AST[t_file SUBSEP struct_execption SUBSEP struct_name SUBSEP "NAME"]=struct_name
}
} else if (parser_state== "FIELDTYPE"){
if(save_def_val == 1){
save_def_val=0;
AST[t_file SUBSEP struct_execption SUBSEP struct_name SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "DEFVAL"]=builded_const
builded_const="";
}
if ( token ~ /^[0-9+-]+$/ ){
field_id=token
} else if ( token == ":"){ # just skip it
} else if ( token == "optional"){
fieldReq=token
} else if ( token == "required"){
fieldReq=token
} else if ( token == "="){
save_def_val=1;
push_state("CONST_VALUE_BUILD")
} else if ( token == "}"){
pop_state()
} else if ( token == "map"){
print "map is unsupported"
definition_type_name="dummy";
pop_state()
push_state("FIELDNAME")
push_state("MAP_END");
} else if ( token == "list"){
pop_state()
push_state("FIELDNAME")
push_state("LIST_BEGIN");
} else if ( token == "set"){
pop_state()
push_state("FIELDNAME")
push_state("SET_BEGIN");
} else {
definition_type_name=token;
pop_state()
push_state("FIELDNAME")
}
} else if (parser_state== "FIELDNAME"){
filed_num++
AST[t_file SUBSEP struct_execption SUBSEP struct_name SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "ID"]=field_id
field_id=""
if(fieldReq!="optional") {fieldReq="required"}
AST[t_file SUBSEP struct_execption SUBSEP struct_name SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "REQ"]=fieldReq
fieldReq=""
AST[t_file SUBSEP struct_execption SUBSEP struct_name SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "TYPE"]=definition_type_name
definition_type_name=""
AST[t_file SUBSEP struct_execption SUBSEP struct_name SUBSEP "FIELDS" SUBSEP filed_num SUBSEP "NAME"]=token
pop_state()
push_state("FIELDTYPE")
} else if (parser_state== "ENUMNAME"){
if(token == "{"){
pop_state();
push_state("ENUM_VALUE")
} else {
AST[t_file SUBSEP enum_senum SUBSEP token SUBSEP "NAME"]=token
enum_name=token
enum_id=0
}
} else if (parser_state== "ENUM_VALUE"){
if ( token == "}"){
pop_state();
} else if ( token == "="){
push_state("ENUM_VALUE_VAL");
} else {
enum_id++;
AST[t_file SUBSEP enum_senum SUBSEP enum_name SUBSEP "VALUES" SUBSEP enum_id SUBSEP "NAME"]=token;
}
} else if (parser_state== "ENUM_VALUE_VAL"){
AST[t_file SUBSEP enum_senum SUBSEP enum_name SUBSEP "VALUES" SUBSEP enum_id SUBSEP "VAL"]=token;
pop_state();
} else if (parser_state== "CONSTDEF"){
if(token == "="){
pop_state();
push_state("CONST_VALUE")
} else {
AST[t_file SUBSEP "CONSTS" SUBSEP token SUBSEP "TYPE"]=definition_type_name
definition_type_name=""
const_name=token
}
} else if (parser_state== "CONST_VALUE"){
if ( token == "{"){
print "Map constatnt is not supported"
pop_state();
push_state("MAP_CONST_END")
} else if ( token == "["){
pop_state();
builded_const="{"
push_state("LIST_CONST_END")
} else {
AST[t_file SUBSEP "CONSTS" SUBSEP const_name SUBSEP "VALUE"]=token
pop_state();
}
} else if (parser_state== "CONST_VALUE_BUILD"){
if ( token == "{"){
print "Map constatnt is not supported"
pop_state();
push_state("MAP_CONST_BUILD_END")
} else if ( token == "["){
pop_state();
push_state("LIST_CONST_BUILD_END")
push_state("CONST_VALUE_BUILD")
} else {
builded_const=token
pop_state();
}
} else if (parser_state== "MAP_CONST_END"){
if(token == "}"){
AST[t_file SUBSEP "CONSTS" SUBSEP const_name SUBSEP "VALUE"]="dummy_map_const"
pop_state();
}
} else if (parser_state== "LIST_CONST_END"){
if(token == "]"){
AST[t_file SUBSEP "CONSTS" SUBSEP const_name SUBSEP "VALUE"]=builded_const"}";
pop_state();
} else {
lb=length(builded_const);
if(substr(builded_const,lb,1)=="{"){
comm=""
} else {
comm=", "
}
if ( token == "{"){
print "Map constatnt is not supported"
push_state("MAP_CONST_BUILD_END")
} else if ( token == "["){
builded_const=comm"{"
push_state("LIST_CONST_BUILD_END")
} else {
AST[t_file SUBSEP "CONSTS" SUBSEP const_name SUBSEP "VALUE"]=token
pop_state();
}
}
} else if (parser_state== "LIST_CONST_BUILD_END"){
if(token == "}"){
builded_const=builded_const"}";
pop_state();
} else {
lb=length(builded_const);
if(substr(builded_const,lb,1)=="{"){
comm=""
} else {
comm=", "
}
if ( token == "{"){
print "Map constatnt is not supported"
push_state("MAP_CONST_BUILD_END")
} else if ( token == "["){
builded_const=comm"{"
push_state("LIST_CONST_BUILD_END")
} else {
builded_const=comm token
pop_state();
}
}
} else if (parser_state== "MAP_CONST_BUILD_END"){
if(token == "}"){
lb=length(builded_const);
if(substr(builded_const,lb,1)=="{"){
comm=""
} else {
comm=", "
}
builded_const=comm"dummy_map_const"
pop_state();
}
} else if (parser_state== "INCLUDE"){
match(token,/\.thrift/)
AST[t_file SUBSEP "INCLUDES" SUBSEP substr(token,1,RSTART-1)]=substr(token,1,RSTART-1)
if( ! (token in processed_files )){
ARGV[ARGC]=token;
ARGC++;
processed_files[token]=token
AST["FILES" SUBSEP basename(substr(token,1,RSTART-1))]=basename(substr(token,1,RSTART-1));
}
pop_state();
} else if (parser_state== "NAMESPACE"){
if(token ~ /[*]|cpp/){
push_state("NAMESPACE_ID");
} else {
push_state("SKIP_1")
}
} else if (parser_state== "NAMESPACE_ID"){
AST[t_file SUBSEP "NAMESPACE"]=token
start_state();
} else if (parser_state== "DEFINITIONTYPE"){
if ( token == "map"){
print "map is unsupported"
definition_type_name="dummy";
pop_state()
push_state("MAP_END");
} else if ( token == "list"){
pop_state()
push_state("LIST_BEGIN");
} else if ( token == "set"){
pop_state()
push_state("SET_BEGIN");
} else {
definition_type_name=token;
pop_state()
}
} else if (parser_state== "LIST_BEGIN"){
if(token == "<"){
pop_state();
push_state("LIST_END")
push_state("DEFINITIONTYPE")
}
} else if (parser_state== "SET_BEGIN"){
if(token == "<"){
pop_state();
push_state("SET_END")
push_state("DEFINITIONTYPE")
}
} else if (parser_state== "LIST_END"){
pop_state();
if(token == ">"){
AST[t_file SUBSEP "LIST_TYPES" SUBSEP definition_type_name "_list"]=definition_type_name
definition_type_name = definition_type_name "_list"
} else {
printf "invalid token: ", token
definition_type_name="dummy";
}
} else if (parser_state== "SET_END"){
pop_state();
if(token == ">"){
AST[t_file SUBSEP "SET_TYPES" SUBSEP definition_type_name "_set"]=definition_type_name
definition_type_name = definition_type_name "_set"
} else {
printf "invalid token: ", token
definition_type_name="dummy";
}
} else if (parser_state== "MAP_END"){
if(token == ">"){
pop_state();
}
} else if (parser_state== "TYPEDEF"){
AST[t_file SUBSEP "TYPEDEF" SUBSEP token]=definition_type_name
definition_type_name=""
pop_state()
} else if (parser_state ~ /SKIP_[0-9]+/){
num_to_skip=substr(parser_state,6);
if(num_to_skip == 1){
start_state();
} else {
pop_state()
num_to_skip--
push_state("SKIP_"num_to_skip)
}
} else{
# do nothing
}
}
# printf("new state %s \n",parser_state )
}
$0 = substr($0, RSTART+RLENGTH ) # Remove processed text from the raw data
# printf("$0 after = <%s>\n",$0)
} else {
next;
}
}
}
END {
# walk_array(AST, "AST")
delete files;
get_array_length(AST,files)
for(f in files){
if(f == "FILES"){
continue
}
file_name= f "_TypesAndPorts.ttcn"
print "module " f "_TypesAndPorts {" > file_name
delete module_data
get_subarray(AST,f,module_data);
print "" >> file_name
delete include_data
get_subarray(module_data,"INCLUDES",include_data)
for(i in include_data){
print " import from " i "_TypesAndPorts all" >> file_name
}
print " import from Thrift_Common all" >> file_name
print "" >> file_name
print " type integer address" >> file_name
print "" >> file_name
print "// Typedefs" >> file_name
delete typedef_data
get_subarray(module_data,"TYPEDEF",typedef_data)
for(t in typedef_data){
print " type " prefix_type(typedef_data[t],f) " " res_word(t) >> file_name
}
print "" >> file_name
print "// List/Set types" >> file_name
delete list_types
get_subarray(module_data,"LIST_TYPES",list_types)
for(l in list_types){
print " type record of " prefix_type(list_types[l],f) " " l >> file_name
}
delete list_types
get_subarray(module_data,"SET_TYPES",list_types)
for(l in list_types){
print " type set of " prefix_type(list_types[l],f) " " l >> file_name
}
print "" >> file_name
print "// Constants" >> file_name
delete const_data
get_subarray(module_data,"CONSTS",const_data)
delete const_lists
get_array_length(const_data,const_lists)
for(c in const_lists){
print " const " prefix_type(const_data[c SUBSEP "TYPE"],f) " " res_word(c) " := " const_data[c SUBSEP "VALUE"]>> file_name
}
print "" >> file_name
print "// Enumerations" >> file_name
delete enum_data
get_subarray(module_data,"ENUMS",enum_data)
delete enum_list
get_array_length(enum_data,enum_list)
for(e in enum_list){
print " type enumerated " res_word(e) " {" >> file_name
delete enum_val_list
get_subarray(enum_data,e SUBSEP "VALUES",enum_val_list)
ev_num=get_array_length(enum_val_list)
for ( i=1; i<=ev_num; i++){
if(i==ev_num){
comm = ""
} else {
comm =","
}
if (e SUBSEP "VALUES" SUBSEP i SUBSEP "VAL" in enum_data){
print " " res_word(enum_data[e SUBSEP "VALUES" SUBSEP i SUBSEP "NAME"]) " (" enum_data[e SUBSEP "VALUES" SUBSEP i SUBSEP "VAL"] ")" comm >> file_name
} else {
print " " res_word(enum_data[e SUBSEP "VALUES" SUBSEP i SUBSEP "NAME"]) comm >> file_name
}
}
print " }" >> file_name
print "" >> file_name
}
print "" >> file_name
print "// Structs" >> file_name
delete struct_data
get_subarray(module_data,"STRUCTS",struct_data)
delete struct_list
get_array_length(struct_data,struct_list)
for(s in struct_list){
print " type record " res_word(s) " {" >> file_name
delete struct_fields
get_subarray(struct_data,s SUBSEP "FIELDS",struct_fields)
f_num=get_array_length(struct_fields)
for ( i=1; i<=f_num; i++){
if(i==f_num){
comm = ""
} else {
comm =","
}
if( struct_fields[i SUBSEP "REQ"] == "optional"){
opt=" optional"
} else {
opt=""
}
print " " prefix_type(struct_fields[i SUBSEP "TYPE"],f) " " res_word(struct_fields[i SUBSEP "NAME"]) opt comm>> file_name
}
print " }" >> file_name
print "" >> file_name
}
print "" >> file_name
print "// Exception types" >> file_name
delete struct_data
get_subarray(module_data,"EXCEPTIONS",struct_data)
delete struct_list
get_array_length(struct_data,struct_list)
for(s in struct_list){
print " type record " res_word(s) " {" >> file_name
delete struct_fields
get_subarray(struct_data,s SUBSEP "FIELDS",struct_fields)
f_num=get_array_length(struct_fields)
for ( i=1; i<=f_num; i++){
if(i==f_num){
comm = ""
} else {
comm =","
}
if( struct_fields[i SUBSEP "REQ"] == "optional"){
opt=" optional"
} else {
opt=""
}
print " " prefix_type(struct_fields[i SUBSEP "TYPE"],f) " " res_word(struct_fields[i SUBSEP "NAME"]) opt comm>> file_name
}
print " }" >> file_name
print "" >> file_name
}
print "" >> file_name
print "// Services" >> file_name
delete services_data
delete services_list
get_subarray(module_data,"SERVICES",services_data)
get_array_length(services_data,services_list)
for(s in services_list){
delete serv_data
get_subarray(services_data,s,serv_data)
print "// Signatures for " s >> file_name
gen_service(serv_data,s,f)
}
print "" >> file_name
print "// Port definition for Services" >> file_name
print "" >> file_name
for(s in services_list){
delete serv_data
get_subarray(services_data,s,serv_data)
print " type port " s "_PT procedure {" >> file_name
print " out Thrift_control" >> file_name
gen_port_proc(serv_data,s,f)
print " } with { extension \"address\" }" >> file_name
print "" >> file_name
}
print "} with { encode \"XER\" }" >> file_name
# generate converter functions
cc_file_name = f "_Converter.cc"
hh_file_name = f "_Converter.hh"
if("NAMESPACE" in module_data){
cc_namespace=dot_to_colon(module_data["NAMESPACE"] "::")
} else {
cc_namespace=""
}
print "#include \"" f "_TypesAndPorts.hh\"" > hh_file_name
print "#include \"" f "_types.h\"" > hh_file_name
print "#include \"Thrift_Common_Converter.hh\"" > hh_file_name
print "#include \"" f "_Converter.hh\"" > cc_file_name
for(i in include_data){
print "#include \"" i "_TypesAndPorts.hh\"" >> hh_file_name
print "#include \"" i "_Converter.hh\"" >> hh_file_name
}
print "" >> cc_file_name
print "" >> hh_file_name
print "// Enumerations" >> cc_file_name
print "// Enumerations" >> hh_file_name
for(e in enum_list){
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(e))"& in," cc_namespace e "::type& out);" >> hh_file_name
print "void conv_thrift_ttcn(const " cc_namespace e "::type& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(e))"& out);" >> hh_file_name
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(e))"& in," cc_namespace e "::type& out){" >> cc_file_name
print " out=("cc_namespace e "::type)(int)in;" >> cc_file_name
print "}" >> cc_file_name
print "void conv_thrift_ttcn(const " cc_namespace e "::type& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(e))"& out){" >> cc_file_name
print " out=(int)in;" >> cc_file_name
print "}" >> cc_file_name
}
delete list_types
get_subarray(module_data,"LIST_TYPES",list_types)
for(l in list_types){
if(is_basetype(list_types[l],f)!=0){
lt=get_basetype(list_types[l])
} else {
lt=cc_namespace list_types[l]
}
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& in, std::vector<" lt ">& out);" >> hh_file_name
print "void conv_thrift_ttcn(const std::vector<" lt ">& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& out);" >> hh_file_name
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& in, std::vector<" lt ">& out){" >> cc_file_name
print " out.empty();" >> cc_file_name
print " size_t s=in.size_of();" >> cc_file_name
print " if(s>0){" >> cc_file_name
print " out.resize(s);" >> cc_file_name
print " for(size_t i=s;i>0; i--){" >> cc_file_name
print " conv_ttcn_thrift(in[i-1],out[i-1]);" >> cc_file_name
print " }" >> cc_file_name
print " }" >> cc_file_name
print "}" >> cc_file_name
print "void conv_thrift_ttcn(const std::vector<" lt ">& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& out){" >> cc_file_name
print " out=NULL_VALUE;" >> cc_file_name
print " for(size_t i=in.size();i>0; i--){" >> cc_file_name
print " conv_thrift_ttcn(in[i-1],out[i-1]);" >> cc_file_name
print " }" >> cc_file_name
print "}" >> cc_file_name
}
delete list_types
get_subarray(module_data,"SET_TYPES",list_types)
for(l in list_types){
if(is_basetype(list_types[l],f)!=0){
lt=get_basetype(list_types[l])
} else {
lt=cc_namespace list_types[l]
}
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& in, std::set<" lt ">& out);" >> hh_file_name
print "void conv_thrift_ttcn(const std::set<" lt ">& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& out);" >> hh_file_name
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& in, std::set<" lt ">& out){" >> cc_file_name
print "}" >> cc_file_name
print "void conv_thrift_ttcn(const std::set<" lt ">& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(l))"& out){" >> cc_file_name
print " out=NULL_VALUE;" >> cc_file_name
print " std::set<" lt ">::iterator it=in.begin();" >> cc_file_name
print " for(size_t i=in.size();i>0; i--){" >> cc_file_name
print " conv_thrift_ttcn(*it,out[i-1]);" >> cc_file_name
print " it++;" >> cc_file_name
print " }" >> cc_file_name
print "}" >> cc_file_name
}
delete struct_data
get_subarray(module_data,"STRUCTS",struct_data)
delete struct_list
get_array_length(struct_data,struct_list)
for(s in struct_list){
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& in, " cc_namespace s "& out);" >> hh_file_name
print "void conv_thrift_ttcn(const " cc_namespace s "& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& out);" >> hh_file_name
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& in, " cc_namespace s "& out){" >> cc_file_name
delete struct_fields
get_subarray(struct_data,s SUBSEP "FIELDS",struct_fields)
f_num=get_array_length(struct_fields)
for ( i=1; i<=f_num; i++){
if( struct_fields[i SUBSEP "REQ"] == "optional"){
print " if( in."double_und(res_word(struct_fields[i SUBSEP "NAME"]))"().ispresent()){" >> cc_file_name
print " conv_ttcn_thrift( in." double_und(res_word(struct_fields[i SUBSEP "NAME"])) "()(),out." struct_fields[i SUBSEP "NAME"] ");" >> cc_file_name
print " out.__isset." struct_fields[i SUBSEP "NAME"]"=true;" >> cc_file_name
print " } else {" >> cc_file_name
print " out.__isset." struct_fields[i SUBSEP "NAME"]"=false;" >> cc_file_name
print " }" >> cc_file_name
} else {
print " conv_ttcn_thrift( in." double_und(res_word(struct_fields[i SUBSEP "NAME"])) "(),out." struct_fields[i SUBSEP "NAME"] ");" >> cc_file_name
}
}
print "}" >> cc_file_name
print "void conv_thrift_ttcn(const " cc_namespace s "& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& out){" >> cc_file_name
for ( i=1; i<=f_num; i++){
if( struct_fields[i SUBSEP "REQ"] == "optional"){
print " if( in.__isset."struct_fields[i SUBSEP "NAME"]"){" >> cc_file_name
print " conv_thrift_ttcn( in." struct_fields[i SUBSEP "NAME"] ",out." double_und(res_word(struct_fields[i SUBSEP "NAME"]))"()());" >> cc_file_name
print " } else {" >> cc_file_name
print " out." double_und(res_word(struct_fields[i SUBSEP "NAME"]))"()=OMIT_VALUE;" >> cc_file_name
print " }" >> cc_file_name
} else {
print " conv_thrift_ttcn( in." struct_fields[i SUBSEP "NAME"] ",out." double_und(res_word(struct_fields[i SUBSEP "NAME"]))"());" >> cc_file_name
}
}
print "}" >> cc_file_name
}
delete struct_data
get_subarray(module_data,"EXCEPTIONS",struct_data)
delete struct_list
get_array_length(struct_data,struct_list)
for(s in struct_list){
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& in, " cc_namespace s "& out);" >> hh_file_name
print "void conv_thrift_ttcn(const " cc_namespace s "& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& out);" >> hh_file_name
print "void conv_ttcn_thrift(const " double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& in, " cc_namespace s "& out){" >> cc_file_name
delete struct_fields
get_subarray(struct_data,s SUBSEP "FIELDS",struct_fields)
f_num=get_array_length(struct_fields)
for ( i=1; i<=f_num; i++){
if( struct_fields[i SUBSEP "REQ"] == "optional"){
print " if( in."double_und(res_word(struct_fields[i SUBSEP "NAME"]))"().ispresent()){" >> cc_file_name
print " conv_ttcn_thrift( in." double_und(res_word(struct_fields[i SUBSEP "NAME"])) "()(),out." struct_fields[i SUBSEP "NAME"] ");" >> cc_file_name
print " out.__isset." struct_fields[i SUBSEP "NAME"]"=true;" >> cc_file_name
print " } else {" >> cc_file_name
print " out.__isset." struct_fields[i SUBSEP "NAME"]"=false;" >> cc_file_name
print " }" >> cc_file_name
} else {
print " conv_ttcn_thrift( in." double_und(res_word(struct_fields[i SUBSEP "NAME"])) "(),out." struct_fields[i SUBSEP "NAME"] ");" >> cc_file_name
}
}
print "}" >> cc_file_name
print "void conv_thrift_ttcn(const " cc_namespace s "& in,"double_und(f) "__TypesAndPorts::" double_und(res_word(s))"& out){" >> cc_file_name
for ( i=1; i<=f_num; i++){
if( struct_fields[i SUBSEP "REQ"] == "optional"){
print " if( in.__isset."struct_fields[i SUBSEP "NAME"]"){" >> cc_file_name
print " conv_thrift_ttcn( in." struct_fields[i SUBSEP "NAME"] ",out." double_und(res_word(struct_fields[i SUBSEP "NAME"]))"()());" >> cc_file_name
print " } else {" >> cc_file_name
print " out." double_und(res_word(struct_fields[i SUBSEP "NAME"]))"()=OMIT_VALUE;" >> cc_file_name
print " }" >> cc_file_name
} else {
print " conv_thrift_ttcn( in." struct_fields[i SUBSEP "NAME"] ",out." double_und(res_word(struct_fields[i SUBSEP "NAME"]))"());" >> cc_file_name
}
}
print "}" >> cc_file_name
}
## test port files
for(s in services_list){
delete serv_data
get_subarray(services_data,s,serv_data)
cc_file_name=s"_PT.cc"
hh_file_name=s"_PT.hh"
## _PT.hh
print "#ifndef "s"__PT_HH" > hh_file_name
print "#define "s"__PT_HH" >> hh_file_name
print "#include <arpa/inet.h>" >> hh_file_name
print "#include <pthread.h>" >> hh_file_name
print "#include \""f"_TypesAndPorts.hh\"" >> hh_file_name
print "#include \""f"_Converter.hh\"" >> hh_file_name
print "#include \""f"_types.h\"" >> hh_file_name
print "#include \""s".h\"" >> hh_file_name
print "" >> hh_file_name
print "#include <thrift/protocol/TBinaryProtocol.h>" >> hh_file_name
print "#include <thrift/transport/TServerSocket.h>" >> hh_file_name
print "#include <thrift/transport/TBufferTransports.h>" >> hh_file_name
print "#include <thrift/transport/TSocket.h>" >> hh_file_name
print "#include " myserver_include >> hh_file_name
print "" >> hh_file_name
print "namespace "double_und(f)"__TypesAndPorts {" >> hh_file_name
print "" >> hh_file_name
print "class "s"Handler : virtual public ::" cc_namespace s "If {" >> hh_file_name
print " public:" >> hh_file_name
print " "s"Handler(const char *);" >> hh_file_name
print " ~"s"Handler();" >> hh_file_name
print " const char *uds_name;" >> hh_file_name
print "" >> hh_file_name
print " int connect();" >> hh_file_name
print " void* get_data();" >> hh_file_name
gen_service_hh(serv_data,s,f)
print "};" >> hh_file_name
print "" >> hh_file_name
print "class "double_und(s)"__PT : public "double_und(s)"__PT_BASE {" >> hh_file_name
print "public:" >> hh_file_name
print " "double_und(s)"__PT(const char *par_port_name = NULL);" >> hh_file_name
print " ~"double_und(s)"__PT();" >> hh_file_name
print "" >> hh_file_name
print " void set_parameter(const char *parameter_name," >> hh_file_name
print " const char *parameter_value);" >> hh_file_name
print "" >> hh_file_name
print " void Handle_Fd_Event_Error(int fd);" >> hh_file_name
print " void Handle_Fd_Event_Writable(int fd);" >> hh_file_name
print " void Handle_Fd_Event_Readable(int fd);" >> hh_file_name
print "" >> hh_file_name
print " char *uds_name;" >> hh_file_name
print " int server_socket;" >> hh_file_name
print " " >> hh_file_name
print " ::std::set<int> clients;" >> hh_file_name
print " ::std::map<int,void*> client_data;" >> hh_file_name
print " " >> hh_file_name
print " int port_mode; // 0-not set, 1-client, 2-server" >> hh_file_name
print "" >> hh_file_name
print " boost::shared_ptr<"s"Handler> service_handler;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::TProcessor> server_processor;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::transport::TServerTransport> server_Transport;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::transport::TTransportFactory> server_transportFactory;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::protocol::TProtocolFactory> server_protocolFactory;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::transport::TSocket> client_socket;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::transport::TTransport> client_transport;" >> hh_file_name
print " boost::shared_ptr< ::apache::thrift::protocol::TProtocol> client_protocol;" >> hh_file_name
print "" >> hh_file_name
print " ::apache::thrift::server::" myserver_name " *server_handler;" >> hh_file_name
print " "cc_namespace s"Client *client_handler;" >> hh_file_name
print "" >> hh_file_name
print " void clean_up();" >> hh_file_name
print " pthread_t server_thread;" >> hh_file_name
print "protected:" >> hh_file_name
print " void user_map(const char *system_port);" >> hh_file_name
print " void user_unmap(const char *system_port);" >> hh_file_name
print "" >> hh_file_name
print " void user_start();" >> hh_file_name
print " void user_stop();" >> hh_file_name
print "" >> hh_file_name
print " void outgoing_call(const Thrift__Common::Thrift__control_call& call_par," >> hh_file_name
print " const INTEGER *destination_address);" >> hh_file_name
print "" >> hh_file_name
gen_outgoing_hh(serv_data,s,f)
print "};" >> hh_file_name
print "" >> hh_file_name
print "}" >> hh_file_name
print "#endif" >> hh_file_name
## _PT.cc
print "#include <stdio.h>" > cc_file_name
print "#include <sys/socket.h>" >> cc_file_name
print "#include <sys/un.h>" >> cc_file_name
print "#include <unistd.h>" >> cc_file_name
print "#include <string.h>" >> cc_file_name
print "#include <errno.h>" >> cc_file_name
print "" >> cc_file_name
print "#include \"" s "_PT.hh\"" >> cc_file_name
print "" >> cc_file_name
print "using namespace ::apache::thrift;" >> cc_file_name
print "using namespace ::apache::thrift::protocol;" >> cc_file_name
print "using namespace ::apache::thrift::transport;" >> cc_file_name
print "using namespace ::apache::thrift::server;" >> cc_file_name
print "using boost::shared_ptr;" >> cc_file_name
print "using namespace Thrift__Common;" >> cc_file_name
print "namespace "double_und(f)"__TypesAndPorts {" >> cc_file_name
print s "Handler::"s"Handler(const char *uds){" >> cc_file_name
print " uds_name=uds;" >> cc_file_name
print "}" >> cc_file_name
print s "Handler::~"s"Handler(){}" >> cc_file_name
print "" >> cc_file_name
print "int "s"Handler::connect(){" >> cc_file_name
print " struct sockaddr_un serv_addr;" >> cc_file_name
print "" >> cc_file_name
print " memset(&serv_addr, 0, sizeof(struct sockaddr_un));" >> cc_file_name
print " serv_addr.sun_family = AF_UNIX;" >> cc_file_name
print " strcpy(serv_addr.sun_path, uds_name);" >> cc_file_name
print " int len=strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);" >> cc_file_name
print "#ifdef LINUX" >> cc_file_name
print " serv_addr.sun_path[0]='\\0';" >> cc_file_name
print "#endif" >> cc_file_name
print " int client_socket = socket(PF_UNIX, SOCK_STREAM, 0);" >> cc_file_name
print " ::connect(client_socket,(const sockaddr*)&serv_addr,len);" >> cc_file_name
print " " >> cc_file_name
print " return client_socket; " >> cc_file_name
print "}" >> cc_file_name
gen_service_cc(serv_data,s,f,0)
print "" >> cc_file_name
print "void "s"__PT::clean_up(){" >> cc_file_name
print " if(port_mode==1){" >> cc_file_name
print " client_transport->close();" >> cc_file_name
print " delete client_handler;" >> cc_file_name
print " client_protocol.reset();" >> cc_file_name
print " client_transport.reset();" >> cc_file_name
print " client_socket.reset();" >> cc_file_name
print " port_mode=0;" >> cc_file_name
print " } else if(port_mode ==2) {" >> cc_file_name
print " server_handler->stop();" >> cc_file_name
print " void *a;" >> cc_file_name
print " pthread_join(server_thread,&a);" >> cc_file_name
print " delete server_handler;" >> cc_file_name
print " server_protocolFactory.reset();" >> cc_file_name
print " server_transportFactory.reset();" >> cc_file_name
print " server_Transport.reset();" >> cc_file_name
print " server_processor.reset();" >> cc_file_name
print " service_handler.reset();" >> cc_file_name
print " Handler_Remove_Fd_Read(server_socket);" >> cc_file_name
print " close(server_socket);" >> cc_file_name
print " server_socket=-1;" >> cc_file_name
print " }" >> cc_file_name
print " if(uds_name){" >> cc_file_name
print "#ifndef LINUX" >> cc_file_name
print " unlink(uds_name);" >> cc_file_name
print "#endif" >> cc_file_name
print " Free(uds_name);" >> cc_file_name
print " uds_name=NULL;" >> cc_file_name
print " }" >> cc_file_name
print " port_mode=0;" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print ""double_und(s)"__PT::"double_und(s)"__PT(const char *par_port_name)" >> cc_file_name
print " : "double_und(s)"__PT_BASE(par_port_name)" >> cc_file_name
print "{" >> cc_file_name
print " server_socket=-1;" >> cc_file_name
print " port_mode=0;" >> cc_file_name
print " client_handler=NULL;" >> cc_file_name
print " uds_name=NULL;" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print ""double_und(s)"__PT::~"double_und(s)"__PT()" >> cc_file_name
print "{" >> cc_file_name
print " clean_up(); " >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::set_parameter(const char * /*parameter_name*/," >> cc_file_name
print " const char * /*parameter_value*/)" >> cc_file_name
print "{" >> cc_file_name
print "" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::Handle_Fd_Event_Error(int /*fd*/)" >> cc_file_name
print "{" >> cc_file_name
print "" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::Handle_Fd_Event_Writable(int /*fd*/)" >> cc_file_name
print "{" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::Handle_Fd_Event_Readable(int fd)" >> cc_file_name
print "{" >> cc_file_name
print "" >> cc_file_name
print " if(fd==server_socket){" >> cc_file_name
print " struct sockaddr_un client_addr;" >> cc_file_name
print " memset(&client_addr, 0, sizeof(struct sockaddr_un));" >> cc_file_name
print " socklen_t client_addr_len;" >> cc_file_name
print " int new_socket=accept(fd,(struct sockaddr *) &client_addr,&client_addr_len);" >> cc_file_name
print " Handler_Add_Fd_Read(new_socket);" >> cc_file_name
print " clients.insert(new_socket);" >> cc_file_name
print " " >> cc_file_name
print " } else {" >> cc_file_name
print " void *read_data;" >> cc_file_name
print " int read_len=read(fd,&read_data,sizeof(read_data));" >> cc_file_name
print "" >> cc_file_name
print " if(read_len>0){" >> cc_file_name
print " int func_num=((struct internal_comm_struct*)read_data)->code;" >> cc_file_name
print " client_data.insert(std::pair<int,void*>(fd,read_data));" >> cc_file_name
print " INTEGER addr=fd;" >> cc_file_name
print " void **_push_data=((struct internal_comm_struct*)read_data)->data;" >> cc_file_name
print " switch(func_num){" >> cc_file_name
gen_service_event_call_cc(serv_data,s,f,0)
print " default:" >> cc_file_name
print " break;" >> cc_file_name
print " }" >> cc_file_name
print " return;" >> cc_file_name
print " } else {" >> cc_file_name
print " Handler_Remove_Fd_Read(fd);" >> cc_file_name
print " clients.erase(fd);" >> cc_file_name
print " close(fd);" >> cc_file_name
print " }" >> cc_file_name
print " }" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::user_map(const char * /*system_port*/)" >> cc_file_name
print "{" >> cc_file_name
print "" >> cc_file_name
print "}" >> cc_file_name
print "void "double_und(s)"__PT::user_unmap(const char * /*system_port*/)" >> cc_file_name
print "{" >> cc_file_name
print " clean_up(); " >> cc_file_name
print "}" >> cc_file_name
print "void "double_und(s)"__PT::user_start()" >> cc_file_name
print "{" >> cc_file_name
print "}" >> cc_file_name
print "void "double_und(s)"__PT::user_stop()" >> cc_file_name
print "{" >> cc_file_name
print "}" >> cc_file_name
print "static void *server_runner_main( void * ptr){" >> cc_file_name
print " (("double_und(s)"__PT*)ptr)->server_handler->serve();" >> cc_file_name
print " return NULL;" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
print "void "double_und(s)"__PT::outgoing_call(const Thrift__Common::Thrift__control_call& call_par," >> cc_file_name
print " const INTEGER * /*destination_address*/)" >> cc_file_name
print "{" >> cc_file_name
print " Thrift__Common::Thrift__control_reply reply;" >> cc_file_name
print " if(port_mode && call_par.operation()!=Thrift__Common::Thrift__port__operation::OP__CLOSE){" >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CTRL__RES__ERR;" >> cc_file_name
print " reply.return_value().result__desc()().error__code()=1;" >> cc_file_name
print " reply.return_value().result__desc()().error__text()=\"The port is aleady connected\";" >> cc_file_name
print " incoming_reply(reply,NULL);" >> cc_file_name
print " return;" >> cc_file_name
print " }" >> cc_file_name
print " switch(call_par.operation()){" >> cc_file_name
print " case Thrift__Common::Thrift__port__operation::OP__CLOSE:" >> cc_file_name
print " clean_up(); " >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CRTL__RES__OK;" >> cc_file_name
print " reply.return_value().result__desc()=OMIT_VALUE;" >> cc_file_name
print " break;" >> cc_file_name
print " case Thrift__Common::Thrift__port__operation::OP__OPEN:" >> cc_file_name
print " if(call_par.port__mode() == Thrift__Common::Thrift__port__mode::MODE__CLIENT){" >> cc_file_name
print " if(call_par.conn__data().transport()().get_selection()==Thrift__Common::Thrift__transport__data::ALT_socket){" >> cc_file_name
print " client_socket.reset(new ::apache::thrift::transport::TSocket(" >> cc_file_name
print " call_par.conn__data().transport()().socket().host__name().ispresent()?(const char*)call_par.conn__data().transport()().socket().host__name()():\"localhost\"," >> cc_file_name
print " (int)call_par.conn__data().transport()().socket().port__num()" >> cc_file_name
print " ));" >> cc_file_name
print " client_transport.reset(new ::apache::thrift::transport::TBufferedTransport(client_socket)) ;" >> cc_file_name
print " } else if(call_par.conn__data().transport()().get_selection()==Thrift__Common::Thrift__transport__data::ALT_framed){" >> cc_file_name
print " client_socket.reset(new ::apache::thrift::transport::TSocket(" >> cc_file_name
print " call_par.conn__data().transport()().framed().host__name().ispresent()?(const char*)call_par.conn__data().transport()().framed().host__name()():\"localhost\"," >> cc_file_name
print " (int)call_par.conn__data().transport()().framed().port__num()" >> cc_file_name
print " ));" >> cc_file_name
print " client_transport.reset(new ::apache::thrift::transport::TFramedTransport(client_socket)) ;" >> cc_file_name
print " }" >> cc_file_name
print " if(call_par.conn__data().protocol()().get_selection()==Thrift__Common::Thrift__protocol__data::ALT_binary){" >> cc_file_name
print " client_protocol.reset(new ::apache::thrift::protocol::TBinaryProtocol(client_transport));" >> cc_file_name
print " }" >> cc_file_name
print " client_handler=new "cc_namespace s"Client(client_protocol);" >> cc_file_name
print " " >> cc_file_name
print " try{" >> cc_file_name
print " client_transport->open();" >> cc_file_name
print " } catch (...) {" >> cc_file_name
print " delete client_handler;" >> cc_file_name
print " client_protocol.reset();" >> cc_file_name
print " client_transport.reset();" >> cc_file_name
print " client_socket.reset();" >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CTRL__RES__ERR;" >> cc_file_name
print " reply.return_value().result__desc()().error__code()=1;" >> cc_file_name
print " reply.return_value().result__desc()().error__text()=\"There is an error reported by the Thrift\";" >> cc_file_name
print " incoming_reply(reply,NULL);" >> cc_file_name
print " return;" >> cc_file_name
print " }" >> cc_file_name
print " " >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CRTL__RES__OK;" >> cc_file_name
print " reply.return_value().result__desc()=OMIT_VALUE;" >> cc_file_name
print " port_mode=1;" >> cc_file_name
print " } else {" >> cc_file_name
print " if(!uds_name){" >> cc_file_name
print "#ifdef LINUX" >> cc_file_name
print " uds_name=mprintf(\"#thriftPTXXXXXX\");" >> cc_file_name
print "#else" >> cc_file_name
print " uds_name=mprintf(\"/tmp/thriftPTXXXXXX\");" >> cc_file_name
print "#endif" >> cc_file_name
print " mktemp(uds_name);" >> cc_file_name
print " }" >> cc_file_name
print " struct sockaddr_un serv_addr;" >> cc_file_name
print "" >> cc_file_name
print " memset(&serv_addr, 0, sizeof(struct sockaddr_un));" >> cc_file_name
print " serv_addr.sun_family = AF_UNIX;" >> cc_file_name
print " strcpy(serv_addr.sun_path, uds_name);" >> cc_file_name
print " int len=strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);" >> cc_file_name
print "#ifdef LINUX" >> cc_file_name
print " serv_addr.sun_path[0]='\\0';" >> cc_file_name
print "#else" >> cc_file_name
print " unlink(uds_name);" >> cc_file_name
print "#endif" >> cc_file_name
print " server_socket = socket(PF_UNIX, SOCK_STREAM, 0);" >> cc_file_name
print " if(bind(server_socket, (struct sockaddr *)&serv_addr, len) == -1){" >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CTRL__RES__ERR;" >> cc_file_name
print " reply.return_value().result__desc()().error__code()=errno;" >> cc_file_name
print " reply.return_value().result__desc()().error__text()=strerror(errno);" >> cc_file_name
print " incoming_reply(reply,NULL);" >> cc_file_name
print " close(server_socket);" >> cc_file_name
print " server_socket=-1;" >> cc_file_name
print " Free(uds_name);" >> cc_file_name
print " uds_name=NULL;" >> cc_file_name
print " return;" >> cc_file_name
print " }" >> cc_file_name
print " if(listen(server_socket, 10) == -1){" >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CTRL__RES__ERR;" >> cc_file_name
print " reply.return_value().result__desc()().error__code()=errno;" >> cc_file_name
print " reply.return_value().result__desc()().error__text()=strerror(errno);" >> cc_file_name
print " incoming_reply(reply,NULL);" >> cc_file_name
print " close(server_socket);" >> cc_file_name
print " server_socket=-1;" >> cc_file_name
print " Free(uds_name);" >> cc_file_name
print " uds_name=NULL;" >> cc_file_name
print " return;" >> cc_file_name
print " }" >> cc_file_name
print " Handler_Add_Fd_Read(server_socket);" >> cc_file_name
print "" >> cc_file_name
print " if(call_par.conn__data().transport()().get_selection()==Thrift__Common::Thrift__transport__data::ALT_socket){" >> cc_file_name
print " server_Transport.reset(new TServerSocket((int)call_par.conn__data().transport()().socket().port__num()));" >> cc_file_name
print " server_transportFactory.reset(new TBufferedTransportFactory());" >> cc_file_name
print " } else if(call_par.conn__data().transport()().get_selection()==Thrift__Common::Thrift__transport__data::ALT_framed){" >> cc_file_name
print " server_Transport.reset(new TServerSocket((int)call_par.conn__data().transport()().framed().port__num()));" >> cc_file_name
print " server_transportFactory.reset(new TFramedTransportFactory());" >> cc_file_name
print " }" >> cc_file_name
print " if(call_par.conn__data().protocol()().get_selection()==Thrift__Common::Thrift__protocol__data::ALT_binary){" >> cc_file_name
print " server_protocolFactory.reset(new TBinaryProtocolFactory());" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " service_handler.reset(new "s"Handler(uds_name));" >> cc_file_name
print " server_processor.reset(new " cc_namespace s"Processor(service_handler));" >> cc_file_name
print " " >> cc_file_name
print " reply.return_value().result__code()=Thrift__Common::Thrift__control__code::CRTL__RES__OK;" >> cc_file_name
print " reply.return_value().result__desc()=OMIT_VALUE;" >> cc_file_name
print " server_handler=new "myserver_name"(server_processor,server_Transport,server_transportFactory,server_protocolFactory);" >> cc_file_name
print "" >> cc_file_name
print " port_mode=2;" >> cc_file_name
print " pthread_create(&server_thread,NULL,server_runner_main,this);" >> cc_file_name
print " }" >> cc_file_name
print "" >> cc_file_name
print " break;" >> cc_file_name
print " default:" >> cc_file_name
print " break;" >> cc_file_name
print " }" >> cc_file_name
print " incoming_reply(reply,NULL);" >> cc_file_name
print "" >> cc_file_name
print "}" >> cc_file_name
print "" >> cc_file_name
gen_service_outgoing_cc(serv_data,s,f,0)
print "} // namespace" >> cc_file_name
}
} ## for(f in files)
}