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