⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 orber_pi.erl

📁 OTP是开放电信平台的简称
💻 ERL
📖 第 1 页 / 共 3 页
字号:
    end.out_reply_enc([], _, _, Msg, _, _) ->    Msg;out_reply_enc([Mod|T], ReqHdr, Ref, Msg, Args, Ctx) ->    {NewMsg, NewArgs} = Mod:out_reply_encoded(Ref, ReqHdr#request_header.object_key,					      Ctx, %% Out Context.					      ReqHdr#request_header.operation,					      Msg, Args),    out_reply_enc(T, ReqHdr, Ref, NewMsg, NewArgs, Ctx).%%------------------------------------------------------------%% function : out_reply%% Arguments: %% Returns  : %% Exception: %% Effect   : Intercept an outgoing reply (server-side).%%------------------------------------------------------------out_reply(PIs, ReqHdr, Ref, Msg, Ctx) ->    case catch out_reply(PIs, ReqHdr, Ref, Msg, undefined, Ctx) of	{'EXIT', R} ->	    orber:dbg("[~p] orber_pi:out_reply(~p, ~p, ~p); exit(~p)", 		      [?LINE, PIs, Ref, Msg, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});	NewMsg ->	    NewMsg    end.out_reply([], _, _, Msg, _, _) ->    Msg;out_reply([Mod|T], ReqHdr, Ref, Msg, Args, Ctx) ->    {NewMsg, NewArgs} = Mod:out_reply(Ref, ReqHdr#request_header.object_key,				      Ctx, %% Out Context.				      ReqHdr#request_header.operation,				      Msg, Args),    out_reply(T, ReqHdr, Ref, NewMsg, NewArgs, Ctx).%%------------------------------------------------------------%% function : out_request_enc%% Arguments: %% Returns  : %% Exception: %% Effect   : Intercept an outgoing request (client-side).%%------------------------------------------------------------out_request_enc(PIs, ObjKey, Ctx, Op, Ref, Msg) ->    case catch out_request_enc(PIs, ObjKey, Ctx, Op, Ref, Msg, undefined) of	{'EXIT', R} ->	    orber:dbg("[~p] orber_pi:out_request_enc(~p, ~p, ~p); exit(~p)", 		      [?LINE, PIs, Ref, Msg, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});	{'EXCEPTION', E} ->	    orber:dbg("[~p] orber_pi:out_request_enc(~p, ~p, ~p); exception(~p)", 		      [?LINE, PIs, Ref, Msg, E], ?DEBUG_LEVEL),	    corba:raise(E);	NewMsg ->	    NewMsg    end.out_request_enc([], _, _, _, _, Msg, _) ->    Msg;out_request_enc([Mod|T], ObjKey, Ctx, Op, Ref, Msg, Args) ->    {NewMsg, NewArgs} = Mod:out_request_encoded(Ref, ObjKey, Ctx, Op, Msg, Args),    out_request_enc(T, ObjKey, Ctx, Op, Ref, NewMsg, NewArgs).%%------------------------------------------------------------%% function : out_request%% Arguments: %% Returns  : %% Exception: %% Effect   : Intercept an outgoing request (client-side).%%------------------------------------------------------------out_request(PIs, ObjKey, Ctx, Op, Ref, Msg) ->    case catch out_request(PIs, ObjKey, Ctx, Op, Ref, Msg, undefined) of	{'EXIT', R} ->	    orber:dbg("[~p] orber_pi:out_request(~p, ~p, ~p); exit(~p)", 		      [?LINE, PIs, Ref, Msg, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});	{'EXCEPTION', E} ->	    orber:dbg("[~p] orber_pi:out_request(~p, ~p, ~p); exception(~p)", 		      [?LINE, PIs, Ref, Msg, E], ?DEBUG_LEVEL),	    corba:raise(E);	NewMsg ->	    NewMsg    end.out_request([], _, _, _, _, Msg, _) ->    Msg;out_request([Mod|T], ObjKey, Ctx, Op, Ref, Msg, Args) ->    {NewMsg, NewArgs} = Mod:out_request(Ref, ObjKey, Ctx, Op, Msg, Args),    out_request(T, ObjKey, Ctx, Op, Ref, NewMsg, NewArgs).%%------------------------------------------------------------%% function :in_reply_enc%% Arguments: %% Returns  : %% Exception: %% Effect   : Intercept an incoming reply (client-side)%%------------------------------------------------------------in_reply_enc(PIs, ObjKey, Ctx, Op, Ref, Msg) ->    case catch in_reply_enc(PIs, ObjKey, Ctx, Op, Ref, Msg, undefined) of	{'EXIT', R} ->	    orber:dbg("[~p] orber_pi:in_reply_enc(~p, ~p, ~p); exit(~p)", 		      [?LINE, PIs, Ref, Msg, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});	{'EXCEPTION', E} ->	    orber:dbg("[~p] orber_pi:in_reply_enc(~p, ~p, ~p); exception(~p)", 		      [?LINE, PIs, Ref, Msg, E], ?DEBUG_LEVEL),	    corba:raise(E);	NewMsg ->	    NewMsg    end.in_reply_enc([], _, _, _, _, Msg, _) ->    Msg;in_reply_enc([Mod|T], ObjKey, Ctx, Op, Ref, Msg, Args) ->    {NewMsg, NewArgs} = Mod:in_reply_encoded(Ref, ObjKey, Ctx, Op, Msg, Args),    in_reply_enc(T, ObjKey, Ctx, Op, Ref, NewMsg, NewArgs).%%------------------------------------------------------------%% function :in_reply%% Arguments: %% Returns  : %% Exception: %% Effect   : Intercept an incoming reply (client-side)%%------------------------------------------------------------in_reply(PIs, ObjKey, Ctx, Op, Ref, Msg) ->    case catch in_reply(PIs, ObjKey, Ctx, Op, Ref, Msg, undefined) of	{'EXIT', R} ->	    orber:dbg("[~p] orber_pi:in_reply(~p, ~p, ~p); exit(~p)", 		      [?LINE, PIs, Ref, Msg, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});	NewMsg ->	    NewMsg    end.in_reply([], _, _, _, _, Msg, _) ->    Msg;in_reply([Mod|T], ObjKey, Ctx, Op, Ref, Msg, Args) ->    {NewMsg, NewArgs} = Mod:in_reply(Ref, ObjKey, Ctx, Op, Msg, Args),    in_reply(T, ObjKey, Ctx, Op, Ref, NewMsg, NewArgs).%%------------------------------------------------------------%%------------- CODEC FUNCTIONS ------------------------------%%------------------------------------------------------------%% function : codefactory_create_codec%% Arguments: #IOP_N_Encoding{}%% Returns  : CodecRef%% Exception: %% Effect   : %%------------------------------------------------------------codefactory_create_codec(#'IOP_N_Encoding'{format = 'IOP_N_ENCODING_CDR_ENCAPS', 					   major_version = Major, 					   minor_version = Minor})   when integer(Major), integer(Minor) ->    {Major, Minor};codefactory_create_codec(_) ->    corba:raise(#'IOP_N_CodecFactory_UnknownEncoding'{}).%%------------------------------------------------------------%% function : codec_encode%% Arguments: Version - GIOP version%%            Any - #any{}%% Returns  : CORBA::OctetSeq%% Exception: %% Effect   : %%------------------------------------------------------------codec_encode(Version, Any) when record(Any, any) ->    %% Encode ByteOrder    {Bytes, Len} = cdr_encode:enc_type('tk_octet', Version, 0, [], 0),    {Bytes2, _Len2} = cdr_encode:enc_type('tk_any', Version, Any, Bytes, Len),    list_to_binary(lists:reverse(Bytes2));codec_encode(_Version, _Any) ->    corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}).%%------------------------------------------------------------%% function : codec_encode_value%% Arguments: Version - GIOP version%%            Any - #any{}%% Returns  : CORBA::OctetSeq%% Exception: %% Effect   : Encode the Any#any.value only.%%------------------------------------------------------------codec_encode_value(Version, #any{typecode = TC, value = Val}) ->    %% Encode ByteOrder    {Bytes, Len} = cdr_encode:enc_type('tk_octet', Version, 0, [], 0),    {Bytes2, _Len2} = cdr_encode:enc_type(TC, Version, Val, Bytes, Len),    list_to_binary(lists:reverse(Bytes2));codec_encode_value(_Version, _NotAnAny) ->    corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}).%%------------------------------------------------------------%% function : codec_decode%% Arguments: Version - GIOP version%%            Bytes - CORBA::OctetSeq%% Returns  : Any - #any{}%% Exception: %% Effect   : %%------------------------------------------------------------codec_decode(Version, Bytes) when binary(Bytes) ->    {ByteOrder, Rest} = cdr_decode:dec_byte_order(Bytes),    case catch cdr_decode:dec_type('tk_any', Version, Rest, 0, ByteOrder) of	{Any, [], _} ->	    Any;	_->	    corba:raise(#'IOP_N_Codec_FormatMismatch'{})    end;codec_decode(_Version, _Any) ->    corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}).%%------------------------------------------------------------%% function : codec_decode_value%% Arguments: Version - GIOP version%%            Bytes - CORBA::OctetSeq%%            TypeCode - CORBA::TypeCode%% Returns  : Any - #any{}%% Exception: %% Effect   : %%------------------------------------------------------------codec_decode_value(Version, Bytes, TypeCode) when binary(Bytes) ->    {ByteOrder, Rest} = cdr_decode:dec_byte_order(Bytes),    case catch cdr_decode:dec_type(TypeCode, Version, Rest, 0, ByteOrder) of	{Val, [], _} ->	    #any{typecode = TypeCode, value = Val};	_->	    corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO})    end;codec_decode_value(_Version, _Bytes, _TypeCode) ->    corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}).%%------------------------------------------------------------%%------------- SERVER SIDE FUNCTIONS ------------------------%%------------------------------------------------------------%% To make a long story short, you find an conceptual description%% of how, and in which order, the different functions is %% supposed to be invoked.%%%%request_from_iiop(Bytes) -> %%    Reply = %%	case receive_service_contexts(ServerRequestInfo) of %%	    SYSTEM EXC -> %%		send_exception(..);%%	    ForwardRequest EXC -> %%		send_other(..);%%	    NoEXC -> %%		case receive_request(..) of%%		    SYSTEM EXC -> %%			send_exception(..);%%		    ForwardRequest EXC -> %%			send_other(..);%%		    No EXC -> %%			InvokeServer%%		end%%	end,%%    case Reply of%%	EXC -> %%	    send_exception(..);%%	No EXC, Normal Reply -> %%	    case send_reply(..) of%%		SYSTEM EXC -> %%		    send_exception(..);%%		ForwardRequest EXC -> %%		    send_other(..);%%		No Exc -> %%		    Done%%	    end;%%	No EXC, LOCATION_FORWARD ->  %%	    send_other(..) %%    end.%% %% %%------------------------------------------------------------%% function : server_start_receive%% Arguments: Msg - #giop_message{}%%            PIs - a list of Interceptors (see 'Comments' in the module header)%% Returns  : %% Exception: %% Effect   : %%------------------------------------------------------------server_start_receive(PIs, Version, ReqHdr, Rest, Len, ByteOrder, Msg) ->    cdr_decode:dec_request_body(Version, ReqHdr, Rest, Len, ByteOrder, Msg),    SRI = ?createInitSRI(ReqHdr#request_header.request_id,			 ReqHdr#request_header.operation,			 ReqHdr#request_header.response_expected),    server_receive(receive_service_contexts, SRI, PIs, [], PIs).server_receive(receive_service_contexts, SRI, [], _Acc, PIs) ->    server_receive(receive_request, SRI, PIs, [], PIs);server_receive(receive_service_contexts, SRI, [H|T], Acc, PIs) ->    case catch receive_service_contexts(SRI, H) of	{'EXCEPTION', #'PortableInterceptor_ForwardRequest'{forward=_Obj, 							    permanent=_Bool}} ->	    server_send(send_other, SRI, Acc, [], PIs);	{'EXCEPTION', _E} ->	    server_send(send_exception, SRI, Acc, [], PIs);	_ ->	    server_receive(receive_service_contexts, SRI, T, Acc, PIs)    end;server_receive(receive_request, SRI, [], _Acc, _PIs) ->    %% Done with receive interceptors, now we can call the server.    SRI;server_receive(receive_request, SRI, [H|T], Acc, PIs)  ->    case catch receive_request(SRI, H) of	{'EXCEPTION', #'PortableInterceptor_ForwardRequest'{forward=_Obj, 							    permanent=_Bool}} ->	    server_send(send_other, SRI, Acc, [], PIs);	{'EXCEPTION', _E} ->	    server_send(send_exception, SRI, Acc, [], PIs);	_ ->	    server_receive(receive_request, SRI, T, Acc, PIs)    end.%%------------------------------------------------------------%% function : server_start_send%% Arguments: SRI - ServerRequestInfo%%            PIs - a list of Interceptors (see 'Comments' in the module header)%% Returns  : %% Exception: %% Effect   : %%------------------------------------------------------------server_start_send(PIs, SRI) ->    case SRI#'ServerRequestInfo'.reply_status of	'PortableInterceptor_SUCCESSFUL' ->	    server_send(send_reply, SRI, PIs, [], PIs);	'PortableInterceptor_SYSTEM_EXCEPTION' ->	    server_send(send_exception, SRI, PIs, [], PIs);	'PortableInterceptor_USER_EXCEPTION' ->	    server_send(send_exception, SRI, PIs, [], PIs);	_ ->	    server_send(send_other, SRI, PIs, [], PIs)    end.server_send(_, SRI, [], _Acc, _PIs) ->    %% Done    SRI;server_send(send_exception, SRI, [H|T], Acc, PIs) ->    case catch send_exception(SRI, H) of	{'EXCEPTION', #'PortableInterceptor_ForwardRequest'{forward=_Obj, 							    permanent=_Bool}} ->	    server_send(send_other, SRI, Acc, [], PIs);	{'EXCEPTION', _E} ->	    server_send(send_exception, SRI, Acc, [], PIs);	_ ->	    server_send(send_exception, SRI, T, Acc, PIs)    end;server_send(send_other, SRI, [H|T], Acc, PIs) ->    case catch send_other(SRI, H) of	{'EXCEPTION', #'PortableInterceptor_ForwardRequest'{forward=_Obj, 							    permanent=_Bool}} ->	    server_send(send_other, SRI, T, Acc, PIs);	{'EXCEPTION', _E} ->	    server_send(send_exception, SRI, T, Acc, PIs);	_ ->	    server_send(send_other, SRI, T, Acc, PIs)    end;server_send(send_reply, SRI, [H|T], Acc, PIs) ->    case catch send_reply(SRI, H) of	{'EXCEPTION', _E} ->	    server_send(send_exception, SRI, T, Acc, PIs);	_ ->	    server_send(send_reply, SRI, T, Acc, PIs)    end.receive_request(SRI, Mod) ->    apply(Mod, receive_request, [SRI]).send_other(SRI, Mod) ->    apply(Mod, send_other, [SRI]).receive_service_contexts(SRI, Mod) ->    apply(Mod, receive_service_contexts, [SRI]).send_reply(SRI, Mod) ->    apply(Mod, send_reply, [SRI]).send_exception(SRI, Mod) ->    apply(Mod, send_exception, [SRI]).%%------------------------------------------------------------%%------------- CLIENT SIDE FUNCTIONS ------------------------%%------------------------------------------------------------%% To make a long story short, you find an conceptual description%% of how, and in which order, the different functions is %% supposed to be invoked.%%%%request(Data) -> %%    Reply = %%	case send_request(CRI) of %%	    SYSTEM EXC -> %%		receive_exception(..);%%	    ForwardRequest EXC -> %%		receive_other(..);%%	    NoEXC -> %%		IIOP-send%%	end,%%    case Reply of%%	EXC -> 

⌨️ 快捷键说明

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