Asterisk - The Open Source Telephony Project  18.5.0
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 accociation 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.

◆ 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_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.

◆ 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.

◆ 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_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.

◆ 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.

◆ 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.

◆ 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,
84  AST_AOC_SUBTOTAL = 1,
85 };

◆ 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  {
63  AST_AOC_REQUEST = 0,
64  AST_AOC_S,
65  AST_AOC_D,
66  AST_AOC_E, /* aoc-e must remain the last item in this enum */
67 };
Definition: aoc.h:64
Definition: aoc.h:66
Definition: aoc.h:65

◆ 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.

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 977 of file aoc.c.

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_aocmessage(), aoc_parse_ie(), and AST_TEST_DEFINE().

982 {
983  if ((decoded->msg_type == AST_AOC_REQUEST) ||
984  (decoded->unit_count >= ARRAY_LEN(decoded->unit_list))) {
985  return -1;
986  }
987 
988  if (!amount_is_present && !type_is_present) {
989  return -1;
990  }
991 
992  decoded->unit_list[decoded->unit_count].valid_amount = amount_is_present;
993  if (amount_is_present) {
994  decoded->unit_list[decoded->unit_count].amount = amount;
995  } else {
996  decoded->unit_list[decoded->unit_count].amount = 0;
997  }
998 
999  decoded->unit_list[decoded->unit_count].valid_type = type_is_present;
1000  if (type_is_present) {
1001  decoded->unit_list[decoded->unit_count].type = type;
1002  } else {
1003  decoded->unit_list[decoded->unit_count].type = 0;
1004  }
1005  decoded->unit_count++;
1006 
1007  return 0;
1008 }
static const char type[]
Definition: chan_ooh323.c:109
char valid_amount
Definition: aoc.h:179
#define ARRAY_LEN(a)
Definition: isdn_lib.c:42
unsigned int type
Definition: aoc.h:182
int unit_count
Definition: aoc.c:217
struct ast_aoc_unit_entry unit_list[32]
Definition: aoc.c:218
char valid_type
Definition: aoc.h:181
enum ast_aoc_type msg_type
Definition: aoc.c:206
unsigned int amount
Definition: aoc.h:180

◆ ast_aoc_cli_init()

int ast_aoc_cli_init ( void  )

enable aoc cli options

Definition at line 2026 of file aoc.c.

References aoc_shutdown(), ARRAY_LEN, ast_cli_register_multiple, ast_register_cleanup(), and STASIS_MESSAGE_TYPE_INIT.

Referenced by asterisk_daemon().

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

◆ 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 276 of file aoc.c.

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_aocmessage(), and AST_TEST_DEFINE().

279 {
280  struct ast_aoc_decoded *decoded = NULL;
281 
282  /* verify input */
283  if (((unsigned int) charge_type > AST_AOC_CHARGE_UNIT) ||
284  ((unsigned int) msg_type > AST_AOC_E) ||
285  ((msg_type == AST_AOC_REQUEST) && !requests)) {
286 
287  ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object, invalid input\n");
288  return NULL;
289  }
290 
291  if (!(decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded)))) {
292  ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
293  return NULL;
294  }
295 
296  decoded->msg_type = msg_type;
297 
298  if (msg_type == AST_AOC_REQUEST) {
299  decoded->request_flag = requests;
300  } else if ((msg_type == AST_AOC_D) || (msg_type == AST_AOC_E)) {
301  decoded->charge_type = charge_type;
302  }
303 
304  return decoded;
305 }
static struct requests requests
#define LOG_WARNING
Definition: logger.h:274
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
enum ast_aoc_type msg_type
Definition: aoc.c:206
Definition: aoc.h:66
enum ast_aoc_request request_flag
Definition: aoc.c:208
enum ast_aoc_charge_type charge_type
Definition: aoc.c:207
Definition: aoc.h:65

◆ 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 449 of file aoc.c.

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 ast_aoc_test_encode_decode_match(), sip_indicate(), and wait_for_answer().

