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 + -
显示快捷键?