Asterisk - The Open Source Telephony Project GIT-master-754dea3
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Data Structures | Macros | Enumerations | Functions
aoc.h File Reference

Generic Advice of Charge encode and decode routines. More...

#include "asterisk/channel.h"
Include dependency graph for aoc.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ast_aoc_charging_association
 
struct  ast_aoc_charging_association_number
 
struct  ast_aoc_duration_rate
 
struct  ast_aoc_flat_rate
 
struct  ast_aoc_s_entry
 
struct  ast_aoc_time
 
struct  ast_aoc_unit_entry
 
struct  ast_aoc_volume_rate
 

Macros

#define AOC_CURRENCY_NAME_SIZE   (10 + 1)
 

Enumerations

enum  ast_aoc_billing_id {
  AST_AOC_BILLING_NA = 0 , AST_AOC_BILLING_NORMAL , AST_AOC_BILLING_REVERSE_CHARGE , AST_AOC_BILLING_CREDIT_CARD ,
  AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL , AST_AOC_BILLING_CALL_FWD_BUSY , AST_AOC_BILLING_CALL_FWD_NO_REPLY , AST_AOC_BILLING_CALL_DEFLECTION ,
  AST_AOC_BILLING_CALL_TRANSFER , AST_AOC_BILLING_NUM_ENTRIES
}
 Defines the billing id options for an aoc message. More...
 
enum  ast_aoc_charge_type { AST_AOC_CHARGE_NA = 0 , AST_AOC_CHARGE_FREE , AST_AOC_CHARGE_CURRENCY , AST_AOC_CHARGE_UNIT }
 
enum  AST_AOC_CHARGING_ASSOCIATION { AST_AOC_CHARGING_ASSOCIATION_NA , AST_AOC_CHARGING_ASSOCIATION_NUMBER , AST_AOC_CHARGING_ASSOCIATION_ID }
 
enum  ast_aoc_currency_multiplier {
  AST_AOC_MULT_ONETHOUSANDTH = 1 , AST_AOC_MULT_ONEHUNDREDTH , AST_AOC_MULT_ONETENTH , AST_AOC_MULT_ONE ,
  AST_AOC_MULT_TEN , AST_AOC_MULT_HUNDRED , AST_AOC_MULT_THOUSAND , AST_AOC_MULT_NUM_ENTRIES
}
 Defines the currency multiplier for an aoc message. More...
 
enum  ast_aoc_request { AST_AOC_REQUEST_S = (1 << 0) , AST_AOC_REQUEST_D = (1 << 1) , AST_AOC_REQUEST_E = (1 << 2) }
 
enum  ast_aoc_s_charged_item {
  AST_AOC_CHARGED_ITEM_NA , AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT , AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION , AST_AOC_CHARGED_ITEM_CALL_ATTEMPT ,
  AST_AOC_CHARGED_ITEM_CALL_SETUP , AST_AOC_CHARGED_ITEM_USER_USER_INFO , AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE
}
 
enum  ast_aoc_s_rate_type {
  AST_AOC_RATE_TYPE_NA , AST_AOC_RATE_TYPE_FREE , AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING , AST_AOC_RATE_TYPE_DURATION ,
  AST_AOC_RATE_TYPE_FLAT , AST_AOC_RATE_TYPE_VOLUME , AST_AOC_RATE_TYPE_SPECIAL_CODE
}
 
enum  ast_aoc_time_scale {
  AST_AOC_TIME_SCALE_HUNDREDTH_SECOND , AST_AOC_TIME_SCALE_TENTH_SECOND , AST_AOC_TIME_SCALE_SECOND , AST_AOC_TIME_SCALE_TEN_SECOND ,
  AST_AOC_TIME_SCALE_MINUTE , AST_AOC_TIME_SCALE_HOUR , AST_AOC_TIME_SCALE_DAY
}
 
enum  ast_aoc_total_type { AST_AOC_TOTAL = 0 , AST_AOC_SUBTOTAL = 1 }
 
enum  ast_aoc_type { AST_AOC_REQUEST = 0 , AST_AOC_S , AST_AOC_D , AST_AOC_E }
 
enum  ast_aoc_volume_unit { AST_AOC_VOLUME_UNIT_OCTET , AST_AOC_VOLUME_UNIT_SEGMENT , AST_AOC_VOLUME_UNIT_MESSAGE }
 

Functions

int ast_aoc_add_unit_entry (struct ast_aoc_decoded *decoded, const unsigned int amount_is_present, const unsigned int amount, const unsigned int type_is_present, const unsigned int type)
 Adds a unit entry into the list of units. More...
 
int ast_aoc_cli_init (void)
 enable aoc cli options More...
 
struct ast_aoc_decodedast_aoc_create (const enum ast_aoc_type msg_type, const enum ast_aoc_charge_type charge_type, const enum ast_aoc_request requests)
 creates a ast_aoc_decode object of a specific message type More...
 
struct ast_aoc_decodedast_aoc_decode (struct ast_aoc_encoded *encoded, size_t size, struct ast_channel *chan)
 decodes an encoded aoc payload. More...
 
int ast_aoc_decoded2str (const struct ast_aoc_decoded *decoded, struct ast_str **msg)
 Convert decoded aoc msg to string representation. More...
 
void * ast_aoc_destroy_decoded (struct ast_aoc_decoded *decoded)
 free an ast_aoc_decoded object More...
 
void * ast_aoc_destroy_encoded (struct ast_aoc_encoded *encoded)
 free an ast_aoc_encoded object More...
 
struct ast_aoc_encodedast_aoc_encode (struct ast_aoc_decoded *decoded, size_t *out_size, struct ast_channel *chan)
 encodes a decoded aoc structure so it can be passed on the wire More...
 
const struct ast_aoc_charging_associationast_aoc_get_association_info (struct ast_aoc_decoded *decoded)
 get the charging association info for AOC-E messages More...
 
enum ast_aoc_billing_id ast_aoc_get_billing_id (struct ast_aoc_decoded *decoded)
 get the billing id for AOC-D and AOC-E messages More...
 
enum ast_aoc_charge_type ast_aoc_get_charge_type (struct ast_aoc_decoded *decoded)
 get the charging type for an AOC-D or AOC-E message More...
 
unsigned int ast_aoc_get_currency_amount (struct ast_aoc_decoded *decoded)
 get the currency amount for AOC-D and AOC-E messages More...
 
enum ast_aoc_currency_multiplier ast_aoc_get_currency_multiplier (struct ast_aoc_decoded *decoded)
 get the currency multiplier for AOC-D and AOC-E messages More...
 
const char * ast_aoc_get_currency_multiplier_decimal (struct ast_aoc_decoded *decoded)
 get the currency multiplier for AOC-D and AOC-E messages in decimal format More...
 
const char * ast_aoc_get_currency_name (struct ast_aoc_decoded *decoded)
 get the currency name for AOC-D and AOC-E messages More...
 
enum ast_aoc_type ast_aoc_get_msg_type (struct ast_aoc_decoded *decoded)
 get the message type, AOC-D, AOC-E, or AOC Request More...
 
enum ast_aoc_request ast_aoc_get_request (struct ast_aoc_decoded *decoded)
 get the types of AOC requested for when message type is AOC Request More...
 
int ast_aoc_get_termination_request (struct ast_aoc_decoded *decoded)
 get whether or not the AST_AOC_REQUEST message as a termination request. More...
 
enum ast_aoc_total_type ast_aoc_get_total_type (struct ast_aoc_decoded *decoded)
 get the type of total for a AOC-D message More...
 
unsigned int ast_aoc_get_unit_count (struct ast_aoc_decoded *decoded)
 get the number of unit entries for AOC-D and AOC-E messages More...
 
const struct ast_aoc_unit_entryast_aoc_get_unit_info (struct ast_aoc_decoded *decoded, unsigned int entry_number)
 get a specific unit entry. More...
 
int ast_aoc_manager_event (const struct ast_aoc_decoded *decoded, struct ast_channel *chan)
 generate AOC manager event for an AOC-S, AOC-D, or AOC-E msg More...
 
int ast_aoc_s_add_rate_duration (struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, unsigned int amount, enum ast_aoc_currency_multiplier multiplier, const char *currency_name, unsigned long time, enum ast_aoc_time_scale time_scale, unsigned long granularity_time, enum ast_aoc_time_scale granularity_time_scale, int step_function)
 Add AOC-S duration rate entry. More...
 
int ast_aoc_s_add_rate_flat (struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, unsigned int amount, enum ast_aoc_currency_multiplier multiplier, const char *currency_name)
 Add AOC-S flat rate entry. More...
 