450 {
451  struct ast_aoc_decoded *decoded;
452 
453  /* verify our encoded payload is actually large enough to hold all the ies */
454  if ((size - (sizeof(struct ast_aoc_encoded)) != ntohs(encoded->datalen))) {
455  ast_log(LOG_WARNING, "Corrupted aoc encoded object, can not decode\n");
456  return NULL;
457  }
458 
459  if (!(decoded = ast_calloc(1, sizeof(struct ast_aoc_decoded)))) {
460  ast_log(LOG_WARNING, "Failed to create ast_aoc_decoded object \n");
461  return NULL;
462  }
463 
464  /* decode flags */
465 
467  decoded->msg_type = AST_AOC_S;
468  } else if (encoded->flags & AST_AOC_ENCODED_TYPE_E) {
469  decoded->msg_type = AST_AOC_E;
470  } else if (encoded->flags & AST_AOC_ENCODED_TYPE_D) {
471  decoded->msg_type = AST_AOC_D;
472  } else {
473  decoded->msg_type = AST_AOC_REQUEST;
474  }
475 
476  if (decoded->msg_type == AST_AOC_REQUEST) {
477  if (encoded->flags & AST_AOC_ENCODED_REQUEST_S) {
478  decoded->request_flag |= AST_AOC_REQUEST_S;
479  }
480  if (encoded->flags & AST_AOC_ENCODED_REQUEST_D) {
481  decoded->request_flag |= AST_AOC_REQUEST_D;
482  }
483  if (encoded->flags & AST_AOC_ENCODED_REQUEST_E) {
484  decoded->request_flag |= AST_AOC_REQUEST_E;
485  }
486  } else if ((decoded->msg_type == AST_AOC_D) || (decoded->msg_type == AST_AOC_E)) {
488  decoded->charge_type = AST_AOC_CHARGE_UNIT;
492  decoded->charge_type = AST_AOC_CHARGE_FREE;
493  } else {
494  decoded->charge_type = AST_AOC_CHARGE_NA;
495  }
496 
497  if (encoded->flags & AST_AOC_ENCODED_CHARGE_SUBTOTAL) {
498  decoded->total_type = AST_AOC_SUBTOTAL;
499  }
500  }
501 
502  /* decode information elements */
503  aoc_parse_ie(decoded, encoded->data, ntohs(encoded->datalen));
504 
505  if (aoc_debug_enabled) {
506  aoc_display_decoded_debug(decoded, 1, chan);
507  }
508 
509  return decoded;
510 }
uint16_t datalen
Definition: aoc.c:200
#define AST_AOC_ENCODED_REQUEST_E
Definition: aoc.c:179
#define AST_AOC_ENCODED_TYPE_E
Definition: aoc.c:174
#define AST_AOC_ENCODED_CHARGE_FREE
Definition: aoc.c:182
#define LOG_WARNING
Definition: logger.h:274
#define AST_AOC_ENCODED_TYPE_D
Definition: aoc.c:173
#define AST_AOC_ENCODED_CHARGE_CURRENCY
Definition: aoc.c:183
#define AST_AOC_ENCODED_REQUEST_S
Definition: aoc.c:177
#define NULL
Definition: resample.c:96
enum ast_aoc_total_type total_type
Definition: aoc.c:209
static void aoc_display_decoded_debug(const struct ast_aoc_decoded *decoded, int decoding, struct ast_channel *chan)
Definition: aoc.c:1988
#define ast_log
Definition: astobj2.c:42
#define AST_AOC_ENCODED_CHARGE_UNIT
Definition: aoc.c:184
#define AST_AOC_ENCODED_CHARGE_SUBTOTAL
Definition: aoc.c:186
static char aoc_debug_enabled
Definition: aoc.c:192
uint8_t flags
Definition: aoc.c:199
#define AST_AOC_ENCODED_REQUEST_D
Definition: aoc.c:178
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
enum ast_aoc_type msg_type
Definition: aoc.c:206
unsigned char data[0]
Definition: aoc.c:201
Definition: aoc.h:64
Definition: aoc.h:66
enum ast_aoc_request request_flag
Definition: aoc.c:208
#define AST_AOC_ENCODED_TYPE_S
Definition: aoc.c:175
enum ast_aoc_charge_type charge_type
Definition: aoc.c:207
static int aoc_parse_ie(struct ast_aoc_decoded *decoded, unsigned char *data, unsigned int datalen)
Definition: aoc.c:369
Definition: aoc.h:65

