orber_iiop.erl

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

ERL
551
字号
%%--------------------------------------------------------------------%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%%%-----------------------------------------------------------------%% File: orber_iiop.erl%% Description:%%    This file contains the interface to the iiop operations%%%% Creation date: 970115%%%%------------------------------------------------------------------module(orber_iiop).-include_lib("orber/include/corba.hrl").-include_lib("orber/src/orber_iiop.hrl").-behaviour(supervisor).%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([start_sup/1, request/8, locate/4]).%%-----------------------------------------------------------------%% Internal exports%%------------------------------------------------------------------export([init/1, terminate/2, handle_call/3]).%%-----------------------------------------------------------------%% Internal defines%%------------------------------------------------------------------define(DEBUG_LEVEL, 7).%%-----------------------------------------------------------------%% External interface functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: start_sup/1%%-----------------------------------------------------------------start_sup(Opts) ->    supervisor:start_link({local, orber_iiop_sup}, ?MODULE,			  {orber_iiop_sup, Opts}).%%%-----------------------------------------------------------------%%% Func: connect/1%%%-----------------------------------------------------------------%connect(OrbName) ->%    orber_iiop_net:connect(OrbName).%%%-----------------------------------------------------------------%%% Func: request/5%%%-----------------------------------------------------------------request({Host, Port, InitObjkey, Index, TaggedProfile, HostData}, 	Op, Parameters, TypeCodes, ResponseExpected, Timeout, IOR, UserCtx) ->    {{Proxy, SysCtx, Interceptors, LocalInterface}, ObjKey, Version} =	connect(Host, Port, InitObjkey, Timeout, [Index], HostData,		TaggedProfile, IOR, UserCtx),    Ctx = add_user_context(SysCtx, UserCtx),    RequestId = orber_request_number:get(),    Env = #giop_env{interceptors = Interceptors, type = out, 		    flags = orber_env:get_flags(), host = LocalInterface,		    version = Version, ctx = Ctx, request_id = RequestId, op = Op,		    parameters = Parameters, tc = TypeCodes, objkey = ObjKey, 		    response_expected = ResponseExpected},    Message = encode_request(Env),    case catch orber_iiop_outproxy:request(Proxy, ResponseExpected, Timeout, 					   Message, RequestId) of 	{'EXCEPTION', MsgExc} ->	    corba:raise(MsgExc);	_ when ResponseExpected == false ->	    ok;	{reply, ReplyHeader, Rest, Len, ByteOrder, Bytes} ->	    case catch decode_reply_body(Interceptors, ObjKey, Op, ReplyHeader, 					 Version, TypeCodes, Rest, Len, ByteOrder, 					 Bytes) of		{'EXCEPTION', DecodeException} ->		    %% We cannot log this exception since it may be a correct exception.		    corba:raise(DecodeException);		{'EXIT', message_error} ->		    orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p)~n"			      "Got exit(message_error)", 			      [?LINE, Rest, Version, TypeCodes], ?DEBUG_LEVEL),		    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});		{'EXIT', Why} ->		    orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p)~n"			      "Got exit(~p)", 			      [?LINE, Rest, Version, TypeCodes, Why], ?DEBUG_LEVEL),		    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});		'message_error' ->		    orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p);~n"			      "Got message_error", 			      [?LINE, Rest, Version, TypeCodes], ?DEBUG_LEVEL),                    %% Perhaps a resend should be done when a message error occurs		    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});		{Result, Par} ->                    %% Check request id 		    case ReplyHeader#reply_header.reply_status of			'no_exception' ->			    case Par of				[] ->				    Result;				_ ->				    list_to_tuple([Result | Par])			    end;			'system_exception' ->			    corba:raise(Result);			'user_exception' ->			    corba:raise(Result);			'location_forward' ->			    case get(orber_forward_notify) of				true ->				   {location_forward, Result};				_ ->				    case catch corba:call(Result, Op, Parameters, 							  TypeCodes, 							  [{timeout, Timeout},							   {context, UserCtx}]) of					{'EXCEPTION', E} ->					    corba:raise(E);					{'EXIT', Reason} ->					    orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p)~n"						      "location_forward resulted in exit(~p)", 						      [?LINE, Rest, Version, TypeCodes, Reason], ?DEBUG_LEVEL),					    corba:raise(#'COMM_FAILURE'{completion_status=?COMPLETED_NO});					NewResult ->					    NewResult 				    end			    end;			'location_forward_perm' ->                            %% We should notify the client in this case.			    case get(orber_forward_notify) of				true ->				   {location_forward, Result};				_ ->				    case catch corba:call(Result, Op, Parameters,                                                           TypeCodes,							  [{timeout, Timeout},							   {context, UserCtx}]) of					{'EXCEPTION', E} ->					    corba:raise(E);					{'EXIT', Reason} ->					    orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p)~n"						      "location_forward_perm resulted in exit(~p)", 						      [?LINE, Rest, Version, TypeCodes, Reason], ?DEBUG_LEVEL),					    corba:raise(#'COMM_FAILURE'{completion_status=?COMPLETED_NO});					NewResult ->					    NewResult				    end			    end;			'needs_addressing_mode' ->			    orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p)~n"				      "needs_addressing_mode not supported.", 				      [?LINE, Rest, Version, TypeCodes], ?DEBUG_LEVEL),			    corba:raise(#'COMM_FAILURE'{completion_status=?COMPLETED_NO})		    end	    end;        What ->            orber:dbg("[~p] orber_iiop:request(reply, ~p, ~p, ~p)~n"		      "outproxy-request: ~p", [?LINE, Message, Version, TypeCodes, What], ?DEBUG_LEVEL),            corba:raise(#'COMM_FAILURE'{completion_status=?COMPLETED_NO})    end.encode_request(#giop_env{interceptors = false} = Env) ->    case catch cdr_encode:enc_request(Env) of	{'EXCEPTION', Exc} ->	    orber:dbg("[~p] orber_iiop:request(~p)~n"		      "Got exception(~p)", 		      [?LINE, Env, Exc], ?DEBUG_LEVEL),	    corba:raise(Exc);	{'EXIT', R} ->	    orber:dbg("[~p] orber_iiop:request:( ~p )~n"		      "Got exit(~p)", 		      [?LINE, Env, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});	Msg ->	    Msg    end;encode_request(#giop_env{interceptors = {native, Ref, PIs},			 objkey = ObjKey, ctx = Ctx, op = Op, 			 parameters = Params} = Env) ->    Parameters = orber_pi:out_request(PIs, ObjKey, Ctx, Op, Ref, Params),    case catch cdr_encode:enc_request_split(Env) of	{'EXCEPTION', Exc} ->	    orber:dbg("[~p] orber_iiop:request( ~p, ~p); exception(~p)", 		      [?LINE, Env, Parameters, Exc], ?DEBUG_LEVEL),	    corba:raise(Exc);	{'EXIT', R} ->	    orber:dbg("[~p] orber_iiop:request:( ~p, ~p); got exit(~p)", 		      [?LINE, Env, Parameters, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});	{Hdr, Body, HdrLen, _, Flags} ->	    NewBody = orber_pi:out_request_enc(PIs, ObjKey, Ctx, Op, Ref, Body),	    cdr_encode:enc_giop_message_header(Env, 'request', Flags, 					       HdrLen+size(NewBody), 					       [Hdr|NewBody])    end;encode_request(Env) ->    case catch cdr_encode:enc_request(Env) of	{'EXCEPTION', Exc} ->	    orber:dbg("[~p] orber_iiop:request( ~p ); exception(~p)", 		      [?LINE, Env, Exc], ?DEBUG_LEVEL),	    corba:raise(Exc);	{'EXIT', R} ->	    orber:dbg("[~p] orber_iiop:request:( ~p ); got exit(~p)", 		      [?LINE, Env, R], ?DEBUG_LEVEL),	    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});	Msg ->	    Msg    end.%%-----------------------------------------------------------------%% Func: locate/1%%-----------------------------------------------------------------locate({Host, Port, InitObjkey, Index, TaggedProfile, HostData},       Timeout, IOR, UserCtx) ->    {{Proxy, _Ctx, _Interceptors, LocalInterface}, ObjKey, Version} =	connect(Host, Port, InitObjkey, Timeout, [Index], HostData,		TaggedProfile, IOR, UserCtx),    RequestId = orber_request_number:get(),    Env = #giop_env{version = Version, objkey = ObjKey, request_id = RequestId,		    flags = orber_env:get_flags(), host = LocalInterface},    Result = 	case catch cdr_encode:enc_locate_request(Env) of	    {'EXCEPTION', EncE} ->		orber:dbg("[~p] orber_iiop:locate(~p); exception(~p)", 			  [?LINE, ObjKey, EncE], ?DEBUG_LEVEL),		corba:raise(EncE);	    {'EXIT', EncR} ->		orber:dbg("[~p] orber_iiop:locate(~p); exit(~p)", 			  [?LINE, ObjKey, EncR], ?DEBUG_LEVEL),		corba:raise(#'MARSHAL'{completion_status=?COMPLETED_NO});	    Request ->		(catch orber_iiop_outproxy:request(Proxy, true, Timeout, 						   Request, RequestId))	end,    case Result of	{'EXCEPTION', MsgExc} ->	    corba:raise(MsgExc);	{locate_reply, ReplyHeader, Rest, Len, ByteOrder} ->	    case catch cdr_decode:dec_locate_reply_body(Version, 							ReplyHeader#locate_reply_header.locate_status,							Rest, Len, ByteOrder) of		{'EXCEPTION', DecodeException} ->		    orber:dbg("[~p] orber_iiop:locate(locate_reply, ~p, ~p); exception(~p)", 			      [?LINE, Rest, Version, DecodeException], ?DEBUG_LEVEL),		    corba:raise(DecodeException);		{'EXIT', message_error} ->		    orber:dbg("[~p] orber_iiop:locate(locate_reply, ~p, ~p); exit(message_error)", 					    [?LINE, Rest, Version], ?DEBUG_LEVEL),		    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});		{'EXIT', R} ->		    orber:dbg("[~p] orber_iiop:locate(locate_reply, ~p, ~p); exit(~p)", 			      [?LINE, Rest, Version, R], ?DEBUG_LEVEL),		    corba:raise(#'MARSHAL'{completion_status=?COMPLETED_MAYBE});		[] ->		    ReplyHeader#locate_reply_header.locate_status;		ObjRef ->		    {ReplyHeader#locate_reply_header.locate_status, ObjRef}	    end;	Other ->

⌨️ 快捷键说明

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