aboutsummaryrefslogtreecommitdiffstats
path: root/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl')
-rw-r--r--lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl205
1 files changed, 205 insertions, 0 deletions
diff --git a/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl b/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl
new file mode 100644
index 0000000000..26269ad4f7
--- /dev/null
+++ b/lib/cosEvent/src/CosEventChannelAdmin_ProxyPullConsumer_impl.erl
@@ -0,0 +1,205 @@
+%%--------------------------------------------------------------------
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
+%%
+%% 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 online 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.
+%%
+%% %CopyrightEnd%
+%%
+%%
+%%----------------------------------------------------------------------
+%% File : CosEventChannelAdmin_ProxyPullConsumer_impl.erl
+%% Description :
+%%
+%%----------------------------------------------------------------------
+-module('CosEventChannelAdmin_ProxyPullConsumer_impl').
+
+%%----------------------------------------------------------------------
+%% Include files
+%%----------------------------------------------------------------------
+-include("CosEventChannelAdmin.hrl").
+-include("CosEventComm.hrl").
+-include("cosEventApp.hrl").
+
+%%----------------------------------------------------------------------
+%% External exports
+%%----------------------------------------------------------------------
+%% Mandatory
+-export([init/1,
+ terminate/2,
+ code_change/3,
+ handle_info/2]).
+
+%% Interface functions
+-export([connect_pull_supplier/3]).
+
+%% Exports from "CosEventComm::PullConsumer"
+-export([disconnect_pull_consumer/2]).
+
+
+%%----------------------------------------------------------------------
+%% Internal exports
+%%----------------------------------------------------------------------
+
+%%----------------------------------------------------------------------
+%% Records
+%%----------------------------------------------------------------------
+-record(state, {admin, admin_pid, channel, client,
+ typecheck, pull_interval, timer_ref}).
+
+%%----------------------------------------------------------------------
+%% Macros
+%%----------------------------------------------------------------------
+
+%%======================================================================
+%% External functions
+%%======================================================================
+%%----------------------------------------------------------------------
+%% Function : init/1
+%% Returns : {ok, State} |
+%% {ok, State, Timeout} |
+%% ignore |
+%% {stop, Reason}
+%% Description: Initiates the server
+%%----------------------------------------------------------------------
+init([Admin, AdminPid, Channel, TypeCheck, PullInterval]) ->
+ process_flag(trap_exit, true),
+ Secs = timer:seconds(PullInterval),
+ timer:start(),
+ {ok, #state{admin = Admin, admin_pid = AdminPid, channel = Channel,
+ typecheck = TypeCheck, pull_interval = Secs}}.
+
+%%----------------------------------------------------------------------
+%% Function : terminate/2
+%% Returns : any (ignored by gen_server)
+%% Description: Shutdown the server
+%%----------------------------------------------------------------------
+terminate(_Reason, #state{client = undefined}) ->
+ ?DBG("Terminating ~p; no client connected.~n", [_Reason]),
+ ok;
+terminate(_Reason, #state{client = Client} = State) ->
+ stop_timer(State),
+ ?DBG("Terminating ~p~n", [_Reason]),
+ cosEventApp:disconnect('CosEventComm_PullSupplier',
+ disconnect_pull_supplier, Client),
+ ok.
+
+%%----------------------------------------------------------------------
+%% Function : code_change/3
+%% Returns : {ok, NewState}
+%% Description: Convert process state when code is changed
+%%----------------------------------------------------------------------
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.
+
+%%---------------------------------------------------------------------%
+%% function : handle_info
+%% Arguments:
+%% Returns : {noreply, State} |
+%% {stop, Reason, State}
+%% Effect : If the Parent Admin or the Channel terminates so must this object.
+%%----------------------------------------------------------------------
+handle_info({'EXIT', Pid, Reason}, #state{admin_pid = Pid} = State) ->
+ ?DBG("Parent Admin terminated ~p~n", [Reason]),
+ orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:handle_info(~p);~n"
+ "My Admin terminated and so will I.", [?LINE, Reason], ?DEBUG_LEVEL),
+ {stop, Reason, State};
+handle_info(try_pull_event, State) ->
+ try_pull_event(State);
+handle_info(_Info, State) ->
+ ?DBG("Unknown Info ~p~n", [_Info]),
+ {noreply, State}.
+
+%%----------------------------------------------------------------------
+%% Function : connect_pull_supplier
+%% Arguments :
+%% Returns :
+%% Description:
+%%----------------------------------------------------------------------
+connect_pull_supplier(_OE_This, #state{client = undefined,
+ typecheck = TypeCheck} = State, NewClient) ->
+ case corba_object:is_nil(NewClient) of
+ true ->
+ ?DBG("A NIL client supplied.~n", []),
+ orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:connect_pull_supplier(..);~n"
+ "Supplied a NIL reference which is not allowed.",
+ [?LINE], ?DEBUG_LEVEL),
+ corba:raise(#'BAD_PARAM'{completion_status = ?COMPLETED_NO});
+ false ->
+ cosEventApp:type_check(NewClient, 'CosEventComm_PullSupplier', TypeCheck),
+ NewState = start_timer(State),
+ {reply, ok, NewState#state{client = NewClient}}
+ end;
+connect_pull_supplier(_, _, _) ->
+ corba:raise(#'CosEventChannelAdmin_AlreadyConnected'{}).
+
+
+%%----------------------------------------------------------------------
+%% Function : disconnect_pull_consumer
+%% Arguments :
+%% Returns :
+%% Description:
+%%----------------------------------------------------------------------
+disconnect_pull_consumer(_OE_This, State) ->
+ NewState = stop_timer(State),
+ ?DBG("Disconnect invoked ~p~n", [NewState]),
+ {stop, normal, ok, NewState#state{client = undefined}}.
+
+%%======================================================================
+%% Internal functions
+%%======================================================================
+%% Start timer which send a message each time we should pull for new events.
+start_timer(State) ->
+ case catch timer:send_interval(State#state.pull_interval, try_pull_event) of
+ {ok,PullTRef} ->
+ ?DBG("Started timer: ~p~n", [State#state.pull_interval]),
+ State#state{timer_ref = PullTRef};
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+stop_timer(#state{timer_ref = undefined} = State) ->
+ ?DBG("No timer to stop~n",[]),
+ State;
+stop_timer(State) ->
+ ?DBG("Stopped timer~n",[]),
+ timer:cancel(State#state.timer_ref),
+ State#state{timer_ref = undefined}.
+
+
+try_pull_event(State) ->
+ case catch 'CosEventComm_PullSupplier':try_pull(State#state.client) of
+ {_,false} ->
+ ?DBG("Client did not supply event~n", []),
+ {noreply, State};
+ {Any, true} ->
+ 'oe_CosEventComm_Channel':send_sync(State#state.channel, Any),
+ ?DBG("Received Event ~p and forwarded it successfully.~n", [Any]),
+ {noreply, State};
+ {'EXCEPTION', #'CosEventComm_Disconnected'{}} ->
+ ?DBG("Client claims we are disconnectedwhen trying to pull event.~n", []),
+ orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:try_pull_event();~n"
+ "Client claims we are disconnected when trying to pull event so I terminate.",
+ [?LINE], ?DEBUG_LEVEL),
+ {stop, normal, State#state{client = undefined}};
+ What ->
+ orber:dbg("[~p] CosEventChannelAdmin_ProxyPullConsumer:try_pull_event(~p);~n"
+ "My Client behaves badly so I terminate.",
+ [?LINE, What], ?DEBUG_LEVEL),
+ {stop, normal, State}
+ end.
+
+
+%%======================================================================
+%% END OF MODULE
+%%======================================================================