◆ 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 1960 of file aoc.c.

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().

1961 {
1962  if (!decoded || !msg) {
1963  return -1;
1964  }
1965 
1966  switch (decoded->msg_type) {
1967  case AST_AOC_S:
1968  ast_str_append(msg, 0, "AOC-S\r\n");
1969  aoc_s_event(decoded, msg);
1970  break;
1971  case AST_AOC_D:
1972  ast_str_append(msg, 0, "AOC-D\r\n");
1973  aoc_d_event(decoded, msg);
1974  break;
1975  case AST_AOC_E:
1976  ast_str_append(msg, 0, "AOC-E\r\n");
1977  aoc_e_event(decoded, msg);
1978  break;
1979  case AST_AOC_REQUEST:
1980  ast_str_append(msg, 0, "AOC-Request\r\n");
1981  aoc_request_event(decoded, msg);
1982  break;
1983  }
1984 
1985  return 0;
1986 }
static void aoc_e_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1560
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:1091
enum ast_aoc_type msg_type
Definition: aoc.c:206
static void aoc_s_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1443
static void aoc_d_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1511
static void aoc_request_event(const struct ast_aoc_decoded *decoded, struct ast_str **msg)
Definition: aoc.c:1423
Definition: aoc.h:64
Definition: aoc.h:66
Definition: aoc.h:65

◆ ast_aoc_destroy_decoded()

void* ast_aoc_destroy_decoded ( struct ast_aoc_decoded decoded)

free an ast_aoc_decoded object

Definition at line 307 of file aoc.c.

References ast_free, and NULL.

Referenced by action_aocmessage(), ast_aoc_test_encode_decode_match(), AST_TEST_DEFINE(), chanlist_free(), hangupcalls(), sip_indicate(), and wait_for_answer().

308 {
309  ast_free(decoded);
310  return NULL;
311 }
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182

◆ ast_aoc_destroy_encoded()

void* ast_aoc_destroy_encoded ( struct ast_aoc_encoded encoded)

free an ast_aoc_encoded object

Definition at line 313 of file aoc.c.

References ast_free, and NULL.

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

314 {
315  ast_free(encoded);
316  return NULL;
317 }
#define NULL
Definition: resample.c:96
#define ast_free(a)
Definition: astmm.h:182

◆ 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 650 of file aoc.c.

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, 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, ast_aoc_decoded::total_type, and ast_aoc_encoded::version.

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

