aboutsummaryrefslogtreecommitdiffstats
path: root/lib/megaco/src/text/megaco_text_mini_decoder.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/megaco/src/text/megaco_text_mini_decoder.erl
downloadotp-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.erl88
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}]}.
+
+