int ast_aoc_s_add_rate_free (struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, int from_beginning)
 Add AOC-S indicating charge item is free. More...
 
int ast_aoc_s_add_rate_na (struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item)
 Add AOC-S entry indicating charge item is not available. More...
 
int ast_aoc_s_add_rate_special_charge_code (struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, unsigned int code)
 Add AOC-S special rate entry. More...
 
int ast_aoc_s_add_rate_volume (struct ast_aoc_decoded *decoded, enum ast_aoc_s_charged_item charged_item, enum ast_aoc_volume_unit volume_unit, unsigned int amount, enum ast_aoc_currency_multiplier multiplier, const char *currency_name)
 Add AOC-S volume rate entry. More...
 
int ast_aoc_s_add_special_arrangement (struct ast_aoc_decoded *decoded, unsigned int code)
 Add AOC-S special arrangement entry. More...
 
unsigned int ast_aoc_s_get_count (struct ast_aoc_decoded *decoded)
 get the number rates associated with an AOC-S message More...
 
const struct ast_aoc_s_entryast_aoc_s_get_rate_info (struct ast_aoc_decoded *decoded, unsigned int entry_number)
 get a specific AOC-S rate entry. More...
 
int ast_aoc_set_association_id (struct ast_aoc_decoded *decoded, const int id)
 set the charging association id for an AST_AOC_E message More...
 
int ast_aoc_set_association_number (struct ast_aoc_decoded *decoded, const char *num, uint8_t plan)
 set the charging association number for an AOC-E message More...
 
int ast_aoc_set_billing_id (struct ast_aoc_decoded *decoded, const enum ast_aoc_billing_id id)
 set the billing id for a AOC-D or AST_AOC_E message More...
 
int ast_aoc_set_currency_info (struct ast_aoc_decoded *decoded, const unsigned int amount, const enum ast_aoc_currency_multiplier multiplier, const char *name)
 Sets the currency values for a AOC-D or AOC-E message. More...
 
int ast_aoc_set_termination_request (struct ast_aoc_decoded *decoded)
 Mark the AST_AOC_REQUEST message as a termination request. More...
 
int ast_aoc_set_total_type (struct ast_aoc_decoded *decoded, const enum ast_aoc_total_type type)
 Sets the type of total for a AOC-D message. More...
 
int ast_aoc_test_encode_decode_match (struct ast_aoc_decoded *decoded)
 test aoc encode decode routines. More...
 

Detailed Description

Generic Advice of Charge encode and decode routines.

Author
David Vossel dvoss.nosp@m.el@d.nosp@m.igium.nosp@m..com

Definition in file aoc.h.

Macro Definition Documentation

◆ AOC_CURRENCY_NAME_SIZE

#define AOC_CURRENCY_NAME_SIZE   (10 + 1)

Definition at line 31 of file aoc.h.

Enumeration Type Documentation

◆ ast_aoc_billing_id

Defines the billing id options for an aoc message.

Note
AOC-D is limited to NORMAL, REVERSE_CHARGE, and CREDIT_CARD.
Enumerator
AST_AOC_BILLING_NA 
AST_AOC_BILLING_NORMAL 
AST_AOC_BILLING_REVERSE_CHARGE 
AST_AOC_BILLING_CREDIT_CARD 
AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL 
AST_AOC_BILLING_CALL_FWD_BUSY 
AST_AOC_BILLING_CALL_FWD_NO_REPLY 
AST_AOC_BILLING_CALL_DEFLECTION 
AST_AOC_BILLING_CALL_TRANSFER 
AST_AOC_BILLING_NUM_ENTRIES 

Definition at line 49 of file aoc.h.

49 {
59 AST_AOC_BILLING_NUM_ENTRIES /* must remain the last item in enum, not a valid billing id */
60};
@ AST_AOC_BILLING_NUM_ENTRIES
Definition: aoc.h:59
@ AST_AOC_BILLING_CALL_FWD_BUSY
Definition: aoc.h:55
@ AST_AOC_BILLING_CALL_FWD_NO_REPLY
Definition: aoc.h:56
@ AST_AOC_BILLING_NORMAL
Definition: aoc.h:51
@ AST_AOC_BILLING_CALL_DEFLECTION
Definition: aoc.h:57
@ AST_AOC_BILLING_CREDIT_CARD
Definition: aoc.h:53
@ AST_AOC_BILLING_CALL_TRANSFER
Definition: aoc.h:58
@ AST_AOC_BILLING_CALL_FWD_UNCONDITIONAL
Definition: aoc.h:54
@ AST_AOC_BILLING_REVERSE_CHARGE
Definition: aoc.h:52
@ AST_AOC_BILLING_NA
Definition: aoc.h:50

◆ ast_aoc_charge_type

Enumerator
AST_AOC_CHARGE_NA 
AST_AOC_CHARGE_FREE 
AST_AOC_CHARGE_CURRENCY 
AST_AOC_CHARGE_UNIT 

Definition at line 69 of file aoc.h.

69 {
73 AST_AOC_CHARGE_UNIT, /* unit must remain the last item in enum */
74};
@ AST_AOC_CHARGE_CURRENCY
Definition: aoc.h:72
@ AST_AOC_CHARGE_FREE
Definition: aoc.h:71
@ AST_AOC_CHARGE_UNIT
Definition: aoc.h:73
@ AST_AOC_CHARGE_NA
Definition: aoc.h:70

◆ AST_AOC_CHARGING_ASSOCIATION

Enumerator
AST_AOC_CHARGING_ASSOCIATION_NA 
AST_AOC_CHARGING_ASSOCIATION_NUMBER 
AST_AOC_CHARGING_ASSOCIATION_ID 

Definition at line 185 of file aoc.h.

185 {
189};
@ AST_AOC_CHARGING_ASSOCIATION_NA
Definition: aoc.h:186
@ AST_AOC_CHARGING_ASSOCIATION_ID
Definition: aoc.h:188
@ AST_AOC_CHARGING_ASSOCIATION_NUMBER
Definition: aoc.h:187

◆ ast_aoc_currency_multiplier

Defines the currency multiplier for an aoc message.

Enumerator
AST_AOC_MULT_ONETHOUSANDTH 
AST_AOC_MULT_ONEHUNDREDTH 
AST_AOC_MULT_ONETENTH 
AST_AOC_MULT_ONE 
AST_AOC_MULT_TEN 
AST_AOC_MULT_HUNDRED 
AST_AOC_MULT_THOUSAND 
AST_AOC_MULT_NUM_ENTRIES 

Definition at line 34 of file aoc.h.

34 {
42 AST_AOC_MULT_NUM_ENTRIES, /* must remain the last item in enum, this is not a valid type */
43};
@ AST_AOC_MULT_TEN
Definition: aoc.h:39
@ AST_AOC_MULT_ONEHUNDREDTH
Definition: aoc.h:36
@ AST_AOC_MULT_HUNDRED
Definition: aoc.h:40
@ AST_AOC_MULT_NUM_ENTRIES
Definition: aoc.h:42
@ AST_AOC_MULT_ONETENTH
Definition: aoc.h:37
@ AST_AOC_MULT_ONETHOUSANDTH
Definition: aoc.h:35
@ AST_AOC_MULT_THOUSAND
Definition: aoc.h:41
@ AST_AOC_MULT_ONE
Definition: aoc.h:38

◆ ast_aoc_request

Enumerator
AST_AOC_REQUEST_S 
AST_AOC_REQUEST_D 
AST_AOC_REQUEST_E 

Definition at line 76 of file aoc.h.

76 {
77 AST_AOC_REQUEST_S = (1 << 0),
78 AST_AOC_REQUEST_D = (1 << 1),
79 AST_AOC_REQUEST_E = (1 << 2),
80};
@ AST_AOC_REQUEST_E
Definition: aoc.h:79
@ AST_AOC_REQUEST_D
Definition: aoc.h:78
@ AST_AOC_REQUEST_S
Definition: aoc.h:77

◆ ast_aoc_s_charged_item

Enumerator
AST_AOC_CHARGED_ITEM_NA 
AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT 
AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION 
AST_AOC_CHARGED_ITEM_CALL_ATTEMPT 
AST_AOC_CHARGED_ITEM_CALL_SETUP 
AST_AOC_CHARGED_ITEM_USER_USER_INFO 
AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE 

Definition at line 145 of file aoc.h.

