aboutsummaryrefslogtreecommitdiffstats
path: root/lib/orber/src/orber_interceptors.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/orber/src/orber_interceptors.erl')
-rw-r--r--lib/orber/src/orber_interceptors.erl162
1 files changed, 162 insertions, 0 deletions
diff --git a/lib/orber/src/orber_interceptors.erl b/lib/orber/src/orber_interceptors.erl
new file mode 100644
index 0000000000..407823ea79
--- /dev/null
+++ b/lib/orber/src/orber_interceptors.erl
@@ -0,0 +1,162 @@
+%%--------------------------------------------------------------------
+%%
+%% %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: orber_interceptors.erl
+%%
+%% Description:
+%% This file contains the code for calling interceptors
+%%
+%%-----------------------------------------------------------------
+-module(orber_interceptors).
+
+-include_lib("orber/include/corba.hrl").
+
+%%-----------------------------------------------------------------
+%% External exports
+%%-----------------------------------------------------------------
+-export([call_send_message_interceptors/2, call_receive_message_interceptors/1,
+ call_request_interceptors/2]).
+-export([push_system_message_interceptor/2, pop_system_message_interceptor/1,
+ create_interceptor_table/0]).
+%%-----------------------------------------------------------------
+%% Internal exports
+%%-----------------------------------------------------------------
+-export([]).
+
+
+%%-----------------------------------------------------------------
+%% External interface functions
+%%-----------------------------------------------------------------
+call_receive_message_interceptors(Bytes) ->
+ case getInMessageInterceptors() of
+ [] ->
+ Bytes;
+ Interceptors ->
+ apply_message_interceptors(Interceptors, receive_message, corba:create_nil_objref(),
+ lists:flatten(Bytes))
+ end.
+call_send_message_interceptors(ObjRef, Bytes) ->
+ case getOutMessageInterceptors() of
+ [] ->
+ Bytes;
+ Interceptors ->
+ apply_message_interceptors(Interceptors, send_message, ObjRef, lists:flatten(Bytes))
+ end.
+
+
+call_request_interceptors(in, Bytes) ->
+ case getInRequestInterceptors() of
+ [] ->
+ Bytes;
+ Interceptors ->
+ Bytes
+ end;
+call_request_interceptors(out, Bytes) ->
+ case getOutRequestInterceptors() of
+ [] ->
+ Bytes;
+ Interceptors ->
+ Bytes
+ end.
+
+create_interceptor_table() ->
+ %% Should be replicated mnesia
+ ets:new(orber_interceptors, [protected, named_table, set]),
+ ets:insert(orber_interceptors, {message_in_interceptors, []}),
+ ets:insert(orber_interceptors, {message_out_interceptors, []}).
+
+push_system_message_interceptor(in, Mod) ->
+ case ets:lookup(orber_interceptors, message_in_interceptors) of
+ [{_, Interceptors}] ->
+ ets:insert(orber_interceptors, {message_in_interceptors, [Mod | Interceptors]});
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end;
+push_system_message_interceptor(out, Mod) ->
+ case ets:lookup(orber_interceptors, message_out_interceptors) of
+ [{_, Interceptors}] ->
+ ets:insert(orber_interceptors, {message_out_interceptors, Interceptors ++ [Mod]});
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+
+pop_system_message_interceptor(in) ->
+ case ets:lookup(orber_interceptors, message_in_interceptors) of
+ [{_, []}] ->
+ ok;
+ [{_, [_ | Interceptors]}] ->
+ ets:insert(orber_interceptors, {message_in_interceptors, Interceptors});
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end;
+pop_system_message_interceptor(out) ->
+ case ets:lookup(orber_interceptors, message_out_interceptors) of
+ [{_, []}] ->
+ ok;
+ [{_, Interceptors}] ->
+ ets:insert(orber_interceptors, {message_out_interceptors, remove_last_element(Interceptors)});
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+
+
+
+%%-----------------------------------------------------------------
+%% Internal functions
+%%-----------------------------------------------------------------
+getInMessageInterceptors() ->
+ case ets:lookup(orber_interceptors, message_in_interceptors) of
+ [{_, Interceptors}] ->
+ Interceptors;
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+
+getOutMessageInterceptors() ->
+ case ets:lookup(orber_interceptors, message_out_interceptors) of
+ [{_, Interceptors}] ->
+ Interceptors;
+ _ ->
+ corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO})
+ end.
+
+
+getInRequestInterceptors() ->
+ [].
+
+getOutRequestInterceptors() ->
+ [].
+
+
+apply_message_interceptors([], F, ObjRef, Bytes) ->
+ Bytes;
+apply_message_interceptors([M | Rest], F, ObjRef, Bytes) ->
+ apply_message_interceptors(Rest, F, ObjRef, apply(M, F, [ObjRef, Bytes])).
+
+
+remove_last_element([]) ->
+ [];
+remove_last_element([M]) ->
+ [];
+remove_last_element([M |Tail]) ->
+ remove_last_element([Tail]).
+
+