651 {
652  struct aoc_ie_data ied;
653  struct ast_aoc_encoded *encoded = NULL;
654  size_t size = 0;
655 
656  if (!decoded || !out_size) {
657  return NULL;
658  }
659 
660  *out_size = 0;
661 
662  /* create information element buffer before allocating the payload,
663  * by doing this the exact size of the payload + the id data can be
664  * allocated all at once. */
665  aoc_create_ie_data(decoded, &ied);
666 
667  size = sizeof(struct ast_aoc_encoded) + ied.pos;
668 
669  if (!(encoded = ast_calloc(1, size))) {
670  ast_log(LOG_WARNING, "Failed to create ast_aoc_encoded object during decode routine. \n");
671  return NULL;
672  }
673 
674  /* -- Set ie data buffer */
675  if (ied.pos) {
676  /* this is safe because encoded was allocated to fit this perfectly */
677  memcpy(encoded->data, ied.buf, ied.pos);
678  encoded->datalen = htons(ied.pos);
679  }
680 
681  /* --- Set Flags --- */
682  switch (decoded->msg_type) {
683  case AST_AOC_S:
684  encoded->flags = AST_AOC_ENCODED_TYPE_S;
685  break;
686  case AST_AOC_D:
687  encoded->flags = AST_AOC_ENCODED_TYPE_D;
688  break;
689  case AST_AOC_E:
690  encoded->flags = AST_AOC_ENCODED_TYPE_E;
691  break;
692  case AST_AOC_REQUEST:
694  default:
695  break;
696  }
697 
698  /* if it is type request, set the types requested, else set charge type */
699  if (decoded->msg_type == AST_AOC_REQUEST) {
700  if (decoded->request_flag & AST_AOC_REQUEST_S) {
701  encoded->flags |= AST_AOC_ENCODED_REQUEST_S;
702  }
703  if (decoded->request_flag & AST_AOC_REQUEST_D) {
704  encoded->flags |= AST_AOC_ENCODED_REQUEST_D;
705  }
706  if (decoded->request_flag & AST_AOC_REQUEST_E) {
707  encoded->flags |= AST_AOC_ENCODED_REQUEST_E;
708  }
709  } else if ((decoded->msg_type == AST_AOC_D) || (decoded->msg_type == AST_AOC_E)) {
710  switch (decoded->charge_type) {
711  case AST_AOC_CHARGE_UNIT:
713  break;
716  break;
717  case AST_AOC_CHARGE_FREE:
719  case AST_AOC_CHARGE_NA:
720  default:
721  encoded->flags |= AST_AOC_ENCODED_CHARGE_NA;
722  break;
723  }
724 
725  if (decoded->total_type == AST_AOC_SUBTOTAL) {
727  }
728  }
729 
730  /* --- Set Version Number --- */
731  encoded->version = AST_AOC_ENCODE_VERSION;
732 
733  /* set the output size */
734  *out_size = size;
735 
736  if (aoc_debug_enabled) {
737  aoc_display_decoded_debug(decoded, 0, chan);
738  }
739 
740  return encoded;
741 }
uint16_t datalen
Definition: aoc.c:200
#define AST_AOC_ENCODED_REQUEST_E
Definition: aoc.c:179
#define AST_AOC_ENCODED_TYPE_E
Definition: aoc.c:174
#define AST_AOC_ENCODED_CHARGE_FREE
Definition: aoc.c:182
#define LOG_WARNING
Definition: logger.h:274
#define AST_AOC_ENCODED_TYPE_D
Definition: aoc.c:173
uint8_t version
Definition: aoc.c:198
#define AST_AOC_ENCODED_CHARGE_CURRENCY
Definition: aoc.c:183
#define AST_AOC_ENCODED_REQUEST_S
Definition: aoc.c:177
#define NULL
Definition: resample.c:96
enum ast_aoc_total_type total_type
Definition: aoc.c:209
static void aoc_display_decoded_debug(const struct ast_aoc_decoded *decoded, int decoding, struct ast_channel *chan)
Definition: aoc.c:1988
#define ast_log
Definition: astobj2.c:42
#define AST_AOC_ENCODED_CHARGE_UNIT
Definition: aoc.c:184
#define AST_AOC_ENCODED_CHARGE_SUBTOTAL
Definition: aoc.c:186
static char aoc_debug_enabled
Definition: aoc.c:192
#define AST_AOC_ENCODED_TYPE_REQUEST
Definition: aoc.c:172
uint8_t flags
Definition: aoc.c:199
#define AST_AOC_ENCODED_REQUEST_D
Definition: aoc.c:178
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:204
enum ast_aoc_type msg_type
Definition: aoc.c:206
#define AST_AOC_ENCODE_VERSION
Definition: aoc.c:189
unsigned char data[0]
Definition: aoc.c:201
#define AST_AOC_ENCODED_CHARGE_NA
Definition: aoc.c:181
Definition: aoc.h:64
Definition: aoc.h:66
enum ast_aoc_request request_flag
Definition: aoc.c:208
static void aoc_create_ie_data(struct ast_aoc_decoded *decoded, struct aoc_ie_data *ied)
Definition: aoc.c:583
#define AST_AOC_ENCODED_TYPE_S
Definition: aoc.c:175
enum ast_aoc_charge_type charge_type
Definition: aoc.c:207
Definition: aoc.h:65