145 {
153};
@ AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION
Definition: aoc.h:148
@ AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT
Definition: aoc.h:147
@ AST_AOC_CHARGED_ITEM_NA
Definition: aoc.h:146
@ AST_AOC_CHARGED_ITEM_USER_USER_INFO
Definition: aoc.h:151
@ AST_AOC_CHARGED_ITEM_CALL_SETUP
Definition: aoc.h:150
@ AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE
Definition: aoc.h:152
@ AST_AOC_CHARGED_ITEM_CALL_ATTEMPT
Definition: aoc.h:149

◆ ast_aoc_s_rate_type

Enumerator
AST_AOC_RATE_TYPE_NA 
AST_AOC_RATE_TYPE_FREE 
AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING 
AST_AOC_RATE_TYPE_DURATION 
AST_AOC_RATE_TYPE_FLAT 
AST_AOC_RATE_TYPE_VOLUME 
AST_AOC_RATE_TYPE_SPECIAL_CODE 

Definition at line 155 of file aoc.h.

155 {
163};
@ AST_AOC_RATE_TYPE_VOLUME
Definition: aoc.h:161
@ AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING
Definition: aoc.h:158
@ AST_AOC_RATE_TYPE_SPECIAL_CODE
Definition: aoc.h:162
@ AST_AOC_RATE_TYPE_NA
Definition: aoc.h:156
@ AST_AOC_RATE_TYPE_DURATION
Definition: aoc.h:159
@ AST_AOC_RATE_TYPE_FLAT
Definition: aoc.h:160
@ AST_AOC_RATE_TYPE_FREE
Definition: aoc.h:157

◆ ast_aoc_time_scale

Enumerator
AST_AOC_TIME_SCALE_HUNDREDTH_SECOND 
AST_AOC_TIME_SCALE_TENTH_SECOND 
AST_AOC_TIME_SCALE_SECOND 
AST_AOC_TIME_SCALE_TEN_SECOND 
AST_AOC_TIME_SCALE_MINUTE 
AST_AOC_TIME_SCALE_HOUR 
AST_AOC_TIME_SCALE_DAY 

Definition at line 87 of file aoc.h.

87 {
95};
@ AST_AOC_TIME_SCALE_TEN_SECOND
Definition: aoc.h:91
@ AST_AOC_TIME_SCALE_DAY
Definition: aoc.h:94
@ AST_AOC_TIME_SCALE_TENTH_SECOND
Definition: aoc.h:89
@ AST_AOC_TIME_SCALE_MINUTE
Definition: aoc.h:92
@ AST_AOC_TIME_SCALE_SECOND
Definition: aoc.h:90
@ AST_AOC_TIME_SCALE_HOUR
Definition: aoc.h:93
@ AST_AOC_TIME_SCALE_HUNDREDTH_SECOND
Definition: aoc.h:88

◆ ast_aoc_total_type

Enumerator
AST_AOC_TOTAL 
AST_AOC_SUBTOTAL 

Definition at line 82 of file aoc.h.

82 {
83 AST_AOC_TOTAL = 0,
85};
@ AST_AOC_TOTAL
Definition: aoc.h:83
@ AST_AOC_SUBTOTAL
Definition: aoc.h:84

◆ ast_aoc_type

Enumerator
AST_AOC_REQUEST 
AST_AOC_S 
AST_AOC_D 
AST_AOC_E 

Definition at line 62 of file aoc.h.

62 {
66 AST_AOC_E, /* aoc-e must remain the last item in this enum */
67};
@ AST_AOC_S
Definition: aoc.h:64
@ AST_AOC_D
Definition: aoc.h:65
@ AST_AOC_E
Definition: aoc.h:66
@ AST_AOC_REQUEST
Definition: aoc.h:63

◆ ast_aoc_volume_unit

Enumerator
AST_AOC_VOLUME_UNIT_OCTET 
AST_AOC_VOLUME_UNIT_SEGMENT 
AST_AOC_VOLUME_UNIT_MESSAGE 

Definition at line 125 of file aoc.h.

125 {
129};
@ AST_AOC_VOLUME_UNIT_OCTET
Definition: aoc.h:126
@ AST_AOC_VOLUME_UNIT_SEGMENT
Definition: aoc.h:127
@ AST_AOC_VOLUME_UNIT_MESSAGE
Definition: aoc.h:128

Function Documentation

◆ ast_aoc_add_unit_entry()

int ast_aoc_add_unit_entry ( struct ast_aoc_decoded decoded,
const unsigned int  amount_is_present,
const unsigned int  amount,
const unsigned int  type_is_present,
const unsigned int  type 
)

Adds a unit entry into the list of units.

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
amount_is_presentset this if the number of units is actually present.
amountnumber of units
type_is_presentset this if the type value is present
typeunit type
Note
If neither the amount nor the type is present, the entry will not be added.
Return values
0success

Definition at line 986 of file aoc.c.

991{
992 if ((decoded->msg_type == AST_AOC_REQUEST) ||
993 (decoded->unit_count >= ARRAY_LEN(decoded->unit_list))) {
994 return -1;
995 }
996
997 if (!amount_is_present && !type_is_present) {
998 return -1;
999 }
1000
1001 decoded->unit_list[decoded->unit_count].valid_amount = amount_is_present;
1002 if (amount_is_present) {
1003 decoded->unit_list[decoded->unit_count].amount = amount;
1004 } else {
1005 decoded->unit_list[decoded->unit_count].amount = 0;
1006 }
1007
1008 decoded->unit_list[decoded->unit_count].valid_type = type_is_present;
1009 if (type_is_present) {
1010 decoded->unit_list[decoded->unit_count].type = type;
1011 } else {
1012 decoded->unit_list[decoded->unit_count].type = 0;
1013 }
1014 decoded->unit_count++;
1015
1016 return 0;
1017}
static const char type[]
Definition: chan_ooh323.c:109
struct ast_aoc_unit_entry unit_list[32]
Definition: aoc.c:227
int unit_count
Definition: aoc.c:226
enum ast_aoc_type msg_type
Definition: aoc.c:215
unsigned int amount
Definition: aoc.h:180
unsigned int type
Definition: aoc.h:182
char valid_type
Definition: aoc.h:181
char valid_amount
Definition: aoc.h:179
#define ARRAY_LEN(a)
Definition: utils.h:666

References ast_aoc_unit_entry::amount, ARRAY_LEN, AST_AOC_REQUEST, ast_aoc_decoded::msg_type, type, ast_aoc_unit_entry::type, ast_aoc_decoded::unit_count, ast_aoc_decoded::unit_list, ast_aoc_unit_entry::valid_amount, and ast_aoc_unit_entry::valid_type.

Referenced by action_aoc_de_message(), aoc_parse_ie(), and AST_TEST_DEFINE().

◆ ast_aoc_cli_init()

int ast_aoc_cli_init ( void  )

enable aoc cli options

Definition at line 2029 of file aoc.c.

2030{
2034
2037}
struct stasis_message_type * aoc_s_type(void)
static void aoc_shutdown(void)
Definition: aoc.c:2021
static struct ast_cli_entry aoc_cli[]
Definition: aoc.c:2017
struct stasis_message_type * aoc_d_type(void)
struct stasis_message_type * aoc_e_type(void)
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
#define ast_cli_register_multiple(e, len)
Register multiple commands.
Definition: cli.h:265
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
Definition: stasis.h:1493

References aoc_cli, aoc_d_type(), aoc_e_type(), aoc_s_type(), aoc_shutdown(), ARRAY_LEN, ast_cli_register_multiple, ast_register_cleanup(), and STASIS_MESSAGE_TYPE_INIT.

Referenced by asterisk_daemon().

◆ ast_aoc_create()

struct ast_aoc_decoded * ast_aoc_create ( const enum ast_aoc_type  msg_type,
const enum ast_aoc_charge_type  charge_type,
const enum ast_aoc_request  requests 
)

creates a ast_aoc_decode object of a specific message type

Since
1.8
Parameters
msg_typeAOC-D, AOC-E, or AOC Request
charge_typethis is ignored if message type is not AOC-D or AOC-E.
requestsflags. This defines the types of AOC requested. This field should only be set when the message type is AOC Request, the value is ignored otherwise.
Return values
heapallocated ast_aoc_decoded object ptr on success
NULLfailure

Definition at line 285 of file aoc.c.

