orber_iiop.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 551 行 · 第 1/2 页
ERL
551 行
orber:dbg("[~p] orber_iiop:locate(~p); exit(~p)", [?LINE, ObjKey, Other], ?DEBUG_LEVEL), corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO}) end. %%%-----------------------------------------------------------------%%% Func: cancel/1%%%-----------------------------------------------------------------%cancel(X) ->% ok.%%%-----------------------------------------------------------------%%% Func: message_error/1%%%-----------------------------------------------------------------%message_error(X) ->% ok.%%-----------------------------------------------------------------%% Server functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: init/1%%-----------------------------------------------------------------init({orber_iiop_sup, Opts}) -> IIOP_port = orber:iiop_port(), SSL_port = orber:iiop_ssl_port(), SupFlags = {one_for_one, 5, 1000}, %Max 5 restarts in 1 second PortList = if SSL_port > -1 -> [{port, ssl, SSL_port}]; true -> [] end, ChildSpec = case orber:is_lightweight() of true -> [ {orber_iiop_outsup, {orber_iiop_outsup, start, [sup, Opts]}, permanent, 10000, supervisor, [orber_iiop_outsup]}, {orber_iiop_pm, {orber_iiop_pm, start, [Opts]}, permanent, 10000, worker, [orber_iiop_pm]} ]; false -> [{orber_iiop_outsup, {orber_iiop_outsup, start, [sup, Opts]}, permanent, 10000, supervisor, [orber_iiop_outsup]}, {orber_iiop_pm, {orber_iiop_pm, start, [Opts]}, permanent, 10000, worker, [orber_iiop_pm]}, {orber_iiop_insup, {orber_iiop_insup, start, [sup, Opts]}, permanent, 10000, supervisor, [orber_iiop_insup]}, {orber_iiop_socketsup, {orber_iiop_socketsup, start, [sup, Opts]}, permanent, 10000, supervisor, [orber_iiop_socketsup]}, {orber_iiop_net, {orber_iiop_net, start, [[{port, normal, IIOP_port} | PortList]]}, permanent, 10000, worker, [orber_iiop_net]}] end, {ok, {SupFlags, ChildSpec}}.%%-----------------------------------------------------------------%% Func: terminate/2%%-----------------------------------------------------------------terminate(_Reason, _State) -> ok.%%-----------------------------------------------------------------%% Func: handle_call/3%%-----------------------------------------------------------------handle_call(_Req, _From, State) -> {reply, ok, State}.%%-----------------------------------------------------------------%% Internal functions%%-----------------------------------------------------------------add_user_context([], UserCtx) -> UserCtx;add_user_context(SysCtx, []) -> SysCtx;add_user_context(SysCtx, UserCtx) -> SysCtx ++ UserCtx.decode_reply_body(false, _ObjKey, _Op, ReplyHeader, Version, TypeCodes, Rest, Len, ByteOrder, Bytes) -> case ReplyHeader#reply_header.reply_status of 'no_exception' -> {R, P, _} = cdr_decode:dec_reply_body(Version, TypeCodes, Rest, Len, ByteOrder, Bytes), {R, P}; 'system_exception' -> {R, _} = cdr_decode:dec_system_exception(Version, Rest, Len, ByteOrder), {R, []}; 'user_exception' -> {R, _} = cdr_decode:dec_user_exception(Version, Rest, Len, ByteOrder), {R, []}; 'location_forward' -> {R, _, _} = cdr_decode:dec_reply_body(Version, {{'tk_objref', "", ""}, [],[]}, Rest, Len, ByteOrder, Bytes), {R, []}; 'location_forward_perm' -> {R, _, _} = cdr_decode:dec_reply_body(Version, {{'tk_objref', "", ""}, [],[]}, Rest, Len, ByteOrder, Bytes), {R, []}; 'needs_addressing_mode' -> {R, _, _} = cdr_decode:dec_reply_body(Version, {'tk_short', [],[]}, Rest, Len, ByteOrder, Bytes), {R, []} end;decode_reply_body(Interceptors, ObjKey, Op, ReplyHeader, Version, TypeCodes, RestIn, Len, ByteOrder, Bytes) -> Rest = case Interceptors of {portable, _PIs} -> RestIn; {native, Ref, PIs} -> orber_pi:in_reply_enc(PIs, ObjKey, ReplyHeader#reply_header.service_context, Op, Ref, RestIn) end, Reply = case ReplyHeader#reply_header.reply_status of 'no_exception' -> {R, P, _} = cdr_decode:dec_reply_body(Version, TypeCodes, Rest, Len, ByteOrder, Bytes), {R, P}; 'system_exception' -> {R, _} = cdr_decode:dec_system_exception(Version, Rest, Len, ByteOrder), {R, []}; 'user_exception' -> {R, _} = cdr_decode:dec_user_exception(Version, Rest, Len, ByteOrder), {R, []}; 'location_forward' -> {R, _, _} = cdr_decode:dec_reply_body(Version, {{'tk_objref', "", ""}, [],[]}, Rest, Len, ByteOrder, Bytes), {R, []}; 'location_forward_perm' -> {R, _, _} = cdr_decode:dec_reply_body(Version, {{'tk_objref', "", ""}, [],[]}, Rest, Len, ByteOrder, Bytes), {R, []}; 'needs_addressing_mode' -> {R, _, _} = cdr_decode:dec_reply_body(Version, {'tk_short', [],[]}, Rest, Len, ByteOrder, Bytes), {R, []} end, case Interceptors of {portable, _PI} -> Reply; {native, Refs, PI} -> orber_pi:in_reply(PI, ObjKey, ReplyHeader#reply_header.service_context, Op, Refs, Reply) end. %% "Plain" TCP/IP.connect(Host, Port, Objkey, Timeout, Index, #host_data{protocol = normal, csiv2_mech = undefined} = HostData, TaggedProfile, IOR, Ctx) -> connect2([{Host, Port}], Objkey, Timeout, Index, HostData, TaggedProfile, IOR, Ctx);%% "Plain" SSLconnect(Host, _, Objkey, Timeout, Index, #host_data{protocol = ssl, ssl_data = #'SSLIOP_SSL'{port = Port}, csiv2_mech = undefined} = HostData, TaggedProfile, IOR, Ctx) -> connect2([{Host, Port}], Objkey, Timeout, Index, HostData, TaggedProfile, IOR, Ctx);%% TEMPORARY FIX TO AVOID RUNNING CSIv2.connect(Host, _, Objkey, Timeout, Index, #host_data{protocol = ssl, ssl_data = #'SSLIOP_SSL'{port = Port}} = HostData, TaggedProfile, IOR, Ctx) -> connect2([{Host, Port}], Objkey, Timeout, Index, HostData, TaggedProfile, IOR, Ctx);%% CSIv2 over SSL (TAG_TLS_SEC_TRANS) using the SAS protocol. Note port must equal 0.connect(_Host, 0, Objkey, Timeout, Index, #host_data{protocol = ssl, csiv2_mech = #'CSIIOP_CompoundSecMech'{target_requires = _TR} = _Mech, csiv2_addresses = Addresses} = HostData, TaggedProfile, IOR, Ctx) -> NewCtx = [#'IOP_ServiceContext' {context_id=?IOP_SecurityAttributeService, context_data = #'CSI_SASContextBody' {label = ?CSI_MsgType_MTEstablishContext, value = #'CSI_EstablishContext' {client_context_id = 0, %% Always 0 when stateless. authorization_token = [#'CSI_AuthorizationElement'{the_element = []}], identity_token = #'CSI_IdentityToken'{label = ?CSI_IdentityTokenType_ITTAbsent, value = true}, client_authentication_token = []}}}|Ctx], connect2(Addresses, Objkey, Timeout, Index, HostData, TaggedProfile, IOR, NewCtx);%% CSIv2 over SSL (TAG_NULL_TAG) using the SAS protocol.connect(Host, _, Objkey, Timeout, Index, #host_data{protocol = ssl, ssl_data = #'SSLIOP_SSL'{port = Port}, csiv2_mech = Mech} = HostData, TaggedProfile, IOR, Ctx) when record(Mech, 'CSIIOP_CompoundSecMech') -> connect2([{Host, Port}], Objkey, Timeout, Index, HostData, TaggedProfile, IOR, Ctx);%% CSIv2 over TCP (TAG_NULL_TAG) using the SAS protocol.connect(Host, Port, Objkey, Timeout, Index, #host_data{protocol = normal, csiv2_mech = Mech} = HostData, TaggedProfile, IOR, Ctx) when record(Mech, 'CSIIOP_CompoundSecMech') -> connect2([{Host, Port}], Objkey, Timeout, Index, HostData, TaggedProfile, IOR, Ctx);connect(_Host, _Port, _Objkey, _Timeout, _Index, HostData, _TaggedProfile, IOR, _Ctx) -> orber:dbg("[~p] orber_iiop:connect(~p)~n" "Unable to use the supplied IOR.~n" "Connection Data: ~p", [?LINE, IOR, HostData], ?DEBUG_LEVEL), corba:raise(#'INV_OBJREF'{completion_status=?COMPLETED_NO}).connect2(HostPort, Objkey, Timeout, Index, HostData, TaggedProfile, IOR, Ctx) -> case try_connect(HostPort, HostData#host_data.protocol, Timeout, HostData, Ctx) of error -> Alts = iop_ior:get_alt_addr(TaggedProfile), case try_connect(Alts, HostData#host_data.protocol, Timeout, HostData, Ctx) of error -> case iop_ior:get_key(IOR, Index) of undefined -> corba:raise(#'COMM_FAILURE'{completion_status = ?COMPLETED_NO}); {'external', {NewHost, NewPort, NewObjkey, NewIndex, NewTaggedProfile, NewHostData}} -> connect(NewHost, NewPort, NewObjkey, Timeout, [NewIndex|Index], NewHostData, NewTaggedProfile, IOR, Ctx); _What -> orber:dbg("[~p] orber_iiop:connect2(~p)~n" "Illegal IOR; contains a mixture of local and external profiles.", [?LINE, IOR], ?DEBUG_LEVEL), corba:raise(#'INV_OBJREF'{completion_status=?COMPLETED_NO}) end; X -> {X, Objkey, HostData#host_data.version} end; X -> {X, Objkey, HostData#host_data.version} end.try_connect([], _, _, _, _) -> error;try_connect([{Host, Port}|T], SocketType, Timeout, HostData, Ctx) -> case catch orber_iiop_pm:connect(Host, Port, SocketType, Timeout, HostData#host_data.charset, HostData#host_data.wcharset, Ctx) of {ok, P, Ctx2, Int, Interface} -> {P, Ctx2, Int, Interface}; {'EXCEPTION', #'BAD_CONTEXT'{} = CtxExc} -> orber:dbg("[~p] orber_iiop:try_connect(~p, ~p) failed~n", [?LINE, Host, Port], ?DEBUG_LEVEL), corba:raise(CtxExc); {'EXCEPTION', _PMExc} -> try_connect(T, SocketType, Timeout, HostData, Ctx); {'EXIT',{timeout,_}} -> orber:dbg("[~p] orber_iiop:try_connect(~p, ~p, ~p)~n" "Connect attempt timed out", [?LINE, Host, Port, Timeout], ?DEBUG_LEVEL), try_connect(T, SocketType, Timeout, HostData, Ctx); {'EXIT', What} -> orber:dbg("[~p] orber_iiop:try_connect(~p, ~p, ~p)~n" "Connect attempt resulted in: ~p", [?LINE, Host, Port, Timeout, What], ?DEBUG_LEVEL), try_connect(T, SocketType, Timeout, HostData, Ctx) end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?