◆ 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 1051 of file aoc.c.

References ast_aoc_decoded::charging_association.

Referenced by AST_TEST_DEFINE().

1052 {
1053  return &decoded->charging_association;
1054 }
struct ast_aoc_charging_association charging_association
Definition: aoc.c:224

◆ 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 1035 of file aoc.c.

References ast_aoc_decoded::billing_id.

Referenced by AST_TEST_DEFINE().

1036 {
1037  return decoded->billing_id;
1038 }
enum ast_aoc_billing_id billing_id
Definition: aoc.c:221

◆ 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 897 of file aoc.c.

References ast_aoc_decoded::charge_type.

Referenced by AST_TEST_DEFINE(), and transmit_info_with_aoc().

898 {
899  return decoded->charge_type;
900 }
enum ast_aoc_charge_type charge_type
Definition: aoc.c:207

◆ 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 940 of file aoc.c.

References ast_aoc_decoded::currency_amount.

Referenced by AST_TEST_DEFINE(), and transmit_info_with_aoc().

941 {
942  return decoded->currency_amount;
943 }
unsigned int currency_amount
Definition: aoc.c:213

◆ 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 945 of file aoc.c.

References ast_aoc_decoded::multiplier.

Referenced by AST_TEST_DEFINE().

946 {
947  return decoded->multiplier;
948 }
enum ast_aoc_currency_multiplier multiplier
Definition: aoc.c:212

◆ 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 950 of file aoc.c.

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.

Referenced by transmit_info_with_aoc().

951 {
952  switch (decoded->multiplier) {
954  return "0.001";
956  return "0.01";
958  return "0.1";
959  case AST_AOC_MULT_ONE:
960  return "1.0";
961  case AST_AOC_MULT_TEN:
962  return "10.0";
964  return "100.0";
966  return "1000.0";
967  default:
968  return "1.0";
969  }
970 }
enum ast_aoc_currency_multiplier multiplier
Definition: aoc.c:212

◆ 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 972 of file aoc.c.

References ast_aoc_decoded::currency_name.

Referenced by AST_TEST_DEFINE(), and transmit_info_with_aoc().

973 {
974  return decoded->currency_name;
975 }
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.c:214

◆ 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 892 of file aoc.c.

References ast_aoc_decoded::msg_type.

Referenced by AST_TEST_DEFINE(), sip_indicate(), transmit_info_with_aoc(), and wait_for_answer().

893 {
894  return decoded->msg_type;
895 }
enum ast_aoc_type msg_type
Definition: aoc.c:206

◆ 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 902 of file aoc.c.

References ast_aoc_decoded::request_flag.

Referenced by AST_TEST_DEFINE().

903 {
904  return decoded->request_flag;
905 }
enum ast_aoc_request request_flag
Definition: aoc.c:208

◆ 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 1079 of file aoc.c.

References ast_aoc_decoded::termination_request.

Referenced by AST_TEST_DEFINE(), and sip_indicate().

1080 {
1081  return decoded->termination_request;
1082 }
char termination_request
Definition: aoc.c:231

◆ 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 914 of file aoc.c.

References ast_aoc_decoded::total_type.

Referenced by AST_TEST_DEFINE().

915 {
916  return decoded->total_type;
917 }
enum ast_aoc_total_type total_type
Definition: aoc.c:209

◆ 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 1019 of file aoc.c.

References ast_aoc_decoded::unit_count.

Referenced by AST_TEST_DEFINE().

1020 {
1021  return decoded->unit_count;
1022 }
int unit_count
Definition: aoc.c:217

◆ 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 1010 of file aoc.c.

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

Referenced by AST_TEST_DEFINE(), and transmit_info_with_aoc().