288{
289 struct ast_aoc_decoded *decoded = NULL;
290
291 /* verify input */
292 if (((unsigned int) charge_type > AST_AOC_CHARGE_UNIT) ||
293 ((unsigned int) msg_type > AST_AOC_E) ||
294 ((msg_type == AST_AOC_REQUEST) && !requests)) {
295
296 ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object, invalid input\n");
297 return NULL;
298 }
299
300 if (!(decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded)))) {
301 ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
302 return NULL;
303 }
304
305 decoded->msg_type = msg_type;
306
307 if (msg_type == AST_AOC_REQUEST) {
308 decoded->request_flag = requests;
309 } else if ((msg_type == AST_AOC_D) || (msg_type == AST_AOC_E)) {
310 decoded->charge_type = charge_type;
311 }
312
313 return decoded;
314}
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define ast_log
Definition: astobj2.c:42
#define LOG_WARNING
static struct requests requests
#define NULL
Definition: resample.c:96
enum ast_aoc_request request_flag
Definition: aoc.c:217
enum ast_aoc_charge_type charge_type
Definition: aoc.c:216

References AST_AOC_CHARGE_UNIT, AST_AOC_D, AST_AOC_E, AST_AOC_REQUEST, ast_calloc, ast_log, ast_aoc_decoded::charge_type, LOG_WARNING, ast_aoc_decoded::msg_type, NULL, ast_aoc_decoded::request_flag, and requests.

Referenced by action_aoc_de_message(), action_aoc_s_message(), and AST_TEST_DEFINE().

◆ ast_aoc_decode()

struct ast_aoc_decoded * ast_aoc_decode ( struct ast_aoc_encoded encoded,
size_t  size,
struct ast_channel chan 
)

decodes an encoded aoc payload.

Since
1.8
Parameters
encodedthe encoded payload to decode.
sizetotal size of encoded payload
chanast channel, Optional for DEBUG output purposes
Return values
heapallocated ast_aoc_decoded object ptr on success
NULLfailure

Definition at line 458 of file aoc.c.

459{
460 struct ast_aoc_decoded *decoded;
461
462 /* verify our encoded payload is actually large enough to hold all the ies */
463 if ((size - (sizeof(struct ast_aoc_encoded)) != ntohs(encoded->datalen))) {
464 ast_log(LOG_WARNING, "Corrupted aoc encoded object, can not decode\n");
465 return NULL;
466 }
467
468 if (!(decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded)))) {
469 ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
470 return NULL;
471 }
472
473 /* decode flags */
474
476 decoded->msg_type = AST_AOC_S;
477 } else if (encoded->flags & AST_AOC_ENCODED_TYPE_E) {
478 decoded->msg_type = AST_AOC_E;
479 } else if (encoded->flags & AST_AOC_ENCODED_TYPE_D) {
480 decoded->msg_type = AST_AOC_D;
481 } else {
482 decoded->msg_type = AST_AOC_REQUEST;
483 }
484
485 if (decoded->msg_type == AST_AOC_REQUEST) {
486 if (encoded->flags & AST_AOC_ENCODED_REQUEST_S) {
488 }
489 if (encoded->flags & AST_AOC_ENCODED_REQUEST_D) {
491 }
492 if (encoded->flags & AST_AOC_ENCODED_REQUEST_E) {
494 }
495 } else if ((decoded->msg_type == AST_AOC_D) || (decoded->msg_type == AST_AOC_E)) {
502 } else {
504 }
505
506 if (encoded->flags & AST_AOC_ENCODED_CHARGE_SUBTOTAL) {
507 decoded->total_type = AST_AOC_SUBTOTAL;
508 }
509 }
510
511 /* decode information elements */
512 aoc_parse_ie(decoded, encoded->data, ntohs(encoded->datalen));
513
514 if (aoc_debug_enabled) {
515 aoc_display_decoded_debug(decoded, 1, chan);
516 }
517
518 return decoded;
519}
#define AST_AOC_ENCODED_CHARGE_UNIT
Definition: aoc.c:193
static int aoc_parse_ie(struct ast_aoc_decoded *decoded, unsigned char *data, unsigned int datalen)
Definition: aoc.c:378
#define AST_AOC_ENCODED_TYPE_D
Definition: aoc.c:182
#define AST_AOC_ENCODED_CHARGE_CURRENCY
Definition: aoc.c:192
#define AST_AOC_ENCODED_REQUEST_E
Definition: aoc.c:188
#define AST_AOC_ENCODED_REQUEST_D
Definition: aoc.c:187
static char aoc_debug_enabled
Definition: aoc.c:201
static void aoc_display_decoded_debug(const struct ast_aoc_decoded *decoded, int decoding, struct ast_channel *chan)
Definition: aoc.c:1991
#define AST_AOC_ENCODED_TYPE_S
Definition: aoc.c:184
#define AST_AOC_ENCODED_CHARGE_SUBTOTAL
Definition: aoc.c:195
#define AST_AOC_ENCODED_CHARGE_FREE
Definition: aoc.c:191
#define AST_AOC_ENCODED_REQUEST_S
Definition: aoc.c:186
#define AST_AOC_ENCODED_TYPE_E
Definition: aoc.c:183
enum ast_aoc_total_type total_type
Definition: aoc.c:218
uint16_t datalen
Definition: aoc.c:209
uint8_t flags
Definition: aoc.c:208
unsigned char data[0]
Definition: aoc.c:210

References aoc_debug_enabled, aoc_display_decoded_debug(), aoc_parse_ie(), AST_AOC_CHARGE_CURRENCY, AST_AOC_CHARGE_FREE, AST_AOC_CHARGE_NA, AST_AOC_CHARGE_UNIT, AST_AOC_D, AST_AOC_E, AST_AOC_ENCODED_CHARGE_CURRENCY, AST_AOC_ENCODED_CHARGE_FREE, AST_AOC_ENCODED_CHARGE_SUBTOTAL, AST_AOC_ENCODED_CHARGE_UNIT, AST_AOC_ENCODED_REQUEST_D, AST_AOC_ENCODED_REQUEST_E, AST_AOC_ENCODED_REQUEST_S, AST_AOC_ENCODED_TYPE_D, AST_AOC_ENCODED_TYPE_E, AST_AOC_ENCODED_TYPE_S, AST_AOC_REQUEST, AST_AOC_REQUEST_D, AST_AOC_REQUEST_E, AST_AOC_REQUEST_S, AST_AOC_S, AST_AOC_SUBTOTAL, ast_calloc, ast_log, ast_aoc_decoded::charge_type, ast_aoc_encoded::data, ast_aoc_encoded::datalen, ast_aoc_encoded::flags, LOG_WARNING, ast_aoc_decoded::msg_type, NULL, ast_aoc_decoded::request_flag, and ast_aoc_decoded::total_type.

Referenced by aoc_framehook(), ast_aoc_test_encode_decode_match(), and wait_for_answer().

◆ ast_aoc_decoded2str()

int ast_aoc_decoded2str ( const struct ast_aoc_decoded decoded,
struct ast_str **  msg 
)

Convert decoded aoc msg to string representation.

Since
1.8
Parameters
decodedast_aoc_decoded struct to convert to string
msgdynamic heap allocated ast_str object to store string representation in
Return values
0success
-1failure

Definition at line 1963 of file aoc.c.

1964{
1965 if (!decoded || !msg) {
1966 return -1;
1967 }
1968
1969 switch (decoded->msg_type) {
1970 case AST_AOC_S:
1971 ast_str_append(msg, 0, "AOC-S\r\n");
1972 aoc_s_event(decoded, msg);
1973 break;
1974 case AST_AOC_D:
1975 ast_str_append(msg, 0, "AOC-D\r\n");
1976 aoc_d_event(decoded, msg);
1977 break;
1978 case AST_AOC_E:
1979 ast_str_append(msg, 0, "AOC-E\r\n");
1980 aoc_e_event(decoded, msg);
1981 break;
1982 case AST_AOC_REQUEST:
1983 ast_str_append(msg, 0, "AOC-Request\r\n");
1984 aoc_request_event(decoded, msg);
1985 break;
1986 }
1987
1988 return 0;
1989}
static void aoc_e_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1565
static void aoc_request_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1428
static void aoc_s_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1448
static void aoc_d_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1516
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139

References aoc_d_event(), aoc_e_event(), aoc_request_event(), aoc_s_event(), AST_AOC_D, AST_AOC_E, AST_AOC_REQUEST, AST_AOC_S, ast_str_append(), and ast_aoc_decoded::msg_type.

Referenced by aoc_display_decoded_debug(), and AST_TEST_DEFINE().

◆ ast_aoc_destroy_decoded()

void * ast_aoc_destroy_decoded ( struct ast_aoc_decoded decoded)

free an ast_aoc_decoded object

Definition at line 316 of file aoc.c.

317{
318 ast_free(decoded);
319 return NULL;
320}
#define ast_free(a)
Definition: astmm.h:180

