📄 orber_pi.erl
字号:
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 + -