diff options
author | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
---|---|---|
committer | Erlang/OTP <[email protected]> | 2009-11-20 14:54:40 +0000 |
commit | 84adefa331c4159d432d22840663c38f155cd4c1 (patch) | |
tree | bff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/megaco/src/text/megaco_text_mini_decoder.erl | |
download | otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2 otp-84adefa331c4159d432d22840663c38f155cd4c1.zip |
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/megaco/src/text/megaco_text_mini_decoder.erl')
-rw-r--r-- | lib/megaco/src/text/megaco_text_mini_decoder.erl | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/lib/megaco/src/text/megaco_text_mini_decoder.erl b/lib/megaco/src/text/megaco_text_mini_decoder.erl new file mode 100644 index 0000000000..6e1bf9295a --- /dev/null +++ b/lib/megaco/src/text/megaco_text_mini_decoder.erl @@ -0,0 +1,88 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2004-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% +%% + +%% +%%---------------------------------------------------------------------- +%%% Purpose: Encode PRETTY Megaco/H.248 text messages from internal form +%%---------------------------------------------------------------------- + +-module(megaco_text_mini_decoder). + +-export([decode_message/2]). + +-include("megaco_text_tokens.hrl"). +-include_lib("megaco/src/engine/megaco_message_internal.hrl"). + + +%%---------------------------------------------------------------------- +%% Convert a binary into a mini 'MegacoMessage' record +%% Return {ok, MegacoMessageRecord} | {error, Reason} +%%---------------------------------------------------------------------- + +decode_message(_, Bin) when is_binary(Bin) -> + case megaco_text_scanner:scan(Bin) of + {ok, Tokens, _Vsn, _LastLine} -> + decode_message(Tokens); + + {error, Reason, Line} -> + parse_error(Reason, Line, []) + end; +decode_message(_EC, _BadBin) -> + {error, bad_binary}. + + +decode_message(Tokens0) -> + Tokens = strip(Tokens0, []), + case (catch megaco_text_mini_parser:parse(Tokens)) of + {ok, MegacoMessage} -> + {ok, MegacoMessage}; + {error, Reason} -> + parse_error(Reason, Tokens); + + %% OTP-4007 + {'EXIT', Reason} -> + parse_error(Reason, Tokens) + end. + +strip([], Tokens) -> + lists:reverse(Tokens); +strip([{'TransToken', _Line, _Text}|_], Acc) -> + strip_finish(Acc); +strip([{'ReplyToken', _Line, _Text}|_], Acc) -> + strip_finish(Acc); +strip([{'PendingToken', _Line, _Text}|_], Acc) -> + strip_finish(Acc); +strip([{'ResponseAckToken', _Line, _Text}|_], Acc) -> + strip_finish(Acc); +strip([{'ErrorToken', _Line, _Text}|_], Acc) -> + strip_finish(Acc); +strip([H|T], Acc) -> + strip(T, [H|Acc]). + +strip_finish(RevTokens) -> + lists:reverse([{endOfMessage, 1, endOfMessage}|RevTokens]). + + +parse_error(Reason, Tokens) -> + {error, [{reason, Reason}, {token, Tokens}]}. + +parse_error(Reason, Line, Tokens) -> + {error, [{reason, Reason, Line}, {token, Tokens}]}. + + |