References ast_free, and NULL.

Referenced by action_aoc_de_message(), action_aoc_s_message(), action_aocmessage(), aoc_data_destroy(), ast_aoc_test_encode_decode_match(), AST_TEST_DEFINE(), chanlist_free(), hangupcalls(), and wait_for_answer().

◆ ast_aoc_destroy_encoded()

void * ast_aoc_destroy_encoded ( struct ast_aoc_encoded encoded)

free an ast_aoc_encoded object

Definition at line 322 of file aoc.c.

323{
324 ast_free(encoded);
325 return NULL;
326}

References ast_free, and NULL.

Referenced by action_aocmessage(), ast_aoc_test_encode_decode_match(), and wait_for_answer().

◆ ast_aoc_encode()

struct ast_aoc_encoded * ast_aoc_encode ( struct ast_aoc_decoded decoded,
size_t *  out_size,
struct ast_channel chan 
)

encodes a decoded aoc structure so it can be passed on the wire

Since
1.8
Parameters
decodedthe decoded struct to be encoded
out_sizeoutput parameter representing size of encoded data
chanast channel, Optional for DEBUG output purposes
Return values
pointerto encoded data
NULLfailure

Definition at line 659 of file aoc.c.

660{
661 struct aoc_ie_data ied;
662 struct ast_aoc_encoded *encoded = NULL;
663 size_t size = 0;
664
665 if (!decoded || !out_size) {
666 return NULL;
667 }
668
669 *out_size = 0;
670
671 /* create information element buffer before allocating the payload,
672 * by doing this the exact size of the payload + the id data can be
673 * allocated all at once. */
674 aoc_create_ie_data(decoded, &ied);
675
676 size = sizeof(struct ast_aoc_encoded) + ied.pos;
677
678 if (!(encoded = ast_calloc(1, size))) {
679 ast_log(LOG_WARNING, "Failed to create ast_aoc_encoded object during decode routine. \n");
680 return NULL;
681 }
682
683 /* -- Set ie data buffer */
684 if (ied.pos) {
685 /* this is safe because encoded was allocated to fit this perfectly */
686 memcpy(encoded->data, ied.buf, ied.pos);
687 encoded->datalen = htons(ied.pos);
688 }
689
690 /* --- Set Flags --- */
691 switch (decoded->msg_type) {
692 case AST_AOC_S:
693 encoded->flags = AST_AOC_ENCODED_TYPE_S;
694 break;
695 case AST_AOC_D:
696 encoded->flags = AST_AOC_ENCODED_TYPE_D;
697 break;
698 case AST_AOC_E:
699 encoded->flags = AST_AOC_ENCODED_TYPE_E;
700 break;
701 case AST_AOC_REQUEST:
703 default:
704 break;
705 }
706
707 /* if it is type request, set the types requested, else set charge type */
708 if (decoded->msg_type == AST_AOC_REQUEST) {
709 if (decoded->request_flag & AST_AOC_REQUEST_S) {
711 }
712 if (decoded->request_flag & AST_AOC_REQUEST_D) {
714 }
715 if (decoded->request_flag & AST_AOC_REQUEST_E) {
717 }
718 } else if ((decoded->msg_type == AST_AOC_D) || (decoded->msg_type == AST_AOC_E)) {
719 switch (decoded->charge_type) {
722 break;
725 break;
729 default:
731 break;
732 }
733
734 if (decoded->total_type == AST_AOC_SUBTOTAL) {
736 }
737 }
738
739 /* --- Set Version Number --- */
741
742 /* set the output size */
743 *out_size = size;
744
745 if (aoc_debug_enabled) {
746 aoc_display_decoded_debug(decoded, 0, chan);
747 }
748
749 return encoded;
750}
#define AST_AOC_ENCODED_CHARGE_NA
Definition: aoc.c:190
#define AST_AOC_ENCODE_VERSION
Definition: aoc.c:198
#define AST_AOC_ENCODED_TYPE_REQUEST
Definition: aoc.c:181
static void aoc_create_ie_data(struct ast_aoc_decoded *decoded, struct aoc_ie_data *ied)
Definition: aoc.c:592
uint8_t version
Definition: aoc.c:207

References aoc_create_ie_data(), aoc_debug_enabled, aoc_display_decoded_debug(), AST_AOC_CHARGE_CURRENCY, AST_AOC_CHARGE_FREE, AST_AOC_CHARGE_NA, AST_AOC_CHARGE_UNIT, AST_AOC_D, AST_AOC_E, AST_AOC_ENCODE_VERSION, AST_AOC_ENCODED_CHARGE_CURRENCY, AST_AOC_ENCODED_CHARGE_FREE, AST_AOC_ENCODED_CHARGE_NA, AST_AOC_ENCODED_CHARGE_SUBTOTAL, AST_AOC_ENCODED_CHARGE_UNIT, AST_AOC_ENCODED_REQUEST_D, AST_AOC_ENCODED_REQUEST_E, AST_AOC_ENCODED_REQUEST_S, AST_AOC_ENCODED_TYPE_D, AST_AOC_ENCODED_TYPE_E, AST_AOC_ENCODED_TYPE_REQUEST, AST_AOC_ENCODED_TYPE_S, AST_AOC_REQUEST, AST_AOC_REQUEST_D, AST_AOC_REQUEST_E, AST_AOC_REQUEST_S, AST_AOC_S, AST_AOC_SUBTOTAL, ast_calloc, ast_log, aoc_ie_data::buf, ast_aoc_decoded::charge_type, ast_aoc_encoded::data, ast_aoc_encoded::datalen, ast_aoc_encoded::flags, LOG_WARNING, ast_aoc_decoded::msg_type, NULL, aoc_ie_data::pos, ast_aoc_decoded::request_flag, ast_aoc_decoded::total_type, and ast_aoc_encoded::version.

Referenced by action_aocmessage(), ast_aoc_test_encode_decode_match(), and wait_for_answer().

◆ ast_aoc_get_association_info()

const struct ast_aoc_charging_association * ast_aoc_get_association_info ( struct ast_aoc_decoded decoded)

get the charging association info for AOC-E messages

Definition at line 1060 of file aoc.c.

1061{
1062 return &decoded->charging_association;
1063}
struct ast_aoc_charging_association charging_association
Definition: aoc.c:233

References ast_aoc_decoded::charging_association.

Referenced by AST_TEST_DEFINE().

◆ ast_aoc_get_billing_id()

enum ast_aoc_billing_id ast_aoc_get_billing_id ( struct ast_aoc_decoded decoded)

get the billing id for AOC-D and AOC-E messages

Definition at line 1044 of file aoc.c.

1045{
1046 return decoded->billing_id;
1047}
enum ast_aoc_billing_id billing_id
Definition: aoc.c:230

References ast_aoc_decoded::billing_id.

Referenced by AST_TEST_DEFINE().

◆ ast_aoc_get_charge_type()

enum ast_aoc_charge_type ast_aoc_get_charge_type ( struct ast_aoc_decoded decoded)

get the charging type for an AOC-D or AOC-E message

Definition at line 906 of file aoc.c.

907{
908 return decoded->charge_type;
909}

References ast_aoc_decoded::charge_type.

Referenced by aoc_send_as_xml(), and AST_TEST_DEFINE().

◆ ast_aoc_get_currency_amount()

unsigned int ast_aoc_get_currency_amount ( struct ast_aoc_decoded decoded)

get the currency amount for AOC-D and AOC-E messages

Definition at line 949 of file aoc.c.

950{
951 return decoded->currency_amount;
952}
unsigned int currency_amount
Definition: aoc.c:222

References ast_aoc_decoded::currency_amount.

Referenced by aoc_send_as_xml(), and AST_TEST_DEFINE().

◆ ast_aoc_get_currency_multiplier()

enum ast_aoc_currency_multiplier ast_aoc_get_currency_multiplier ( struct ast_aoc_decoded decoded)

get the currency multiplier for AOC-D and AOC-E messages

Definition at line 954 of file aoc.c.

955{
956 return decoded->multiplier;
957}
enum ast_aoc_currency_multiplier multiplier
Definition: aoc.c:221

References ast_aoc_decoded::multiplier.

Referenced by aoc_send_as_xml(), and AST_TEST_DEFINE().

◆ ast_aoc_get_currency_multiplier_decimal()

const char * ast_aoc_get_currency_multiplier_decimal ( struct ast_aoc_decoded decoded)

get the currency multiplier for AOC-D and AOC-E messages in decimal format

Definition at line 959 of file aoc.c.

