orber_cosnaming_utils.erl
来自「OTP是开放电信平台的简称」· ERL 代码 · 共 756 行 · 第 1/2 页
ERL
756 行
%%--------------------------------------------------------------------%% ``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 via the world wide web 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.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %% $Id$%%%%-----------------------------------------------------------------%% File: CosNaming_BindingIterator_impl.erl%% Creation date: 970902%% Modified:%%%%------------------------------------------------------------------module(orber_cosnaming_utils).-include("orber_cosnaming.hrl").-include("CosNaming.hrl").-include("CosNaming_NamingContext.hrl").-include("CosNaming_NamingContextExt.hrl").-include_lib("orber/include/corba.hrl").%%-----------------------------------------------------------------%% External exports%%------------------------------------------------------------------export([query_result/1]).%%-----------------------------------------------------------------%% Internal exports%%------------------------------------------------------------------export([addresses/1, name/1, check_addresses/1, check_name/1, key/1, select_type/1, lookup/1, lookup/2, escape_string/1, unescape_string/1, name2string/1, string2name/1]).%%-----------------------------------------------------------------%% Records%%-----------------------------------------------------------------%%-----------------------------------------------------------------%% Defines%%-----------------------------------------------------------------%% DEFAULT VALUES:%%%% IIOP:%% - port: 2809%% - iiop version: 1.0-define(DEF_VERS, {1,0}).-define(DEF_PORT, 2809).-define(DEF_KEY, "NameService").-define(HTTP_DEF_PORT, 80).%% DEBUG INFO-define(DEBUG_LEVEL, 5).%%-----------------------------------------------------------------%% External interface functions%%-----------------------------------------------------------------%% Check a read transactionquery_result({atomic, Qres}) -> case Qres of [Hres] -> Hres#orber_CosNaming.nameindex; [Hres|Tres] -> orber:dbg("[~p] orber_cosnaming_utils:query_result(~p);~n" "Multiple Hits: ~p", [?LINE, Qres, [Hres|Tres]], ?DEBUG_LEVEL), error; [] -> orber:dbg("[~p] orber_cosnaming_utils:query_result();~n" "No hit", [?LINE], ?DEBUG_LEVEL), error; Other -> orber:dbg("[~p] orber_cosnaming_utils:query_result(~p);~n" "Mnesia Access Failed ~p", [?LINE, Qres, Other], ?DEBUG_LEVEL), error end;query_result({aborted, Qres}) -> orber:dbg("[~p] orber_cosnaming_utils:query_result(~p);~n" "Mnesia Access Aborted", [?LINE, Qres], ?DEBUG_LEVEL), error;query_result(What) -> orber:dbg("[~p] orber_cosnaming_utils:query_result(~p);~n" "Mnesia Access Failed", [?LINE, What], ?DEBUG_LEVEL), error.%%----------------------------------------------------------------------%% Function : check_addresses%% Arguments : %% Description: %% Returns : %%----------------------------------------------------------------------check_addresses(Str) -> {_, Rest2} = addresses(Str), case key(Rest2) of {_, []} -> ok; What -> orber:dbg("[~p] orber_cosnaming_utils:check_addresses(~p);~n" "Key ~p", [?LINE, Str, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}) end.%%----------------------------------------------------------------------%% Function : check_name%% Arguments : %% Description: %% Returns : %%----------------------------------------------------------------------check_name(Str) -> name(Str).%%----------------------------------------------------------------------%% Function : select_type%% Arguments : A corbaloc/corbaname-string.%% Description: %% Returns : A tuple which contain data about what connection we want to use |%% {'EXCEPTION', #'CosNaming_NamingContextExt_InvalidAddress'{}}%%----------------------------------------------------------------------select_type([$c, $o, $r, $b, $a, $l, $o, $c, $:|Rest1]) -> {Addresses, Rest2} = addresses(Rest1), case key(Rest2) of {Key, []} -> {corbaloc, Addresses, Key}; What -> orber:dbg("[~p] orber_cosnaming_utils:select_type(~p);~n" "Key ~p", [?LINE, Rest1, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}) end;select_type([$c, $o, $r, $b, $a, $n, $a, $m, $e, $:|Rest1]) -> {Addresses, Rest2} = addresses(Rest1), {Key, Rest3} = key(Rest2), Name = name(Rest3), {corbaname, Addresses, Key, string2name(Name)};select_type([$f, $i, $l, $e, $:, $/ |Rest]) -> file(Rest);select_type([$f, $t, $p, $:, $/, $/ |Rest]) -> ftp(Rest);select_type([$h, $t, $t, $p, $:, $/, $/ |Rest]) -> http(Rest);select_type(What) -> orber:dbg("[~p] orber_cosnaming_utils:select_type(~p);~n" "Malformed or unsupported type.", [?LINE, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}).%%----------------------------------------------------------------------%% Function : addresses%% Arguments : A corbaloc string.%% Description: %% Returns : A list of addresses an the remaining part possibly containg%% a Key and a stringified Name%%----------------------------------------------------------------------addresses(Str) -> addresses(address(protocol, Str, [], []), []).addresses({false, rir, Rest}, []) -> {rir, Rest};addresses({false, Adr, Rest}, Addresses) -> {lists:reverse([Adr|Addresses]), Rest};addresses({true, Adr, Rest}, Addresses) -> addresses(address(protocol, Rest, [], []), [Adr|Addresses]).%% Which protocol.address(protocol, [$:|T], [], []) -> address(version, T, [], [iiop]);address(protocol, [$i, $i, $o, $p, $:|T], [], []) -> address(version, T, [], [iiop]);address(protocol, [$r, $i, $r, $:|T], [], []) -> {false, rir, T};address(protocol, What, _, _) -> orber:dbg("[~p] orber_cosnaming_utils:address(~p);~n" "Malformed or unsupported protocol.", [?LINE, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{});%% Parsed one address, no version found or port found.address(version, [$,|T], Acc, Previous) -> {true, lists:reverse([?DEF_PORT, lists:reverse(Acc), ?DEF_VERS|Previous]), T};address(version, [$/|T], Acc, Previous) -> {false, lists:reverse([?DEF_PORT, lists:reverse(Acc), ?DEF_VERS|Previous]), T};%% Found iiop version.address(version, [$@|T], Acc, Previous) -> case Acc of [Minor, $., Major] -> address(address, T, [], [{Major-$0, Minor-$0}|Previous]); What -> orber:dbg("[~p] orber_cosnaming_utils:address(~p);~n" "Malformed or unsupported version.", [?LINE, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}) end;%% Found no iiop version, switch to port. In this case Acc contains the%% Host.address(version, [$:|T], Acc, Previous) -> case check_ip_version(T, [$:|Acc]) of false -> address(port, T, [], [lists:reverse(Acc), ?DEF_VERS|Previous]); {ok, NewAcc, NewT, Type} -> address(Type, NewT, [], [lists:reverse(NewAcc), ?DEF_VERS|Previous]) end;%% Parsed one address, port not found.address(address, [$,|T], [], Previous) -> {true, lists:reverse([?DEF_PORT|Previous]), T};address(address, [$/|T], [], Previous) -> {false, lists:reverse([?DEF_PORT|Previous]), T};address(address, [$,|T], Acc, Previous) -> {true, lists:reverse([?DEF_PORT, lists:reverse(Acc)|Previous]), T};address(address, [$/|T], Acc, Previous) -> {false, lists:reverse([?DEF_PORT, lists:reverse(Acc)|Previous]), T};%% Parsed one address.address(port, [$/|T], Acc, Previous) -> case catch list_to_integer(lists:reverse(Acc)) of Port when integer(Port) -> {false, lists:reverse([Port|Previous]), T}; What -> orber:dbg("[~p] orber_cosnaming_utils:address(~p);~n" "Malformed port.", [?LINE, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}) end;address(port, [$,|T], Acc, Previous) -> case catch list_to_integer(lists:reverse(Acc)) of Port when integer(Port) -> {true, lists:reverse([Port|Previous]), T}; What -> orber:dbg("[~p] orber_cosnaming_utils:address(~p);~n" "Malformed port.", [?LINE, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}) end;%% EOS, check how far we have reached so far and add necessary default values.address(version, [], Acc, Previous) -> {false, lists:reverse([?DEF_PORT, lists:reverse(Acc), ?DEF_VERS|Previous]), []};address(port, [], [], Previous) -> {false, lists:reverse([?DEF_PORT|Previous]), []};address(port, [], Acc, Previous) -> case catch list_to_integer(lists:reverse(Acc)) of Port when integer(Port) -> {false, lists:reverse([Port|Previous]), []}; What -> orber:dbg("[~p] orber_cosnaming_utils:address(~p);~n" "Malformed port.", [?LINE, What], ?DEBUG_LEVEL), corba:raise(#'CosNaming_NamingContextExt_InvalidAddress'{}) end;address(address, [], [], Previous) -> {false, lists:reverse([?DEF_PORT|Previous]), []};address(address, [], Acc, Previous) -> {false, lists:reverse([?DEF_PORT, lists:reverse(Acc)|Previous]), []}; %% Found portaddress(address, [$:|T], Acc, Previous) -> case check_ip_version(T, [$:|Acc]) of false -> address(port, T, [], [lists:reverse(Acc)|Previous]); {ok, NewAcc, NewT, Type} -> address(Type, NewT, [], [lists:reverse(NewAcc)|Previous]) end; address(Type, [H|T], Acc, Previous) -> address(Type, T, [H|Acc], Previous).check_ip_version(T, Acc) -> case orber_env:ip_version() of inet -> false; inet6 -> case search_for_delimiter(1, T, Acc, $:) of {ok, NewAcc, NewT, Type} -> {ok, NewAcc, NewT, Type}; _ -> false end end.%% An IPv6 address may look like (x == hex, d == dec):%% * "0:0:0:0:0:0:10.1.1.1" - x:x:x:x:x:x:d.d.d.d%% * "0:0:0:0:8:800:200C:417A" - x:x:x:x:x:x:x:x%% We cannot allow compressed addresses (::10.1.1.1) since we it is not%% possible to know if the last part is a port number or part of the address.search_for_delimiter(7, [], Acc, $:) -> {ok, Acc, [], address};search_for_delimiter(9, [], Acc, $.) -> {ok, Acc, [], address};search_for_delimiter(_, [], _, _) -> false;search_for_delimiter(7, [$/|T], Acc, $:) -> {ok, Acc, [$/|T], address};search_for_delimiter(9, [$/|T], Acc, $.) -> {ok, Acc, [$/|T], address};search_for_delimiter(_, [$/|_T], _Acc, _) -> false;search_for_delimiter(7, [$,|T], Acc, $:) -> {ok, Acc, [$,|T], address};search_for_delimiter(9, [$,|T], Acc, $.) -> {ok, Acc, [$,|T], address};search_for_delimiter(_, [$,|_T], _Acc, _) -> false;search_for_delimiter(7, [$:|T], Acc, $:) -> {ok, Acc, T, port};search_for_delimiter(9, [$:|T], Acc, $.) -> {ok, Acc, T, port};search_for_delimiter(N, [$:|T], Acc, $:) -> search_for_delimiter(N+1, T, [$:|Acc], $:);search_for_delimiter(N, [$.|T], Acc, $.) when N > 6, N < 9 -> search_for_delimiter(N+1, T, [$.|Acc], $.);search_for_delimiter(6, [$.|T], Acc, $:) -> search_for_delimiter(7, T, [$.|Acc], $.);search_for_delimiter(N, [H|T], Acc, LookingFor) -> search_for_delimiter(N, T, [H|Acc], LookingFor).%%----------------------------------------------------------------------%% Function : key%% Arguments : A string which contain a Key we want to use and, if defined,%% stringified NameComponent sequence.%% Description: %% Returns : The Key and the remaining part, i.e., a stringified %% NameComponent sequence.%%----------------------------------------------------------------------key(Str) -> key(Str, []).key([], []) -> {?DEF_KEY, []};key([], Acc) -> {lists:reverse(Acc), []};key([$#|T], []) -> {?DEF_KEY, T};key([$#|T], Acc) -> {lists:reverse(Acc), T};key([$/|T], []) -> key(T, []);key([H|T], Acc) -> key(T, [H|Acc]).%%----------------------------------------------------------------------%% Function : name%% Arguments : A string describing a NameComponent sequence.%% Description: %% Returns : The input string |%% {'EXCEPTION', #'CosNaming_NamingContext_InvalidName'{}}%%----------------------------------------------------------------------name(Str) -> name(Str, []).name([], Acc) -> lists:reverse(Acc);name([$., $/|_T], _) -> corba:raise(#'CosNaming_NamingContext_InvalidName'{});name([$/, $/|_T], _) -> corba:raise(#'CosNaming_NamingContext_InvalidName'{});name([$/|T], []) -> name(T, []);name([H|T], Acc) -> name(T, [H|Acc]).%%----------------------------------------------------------------------%% Function : file%% Arguments : A string describing connection parameters.%% Description: %% Returns : A tuple consisting of data extracted from the given string.%%----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?