cdr_encode.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 1,146 行 · 第 1/4 页
ERL
1,146 行
enc_exception_1(_Env, [], [], Bytes, Len) -> {Bytes, Len};enc_exception_1(Env, [Arg |Args], [{_ElemName, ElemType} |ElementList], Bytes, Len) -> {Bytes1, Len1} = enc_type(ElemType, Env, Arg, Bytes, Len), enc_exception_1(Env, Args, ElementList, Bytes1, Len1). %%-----------------------------------------------------------------%% Func: enc_type_code/3%%-----------------------------------------------------------------enc_type_code('tk_null', Env, Message, Len) -> enc_type('tk_ulong', Env, 0, Message, Len);enc_type_code('tk_void', Env, Message, Len) -> enc_type('tk_ulong', Env, 1, Message, Len);enc_type_code('tk_short', Env, Message, Len) -> enc_type('tk_ulong', Env, 2, Message, Len);enc_type_code('tk_long', Env, Message, Len) -> enc_type('tk_ulong', Env, 3, Message, Len);enc_type_code('tk_longlong', Env, Message, Len) -> enc_type('tk_ulong', Env, 23, Message, Len);enc_type_code('tk_longdouble', Env, Message, Len) -> enc_type('tk_ulong', Env, 25, Message, Len);enc_type_code('tk_ushort', Env, Message, Len) -> enc_type('tk_ulong', Env, 4, Message, Len);enc_type_code('tk_ulong', Env, Message, Len) -> enc_type('tk_ulong', Env, 5, Message, Len);enc_type_code('tk_ulonglong', Env, Message, Len) -> enc_type('tk_ulong', Env, 24, Message, Len);enc_type_code('tk_float', Env, Message, Len) -> enc_type('tk_ulong', Env, 6, Message, Len);enc_type_code('tk_double', Env, Message, Len) -> enc_type('tk_ulong', Env, 7, Message, Len);enc_type_code('tk_boolean', Env, Message, Len) -> enc_type('tk_ulong', Env, 8, Message, Len);enc_type_code('tk_char', Env, Message, Len) -> enc_type('tk_ulong', Env, 9, Message, Len);enc_type_code('tk_wchar', Env, Message, Len) -> enc_type('tk_ulong', Env, 26, Message, Len);enc_type_code('tk_octet', Env, Message, Len) -> enc_type('tk_ulong', Env, 10, Message, Len);enc_type_code('tk_any', Env, Message, Len) -> enc_type('tk_ulong', Env, 11, Message, Len);enc_type_code('tk_TypeCode', Env, Message, Len) -> enc_type('tk_ulong', Env, 12, Message, Len);enc_type_code('tk_Principal', Env, Message, Len) -> enc_type('tk_ulong', Env, 13, Message, Len);enc_type_code({'tk_objref', RepId, Name}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 14, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}]}, Env, {"", RepId, Name}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_struct', RepId, SimpleName, ElementList}, Env, Message, Len) -> %% Using SimpleName should be enough (and we avoid some overhead). %% Name = ifrid_to_name(RepId), {Message1, Len1} = enc_type('tk_ulong', Env, 15, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"element list", {'tk_sequence', {'tk_struct', "","", [{"member name", {'tk_string', 0}}, {"member type", 'tk_TypeCode'}]}, 0}}]}, Env, {"", RepId, SimpleName, lists:map(fun({N,T}) -> {"",N,T} end, ElementList)}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_union', RepId, Name, DiscrTC, Default, ElementList}, Env, Message, Len) -> NewElementList = case check_enum(DiscrTC) of true -> lists:map(fun({L,N,T}) -> {"",list_to_atom(L),N,T} end, ElementList); false -> lists:map(fun({L,N,T}) -> {"",L,N,T} end, ElementList) end, {Message1, Len1} = enc_type('tk_ulong', Env, 16, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"discriminant type", 'tk_TypeCode'}, {"default used", 'tk_long'}, {"element list", {'tk_sequence', {'tk_struct', "","", [{"label value", DiscrTC}, {"member name", {'tk_string', 0}}, {"member type", 'tk_TypeCode'}]}, 0}}]}, Env, {"", RepId, Name, DiscrTC, Default, NewElementList}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_enum', RepId, Name, ElementList}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 17, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"element list", {'tk_sequence', {'tk_string', 0}, 0}}]}, Env, {"", RepId, Name, ElementList}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_string', MaxLength}, Env, Message, Len) -> enc_type({'tk_struct', "", "", [{"TCKind", 'tk_ulong'}, {"max length", 'tk_ulong'}]}, Env, {"", 18, MaxLength}, Message, Len);enc_type_code({'tk_wstring', MaxLength}, Env, Message, Len) -> enc_type({'tk_struct', "", "", [{"TCKind", 'tk_ulong'}, {"max length", 'tk_ulong'}]}, Env, {"", 27, MaxLength}, Message, Len);enc_type_code({'tk_sequence', ElemTC, MaxLength}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 19, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"element type", 'tk_TypeCode'}, {"max length", 'tk_ulong'}]}, Env, {"", ElemTC, MaxLength}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_array', ElemTC, Length}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 20, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"element type", 'tk_TypeCode'}, {"length", 'tk_ulong'}]}, Env, {"", ElemTC, Length}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_alias', RepId, Name, TC}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 21, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"TypeCode", 'tk_TypeCode'}]}, Env, {"", RepId, Name, TC}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_except', RepId, Name, ElementList}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 22, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"element list", {'tk_sequence', {'tk_struct', "", "", [{"member name", {'tk_string', 0}}, {"member type", 'tk_TypeCode'}]}, 0}}]}, Env, {"", RepId, Name, lists:map(fun({N,T}) -> {"",N,T} end, ElementList)}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_fixed', Digits, Scale}, Env, Message, Len) -> enc_type({'tk_struct', "", "", [{"TCKind", 'tk_ulong'}, {"digits", 'tk_ushort'}, {"scale", 'tk_short'}]}, Env, {"", 28, Digits, Scale}, Message, Len);enc_type_code({'tk_value', RepId, Name, ValueModifier, TC, ElementList}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 29, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"ValueModifier", 'tk_short'}, {"TypeCode", 'tk_TypeCode'}, {"element list", {'tk_sequence', {'tk_struct', "","", [{"member name", {'tk_string', 0}}, {"member type", 'tk_TypeCode'}, {"Visibility", 'tk_short'}]}, 0}}]}, Env, {"", RepId, Name, ValueModifier, TC, lists:map(fun({N,T,V}) -> {"",N,T,V} end, ElementList)}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_value_box', RepId, Name, TC}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 30, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}, {"TypeCode", 'tk_TypeCode'}]}, Env, {"", RepId, Name, TC}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_native', RepId, Name}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 31, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"repository ID", {'tk_string', 0}}, {"name", {'tk_string', 0}}]}, Env, {"", RepId, Name}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_abstract_interface', RepId, Name}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 32, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"RepositoryId", {'tk_string', 0}}, {"name", {'tk_string', 0}}]}, Env, {"", RepId, Name}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'tk_local_interface', RepId, Name}, Env, Message, Len) -> {Message1, Len1} = enc_type('tk_ulong', Env, 33, Message, Len), {Message2, _} = enc_byte_order(Env, []), {ComplexParams, Len2} = enc_type({'tk_struct', "", "", [{"RepositoryId", {'tk_string', 0}}, {"name", {'tk_string', 0}}]}, Env, {"", RepId, Name}, Message2, 1), encode_complex_tc_paramters(lists:reverse(ComplexParams), Len2, Message1, Len1);enc_type_code({'none', Indirection}, Env, Message, Len) -> %% placeholder enc_type({'tk_struct', "", "", [{"TCKind", 'tk_ulong'}, {"indirection", 'tk_long'}]}, Env, {"", 16#ffffffff, Indirection}, Message, Len);enc_type_code(Type, _, _, _) -> orber:dbg("[~p] cdr_encode:enc_type_code(~p); No match.", [?LINE, Type], ?DEBUG_LEVEL), corba:raise(#'MARSHAL'{minor=(?ORBER_VMCID bor 7), completion_status=?COMPLETED_MAYBE}).check_enum({'tk_enum', _, _, _}) -> true;check_enum(_) -> false.encode_complex_tc_paramters(Value, ValueLength, Message, Len) -> {Message1, _Len1} = enc_align(Message, Len, 4), Message2 = cdrlib:enc_unsigned_long(ValueLength, Message1), {[Value |Message2], Len+ValueLength+4}.%%-----------------------------------------------------------------%% Func: enc_align/1%%-----------------------------------------------------------------enc_align(R, Len, Alignment) -> Rem = Len rem Alignment, if Rem == 0 -> {R, Len}; true -> Diff = Alignment - Rem, {add_bytes(R, Diff), Len + Diff} end.add_bytes(R, 0) -> R;add_bytes(R, 1) -> [<<16#01:8>> | R];add_bytes(R, 2) -> [<<16#02:8, 16#02:8>> | R];add_bytes(R, 3) -> [<<16#03:8, 16#03:8, 16#03:8>> | R];add_bytes(R, 4) -> [<<16#04:8, 16#04:8, 16#04:8, 16#04:8>> | R];add_bytes(R, 5) -> [<<16#05:8, 16#05:8, 16#05:8, 16#05:8, 16#05:8>> | R];add_bytes(R, 6) -> [<<16#06:8, 16#06:8, 16#06:8, 16#06:8, 16#06:8, 16#06:8>> | R];add_bytes(R, 7) -> [<<16#07:8, 16#07:8, 16#07:8, 16#07:8, 16#07:8, 16#07:8, 16#07:8>> | R];add_bytes(R,N) -> add_bytes([<<16#08:8>> | R], N - 1).
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?