960{
961 switch (decoded->multiplier) {
963 return "0.001";
965 return "0.01";
967 return "0.1";
968 case AST_AOC_MULT_ONE:
969 return "1.0";
970 case AST_AOC_MULT_TEN:
971 return "10.0";
973 return "100.0";
975 return "1000.0";
976 default:
977 return "1.0";
978 }
979}

References AST_AOC_MULT_HUNDRED, AST_AOC_MULT_ONE, AST_AOC_MULT_ONEHUNDREDTH, AST_AOC_MULT_ONETENTH, AST_AOC_MULT_ONETHOUSANDTH, AST_AOC_MULT_TEN, AST_AOC_MULT_THOUSAND, and ast_aoc_decoded::multiplier.

◆ ast_aoc_get_currency_name()

const char * ast_aoc_get_currency_name ( struct ast_aoc_decoded decoded)

get the currency name for AOC-D and AOC-E messages

Definition at line 981 of file aoc.c.

982{
983 return decoded->currency_name;
984}
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.c:223

References ast_aoc_decoded::currency_name.

Referenced by aoc_send_as_xml(), and AST_TEST_DEFINE().

◆ ast_aoc_get_msg_type()

enum ast_aoc_type ast_aoc_get_msg_type ( struct ast_aoc_decoded decoded)

get the message type, AOC-D, AOC-E, or AOC Request

Definition at line 901 of file aoc.c.

902{
903 return decoded->msg_type;
904}

References ast_aoc_decoded::msg_type.

Referenced by aoc_send_as_xml(), AST_TEST_DEFINE(), and wait_for_answer().

◆ ast_aoc_get_request()

enum ast_aoc_request ast_aoc_get_request ( struct ast_aoc_decoded decoded)

get the types of AOC requested for when message type is AOC Request

Definition at line 911 of file aoc.c.

912{
913 return decoded->request_flag;
914}

References ast_aoc_decoded::request_flag.

Referenced by AST_TEST_DEFINE().

◆ ast_aoc_get_termination_request()

int ast_aoc_get_termination_request ( struct ast_aoc_decoded decoded)

get whether or not the AST_AOC_REQUEST message as a termination request.

Since
1.8
Note
a termination request indicates that the call has terminated, but that the other side is waiting for a short period of time before hanging up so it can get the final AOC-E message.
Parameters
decodedast_aoc_decoded struct to get values on
Return values
0not a termination request
1is a termination request

Definition at line 1088 of file aoc.c.

1089{
1090 return decoded->termination_request;
1091}
char termination_request
Definition: aoc.c:240

References ast_aoc_decoded::termination_request.

Referenced by AST_TEST_DEFINE().

◆ ast_aoc_get_total_type()

enum ast_aoc_total_type ast_aoc_get_total_type ( struct ast_aoc_decoded decoded)

get the type of total for a AOC-D message

Definition at line 923 of file aoc.c.

924{
925 return decoded->total_type;
926}

References ast_aoc_decoded::total_type.

Referenced by aoc_send_as_xml(), and AST_TEST_DEFINE().

◆ ast_aoc_get_unit_count()

unsigned int ast_aoc_get_unit_count ( struct ast_aoc_decoded decoded)

get the number of unit entries for AOC-D and AOC-E messages

Definition at line 1028 of file aoc.c.

1029{
1030 return decoded->unit_count;
1031}

References ast_aoc_decoded::unit_count.

Referenced by AST_TEST_DEFINE().

◆ ast_aoc_get_unit_info()

const struct ast_aoc_unit_entry * ast_aoc_get_unit_info ( struct ast_aoc_decoded decoded,
unsigned int  entry_number 
)

get a specific unit entry.

Since
1.8
Note
This can be used in conjunction with ast_aoc_get_unit_count to create a unit entry iterator.

Definition at line 1019 of file aoc.c.

1020{
1021 if (entry_number >= decoded->unit_count) {
1022 return NULL;
1023 }
1024
1025 return (const struct ast_aoc_unit_entry *) &decoded->unit_list[entry_number];
1026}
Definition: aoc.h:178

References NULL, ast_aoc_decoded::unit_count, and ast_aoc_decoded::unit_list.

Referenced by aoc_send_as_xml(), and AST_TEST_DEFINE().

◆ ast_aoc_manager_event()

int ast_aoc_manager_event ( const struct ast_aoc_decoded decoded,
struct ast_channel chan 
)

generate AOC manager event for an AOC-S, AOC-D, or AOC-E msg

Precondition
chan is locked

Definition at line 1931 of file aoc.c.

1932{
1933 struct ast_json *blob;
1934 struct stasis_message_type *msg_type;
1935
1936 if (!decoded) {
1937 return -1;
1938 }
1939
1940 switch (decoded->msg_type) {
1941 case AST_AOC_S:
1942 blob = s_to_json(decoded);
1943 msg_type = aoc_s_type();
1944 break;
1945 case AST_AOC_D:
1946 blob = d_to_json(decoded);
1947 msg_type = aoc_d_type();
1948 break;
1949 case AST_AOC_E:
1950 blob = e_to_json(decoded);
1951 msg_type = aoc_e_type();
1952 break;
1953 default:
1954 /* events for AST_AOC_REQUEST are not generated here */
1955 return 0;
1956 }
1957
1958 aoc_publish_blob(chan, msg_type, blob);
1959 ast_json_unref(blob);
1960 return 0;
1961}
static struct ast_json * s_to_json(const struct ast_aoc_decoded *decoded)
Definition: aoc.c:1711
static struct ast_json * d_to_json(const struct ast_aoc_decoded *decoded)
Definition: aoc.c:1802
static void aoc_publish_blob(struct ast_channel *chan, struct stasis_message_type *msg_type, struct ast_json *blob)
Definition: aoc.c:1838
static struct ast_json * e_to_json(const struct ast_aoc_decoded *decoded)
Definition: aoc.c:1807
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
Abstract JSON element (object, array, string, int, ...).

References aoc_d_type(), aoc_e_type(), aoc_publish_blob(), aoc_s_type(), AST_AOC_D, AST_AOC_E, AST_AOC_S, ast_json_unref(), d_to_json(), e_to_json(), ast_aoc_decoded::msg_type, and s_to_json().

◆ ast_aoc_s_add_rate_duration()

int ast_aoc_s_add_rate_duration ( struct ast_aoc_decoded decoded,
enum ast_aoc_s_charged_item  charged_item,
unsigned int  amount,
enum ast_aoc_currency_multiplier  multiplier,
const char *  currency_name,
unsigned long  time,
enum ast_aoc_time_scale  time_scale,
unsigned long  granularity_time,
enum ast_aoc_time_scale  granularity_time_scale,
int  step_function 
)

Add AOC-S duration rate entry.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
charged_itemast_aoc_s_charged_item
amountcurrency amount
multipliercurrency multiplier
currency_nametruncated after 10 characters
time
time_scalefrom ast_aoc_time_scale enum
granularity_time(optional, set to 0 if not present);
granularity_time_scale(optional, set to 0 if not present);
step_functionset to 1 if this is to use a step function, 0 if continuious
Return values
0success
-1failure

Definition at line 779 of file aoc.c.

789{
790
791 struct ast_aoc_s_entry entry = { 0, };
792
795 entry.rate.duration.amount = amount;
796 entry.rate.duration.multiplier = multiplier;
797 entry.rate.duration.time = time;
798 entry.rate.duration.time_scale = time_scale;
799 entry.rate.duration.granularity_time = granularity_time;
800 entry.rate.duration.granularity_time_scale = granularity_time_scale;
801 entry.rate.duration.charging_type = step_function ? 1 : 0;
802
803 if (!ast_strlen_zero(currency_name)) {
804 ast_copy_string(entry.rate.duration.currency_name, currency_name, sizeof(entry.rate.duration.currency_name));
805 }
806
807 return aoc_s_add_entry(decoded, &entry);
808}
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:752
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:425
uint32_t amount
Definition: aoc.h:104
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.h:114
uint16_t multiplier
Definition: aoc.h:109
uint16_t granularity_time_scale
Definition: aoc.h:111
uint8_t charging_type
Charging interval type.
Definition: aoc.h:122
uint16_t time_scale
Definition: aoc.h:110
uint32_t granularity_time
Definition: aoc.h:107
uint32_t time
Definition: aoc.h:105
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
union ast_aoc_s_entry::@182 rate
Charge rate being applied.
struct ast_aoc_duration_rate duration
Definition: aoc.h:171
uint16_t rate_type
Definition: aoc.h:167

