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