1011 {
1012  if (entry_number >= decoded->unit_count) {
1013  return NULL;
1014  }
1015 
1016  return (const struct ast_aoc_unit_entry *) &decoded->unit_list[entry_number];
1017 }
#define NULL
Definition: resample.c:96
int unit_count
Definition: aoc.c:217
struct ast_aoc_unit_entry unit_list[32]
Definition: aoc.c:218
Definition: aoc.h:178

◆ 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 1928 of file aoc.c.

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().

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

◆ 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 770 of file aoc.c.

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 AST_TEST_DEFINE().

780 {
781 
782  struct ast_aoc_s_entry entry = { 0, };
783 
784  entry.charged_item = charged_item;
786  entry.rate.duration.amount = amount;
787  entry.rate.duration.multiplier = multiplier;
788  entry.rate.duration.time = time;
789  entry.rate.duration.time_scale = time_scale;
790  entry.rate.duration.granularity_time = granularity_time;
791  entry.rate.duration.granularity_time_scale = granularity_time_scale;
792  entry.rate.duration.charging_type = step_function ? 1 : 0;
793 
794  if (!ast_strlen_zero(currency_name)) {
795  ast_copy_string(entry.rate.duration.currency_name, currency_name, sizeof(entry.rate.duration.currency_name));
796  }
797 
798  return aoc_s_add_entry(decoded, &entry);
799 }
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
struct ast_aoc_duration_rate duration
Definition: aoc.h:171
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
uint8_t charging_type
Charging interval type.
Definition: aoc.h:122
uint32_t amount
Definition: aoc.h:104
#define ast_strlen_zero(foo)
Definition: strings.h:52
uint16_t multiplier
Definition: aoc.h:109
uint16_t time_scale
Definition: aoc.h:110
uint32_t granularity_time
Definition: aoc.h:107
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.h:114
union ast_aoc_s_entry::@220 rate
Charge rate being applied.
uint32_t time
Definition: aoc.h:105
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
Definition: search.h:40
uint16_t rate_type
Definition: aoc.h:167
uint16_t granularity_time_scale
Definition: aoc.h:111

◆ 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 801 of file aoc.c.

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 AST_TEST_DEFINE().

806 {
807  struct ast_aoc_s_entry entry = { 0, };
808 
809  entry.charged_item = charged_item;
811  entry.rate.flat.amount = amount;
812  entry.rate.flat.multiplier = multiplier;
813 
814  if (!ast_strlen_zero(currency_name)) {
815  ast_copy_string(entry.rate.flat.currency_name, currency_name, sizeof(entry.rate.flat.currency_name));
816  }
817 
818  return aoc_s_add_entry(decoded, &entry);
819 }
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
#define ast_strlen_zero(foo)
Definition: strings.h:52
struct ast_aoc_flat_rate flat
Definition: aoc.h:172
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.h:142
uint16_t multiplier
Definition: aoc.h:140
union ast_aoc_s_entry::@220 rate
Charge rate being applied.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
Definition: search.h:40
uint32_t amount
Definition: aoc.h:139
uint16_t rate_type
Definition: aoc.h:167

◆ 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 857 of file aoc.c.

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 AST_TEST_DEFINE().

860 {
861  struct ast_aoc_s_entry entry = { 0, };
862 
863  entry.charged_item = charged_item;
865 
866  return aoc_s_add_entry(decoded, &entry);
867 }
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
Definition: search.h:40
uint16_t rate_type
Definition: aoc.h:167

◆ 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 869 of file aoc.c.

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 AST_TEST_DEFINE().

871 {
872  struct ast_aoc_s_entry entry = { 0, };
873 
874  entry.charged_item = charged_item;
876 
877  return aoc_s_add_entry(decoded, &entry);
878 }
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
Definition: search.h:40
uint16_t rate_type
Definition: aoc.h:167

◆ 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 844 of file aoc.c.

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.

847 {
848  struct ast_aoc_s_entry entry = { 0, };
849 
850  entry.charged_item = charged_item;
852  entry.rate.special_code = code;
853 
854  return aoc_s_add_entry(decoded, &entry);
855 }
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
uint16_t special_code
Definition: aoc.h:174
union ast_aoc_s_entry::@220 rate
Charge rate being applied.
Definition: search.h:40
uint16_t rate_type
Definition: aoc.h:167

