diff options
Diffstat (limited to 'lib/cosNotification/src/CosNotifyChannelAdmin_EventChannelFactory_impl.erl')
-rw-r--r-- | lib/cosNotification/src/CosNotifyChannelAdmin_EventChannelFactory_impl.erl | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/lib/cosNotification/src/CosNotifyChannelAdmin_EventChannelFactory_impl.erl b/lib/cosNotification/src/CosNotifyChannelAdmin_EventChannelFactory_impl.erl new file mode 100644 index 0000000000..872a786f92 --- /dev/null +++ b/lib/cosNotification/src/CosNotifyChannelAdmin_EventChannelFactory_impl.erl @@ -0,0 +1,142 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 1999-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 : CosNotifyChannelAdmin_EventChannelFactory_impl.erl +%% Purpose : +%%------------------------------------------------------------------- + +-module('CosNotifyChannelAdmin_EventChannelFactory_impl'). + +%%--------------- INCLUDES ----------------------------------- +%% Application files +-include_lib("orber/include/corba.hrl"). +-include_lib("orber/include/ifr_types.hrl"). +%% Application files +-include("CosNotification.hrl"). +-include("CosNotifyChannelAdmin.hrl"). +-include("CosNotifyComm.hrl"). +-include("CosNotifyFilter.hrl"). +-include("CosNotification_Definitions.hrl"). + +%%--------------- IMPORTS ------------------------------------ + +%%--------------- EXPORTS ------------------------------------ +%% External +-export([create_channel/5, + get_all_channels/3, + get_event_channel/4]). + +%%--------------- gen_server specific exports ---------------- +-export([handle_info/2, code_change/3]). +-export([init/1, terminate/2]). + +%%--------------- LOCAL DEFINITIONS -------------------------- +%% Data structures +-record(state, {adminProp, + idCounter = 0, + options, + etsR, + server_options}). + +%%-----------------------------------------------------------% +%% function : handle_info, code_change +%% Arguments: See gen_server documentation. +%% Effect : Functions demanded by the gen_server module. +%%------------------------------------------------------------ + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +handle_info(Info, State) -> + ?debug_print("INFO: ~p~n", [Info]), + case Info of + {'EXIT', Pid, normal} -> + ets:match_delete(State#state.etsR, {'_','_',Pid}), + {noreply, State}; + _Other -> + ?debug_print("TERMINATED: ~p~n",[_Other]), + {noreply, State} + end. + +%%----------------------------------------------------------% +%% function : init, terminate +%% Arguments: +%%----------------------------------------------------------- + +init(Options) -> + process_flag(trap_exit, true), + SO = 'CosNotification_Common':get_option(server_options, Options, ?not_DEFAULT_SETTINGS), + {ok, #state{options = Options, + etsR = ets:new(oe_ets, [set, protected]), + server_options = SO}}. + +terminate(_Reason, _State) -> + ok. + +%%----------------------------------------------------------- +%%------- Exported external functions ----------------------- +%%----------------------------------------------------------- +%%----------------------------------------------------------% +%% function : create_channel +%% Arguments: InitQoS +%% InitAdmin +%% Returns : Ch - Channel obj ref +%% Id - Channel Id (out-type) +%%----------------------------------------------------------- +create_channel(OE_THIS, _OE_FROM, State, InitQoS, InitAdmin) -> + {QoS, LQoS} = 'CosNotification_Common':init_qos(InitQoS), + {IAdm, LAdm} = 'CosNotification_Common':init_adm(InitAdmin), + Id = 'CosNotification_Common':create_id(State#state.idCounter), + case 'CosNotifyChannelAdmin_EventChannel':oe_create_link([OE_THIS, QoS, IAdm, + LQoS, LAdm, + State#state.options], + [{sup_child, true}|State#state.server_options]) of + {ok, Pid, Ch} -> + ets:insert(State#state.etsR, {Id,Ch,Pid}), + {reply, {Ch, Id}, State#state{idCounter=Id}}; + _ -> + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. + +%%----------------------------------------------------------% +%% function : get_all_channels +%% Arguments: - +%% Returns : ChannelIDSeq - List of alive channels created +%% by this factory. +%%----------------------------------------------------------- +get_all_channels(_OE_THIS, _OE_FROM, State) -> + {reply, lists:flatten(ets:match(State#state.etsR, {'$1','_','_'})), State}. + +%%----------------------------------------------------------% +%% function : get_event_channel +%% Arguments: ChannelId +%% Returns : ChannelRef | 'CosNotifyChannelAdmin_ChannelNotFound' +%%----------------------------------------------------------- +get_event_channel(_OE_THIS, _OE_FROM, State, Id) -> + {reply, find_obj(ets:lookup(State#state.etsR, Id)), State}. + +%%--------------- LOCAL FUNCTIONS ---------------------------- +find_obj([]) -> {'EXCEPTION', #'CosNotifyChannelAdmin_ChannelNotFound'{}}; +find_obj([{_, Obj,_}]) -> Obj; +find_obj(_) -> {'EXCEPTION', #'CosNotifyChannelAdmin_ChannelNotFound'{}}. + +%%--------------- MISC FUNCTIONS, E.G. DEBUGGING ------------- +%%--------------- END OF MODULE ------------------------------ |