From 84adefa331c4159d432d22840663c38f155cd4c1 Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Fri, 20 Nov 2009 14:54:40 +0000 Subject: The R13B03 release. --- lib/orber/src/orber_interceptors.erl | 162 +++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 lib/orber/src/orber_interceptors.erl (limited to 'lib/orber/src/orber_interceptors.erl') 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]). + + -- cgit v1.2.3