◆ 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 822 of file aoc.c.

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 AST_TEST_DEFINE().

828 {
829  struct ast_aoc_s_entry entry = { 0, };
830 
831  entry.charged_item = charged_item;
833  entry.rate.volume.multiplier = multiplier;
834  entry.rate.volume.amount = amount;
835  entry.rate.volume.volume_unit = volume_unit;
836 
837  if (!ast_strlen_zero(currency_name)) {
838  ast_copy_string(entry.rate.volume.currency_name, currency_name, sizeof(entry.rate.volume.currency_name));
839  }
840 
841  return aoc_s_add_entry(decoded, &entry);
842 }
uint16_t volume_unit
Definition: aoc.h:134
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
Definition: aoc.h:165
uint32_t amount
Definition: aoc.h:132
uint16_t charged_item
Definition: aoc.h:166
#define ast_strlen_zero(foo)
Definition: strings.h:52
uint16_t multiplier
Definition: aoc.h:133
struct ast_aoc_volume_rate volume
Definition: aoc.h:173
union ast_aoc_s_entry::@220 rate
Charge rate being applied.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
Definition: search.h:40
uint16_t rate_type
Definition: aoc.h:167
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.h:135

◆ 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 880 of file aoc.c.

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.

882 {
883  struct ast_aoc_s_entry entry = { 0, };
884 
887  entry.rate.special_code = code;
888 
889  return aoc_s_add_entry(decoded, &entry);
890 }
static int aoc_s_add_entry(struct ast_aoc_decoded *decoded, struct ast_aoc_s_entry *entry)
Definition: aoc.c:743
Definition: aoc.h:165
uint16_t charged_item
Definition: aoc.h:166
uint16_t special_code
Definition: aoc.h:174
union ast_aoc_s_entry::@220 rate
Charge rate being applied.
Definition: search.h:40
uint16_t rate_type
Definition: aoc.h:167

◆ 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 756 of file aoc.c.

References ast_aoc_decoded::aoc_s_count.

757 {
758  return decoded->aoc_s_count;
759 }
int aoc_s_count
Definition: aoc.c:227

◆ 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 761 of file aoc.c.

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

762 {
763  if (entry_number >= decoded->aoc_s_count) {
764  return NULL;
765  }
766 
767  return (const struct ast_aoc_s_entry *) &decoded->aoc_s_entries[entry_number];
768 }
Definition: aoc.h:165
#define NULL
Definition: resample.c:96
int aoc_s_count
Definition: aoc.c:227
struct ast_aoc_s_entry aoc_s_entries[10]
Definition: aoc.c:228

◆ 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 1040 of file aoc.c.

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, ast_aoc_charging_association::id, id, and ast_aoc_decoded::msg_type.

Referenced by action_aocmessage(), and AST_TEST_DEFINE().

1041 {
1042  if (decoded->msg_type != AST_AOC_E) {
1043  return -1;
1044  }
1045  memset(&decoded->charging_association, 0, sizeof(decoded->charging_association));
1047  decoded->charging_association.charge.id = id;
1048  return 0;
1049 }
union ast_aoc_charging_association::@221 charge
struct ast_aoc_charging_association charging_association
Definition: aoc.c:224
enum ast_aoc_type msg_type
Definition: aoc.c:206
Definition: aoc.h:66
enum queue_result id
Definition: app_queue.c:1507

◆ 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 accociation 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 1056 of file aoc.c.

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_aocmessage(), and AST_TEST_DEFINE().

1057 {
1058  if ((decoded->msg_type != AST_AOC_E) || ast_strlen_zero(num)) {
1059  return -1;
1060  }
1061  memset(&decoded->charging_association, 0, sizeof(decoded->charging_association));
1063  decoded->charging_association.charge.number.plan = plan;
1065 
1066  return 0;
1067 }
union ast_aoc_charging_association::@221 charge
struct ast_aoc_charging_association_number number
Definition: aoc.h:197
#define ast_strlen_zero(foo)
Definition: strings.h:52
struct ast_aoc_charging_association charging_association
Definition: aoc.c:224
enum ast_aoc_type msg_type
Definition: aoc.c:206
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401
Definition: aoc.h:66

