ic_cserver.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 2,101 行 · 第 1/5 页

ERL
2,101
字号
mk_c_type(_G, _N, {void, _}, _) ->    "void";mk_c_type(_G, _N, {unsigned, U}, _) ->    case U of	{short, _} ->	    "CORBA_unsigned_short";	{long, _} ->	    "CORBA_unsigned_long";	{'long long', _} ->	    "CORBA_unsigned_long_long"    end;mk_c_type(_G, _N, {'long long', _}, _) ->    "CORBA_long_long";mk_c_type(_G, _N, {'any', _}, _) ->  %% Fix for any type    "CORBA_long";mk_c_type(_G, _N, {T, _}, _) ->    "CORBA_" ++ atom_to_list(T).%%------------------------------------------------------------%% Emit encoding statement%%------------------------------------------------------------%% emit_encoding_stmt(G, N, X, Fd, T, LName)%% %%emit_encoding_stmt(G, N, X, Fd, T, LName) when element(1, T) == scoped_id ->    case mk_c_type(G, N, T, evaluate_not) of	"erlang_pid" ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_pid(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    emit_c_enc_rpt(Fd, "    ", "oe_ei_encode_pid", []),	    emit(Fd, "    return oe_error_code;\n  }\n");	"erlang_port" ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_port(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    emit_c_enc_rpt(Fd, "    ", "oe_ei_encode_port", []),	    emit(Fd, "    return oe_error_code;\n  }\n");	"erlang_ref" ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_ref(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    emit_c_enc_rpt(Fd, "    ", "oe_ei_encode_ref", []),	    emit(Fd, "    return oe_error_code;\n  }\n");	"ETERM*" ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_term(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    emit_c_enc_rpt(Fd, "    ", "oe_ei_encode_term", []),	    emit(Fd, "    return oe_error_code;\n  }\n");	{enum, FSN} ->	    emit_encoding_stmt(G, N, X, Fd, FSN, LName);	FSN ->	    emit_encoding_stmt(G, N, X, Fd, FSN, LName)    end;emit_encoding_stmt(G, N, X, Fd, T, LName) when list(T) ->     %% Already a fullscoped name    case get_param_tk(LName, X) of	error ->	    emit(Fd, "  if ((oe_error_code = ~s~s(oe_env, ~s)) < 0) {\n", 		 [ic_util:mk_oe_name(G, "encode_"), T, LName]);	ParamTK ->	    case ic_cbe:is_variable_size(ParamTK) of		true ->		    emit(Fd, "  if ((oe_error_code = ~s~s(oe_env, ~s)) < 0)"			 " {\n", 			 [ic_util:mk_oe_name(G, "encode_"), T, LName]), 		    emit(Fd, "    CORBA_exc_set(oe_env, "			 "CORBA_SYSTEM_EXCEPTION, "			 "BAD_PARAM, \"Bad operation parameter on encode\");"			 "\n"), 		    ?emit_c_enc_rpt(Fd, "    ", "", []),		    emit(Fd, "    return oe_error_code;\n  }\n\n");		false ->		    if atom(ParamTK) ->			    case ParamTK of				tk_ushort -> 				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_ulong(oe_env, "					 "(unsigned long) ~s)) < 0) {\n", 					 [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "ushort", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_ulong -> 				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_ulong(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "ulong", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_ulonglong -> 				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_ulonglong(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "ulonglong", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_short ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_long(oe_env, "					 "(long) ~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "short", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_long ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_long(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "long", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_longlong ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_longlong(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "longlong", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_float ->				    emit(Fd, "    if ((oe_error_code = "					 "oe_ei_encode_double(oe_env, "					 "(double) ~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "float", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_double ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_double(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "double", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_boolean ->				    emit(Fd, "  switch(~s) {\n", [LName]), 				    emit(Fd, "    case 0 :\n"), 				    emit(Fd, "      if ((oe_error_code = "					 "oe_ei_encode_atom(oe_env, "					 "\"false\")) < 0) {\n"), 				    emit(Fd, "        CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "boolean", []),				    emit(Fd, "        return "					 "oe_error_code;\n      }\n"), 				    emit(Fd, "      break;\n"), 				    emit(Fd, "    case 1 :\n"), 				    emit(Fd, "      if ((oe_error_code = "					 "oe_ei_encode_atom(oe_env, "					 "\"true\")) < 0) {\n"), 				    emit(Fd, "        CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "boolean", []),				    emit(Fd, "        return "					 "oe_error_code;\n      }\n"), 				    emit(Fd, "      break;\n"), 				    emit(Fd, "    default :\n"), 				    emit(Fd, "      CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "boolean", []),				    emit(Fd, "      return -1;\n"), 				    emit(Fd, "  }\n\n");				tk_char ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_char(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "char", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_wchar ->  %% WCHAR				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_wchar(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "wchar", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_octet ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_char(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "octet", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				tk_any ->				    emit(Fd, "  if ((oe_error_code = "					 "oe_ei_encode_long(oe_env, "					 "~s)) < 0) {\n", [LName]), 				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "any", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n");				_ ->				    emit(Fd, "    CORBA_exc_set(oe_env, "					 "CORBA_SYSTEM_EXCEPTION, "					 "BAD_PARAM, \"Bad operation "					 "parameter on encode\");\n"), 				    ?emit_c_enc_rpt(Fd, "    ", "tk_unknown", []),				    emit(Fd, "    return "					 "oe_error_code;\n  }\n\n"), 				    ok			    end;		       true ->			    case element(1, ParamTK) of				tk_enum ->				    emit(Fd, "  if ((oe_error_code = "					 "~s~s(oe_env, ~s)) < 0) {\n", 					 [ic_util:mk_oe_name(G, "encode_"), 					  T, LName]),				    ?emit_c_enc_rpt(Fd, "    ", "enum", []);				tk_array ->				    emit(Fd, "  if ((oe_error_code = "					 "~s~s(oe_env, ~s)) < 0) {\n", 					 [ic_util:mk_oe_name(G, "encode_"), 					  T, LName]),				    ?emit_c_enc_rpt(Fd, "    ", "array", []);				_ ->				    emit(Fd, "  if ((oe_error_code = "					 "~s~s(oe_env, &~s)) < 0) {\n", 					 [ic_util:mk_oe_name(G, "encode_"), 					  T, LName]),				    ?emit_c_enc_rpt(Fd, "    ", "", [])			    end, 			    emit(Fd, "    CORBA_exc_set(oe_env, "				 "CORBA_SYSTEM_EXCEPTION, "				 "BAD_PARAM, \"Bad operation "				 "parameter on encode\");\n"), 			    emit(Fd, "    return oe_error_code;\n  }\n\n")		    end	    end    end;emit_encoding_stmt(G, N, _X, Fd, T, LName)  when record(T, string) ->    emit(Fd, "  if ((oe_error_code = "	 "oe_ei_encode_string(oe_env, (const char*) ~s)) < 0) {\n", 	 [LName]),     emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "	 "BAD_PARAM, \"Cannot encode string\");\n"),     ?emit_c_enc_rpt(Fd, "    ", "string", []),    emit(Fd, "    return oe_error_code;\n  }\n\n");emit_encoding_stmt(G, N, _X, Fd, T, LName) when record(T, wstring) ->    emit(Fd, "  if ((oe_error_code = "	 "oe_ei_encode_wstring(oe_env, ~s)) < 0) {\n", 	 [LName]),     ?emit_c_enc_rpt(Fd, "    ", "wstring", []),    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "	 "BAD_PARAM, \"Cannot encode string\");\n"),     emit(Fd, "    return oe_error_code;\n  }\n\n");emit_encoding_stmt(G, N, _X, Fd, T, LName) ->    case T of	{unsigned, {short, _}} -> 	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_ulong(oe_env, (unsigned long) ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "ushort", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{unsigned, {long, _}} -> 	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_ulong(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "ulong", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{unsigned, {'long long', _}} -> 	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_ulonglong(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "ulonglong", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{short, _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_long(oe_env, (long) ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "short", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{long, _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_long(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "long", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{'long long', _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_longlong(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "longlong", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{float, _} ->	    emit(Fd, "    if ((oe_error_code = "		 "oe_ei_encode_double(oe_env, (double) ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "float", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{double, _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_double(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "double", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{boolean, _} ->	    emit(Fd, "  switch(~s) {\n", [LName]), 	    emit(Fd, "    case 0 :\n"), 	    emit(Fd, "      if ((oe_error_code = "		 "oe_ei_encode_atom(oe_env, \"false\")) < 0) {\n"), 	    ?emit_c_enc_rpt(Fd, "    ", "boolean", []),	    emit(Fd, "        CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "        return oe_error_code;\n      }\n"), 	    emit(Fd, "      break;\n"), 	    emit(Fd, "    case 1 :\n"), 	    emit(Fd, "      if ((oe_error_code = "		 "oe_ei_encode_atom(oe_env, \"true\")) < 0) {\n"), 	    ?emit_c_enc_rpt(Fd, "    ", "boolean", []),	    emit(Fd, "        CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "        return oe_error_code;\n      }\n"), 	    emit(Fd, "      break;\n"), 	    emit(Fd, "    default :\n"), 	    ?emit_c_enc_rpt(Fd, "    ", "boolean", []),	    emit(Fd, "      CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "      return -1;\n"), 	    emit(Fd, "  }\n\n");	{char, _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_char(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "char", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{wchar, _} ->  %% WCHAR	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_wchar(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "wchar", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{octet, _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_char(oe_env, ~s)) < 0) {\n", 		 [LName]), 	    ?emit_c_enc_rpt(Fd, "    ", "octet", []),	    emit(Fd, "    CORBA_exc_set(oe_env, CORBA_SYSTEM_EXCEPTION, "		 "BAD_PARAM, \"Bad operation parameter on encode\");\n"), 	    emit(Fd, "    return oe_error_code;\n  }\n\n");	{void, _} ->	    emit(Fd, "  if ((oe_error_code = "		 "oe_ei_encode_atom(oe_env, \"void\")) < 0) {\n"), 	    ?emit_c_enc_rpt(Fd, "    ", "

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?