%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2003-2019. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
%%----------------------------------------------------------------------
%% Purpose: Megaco encoder behaviour module
%%----------------------------------------------------------------------
-module(megaco_encoder).
-export_type([
protocol_version/0,
segment_no/0,
megaco_message/0,
transaction/0,
transaction_request/0,
transaction_pending/0,
transaction_reply/0,
transaction_response_ack/0,
transaction_ack/0,
segment_reply/0,
action_request/0,
action_reply/0,
command_request/0,
error_desc/0
]).
-include("megaco_message_internal.hrl").
-type protocol_version() :: integer().
-type segment_no() :: integer().
-type megaco_message() :: #'MegacoMessage'{}.
-type transaction() :: {transactionRequest, transaction_request()} |
{transactionPending, transaction_reply()} |
{transactionReply, transaction_pending()} |
{transactionResponseAck, transaction_response_ack()} |
{segmentReply, segment_reply()}.
-type transaction_request() :: #'TransactionRequest'{}.
-type transaction_pending() :: #'TransactionPending'{}.
%% The problem with TransactionReply is that its definition depend
%% on which version of the protocol we are using. As of version 3,
%% it has two more fields.
%% -type transaction_reply() :: #'TransactionReply'{}.
-type transaction_reply() :: {'TransactionReply', _, _} |
{'TransactionReply', _, _, _, _}.
-type transaction_response_ack() :: [transaction_ack()].
-type transaction_ack() :: #'TransactionAck'{}.
-type segment_reply() :: #'SegmentReply'{}.
%% -type action_request() :: #'ActionRequest'{}.
-type action_request() :: {'ActionRequest', _, _, _, _}.
%% -type action_reply() :: #'ActionReply'{}.
-type action_reply() :: {'ActionReply', _, _, _}.
%% -type command_request() :: #'CommandRequest'{}.
-type command_request() :: {'CommandRequest', _, _, _}.
-type error_desc() :: #'ErrorDescriptor'{}.
-callback encode_message(EncodingConfig,
Version,
Message) -> {ok, Bin} | Error when
EncodingConfig :: list(),
Version :: protocol_version(),
Message :: megaco_message(),
Bin :: binary(),
Error :: term().
-callback decode_message(EncodingConfig,
Version,
Bin) -> {ok, Message} | Error when
EncodingConfig :: list(),
Version :: protocol_version() | dynamic,
Bin :: binary(),
Message :: megaco_message(),
Error :: term().
-callback decode_mini_message(EncodingConfig,
Version,
Bin) -> {ok, Message} | Error when
EncodingConfig :: list(),
Version :: protocol_version() | dynamic,
Bin :: binary(),
Message :: megaco_message(),
Error :: term().
-callback encode_transaction(EncodingConfig,
Version,
Transaction) -> {ok, Bin} | {error, Reason} when
EncodingConfig :: list(),
Version :: protocol_version(),
Transaction :: transaction(),
Bin :: binary(),
Reason :: not_implemented | term().
-callback encode_action_requests(EncodingConfig,
Version,
ARs) -> {ok, Bin} | {error, Reason} when
EncodingConfig :: list(),
Version :: protocol_version(),
ARs :: [action_request()],
Bin :: binary(),
Reason :: not_implemented | term().
-callback encode_action_reply(EncodingConfig,
Version,
AR) -> {ok, Bin} | {error, Reason} when
EncodingConfig :: list(),
Version :: protocol_version(),
AR :: action_reply(),
Bin :: binary(),
Reason :: not_implemented | term().
-optional_callbacks(
[
encode_action_reply/3 % Only used if segementation is used
]).