◆ 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 1024 of file aoc.c.

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

Referenced by action_aocmessage(), and AST_TEST_DEFINE().

1025 {
1026  if ((id >= AST_AOC_BILLING_NUM_ENTRIES) || (id < AST_AOC_BILLING_NA)) {
1027  return -1;
1028  }
1029 
1030  decoded->billing_id = id;
1031 
1032  return 0;
1033 }
enum ast_aoc_billing_id billing_id
Definition: aoc.c:221
enum queue_result id
Definition: app_queue.c:1507

◆ 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 919 of file aoc.c.

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, and ast_aoc_decoded::multiplier.

Referenced by action_aocmessage(), and AST_TEST_DEFINE().

923 {
924 
925  if (!ast_strlen_zero(name)) {
926  ast_copy_string(decoded->currency_name, name, sizeof(decoded->currency_name));
927  }
928 
929  decoded->currency_amount = amount;
930 
931  if (multiplier && (multiplier < AST_AOC_MULT_NUM_ENTRIES)) {
932  decoded->multiplier = multiplier;
933  } else {
934  decoded->multiplier = AST_AOC_MULT_ONE;
935  }
936 
937  return 0;
938 }
enum ast_aoc_currency_multiplier multiplier
Definition: aoc.c:212
#define ast_strlen_zero(foo)
Definition: strings.h:52
char currency_name[AOC_CURRENCY_NAME_SIZE]
Definition: aoc.c:214
unsigned int currency_amount
Definition: aoc.c:213
static const char name[]
Definition: cdr_mysql.c:74
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:401

◆ 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 1069 of file aoc.c.

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

Referenced by AST_TEST_DEFINE().

1070 {
1071  if (decoded->msg_type != AST_AOC_REQUEST) {
1072  return -1;
1073  }
1074  decoded->termination_request = 1;
1075 
1076  return 0;
1077 }
enum ast_aoc_type msg_type
Definition: aoc.c:206
char termination_request
Definition: aoc.c:231

◆ 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 907 of file aoc.c.

References ast_aoc_decoded::total_type, and type.

Referenced by action_aocmessage(), and AST_TEST_DEFINE().

909 {
910  decoded->total_type = type;
911  return 0;
912 }
static const char type[]
Definition: chan_ooh323.c:109
enum ast_aoc_total_type total_type
Definition: aoc.c:209

◆ 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 1330 of file aoc.c.

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

Referenced by AST_TEST_DEFINE().

1331 {
1332  struct ast_aoc_decoded *new_decoded = NULL;
1333  struct ast_aoc_encoded *encoded = NULL;
1334  size_t size;
1335  int res = 0;
1336 
1337  if (!(encoded = ast_aoc_encode(decoded, &size, NULL))) {
1338  return -1;
1339  }
1340 
1341  if (!(new_decoded = ast_aoc_decode(encoded, size, NULL))) {
1342  ast_free(encoded);
1343  return -1;
1344  }
1345 
1346  if (memcmp(new_decoded, decoded, sizeof(struct ast_aoc_decoded))) {
1347  res = -1;
1348  }
1349 
1350  ast_aoc_destroy_decoded(new_decoded);
1351  ast_aoc_destroy_encoded(encoded);
1352  return res;
1353 }
void * ast_aoc_destroy_encoded(struct ast_aoc_encoded *encoded)
free an ast_aoc_encoded object
Definition: aoc.c:313
#define NULL
Definition: resample.c:96
void * ast_aoc_destroy_decoded(struct ast_aoc_decoded *decoded)
free an ast_aoc_decoded object
Definition: aoc.c:307
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:449
#define ast_free(a)
Definition: astmm.h:182
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:650