References ast_aoc_duration_rate::amount, aoc_s_add_entry(), AST_AOC_RATE_TYPE_DURATION, ast_copy_string(), ast_strlen_zero(), ast_aoc_s_entry::charged_item, ast_aoc_duration_rate::charging_type, ast_aoc_duration_rate::currency_name, ast_aoc_s_entry::duration, ast_aoc_duration_rate::granularity_time, ast_aoc_duration_rate::granularity_time_scale, ast_aoc_duration_rate::multiplier, ast_aoc_s_entry::rate, ast_aoc_s_entry::rate_type, ast_aoc_duration_rate::time, and ast_aoc_duration_rate::time_scale.

Referenced by action_aoc_s_submessage(), and AST_TEST_DEFINE().

◆ ast_aoc_s_add_rate_flat()

int ast_aoc_s_add_rate_flat ( struct ast_aoc_decoded decoded,
enum ast_aoc_s_charged_item  charged_item,
unsigned int  amount,
enum ast_aoc_currency_multiplier  multiplier,
const char *  currency_name 
)

Add AOC-S flat rate entry.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
charged_itemast_aoc_s_charged_item
amountcurrency amount
multipliercurrency multiplier
currency_nametruncated after 10 characters
Return values
0success
-1failure

Definition at line 810 of file aoc.c.

815{
816 struct ast_aoc_s_entry entry = { 0, };
817
820 entry.rate.flat.amount = amount;
821 entry.rate.flat.multiplier = multiplier;
822
823 if (!ast_strlen_zero(currency_name)) {
824 ast_copy_string(entry.rate.flat.currency_name, currency_name, sizeof(entry.rate.flat.currency_name));
825 }
826
827 return aoc_s_add_entry(decoded, &entry);
828}
uint32_t amount
Definition: aoc.h:139
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.h:142
uint16_t multiplier
Definition: aoc.h:140
struct ast_aoc_flat_rate flat
Definition: aoc.h:172

References ast_aoc_flat_rate::amount, aoc_s_add_entry(), AST_AOC_RATE_TYPE_FLAT, ast_copy_string(), ast_strlen_zero(), ast_aoc_s_entry::charged_item, ast_aoc_flat_rate::currency_name, ast_aoc_s_entry::flat, ast_aoc_flat_rate::multiplier, ast_aoc_s_entry::rate, and ast_aoc_s_entry::rate_type.

Referenced by action_aoc_s_submessage(), and AST_TEST_DEFINE().

◆ ast_aoc_s_add_rate_free()

int ast_aoc_s_add_rate_free ( struct ast_aoc_decoded decoded,
enum ast_aoc_s_charged_item  charged_item,
int  from_beginning 
)

Add AOC-S indicating charge item is free.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
charged_itemast_aoc_s_charged_item
from_beginningTRUE if the rate is free from beginning.
Return values
0success
-1failure

Definition at line 866 of file aoc.c.

869{
870 struct ast_aoc_s_entry entry = { 0, };
871
874
875 return aoc_s_add_entry(decoded, &entry);
876}

References aoc_s_add_entry(), AST_AOC_RATE_TYPE_FREE, AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING, ast_aoc_s_entry::charged_item, and ast_aoc_s_entry::rate_type.

Referenced by action_aoc_s_submessage(), and AST_TEST_DEFINE().

◆ ast_aoc_s_add_rate_na()

int ast_aoc_s_add_rate_na ( struct ast_aoc_decoded decoded,
enum ast_aoc_s_charged_item  charged_item 
)

Add AOC-S entry indicating charge item is not available.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
charged_itemast_aoc_s_charged_item
Return values
0success
-1failure

Definition at line 878 of file aoc.c.

880{
881 struct ast_aoc_s_entry entry = { 0, };
882
885
886 return aoc_s_add_entry(decoded, &entry);
887}

References aoc_s_add_entry(), AST_AOC_RATE_TYPE_NA, ast_aoc_s_entry::charged_item, and ast_aoc_s_entry::rate_type.

Referenced by action_aoc_s_submessage(), and AST_TEST_DEFINE().

◆ ast_aoc_s_add_rate_special_charge_code()

int ast_aoc_s_add_rate_special_charge_code ( struct ast_aoc_decoded decoded,
enum ast_aoc_s_charged_item  charged_item,
unsigned int  code 
)

Add AOC-S special rate entry.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
charged_itemast_aoc_s_charged_item
codespecial charging code
Return values
0success
-1failure

Definition at line 853 of file aoc.c.

856{
857 struct ast_aoc_s_entry entry = { 0, };
858
861 entry.rate.special_code = code;
862
863 return aoc_s_add_entry(decoded, &entry);
864}
uint16_t special_code
Definition: aoc.h:174

References aoc_s_add_entry(), AST_AOC_RATE_TYPE_SPECIAL_CODE, ast_aoc_s_entry::charged_item, ast_aoc_s_entry::rate, ast_aoc_s_entry::rate_type, and ast_aoc_s_entry::special_code.

Referenced by action_aoc_s_submessage().

◆ ast_aoc_s_add_rate_volume()

int ast_aoc_s_add_rate_volume ( struct ast_aoc_decoded decoded,
enum ast_aoc_s_charged_item  charged_item,
enum ast_aoc_volume_unit  volume_unit,
unsigned int  amount,
enum ast_aoc_currency_multiplier  multiplier,
const char *  currency_name 
)

Add AOC-S volume rate entry.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
charged_itemast_aoc_s_charged_item
volume_unitfrom ast_aoc_volume_unit enum
amountcurrency amount
multipliercurrency multiplier
currency_nametruncated after 10 characters
Return values
0success
-1failure

Definition at line 831 of file aoc.c.

837{
838 struct ast_aoc_s_entry entry = { 0, };
839
842 entry.rate.volume.multiplier = multiplier;
843 entry.rate.volume.amount = amount;
844 entry.rate.volume.volume_unit = volume_unit;
845
846 if (!ast_strlen_zero(currency_name)) {
847 ast_copy_string(entry.rate.volume.currency_name, currency_name, sizeof(entry.rate.volume.currency_name));
848 }
849
850 return aoc_s_add_entry(decoded, &entry);
851}
struct ast_aoc_volume_rate volume
Definition: aoc.h:173
uint32_t amount
Definition: aoc.h:132
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.h:135
uint16_t multiplier
Definition: aoc.h:133
uint16_t volume_unit
Definition: aoc.h:134

References ast_aoc_volume_rate::amount, aoc_s_add_entry(), AST_AOC_RATE_TYPE_VOLUME, ast_copy_string(), ast_strlen_zero(), ast_aoc_s_entry::charged_item, ast_aoc_volume_rate::currency_name, ast_aoc_volume_rate::multiplier, ast_aoc_s_entry::rate, ast_aoc_s_entry::rate_type, ast_aoc_s_entry::volume, and ast_aoc_volume_rate::volume_unit.

Referenced by action_aoc_s_submessage(), and AST_TEST_DEFINE().

◆ ast_aoc_s_add_special_arrangement()

int ast_aoc_s_add_special_arrangement ( struct ast_aoc_decoded decoded,
unsigned int  code 
)

Add AOC-S special arrangement entry.

Since
1.8
Parameters
decodedaoc decoded object to add entry to
codespecial arrangement code
Return values
0success
-1failure

Definition at line 889 of file aoc.c.

891{
892 struct ast_aoc_s_entry entry = { 0, };
893
896 entry.rate.special_code = code;
897
898 return aoc_s_add_entry(decoded, &entry);
899}

References aoc_s_add_entry(), AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT, AST_AOC_RATE_TYPE_SPECIAL_CODE, ast_aoc_s_entry::charged_item, ast_aoc_s_entry::rate, ast_aoc_s_entry::rate_type, and ast_aoc_s_entry::special_code.

Referenced by action_aoc_s_submessage().

◆ ast_aoc_s_get_count()

unsigned int ast_aoc_s_get_count ( struct ast_aoc_decoded decoded)

get the number rates associated with an AOC-S message

Definition at line 765 of file aoc.c.

766{
767 return decoded->aoc_s_count;
768}
int aoc_s_count
Definition: aoc.c:236

References ast_aoc_decoded::aoc_s_count.

Referenced by action_aoc_s_message(), and aoc_send_as_xml().

◆ ast_aoc_s_get_rate_info()

const struct ast_aoc_s_entry * ast_aoc_s_get_rate_info ( struct ast_aoc_decoded decoded,
unsigned int  entry_number 
)

get a specific AOC-S rate entry.

Since
1.8
Note
This can be used in conjunction with ast_aoc_s_get_count to create a unit entry iterator.

