cdr_encode.erl

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

ERL
1,146
字号
	     Mess, Len);enc_target_address(#giop_env{objkey = ObjKey} = Env, Mess, Len) ->    enc_type(?TARGETADDRESS, Env, #'GIOP_TargetAddress'{label = ?GIOP_KeyAddr, 							value = ObjKey}, 	     Mess, Len).%% FIX ME!! This is temporary, not proper flag handling.enc_response_flags(#giop_env{response_expected = true} = Env, Mess, Len) ->    enc_type('tk_octet', Env, 3, Mess, Len);enc_response_flags(#giop_env{response_expected = false} = Env, Mess, Len) ->    enc_type('tk_octet', Env, 0, Mess, Len).%%-----------------------------------------------------------------%% Func: enc_request_body/5%%-----------------------------------------------------------------enc_request_body(#giop_env{tc = {_, [], _}}, Message, Len) ->    %% This case is used to avoid adding alignment even though no body will be added.    {Message, Len};enc_request_body(#giop_env{version = {1,2}, 			   tc = {_RetType, InParameters, _OutParameters},			   parameters = Parameters} = Env,		 Message, Len) ->    {Message1, Len1} = enc_align(Message, Len, 8),    enc_parameters(Env, InParameters, Parameters, Message1, Len1);enc_request_body(#giop_env{tc = {_RetType, InParameters, _OutParameters},			   parameters = Parameters} = Env,		 Message, Len) ->    enc_parameters(Env, InParameters, Parameters, Message, Len).%%-----------------------------------------------------------------%% Func: validate_request_body/1%%-----------------------------------------------------------------validate_request_body(#giop_env{tc = {_RetType, InParameters, _OutParameters}, 				parameters = Parameters} = Env) ->    enc_parameters(Env, InParameters, Parameters, [], 0).%%-----------------------------------------------------------------%% Func: enc_reply/6%%-----------------------------------------------------------------%% ## NEW IIOP 1.2 ##enc_reply(#giop_env{version = {1,2}} = Env) ->    Flags            = 1, %% LTH Not correct, just placeholder    {Message, Len}   = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),     {Message1, Len1} = enc_reply_status(Env, Message, Len),    {Message2, Len2} = enc_service_context(Env, Message1, Len1),    {Message3, Len3} = enc_reply_body(Env, Message2, Len2),    enc_giop_message_header(Env, 'reply', Flags, Len3 - ?GIOP_HEADER_SIZE,			    lists:reverse(Message3));enc_reply(Env) ->    Flags            = 1, %% LTH Not correct, just placeholder    {Message, Len}   = enc_service_context(Env, [], ?GIOP_HEADER_SIZE),    {Message1, Len1} = enc_request_id(Env, Message, Len),     {Message2, Len2} = enc_reply_status(Env, Message1, Len1),    {Message3, Len3} = enc_reply_body(Env, Message2, Len2),    enc_giop_message_header(Env, 'reply', Flags, Len3 - ?GIOP_HEADER_SIZE,			    lists:reverse(Message3)).%% ## NEW IIOP 1.2 ##enc_reply_split(#giop_env{version = {1,2}} = Env) ->    Flags            = 1, %% LTH Not correct, just placeholder    {Message, Len0}   = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),     {Message1, Len1} = enc_reply_status(Env, Message, Len0),    {Message2, Len2} = enc_service_context(Env, Message1, Len1),    {Body, Len} = enc_reply_body(Env, [], Len2),    {lists:reverse(Message2), list_to_binary(lists:reverse(Body)),     Len2 - ?GIOP_HEADER_SIZE, Len-Len2, Flags};enc_reply_split(Env) ->    Flags            = 1, %% LTH Not correct, just placeholder    {Message, Len0}   = enc_service_context(Env, [], ?GIOP_HEADER_SIZE),    {Message1, Len1} = enc_request_id(Env, Message, Len0),     {Message2, Len2} = enc_reply_status(Env, Message1, Len1),    {Body, Len} = enc_reply_body(Env, [], Len2),    {lists:reverse(Message2), list_to_binary(lists:reverse(Body)),      Len2 - ?GIOP_HEADER_SIZE, Len-Len2, Flags}.enc_reply_status(Env, Mess, Len) ->    L = enc_giop_reply_status_type(Env#giop_env.reply_status),    enc_type('tk_ulong', Env, L, Mess, Len).%%-----------------------------------------------------------------%% Func: enc_reply_body/6%%-----------------------------------------------------------------enc_reply_body(#giop_env{tc = {'tk_void', _, []}, result = ok, 			 parameters = []}, Message, Len) ->    %% This case is mainly to be able to avoid adding alignment for    %% IIOP-1.2 messages if the body should be empty, i.e., void return value and    %% no out parameters.    {Message, Len};enc_reply_body(#giop_env{version = {1,2}, 			 tc = {RetType, _InParameters, OutParameters},			 parameters = Parameters, result = Result} = Env, 	       Message, Len) ->    {Message1, Len1} = enc_align(Message, Len, 8),    {Message2, Len2}  = enc_type(RetType, Env, Result, Message1, Len1),    enc_parameters(Env, OutParameters, Parameters, Message2, Len2);enc_reply_body(#giop_env{tc = {RetType, _InParameters, OutParameters}, 			 parameters = Parameters, result = Result} = Env,	       Message, Len) ->    {Message1, Len1}  = enc_type(RetType, Env, Result, Message, Len),    enc_parameters(Env, OutParameters, Parameters, Message1, Len1).%%-----------------------------------------------------------------%% Func: validate_reply_body/3%%-----------------------------------------------------------------validate_reply_body(Env, {'EXCEPTION', Exception}) ->    {TypeOfException, ExceptionTypeCode, NewExc} =	orber_exceptions:get_def(Exception),    {'tk_except', TypeOfException, ExceptionTypeCode,      (catch enc_reply_body(Env#giop_env{tc = {ExceptionTypeCode, [], []}, 					result = NewExc, parameters = []}, [], 0))};validate_reply_body(#giop_env{tc = {_RetType, _InParameters, []}} = Env, Reply) ->    enc_reply_body(Env#giop_env{result = Reply}, [], 0);validate_reply_body(Env, Reply) when tuple(Reply) ->    [Result|Parameters] = tuple_to_list(Reply),    enc_reply_body(Env#giop_env{result = Result, parameters = Parameters}, [], 0);validate_reply_body(Env, Reply) ->    enc_reply_body(Env#giop_env{result = Reply}, [], 0).%%-----------------------------------------------------------------%% Func: enc_cancel_request/2%%-----------------------------------------------------------------enc_cancel_request(Env) ->    Flags = 1, %% LTH Not correct, just placeholder    {Message, Len} = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),    enc_giop_message_header(Env, 'cancel_request', Flags, Len - ?GIOP_HEADER_SIZE,			    lists:reverse(Message)).%%-----------------------------------------------------------------%% Func: enc_locate_request/3%%-----------------------------------------------------------------%% ## NEW IIOP 1.2 ##enc_locate_request(#giop_env{version = {1,2}} = Env) ->    Flags = 1, %% LTH Not correct, just placeholder    {Message, Len}   = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),     {Message1, Len1} = enc_target_address(Env, Message, Len),    enc_giop_message_header(Env, 'locate_request', Flags, Len1-?GIOP_HEADER_SIZE, 			    lists:reverse(Message1));enc_locate_request(Env) ->    Flags = 1, %% LTH Not correct, just placeholder    {Message, Len}   = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),     {Message1, Len1} = enc_object_key(Env, Message, Len),    enc_giop_message_header(Env, 'locate_request', Flags, Len1-?GIOP_HEADER_SIZE, 			    lists:reverse(Message1)).%%-----------------------------------------------------------------%% Func: enc_locate_reply%%-----------------------------------------------------------------%% No forward etc. Just encode the status.enc_locate_reply(#giop_env{tc = undefined} = Env) ->    Flags = 1, %% LTH Not correct, just placeholder    {Message, Len} = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),     {Message1, Len1} = enc_locate_status(Env, Message, Len),    enc_giop_message_header(Env, 'locate_reply', Flags, Len1 - ?GIOP_HEADER_SIZE, 			    lists:reverse(Message1));enc_locate_reply(Env) ->    Flags = 1, %% LTH Not correct, just placeholder    {Message, Len} = enc_request_id(Env, [], ?GIOP_HEADER_SIZE),     {Message1, Len1} = enc_locate_status(Env, Message, Len),    {Message2, Len2} = enc_locate_reply_body(Env, Message1, Len1),    enc_giop_message_header(Env, 'locate_reply', Flags, Len2 - ?GIOP_HEADER_SIZE, 			    lists:reverse(Message2)).enc_locate_reply_body(#giop_env{tc = TC, result = Data} = Env, Message, Len) ->    %% In CORBA-2.3.1 the LocateReply body didn't align the body (8-octet    %% boundry) for IIOP-1.2. This have been changed in later specs.    %% Un-comment the line below when we want to be CORBA-2.4 compliant.    %% But in CORB-2.6 this was changed once again (i.e. no alignment).    %% The best solution is to keep it as is.    enc_type(TC, Env, Data, Message, Len).enc_locate_status(Env, Mess, Len) ->    L = enc_giop_locate_status_type(Env#giop_env.reply_status),    enc_type('tk_ulong', Env, L, Mess, Len).%%-----------------------------------------------------------------%% Func: enc_close_connection/1%%-----------------------------------------------------------------enc_close_connection(Env) ->    Flags = 1, %% LTH Not correct, just placeholder    enc_giop_message_header(Env, 'close_connection', Flags, 0, []).%%-----------------------------------------------------------------%% Func: enc_message_error/1%%-----------------------------------------------------------------enc_message_error(Env) ->    Flags = 1, %% LTH Not correct, just placeholder    enc_giop_message_header(Env, 'message_error', Flags, 0, []).%%-----------------------------------------------------------------%% Func: enc_fragment/1%%-----------------------------------------------------------------enc_fragment(Env) ->    Flags = 1, %% LTH Not correct, just placeholder    enc_giop_message_header(Env, 'fragment', Flags, 0, []).%%-----------------------------------------------------------------%% Func: enc_giop_msg_type%% Args: An integer message type code%% Returns: An atom which is the message type code name%%-----------------------------------------------------------------enc_giop_msg_type('request') ->  %% LTH l鋑ga in version ??    0;enc_giop_msg_type('reply') ->    1;enc_giop_msg_type('cancel_request') ->    2;enc_giop_msg_type('locate_request') ->    3;enc_giop_msg_type('locate_reply') ->    4;enc_giop_msg_type('close_connection') ->    5;enc_giop_msg_type('message_error') ->    6;enc_giop_msg_type('fragment') ->    7.%%-----------------------------------------------------------------%% Func: enc_giop_reply_status_type%% Args: An atom which is the reply status%% Returns: An integer status code%%-----------------------------------------------------------------enc_giop_reply_status_type(?NO_EXCEPTION) ->    0;enc_giop_reply_status_type(?USER_EXCEPTION) ->    1;enc_giop_reply_status_type(?SYSTEM_EXCEPTION) ->    2;enc_giop_reply_status_type('location_forward') ->    3;%% ## NEW IIOP 1.2 ##enc_giop_reply_status_type('location_forward_perm') ->    4;enc_giop_reply_status_type('needs_addressing_mode') ->    5.%%-----------------------------------------------------------------%% Func: enc_giop_locate_status_type%% Args: An integer status code%% Returns: An atom which is the reply status%%-----------------------------------------------------------------enc_giop_locate_status_type('unknown_object') ->    0;enc_giop_locate_status_type('object_here') ->    1;enc_giop_locate_status_type('object_forward') ->    2;%% ## NEW IIOP 1.2 ##enc_giop_locate_status_type('object_forward_perm') ->    3;enc_giop_locate_status_type('loc_system_exception') ->    4;enc_giop_locate_status_type('loc_needs_addressing_mode') ->    5.%%-----------------------------------------------------------------%% Func: enc_type/3%%-----------------------------------------------------------------enc_type(Env, TypeCode, Value) ->    {Bytes, _Len} = enc_type(TypeCode, Env, Value, [], 0),    list_to_binary(lists:reverse(Bytes)).%%-----------------------------------------------------------------%% Func: enc_type/5%%-----------------------------------------------------------------enc_type('tk_null', _Env, null, Bytes, Len) ->    {Bytes, Len}; enc_type('tk_void', _Env, ok, Bytes, Len) ->    {Bytes, Len}; enc_type('tk_short', _Env, Value, Bytes, Len) ->    {Rest, Len1} = enc_align(Bytes, Len, 2),    {cdrlib:enc_short(Value, Rest), Len1 + 2};enc_type('tk_long', _Env, Value, Bytes, Len) ->    {Rest, Len1} = enc_align(Bytes, Len, 4),    {cdrlib:enc_long(Value, Rest ), Len1 + 4};enc_type('tk_longlong', _Env, Value, Bytes, Len) ->    {Rest, Len1} = enc_align(Bytes, Len, 8),    {cdrlib:enc_longlong(Value, Rest ), Len1 + 8};enc_type('tk_ushort', _Env, Value, Bytes, Len) ->    {Rest, Len1} = enc_align(Bytes, Len, 2),    {cdrlib:enc_unsigned_short(Value, Rest), Len1 + 2};enc_type('tk_ulong', _Env, Value, Bytes, Len) ->     {Rest, Len1} = enc_align(Bytes, Len, 4),    {cdrlib:enc_unsigned_long(Value, Rest), Len1 + 4};enc_type('tk_ulonglong', _Env, Value, Bytes, Len) ->     {Rest, Len1} = enc_align(Bytes, Len, 8),

⌨️ 快捷键说明

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