⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 megaco_erl_dist_encoder.erl

📁 OTP是开放电信平台的简称
💻 ERL
字号:
%% ``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$%%%%----------------------------------------------------------------------%% Purpose: Externalize/internalize Megaco/H.248 messages%%-----------------------------------------------------------------------module(megaco_erl_dist_encoder).-behaviour(megaco_encoder).-export([encode_message/3, decode_message/3,         decode_mini_message/3,	 encode_transaction/3,	 encode_action_requests/3,	 encode_action_request/3,	 encode_command_request/3,	 encode_action_reply/3	]).-export([version_of/2]).%% Backward compatible funcs:-export([encode_message/2, decode_message/2]).-include("megaco_message_internal.hrl").-define(MC_MOD, megaco_erl_dist_encoder_mc).%%----------------------------------------------------------------------%% Convert a 'MegacoMessage' record into a binary%% Return {ok, DeepIoList} | {error, Reason}%%----------------------------------------------------------------------encode_message(Config, 	       #'MegacoMessage'{mess = #'Message'{version = V}} = MegaMsg) ->    encode_message(Config, V, MegaMsg).encode_message([{version3, _}|EC], Vsn, MegaMsg) ->    encode_message(EC, Vsn, MegaMsg);encode_message([megaco_compressed|Config], Vsn, MegaMsg)   when is_record(MegaMsg, 'MegacoMessage') ->    {ok, erlang:term_to_binary(?MC_MOD:encode(MegaMsg, Vsn), Config)};encode_message([{megaco_compressed, Mod}|Config], Vsn, MegaMsg)   when is_atom(Mod) and is_record(MegaMsg, 'MegacoMessage') ->    {ok, erlang:term_to_binary(Mod:encode(MegaMsg, Vsn), Config)};encode_message(Config, _Vsn, MegaMsg)   when is_record(MegaMsg, 'MegacoMessage') ->    {ok, erlang:term_to_binary(MegaMsg, Config)};encode_message(_Config, _Vsn, _MegaMsg) ->    {error, not_a_megaco_message}.%%----------------------------------------------------------------------%% Convert a transaction record into a binary%% Return {ok, Bin} | {error, Reason}%%----------------------------------------------------------------------encode_transaction([{version3, _}|EC], Vsn, Trans) ->    encode_transaction(EC, Vsn, Trans);encode_transaction([megaco_compressed|Config], _Vsn, Trans) ->    {ok, erlang:term_to_binary(?MC_MOD:encode(Trans), Config)};encode_transaction([{megaco_compressed, Mod}|Config], _Vsn, Trans) ->    {ok, erlang:term_to_binary(Mod:encode(Trans), Config)};encode_transaction(Config, _Vsn, Trans) ->    {ok, erlang:term_to_binary(Trans, Config)}.%%----------------------------------------------------------------------%% Convert a list of ActionRequest record's into a binary%% Return {ok, Binary} | {error, Reason}%%----------------------------------------------------------------------encode_action_requests([{version3, _}|EC], Vsn, ActReqs) ->    encode_action_requests(EC, Vsn, ActReqs);encode_action_requests([megaco_compressed|Config], Vsn, ActReqs0)   when is_list(ActReqs0) ->    ActReqs = [?MC_MOD:encode(AR, Vsn) || AR <- ActReqs0],    {ok, erlang:term_to_binary(ActReqs, Config)};encode_action_requests([{megaco_compressed, Mod}|Config], Vsn, ActReqs0)   when is_list(ActReqs0) ->    ActReqs = [Mod:encode(AR, Vsn) || AR <- ActReqs0],    {ok, erlang:term_to_binary(ActReqs, Config)};encode_action_requests(Config, _Vsn, ActReqs)   when is_list(ActReqs) ->    {ok, erlang:term_to_binary(ActReqs, Config)}.%%----------------------------------------------------------------------%% Convert a ActionRequest record into a binary%% Return {ok, Binary} | {error, Reason}%%----------------------------------------------------------------------encode_action_request([{version3, _}|EC], Vsn, ActReq) ->    encode_action_request(EC, Vsn, ActReq);encode_action_request([megaco_compressed|Config], Vsn, ActReq)   when is_tuple(ActReq) ->    {ok, erlang:term_to_binary(?MC_MOD:encode(ActReq, Vsn), Config)};encode_action_request([{megaco_compressed, Mod}|Config], Vsn, ActReq)   when is_tuple(ActReq) ->    {ok, erlang:term_to_binary(Mod:encode(ActReq, Vsn), Config)};encode_action_request(Config, _Vsn, ActReq)   when is_tuple(ActReq) ->    {ok, erlang:term_to_binary(ActReq, Config)}.%%----------------------------------------------------------------------%% Convert a CommandRequest record into a binary%% Return {ok, DeepIoList} | {error, Reason}%%----------------------------------------------------------------------encode_command_request([{version3, _}|EC], Vsn, CmdReq) ->    encode_command_request(EC, Vsn, CmdReq);encode_command_request([megaco_compressed|Config], Vsn, CmdReq)  when is_tuple(CmdReq) ->    {ok, erlang:term_to_binary(?MC_MOD:encode(CmdReq, Vsn), Config)};encode_command_request([{megaco_compressed, Mod}|Config], Vsn, CmdReq)  when tuple(CmdReq) ->    {ok, erlang:term_to_binary(Mod:encode(CmdReq, Vsn), Config)};encode_command_request(Config, _Vsn, CmdReq)  when tuple(CmdReq) ->    {ok, erlang:term_to_binary(CmdReq, Config)}. %%----------------------------------------------------------------------%% Convert a action reply into a binary%% Return {ok, DeepIoList} | {error, Reason}%%----------------------------------------------------------------------encode_action_reply([{version3, _}|EC], Vsn, ActRep) ->    encode_action_reply(EC, Vsn, ActRep);encode_action_reply([megaco_compressed|Config], Vsn, ActRep)   when is_tuple(ActRep) ->    {ok, erlang:term_to_binary(?MC_MOD:encode(ActRep, Vsn), Config)};encode_action_reply([{megaco_compressed, Mod}|Config], Vsn, ActRep)   when is_tuple(ActRep) ->    {ok, erlang:term_to_binary(Mod:encode(ActRep, Vsn), Config)};encode_action_reply(Config, _Vsn, ActRep)   when is_tuple(ActRep) ->    {ok, erlang:term_to_binary(ActRep, Config)}.  %%----------------------------------------------------------------------%% Get the megaco version of the message%% Return {ok, Version} | {error, Reason}%%----------------------------------------------------------------------version_of(Config, Bin) when binary(Bin) ->    case decode_message(Config, 1, Bin) of	{ok, M} ->	    V = (M#'MegacoMessage'.mess)#'Message'.version,	    {ok, V};	Error ->	    Error    end.decode_message(Config, Bin) ->    decode_message(Config, 1, Bin).				   decode_message([{version3, _}|EC], V, Bin) ->    decode_message(EC, V, Bin);decode_message([megaco_compressed = MC|_Config], Vsn, Bin) ->    case catch erlang:binary_to_term(Bin) of	Msg when is_tuple(Msg) ->	    case (?MC_MOD:decode(Msg, Vsn)) of		MegaMsg when is_record(MegaMsg, 'MegacoMessage') ->		    {ok, dm(MegaMsg, MC, Vsn)};		_ ->		    {error, {bad_message, Msg}}	    end;	{'EXIT', _Reason} ->	    {error, bad_binary}    end;decode_message([{megaco_compressed, Mod} = MC|_Config], Vsn, Bin)   when is_atom(Mod) ->    case catch erlang:binary_to_term(Bin) of	Msg when is_tuple(Msg) ->	    case (Mod:decode(Msg, Vsn)) of		MegaMsg when is_record(MegaMsg, 'MegacoMessage') ->		    {ok, dm(MegaMsg, MC, Vsn)};		_ ->		    {error, {bad_message, Msg}}	    end;	{'EXIT', _Reason} ->	    {error, bad_binary}    end;decode_message(_Config, Vsn, Bin) ->    case catch erlang:binary_to_term(Bin) of	MegaMsg when is_record(MegaMsg, 'MegacoMessage') ->	    {ok, dm(MegaMsg, undefined, Vsn)};	{'EXIT', _Reason} ->	    {error, bad_binary}    end.decode_mini_message(EC, Vsn, Bin) when is_binary(Bin) ->    decode_message(EC, Vsn, Bin).%% This crap is because the transactions or the action-requests%% might have been encoded separetelydm(#'MegacoMessage'{mess = Mess} = M, MC, Vsn) ->    #'Message'{messageBody = Body} = Mess,    case Body of	{transactions, Transactions} ->	    Body2 = {transactions, dmt(Transactions, [], MC, Vsn)},	    Mess2 = Mess#'Message'{messageBody = Body2},	    M#'MegacoMessage'{mess = Mess2};	_ ->	    M    end.dmt([], Acc, _, _Vsn) ->    lists:reverse(Acc);dmt([Trans0|Transactions], Acc, MC, Vsn) when is_binary(Trans0) ->    Trans1 = erlang:binary_to_term(Trans0),    Trans2 = dmt1(Trans1, MC, Vsn),    dmt(Transactions, [Trans2|Acc], MC, Vsn);dmt([{Tag, Trans0}|Transactions], Acc, MC, Vsn) when is_binary(Trans0) ->    Trans1 = erlang:binary_to_term(Trans0),    Trans2 = dmt1(Trans1, MC, Vsn),    dmt(Transactions, [{Tag, Trans2}|Acc], MC, Vsn);dmt([{transactionRequest,       #'TransactionRequest'{actions = Acts0} = TR0}|Transactions],     Acc, MC, Vsn)   when is_binary(Acts0) ->    Acts1 = erlang:binary_to_term(Acts0),    Acts2 = dmt1(Acts1, MC, Vsn),    TR1 = TR0#'TransactionRequest'{actions = Acts2},    dmt(Transactions, [{transactionRequest, TR1}|Acc], MC, Vsn);dmt([{transactionRequest,       #'TransactionRequest'{actions = Acts0} = TR0}|Transactions],     Acc, MC, Vsn) ->    Acts2 = [dmt2(AR, MC, Vsn) || AR <- Acts0],    TR1 = TR0#'TransactionRequest'{actions = Acts2},    dmt(Transactions, [{transactionRequest, TR1}|Acc], MC, Vsn);dmt([Trans|Transactions], Acc, MC, Vsn) ->    dmt(Transactions, [Trans|Acc], MC, Vsn).dmt1(L, megaco_compressed, Vsn) when is_list(L) ->    [?MC_MOD:decode(E, Vsn) || E <- L];dmt1(L, {megaco_compressed, Mod}, Vsn) when is_list(L) ->    [Mod:decode(E, Vsn) || E <- L];dmt1(T, megaco_compressed, Vsn) when is_tuple(T) ->    ?MC_MOD:decode(T, Vsn);dmt1(T, {megaco_compressed, Mod}, Vsn) when is_tuple(T) ->    Mod:decode(T, Vsn);dmt1(Else, _, _Vsn) ->    Else.	    dmt2(Bin, MC, Vsn) when is_binary(Bin) ->    AR = erlang:binary_to_term(Bin),    dmt1(AR, MC, Vsn);dmt2(AR, _MC, _Vsn) ->    AR.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -