%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2019-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 user behaviour module
%%
%% This callback functions are the default! Its possible for the user to
%% provide a arbitrary number of "extra" arguments via the user_args
%% config option.
%% So, for instance, the handle_connect/2 could instead become
%% handle_connect/4 if the user sets the user_args option to [foo, bar].
%% This means that its impossible to define a proper behaviour.
%% So what we do here is to define a behaviour with the "default interface"
%% (the user_args option has the [] as the default value) and set them
%% all to be optional!
%%-------------------------------------------------------------------------
-module(megaco_user).
-export_type([
receive_handle/0,
conn_handle/0,
megaco_timer/0
]).
-include_lib("megaco/include/megaco.hrl").
%% -include_lib("megaco/include/megaco_message_v1.hrl").
-type receive_handle() :: #megaco_receive_handle{}.
-type conn_handle() :: #megaco_conn_handle{}.
-type megaco_timer() :: infinity | non_neg_integer() | #megaco_incr_timer{}.
-callback handle_connect(ConnHandle, ProtocolVersion) ->
ok | error | {error, ErrorDescr} when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ErrorDescr :: megaco_encoder:error_desc().
-callback handle_connect(ConnHandle, ProtocolVersion, Extra) ->
ok | error | {error, ErrorDescr} when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
Extra :: term(),
ErrorDescr :: megaco_encoder:error_desc().
-callback handle_disconnect(ConnHandle, ProtocolVersion, Reason) ->
megaco:void() when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
Reason :: term().
-callback handle_syntax_error(ReceiveHandle, ProtocolVersion, DefaultED) ->
reply | {reply, ED} | no_reply | {no_reply, ED} when
ReceiveHandle :: receive_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
DefaultED :: megaco_encoder:error_desc(),
ED :: megaco_encoder:error_desc().
-callback handle_syntax_error(ReceiveHandle, ProtocolVersion, DefaultED, Extra) ->
reply | {reply, ED} | no_reply | {no_reply, ED} when
ReceiveHandle :: receive_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
DefaultED :: megaco_encoder:error_desc(),
ED :: megaco_encoder:error_desc(),
Extra :: term().
-callback handle_message_error(ConnHandle, ProtocolVersion, ErrorDescr) ->
megaco:void() when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ErrorDescr :: megaco_encoder:error_desc().
-callback handle_message_error(ConnHandle, ProtocolVersion, ErrorDescr, Extra) ->
megaco:void() when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ErrorDescr :: megaco_encoder:error_desc(),
Extra :: term().
-callback handle_trans_request(ConnHandle, ProtocolVersion, ActionRequests) ->
Pending | Reply | ignore_trans_request when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ActionRequests :: [megaco_encoder:action_request()],
Pending :: {pending, ReqData},
ReqData :: term(),
Reply :: {AckAction, ActualReply} |
{AckAction, ActualReply, SendOptions},
AckAction :: discard_ack |
{handle_ack, AckData} |
{handle_pending_ack, AckData} |
{handle_sloppy_ack, AckData},
ActualReply :: [megaco_encoder:action_reply()] |
megaco_encoder:error_desc(),
AckData :: term(),
SendOptions :: [SendOption],
SendOption :: {reply_timer, megaco_timer()} |
{send_handle, term()} |
{protocol_version, integer()}.
-callback handle_trans_request(ConnHandle,
ProtocolVersion,
ActionRequests,
Extra) ->
Pending | Reply | ignore_trans_request when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ActionRequests :: [megaco_encoder:action_request()],
Extra :: term(),
Pending :: {pending, ReqData},
ReqData :: term(),
Reply :: {AckAction, ActualReply} |
{AckAction, ActualReply, SendOptions},
AckAction :: discard_ack |
{handle_ack, AckData} |
{handle_pending_ack, AckData} |
{handle_sloppy_ack, AckData},
ActualReply :: [megaco_encoder:action_reply()] |
megaco_encoder:error_desc(),
AckData :: term(),
SendOptions :: [SendOption],
SendOption :: {reply_timer, megaco_timer()} |
{send_handle, term()} |
{protocol_version, integer()}.
-callback handle_trans_long_request(ConnHandle, ProtocolVersion, ReqData) ->
Reply when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ReqData :: term(),
Reply :: {AckAction, ActualReply} |
{AckAction, ActualReply, SendOptions},
AckAction :: discard_ack |
{handle_ack, AckData} |
{handle_sloppy_ack, AckData},
ActualReply :: [megaco_encoder:action_reply()] |
megaco_encoder:error_desc(),
AckData :: term(),
SendOptions :: [SendOption],
SendOption :: {reply_timer, megaco_timer()} |
{send_handle, term()} |
{protocol_version, megaco_encoder:protocol_version()}.
-callback handle_trans_long_request(ConnHandle, ProtocolVersion, ReqData, Extra) ->
Reply when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
ReqData :: term(),
Extra :: term(),
Reply :: {AckAction, ActualReply} |
{AckAction, ActualReply, SendOptions},
AckAction :: discard_ack |
{handle_ack, AckData} |
{handle_sloppy_ack, AckData},
ActualReply :: [megaco_encoder:action_reply()] |
megaco_encoder:error_desc(),
AckData :: term(),
SendOptions :: [SendOption],
SendOption :: {reply_timer, megaco_timer()} |
{send_handle, term()} |
{protocol_version, megaco_encoder:protocol_version()}.
-callback handle_trans_reply(ConnHandle,
ProtocolVersion,
UserReply,
ReplyData) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
UserReply :: Success | Failure,
ReplyData :: term(),
Success :: {ok, Result},
Result :: TransactionResult | SegmentResult,
TransactionResult :: [megaco_encoder:action_reply()],
SegmentResult :: {megaco_encoder:segment_no(),
LastSegment,
[megaco_encoder:action_reply()]},
Failure :: {error, Reason} |
{error, ReplyNo, Reason},
Reason :: TransactionReason |
SegmentReason |
UserCancelReason |
SendReason |
OtherReason,
TransactionReason :: megaco_encoder:error_desc(),
SegmentReason :: {megaco_encoder:segment_no(),
LastSegment,
megaco_encoder:error_desc()},
OtherReason :: timeout |
{segment_timeout, MissingSegments} |
exceeded_recv_pending_limit | term(),
LastSegment :: boolean(),
MissingSegments :: [megaco_encoder:segment_no()],
UserCancelReason :: {user_cancel, ReasonForUserCancel},
ReasonForUserCancel :: term(),
SendReason :: SendCancelledReason | SendFailedReason,
SendCancelledReason :: {send_message_cancelled,
ReasonForSendCancel},
ReasonForSendCancel :: term(),
SendFailedReason :: {send_message_failed, ReasonForSendFailure},
ReasonForSendFailure :: term(),
ReplyNo :: pos_integer().
-callback handle_trans_reply(ConnHandle,
ProtocolVersion,
UserReply,
ReplyData,
Extra) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
UserReply :: Success | Failure,
ReplyData :: term(),
Extra :: term(),
Success :: {ok, Result},
Result :: TransactionResult | SegmentResult,
TransactionResult :: [megaco_encoder:action_reply()],
SegmentResult :: {megaco_encoder:segment_no(),
LastSegment,
[megaco_encoder:action_reply()]},
Failure :: {error, Reason} |
{error, ReplyNo, Reason},
Reason :: TransactionReason |
SegmentReason |
UserCancelReason |
SendReason |
OtherReason,
TransactionReason :: megaco_encoder:error_desc(),
SegmentReason :: {megaco_encoder:segment_no(),
LastSegment,
megaco_encoder:error_desc()},
OtherReason :: timeout |
{segment_timeout, MissingSegments} |
exceeded_recv_pending_limit | term(),
LastSegment :: boolean(),
MissingSegments :: [megaco_encoder:segment_no()],
UserCancelReason :: {user_cancel, ReasonForUserCancel},
ReasonForUserCancel :: term(),
SendReason :: SendCancelledReason | SendFailedReason,
SendCancelledReason :: {send_message_cancelled,
ReasonForSendCancel},
ReasonForSendCancel :: term(),
SendFailedReason :: {send_message_failed, ReasonForSendFailure},
ReasonForSendFailure :: term(),
ReplyNo :: pos_integer().
-callback handle_trans_ack(ConnHandle,
ProtocolVersion,
AckStatus,
AckData) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
AckStatus :: ok | {error, Reason},
AckData :: term(),
Reason :: UserCancelReason | SendReason | OtherReason,
UserCancelReason :: {user_cancel, ReasonForUserCancel},
ReasonForUserCancel :: term(),
SendReason :: SendCancelledReason | SendFailedReason,
SendCancelledReason :: {send_message_cancelled, ReasonForSendCancel},
ReasonForSendCancel :: term(),
SendFailedReason :: {send_message_failed, ReasonForSendFailure},
ReasonForSendFailure :: term(),
OtherReason :: term().
-callback handle_trans_ack(ConnHandle,
ProtocolVersion,
AckStatus,
AckData,
Extra) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
AckStatus :: ok | {error, Reason},
AckData :: term(),
Extra :: term(),
Reason :: UserCancelReason | SendReason | OtherReason,
UserCancelReason :: {user_cancel, ReasonForUserCancel},
ReasonForUserCancel :: term(),
SendReason :: SendCancelledReason | SendFailedReason,
SendCancelledReason :: {send_message_cancelled, ReasonForSendCancel},
ReasonForSendCancel :: term(),
SendFailedReason :: {send_message_failed, ReasonForSendFailure},
ReasonForSendFailure :: term(),
OtherReason :: term().
-callback handle_unexpected_trans(ConnHandle, ProtocolVersion, Trans) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
Trans :: megaco_encoder:transaction_pending() |
megaco_encoder:transaction_reply() |
megaco_encoder:transaction_response_ack().
-callback handle_unexpected_trans(ConnHandle, ProtocolVersion, Trans, Extra) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
Trans :: megaco_encoder:transaction_pending() |
megaco_encoder:transaction_reply() |
megaco_encoder:transaction_response_ack(),
Extra :: term().
-callback handle_trans_request_abort(ConnHandle,
ProtocolVersion,
TransNo,
Pid) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
TransNo :: integer(),
Pid :: undefined | pid().
-callback handle_trans_request_abort(ConnHandle,
ProtocolVersion,
TransNo,
Pid,
Extra) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
TransNo :: integer(),
Pid :: undefined | pid(),
Extra :: term().
-callback handle_segment_reply(ConnHandle,
ProtocolVersion,
TransNo,
SegNo,
SegCompl) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
TransNo :: integer(),
SegNo :: integer(),
SegCompl :: asn1_NOVALUE | 'NULL'.
-callback handle_segment_reply(ConnHandle,
ProtocolVersion,
TransNo,
SegNo,
SegCompl,
Extra) ->
ok when
ConnHandle :: conn_handle(),
ProtocolVersion :: megaco_encoder:protocol_version(),
TransNo :: integer(),
SegNo :: megaco_encoder:segment_no(),
SegCompl :: asn1_NOVALUE | 'NULL',
Extra :: term().
-optional_callbacks(
[
%% The actual number of arguments to *all* functions,
%% depend of the user_args config option.
handle_connect/2,
handle_connect/3,
handle_disconnect/3,
handle_syntax_error/3,
handle_syntax_error/4,
handle_message_error/3,
handle_message_error/4,
handle_trans_request/3,
handle_trans_request/4,
handle_trans_long_request/3,
handle_trans_long_request/4,
handle_trans_reply/4,
handle_trans_reply/5,
handle_trans_ack/4,
handle_trans_ack/5,
handle_unexpected_trans/3,
handle_unexpected_trans/4,
handle_trans_request_abort/4,
handle_trans_request_abort/5,
handle_segment_reply/5,
handle_segment_reply/6
]).