Definition at line 770 of file aoc.c.

771{
772 if (entry_number >= decoded->aoc_s_count) {
773 return NULL;
774 }
775
776 return (const struct ast_aoc_s_entry *) &decoded->aoc_s_entries[entry_number];
777}
struct ast_aoc_s_entry aoc_s_entries[10]
Definition: aoc.c:237

References ast_aoc_decoded::aoc_s_count, ast_aoc_decoded::aoc_s_entries, and NULL.

Referenced by aoc_send_as_xml().

◆ ast_aoc_set_association_id()

int ast_aoc_set_association_id ( struct ast_aoc_decoded decoded,
const int  id 
)

set the charging association id for an AST_AOC_E message

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
idcharging association identifier
Note
If the association number was set, this will override that value. Only the id OR the number can be set at a time, not both.
Return values
0success

Definition at line 1049 of file aoc.c.

1050{
1051 if (decoded->msg_type != AST_AOC_E) {
1052 return -1;
1053 }
1054 memset(&decoded->charging_association, 0, sizeof(decoded->charging_association));
1056 decoded->charging_association.charge.id = id;
1057 return 0;
1058}
enum queue_result id
Definition: app_queue.c:1808
union ast_aoc_charging_association::@183 charge

References AST_AOC_CHARGING_ASSOCIATION_ID, AST_AOC_E, ast_aoc_charging_association::charge, ast_aoc_decoded::charging_association, ast_aoc_charging_association::charging_type, id, ast_aoc_charging_association::id, and ast_aoc_decoded::msg_type.

Referenced by action_aoc_de_message(), and AST_TEST_DEFINE().

◆ ast_aoc_set_association_number()

int ast_aoc_set_association_number ( struct ast_aoc_decoded decoded,
const char *  num,
uint8_t  plan 
)

set the charging association number for an AOC-E message

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
numcharging association number
plancharging association number plan and type-of-number fields
Note
If the association id was set, this will override that value. Only the id OR the number can be set at a time, not both.
Return values
0success

Definition at line 1065 of file aoc.c.

1066{
1067 if ((decoded->msg_type != AST_AOC_E) || ast_strlen_zero(num)) {
1068 return -1;
1069 }
1070 memset(&decoded->charging_association, 0, sizeof(decoded->charging_association));
1072 decoded->charging_association.charge.number.plan = plan;
1074
1075 return 0;
1076}
struct ast_aoc_charging_association_number number
Definition: aoc.h:197

References AST_AOC_CHARGING_ASSOCIATION_NUMBER, AST_AOC_E, ast_copy_string(), ast_strlen_zero(), ast_aoc_charging_association::charge, ast_aoc_decoded::charging_association, ast_aoc_charging_association::charging_type, ast_aoc_decoded::msg_type, ast_aoc_charging_association_number::number, ast_aoc_charging_association::number, and ast_aoc_charging_association_number::plan.

Referenced by action_aoc_de_message(), and AST_TEST_DEFINE().

◆ ast_aoc_set_billing_id()

int ast_aoc_set_billing_id ( struct ast_aoc_decoded decoded,
const enum ast_aoc_billing_id  id 
)

set the billing id for a AOC-D or AST_AOC_E message

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
idbilling id
Return values
0success

Definition at line 1033 of file aoc.c.

1034{
1035 if ((id >= AST_AOC_BILLING_NUM_ENTRIES) || (id < AST_AOC_BILLING_NA)) {
1036 return -1;
1037 }
1038
1039 decoded->billing_id = id;
1040
1041 return 0;
1042}

References AST_AOC_BILLING_NA, AST_AOC_BILLING_NUM_ENTRIES, ast_aoc_decoded::billing_id, and id.

Referenced by action_aoc_de_message(), and AST_TEST_DEFINE().

◆ ast_aoc_set_currency_info()

int ast_aoc_set_currency_info ( struct ast_aoc_decoded decoded,
const unsigned int  amount,
const enum ast_aoc_currency_multiplier  multiplier,
const char *  name 
)

Sets the currency values for a AOC-D or AOC-E message.

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
amountcurrency amount REQUIRED
multipliercurrency multiplier REQUIRED, 0 or undefined value defaults to AST_AOC_MULT_ONE.
namecurrency name OPTIONAL
Return values
0success

Definition at line 928 of file aoc.c.

932{
933
934 if (!ast_strlen_zero(name)) {
935 ast_copy_string(decoded->currency_name, name, sizeof(decoded->currency_name));
936 }
937
938 decoded->currency_amount = amount;
939
940 if (multiplier && (multiplier < AST_AOC_MULT_NUM_ENTRIES)) {
941 decoded->multiplier = multiplier;
942 } else {
943 decoded->multiplier = AST_AOC_MULT_ONE;
944 }
945
946 return 0;
947}
static const char name[]
Definition: format_mp3.c:68

References AST_AOC_MULT_NUM_ENTRIES, AST_AOC_MULT_ONE, ast_copy_string(), ast_strlen_zero(), ast_aoc_decoded::currency_amount, ast_aoc_decoded::currency_name, ast_aoc_decoded::multiplier, and name.

Referenced by action_aoc_de_message(), and AST_TEST_DEFINE().

◆ ast_aoc_set_termination_request()

int ast_aoc_set_termination_request ( struct ast_aoc_decoded decoded)

Mark the AST_AOC_REQUEST message as a termination request.

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
Note
A termination request indicates that the call has terminated, but that the other side is waiting for a short period of time before hanging up so it can get the final AOC-E message.
Return values
0success
-1failure

Definition at line 1078 of file aoc.c.

1079{
1080 if (decoded->msg_type != AST_AOC_REQUEST) {
1081 return -1;
1082 }
1083 decoded->termination_request = 1;
1084
1085 return 0;
1086}

References AST_AOC_REQUEST, ast_aoc_decoded::msg_type, and ast_aoc_decoded::termination_request.

Referenced by AST_TEST_DEFINE().

◆ ast_aoc_set_total_type()

int ast_aoc_set_total_type ( struct ast_aoc_decoded decoded,
const enum ast_aoc_total_type  type 
)

Sets the type of total for a AOC-D message.

Since
1.8
Parameters
decodedast_aoc_decoded struct to set values on
typetotal type: TOTAL or SUBTOTAL
Note
If this value is not set, the default for the message is TOTAL
Return values
0success

Definition at line 916 of file aoc.c.

918{
919 decoded->total_type = type;
920 return 0;
921}

References ast_aoc_decoded::total_type, and type.

Referenced by action_aoc_de_message(), and AST_TEST_DEFINE().

◆ ast_aoc_test_encode_decode_match()

int ast_aoc_test_encode_decode_match ( struct ast_aoc_decoded decoded)

test aoc encode decode routines.

Since
1.8
Note
This function verifies that a decoded message matches itself after the encode decode routine.

Definition at line 1339 of file aoc.c.

1340{
1341 struct ast_aoc_decoded *new_decoded = NULL;
1342 struct ast_aoc_encoded *encoded = NULL;
1343 size_t size;
1344 int res = 0;
1345
1346 if (!(encoded = ast_aoc_encode(decoded, &size, NULL))) {
1347 return -1;
1348 }
1349
1350 if (!(new_decoded = ast_aoc_decode(encoded, size, NULL))) {
1351 ast_free(encoded);
1352 return -1;
1353 }
1354
1355 if (memcmp(new_decoded, decoded, sizeof(struct ast_aoc_decoded))) {
1356 res = -1;
1357 }
1358
1359 ast_aoc_destroy_decoded(new_decoded);
1360 ast_aoc_destroy_encoded(encoded);
1361 return res;
1362}
void * ast_aoc_destroy_encoded(struct ast_aoc_encoded *encoded)
free an ast_aoc_encoded object
Definition: aoc.c:322
struct ast_aoc_decoded * ast_aoc_decode(struct ast_aoc_encoded *encoded, size_t size, struct ast_channel *chan)
decodes an encoded aoc payload.
Definition: aoc.c:458
void * ast_aoc_destroy_decoded(struct ast_aoc_decoded *decoded)
free an ast_aoc_decoded object
Definition: aoc.c:316
struct ast_aoc_encoded * ast_aoc_encode(struct ast_aoc_decoded *decoded, size_t *out_size, struct ast_channel *chan)
encodes a decoded aoc structure so it can be passed on the wire
Definition: aoc.c:659

References ast_aoc_decode(), ast_aoc_destroy_decoded(), ast_aoc_destroy_encoded(), ast_aoc_encode(), ast_free, and NULL.

Referenced by AST_TEST_DEFINE().