%%--------------------------------------------------------------------
%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2001-2016. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
%%----------------------------------------------------------------------
%% File : CosEventDomainAdmin_EventDomainFactory_impl.erl
%% Description :
%%
%%----------------------------------------------------------------------
-module('CosEventDomainAdmin_EventDomainFactory_impl').
%%----------------------------------------------------------------------
%% Include files
%%----------------------------------------------------------------------
-include_lib("orber/include/corba.hrl").
-include_lib("orber/include/ifr_types.hrl").
-include_lib("cosNotification/include/CosNotification.hrl").
-include("CosEventDomainAdmin.hrl").
-include("cosEventDomainApp.hrl").
%%----------------------------------------------------------------------
%% External exports
%%----------------------------------------------------------------------
-export([init/1,
terminate/2,
code_change/3,
handle_info/2]).
-export([create_event_domain/4,
get_all_domains/2,
get_event_domain/3]).
%%----------------------------------------------------------------------
%% Internal exports
%%----------------------------------------------------------------------
-export([]).
%%----------------------------------------------------------------------
%% Records
%%----------------------------------------------------------------------
-record(state, {current_id = -1, domains = []}).
%%----------------------------------------------------------------------
%% Macros
%%----------------------------------------------------------------------
%%======================================================================
%% External functions
%%======================================================================
%%----------------------------------------------------------------------
%% Function : init/1
%% Returns : {ok, State} |
%% {ok, State, Timeout} |
%% ignore |
%% {stop, Reason}
%% Description: Initiates the server
%%----------------------------------------------------------------------
init([]) ->
process_flag(trap_exit, true),
{ok, #state{}}.
%%----------------------------------------------------------------------
%% Function : terminate/2
%% Returns : any (ignored by gen_server)
%% Description: Shutdown the server
%%----------------------------------------------------------------------
terminate(_Reason, _State) ->
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/2
%% Returns : {noreply, State} |
%% {stop, Reason, State}
%% Description: Handle, for example, exit signals.
%%----------------------------------------------------------------------
handle_info({'EXIT', Pid, _Reason}, State) ->
{noreply, State#state{domains=delete_domain(State#state.domains, Pid, [])}};
handle_info(_Info, State) ->
{noreply, State}.
%%----------------------------------------------------------------------
%% Function : create_event_domain
%% Arguments : InitialQoS - CosNotification::QoSProperties
%% InitialAdmin - CosNotification::AdminProperties
%% Returns : CosEventDomainAdmin::EventDomain |
%% {'EXCEPTION', #'CosNotification_UnsupportedQoS'{}} |
%% {'EXCEPTION', #'CosNotification_UnsupportedAdmin'{}} |
%% Description:
%%----------------------------------------------------------------------
create_event_domain(_OE_This, State, InitialQoS, InitialAdmin) ->
Id = cosEventDomainApp:create_id(State#state.current_id),
Admin = cosEventDomainApp:get_admin(InitialAdmin),
QoS = cosEventDomainApp:get_qos(InitialQoS),
case catch 'CosEventDomainAdmin_EventDomain':oe_create_link([self(), Id,
QoS, Admin],
[{sup_child, true}]) of
{ok, Pid, ED} ->
{reply, {ED, Id}, State#state{current_id = Id,
domains = [{Id, ED, Pid}|State#state.domains]}};
What ->
orber:dbg("[~p] CosEventDomainAdmin_EventDomainFactory:"
"create_event_domain();~n"
"Failed creatin a new EventDomain due to: ~p",
[?LINE, What], ?DEBUG_LEVEL),
corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
end.
%%----------------------------------------------------------------------
%% Function : get_all_domains
%% Arguments : -
%% Returns : CosEventDomainAdmin::DomainIDSeq - [long()]
%% Description:
%%----------------------------------------------------------------------
get_all_domains(_OE_This, State) ->
{reply, get_all_domains_helper(State#state.domains, []), State}.
get_all_domains_helper([], Acc) ->
Acc;
get_all_domains_helper([{Id, _, _}|T], Acc) ->
get_all_domains_helper(T, [Id|Acc]).
%%----------------------------------------------------------------------
%% Function : get_event_domain
%% Arguments : CosEventDomainAdmin::DomainID - long()
%% Returns : CosEventDomainAdmin::EventDomain |
%% {'EXCEPTION', #'CosEventDomainAdmin_DomainNotFound'{}} |
%% Description:
%%----------------------------------------------------------------------
get_event_domain(_OE_This, State, DomainID) ->
{reply, get_event_domain_helper(State#state.domains, DomainID), State}.
get_event_domain_helper([], _) ->
corba:raise(#'CosEventDomainAdmin_DomainNotFound'{});
get_event_domain_helper([{Id, ED, _}|_], Id) ->
ED;
get_event_domain_helper([_|T], Id) ->
get_event_domain_helper(T, Id).
%%======================================================================
%% Internal functions
%%======================================================================
delete_domain([], _, Acc) ->
%% The domain didn't exist.
Acc;
delete_domain([{_Id, _, Pid}], Pid, Acc) ->
Acc;
delete_domain([{_Id, _, Pid}|T], Pid, Acc) ->
T++Acc;
delete_domain([H|T], Pid, Acc) ->
delete_domain(T, Pid, [H|Acc]).
%%======================================================================
%% END OF MODULE
%%======================================================================