orber_iiop_inproxy.erl

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

ERL
399
字号
%%--------------------------------------------------------------------%% ``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_inproxy.erl%% %% Description:%%    This file contains the IIOP "proxy" for incomming connections%%%% Creation date: 990425%%%%------------------------------------------------------------------module(orber_iiop_inproxy).-behaviour(gen_server).-include_lib("orber/src/orber_iiop.hrl").-include_lib("orber/include/corba.hrl").%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([start/0, start/1]).%%-----------------------------------------------------------------%% Internal exports%%------------------------------------------------------------------export([init/1, handle_call/3, handle_cast/2, handle_info/2,	 code_change/3, terminate/2, post_accept/3, stop/1]).%%-----------------------------------------------------------------%% Macros%%------------------------------------------------------------------define(DEBUG_LEVEL, 7).-record(state, {stype, socket, db, timeout, max_fragments, 		max_requests, request_counter = 1, giop_env, peer}).%%-----------------------------------------------------------------%% External interface functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: start/0%%-----------------------------------------------------------------start() ->    ignore.%%-----------------------------------------------------------------%% Func: start/1%%-----------------------------------------------------------------start(Opts) ->    gen_server:start_link(orber_iiop_inproxy, Opts, []).post_accept(Pid, ssl, Socket) ->    (catch gen_server:cast(Pid, {post_accept, ssl, Socket})),    ok;post_accept(_, _, _) ->    ok.%%-----------------------------------------------------------------%% Internal interface functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: stop/1%%-----------------------------------------------------------------stop(Pid) ->    gen_server:cast(Pid, stop).%%-----------------------------------------------------------------%% Server functions%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Func: init/1%%-----------------------------------------------------------------init({connect, Type, Socket, Ref, Options}) ->    process_flag(trap_exit, true),    Flags = orber_tb:keysearch(flags, Options, orber_env:get_flags()),    {Address, Port} = PeerData = orber_socket:peerdata(Type, Socket),    {LAddress, LPort} = LocalData = orber_socket:sockdata(Type, Socket),    case {?ORB_FLAG_TEST(Flags, ?ORB_ENV_LOCAL_INTERFACE), LPort} of	{true, 0} ->	    orber_tb:info("Unable to lookup the local address and port number.~n"			  "Closing the incoming connection.", []),	    ignore;	_ ->	    orber_iiop_net:add_connection(Socket, Type, PeerData, LocalData, Ref),	    Interceptors = 		case orber_tb:keysearch(interceptors, Options,					orber_env:get_interceptors()) of		    {native, PIs} ->			{native, orber_pi:new_in_connection(PIs, Address, Port, 							    LAddress, LPort), PIs};		    Other ->			Other		end,	    Env = 		case ?ORB_FLAG_TEST(Flags, ?ORB_ENV_LOCAL_INTERFACE) of		    true when Type == ssl ->			#giop_env{interceptors = Interceptors, 				  flags = Flags, host = [LAddress], 				  iiop_port = 				  orber_tb:keysearch(iiop_port, Options, 						     orber_env:iiop_port()),				  iiop_ssl_port = LPort,				  domain = orber:domain(),				  partial_security = orber:partial_security()};		    true ->			#giop_env{interceptors = Interceptors, 				  flags = Flags, host = [LAddress], 				  iiop_port = LPort,				  iiop_ssl_port = 				  orber_tb:keysearch(iiop_ssl_port, Options, 						     orber_env:iiop_ssl_port()),				  domain = orber:domain(),				  partial_security = orber:partial_security()};		    false ->			case ?ORB_FLAG_TEST(Flags, ?ORB_ENV_ENABLE_NAT) of			    false ->				#giop_env{interceptors = Interceptors, 					  flags = Flags, host = orber:host(), 					  iiop_port = orber:iiop_port(),					  iiop_ssl_port = orber:iiop_ssl_port(),					  domain = orber:domain(),					  partial_security = orber:partial_security()};			    true ->				#giop_env{interceptors = Interceptors, 					  flags = Flags, 					  host = 					  orber_tb:keysearch(nat_ip_address, Options,							     orber_env:nat_host()), 					  iiop_port = 					  orber_tb:keysearch(nat_iiop_port, Options,							     orber_env:nat_iiop_port()),					  iiop_ssl_port = 					  orber_tb:keysearch(nat_iiop_ssl_port, Options,							     orber_env:nat_iiop_ssl_port()),					  domain = orber:domain(),					  partial_security = orber:partial_security()}			end		end,	    Timeout = orber_tb:keysearch(iiop_in_connection_timeout, Options,					 orber_env:iiop_in_connection_timeout()),	    MaxFrags = orber_tb:keysearch(iiop_max_fragments, Options,					  orber_env:iiop_max_fragments()),	    MaxRequests = orber_tb:keysearch(iiop_max_in_requests, Options,					     orber_env:iiop_max_in_requests()),	    {ok, #state{stype = Type, 			socket = Socket, 			db =  ets:new(orber_incoming_requests, [set]), 			timeout = Timeout,			max_fragments = MaxFrags,			max_requests = MaxRequests,			giop_env = Env, peer = PeerData}, Timeout}    end.%%-----------------------------------------------------------------%% Func: terminate/2%%-----------------------------------------------------------------%% We may want to kill all proxies before terminating, but the best%% option should be to let the requests complete (especially for one-way%% functions it's a better alternative.terminate(_Reason, #state{db = IncRequests, giop_env = Env}) ->    ets:delete(IncRequests),    case Env#giop_env.interceptors of 	false ->	    ok;	{native, Ref, PIs} ->	    orber_pi:closed_in_connection(PIs, Ref);	{_Type, _PIs} ->	    ok    end.%%-----------------------------------------------------------------%% Func: handle_call/3%%-----------------------------------------------------------------handle_call(stop, _From, State) ->    {stop, normal, ok, State};handle_call(_, _, State) ->    {noreply, State, State#state.timeout}.%%-----------------------------------------------------------------%% Func: handle_cast/2%%-----------------------------------------------------------------handle_cast({post_accept, Type, Socket}, State) ->

⌨️ 快捷键说明

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