[asterisk-commits] dvossel: branch dvossel/generic_aoc r256361 - in /team/dvossel/generic_aoc: c...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Tue Apr 6 11:33:02 CDT 2010
Author: dvossel
Date: Tue Apr 6 11:33:00 2010
New Revision: 256361
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=256361
Log:
adds sig_pri component for sending aoc_s msg and more unit test conditions
Modified:
team/dvossel/generic_aoc/channels/sig_pri.c
team/dvossel/generic_aoc/include/asterisk/aoc.h
team/dvossel/generic_aoc/main/aoc.c
team/dvossel/generic_aoc/tests/test_aoc.c
Modified: team/dvossel/generic_aoc/channels/sig_pri.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/generic_aoc/channels/sig_pri.c?view=diff&rev=256361&r1=256360&r2=256361
==============================================================================
--- team/dvossel/generic_aoc/channels/sig_pri.c (original)
+++ team/dvossel/generic_aoc/channels/sig_pri.c Tue Apr 6 11:33:00 2010
@@ -1931,6 +1931,38 @@
#if defined(HAVE_PRI_AOC_EVENTS)
/*!
* \internal
+ * \brief Convert ast_aoc_charged_item to PRI_AOC_CHARGED_ITEM .
+ * \since 1.8
+ *
+ * \param value Value to convert to string.
+ *
+ * \return PRI_AOC_CHARGED_ITEM
+ */
+static enum PRI_AOC_CHARGED_ITEM sig_pri_aoc_charged_item_to_pri(enum PRI_AOC_CHARGED_ITEM value)
+{
+ switch (value) {
+ case AST_AOC_CHARGED_ITEM_NA:
+ return PRI_AOC_CHARGED_ITEM_NOT_AVAILABLE;
+ case AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT:
+ return PRI_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT;
+ case AST_AOC_CHARGED_ITEM_BASIC_COMMUNICATION:
+ return PRI_AOC_CHARGED_ITEM_BASIC_COMMUNICATION;
+ case AST_AOC_CHARGED_ITEM_CALL_ATTEMPT:
+ return PRI_AOC_CHARGED_ITEM_CALL_ATTEMPT;
+ case AST_AOC_CHARGED_ITEM_CALL_SETUP:
+ return PRI_AOC_CHARGED_ITEM_CALL_SETUP;
+ case AST_AOC_CHARGED_ITEM_USER_USER_INFO:
+ return PRI_AOC_CHARGED_ITEM_USER_USER_INFO;
+ case AST_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE:
+ return PRI_AOC_CHARGED_ITEM_SUPPLEMENTARY_SERVICE;
+ }
+ return PRI_AOC_CHARGED_ITEM_NOT_AVAILABLE;
+}
+#endif /* defined(HAVE_PRI_CCSS) */
+
+#if defined(HAVE_PRI_AOC_EVENTS)
+/*!
+ * \internal
* \brief Convert PRI_AOC_CHARGED_ITEM to ast_aoc_charged_item.
* \since 1.8
*
@@ -1968,9 +2000,9 @@
*
* \return pri enum equivalent.
*/
-static int sig_pri_aoc_multiplier_from_ast(struct ast_aoc_decoded *decoded)
-{
- switch (ast_aoc_get_currency_multiplier(decoded)) {
+static int sig_pri_aoc_multiplier_from_ast(enum ast_aoc_currency_multiplier mult)
+{
+ switch (mult) {
case AST_AOC_MULT_ONETHOUSANDTH:
return PRI_AOC_MULTIPLIER_THOUSANDTH;
case AST_AOC_MULT_ONEHUNDREDTH:
@@ -2022,6 +2054,38 @@
}
#endif /* defined(HAVE_PRI_AOC_EVENTS) */
+#if defined(HAVE_PRI_AOC_EVENTS)
+/*!
+ * \internal
+ * \brief Convert ast_aoc_time_scale representation to PRI_AOC_TIME_SCALE
+ * \since 1.8
+ *
+ * \param value Value to convert to ast representation
+ *
+ * \return PRI_AOC_TIME_SCALE
+ */
+static enum PRI_AOC_TIME_SCALE sig_pri_aoc_scale_to_pri(enum ast_aoc_time_scale value)
+{
+ switch (value) {
+ default:
+ case AST_AOC_TIME_SCALE_HUNDREDTH_SECOND:
+ return PRI_AOC_TIME_SCALE_HUNDREDTH_SECOND;
+ case AST_AOC_TIME_SCALE_TENTH_SECOND:
+ return PRI_AOC_TIME_SCALE_TENTH_SECOND;
+ case AST_AOC_TIME_SCALE_SECOND:
+ return PRI_AOC_TIME_SCALE_SECOND;
+ case AST_AOC_TIME_SCALE_TEN_SECOND:
+ return PRI_AOC_TIME_SCALE_TEN_SECOND;
+ case AST_AOC_TIME_SCALE_MINUTE:
+ return PRI_AOC_TIME_SCALE_MINUTE;
+ case AST_AOC_TIME_SCALE_HOUR:
+ return PRI_AOC_TIME_SCALE_HOUR;
+ case AST_AOC_TIME_SCALE_DAY:
+ return PRI_AOC_TIME_SCALE_DAY;
+ }
+}
+#endif /* defined(HAVE_PRI_AOC_EVENTS) */
+
#if defined(HAVE_PRI_AOC_EVENTS)
/*!
@@ -2109,7 +2173,6 @@
aoc_s->item[idx].rate.flat.currency);
break;
case PRI_AOC_RATE_TYPE_VOLUME:
-
ast_aoc_s_add_rate_volume(decoded,
charged_item,
aoc_s->item[idx].rate.volume.unit,
@@ -2123,8 +2186,10 @@
aoc_s->item[idx].rate.special);
break;
case PRI_AOC_RATE_TYPE_FREE:
+ ast_aoc_s_add_rate_free(decoded, charged_item, 0);
+ break;
case PRI_AOC_RATE_TYPE_FREE_FROM_BEGINNING:
- ast_aoc_s_add_rate_free(decoded, charged_item);
+ ast_aoc_s_add_rate_free(decoded, charged_item, 1);
break;
default:
ast_aoc_s_add_rate_na(decoded, charged_item);
@@ -2397,6 +2462,101 @@
#if defined(HAVE_PRI_AOC_EVENTS)
/*!
* \internal
+ * \brief send an AOC-S message on the current call
+ *
+ * \param pvt sig_pri private channel structure.
+ * \param ast Asterisk channel
+ * \param generic decoded ast AOC message
+ *
+ * \return Nothing
+ *
+ * \note Assumes that the PRI lock is already obtained.
+ */
+static void sig_pri_aoc_s_from_ast(struct sig_pri_chan *pvt, struct ast_channel *ast, struct ast_aoc_decoded *decoded)
+{
+ struct pri_subcmd_aoc_s aoc_s = { 0, };
+ const struct ast_aoc_s_entry *entry;
+ int idx;
+
+ for (idx = 0; idx < ast_aoc_s_get_count(decoded); idx++) {
+ if (!(entry = ast_aoc_s_get_rate_info(decoded, idx))) {
+ break;
+ }
+
+ aoc_s.item[idx].chargeable = sig_pri_aoc_charged_item_to_pri(entry->charged_item);
+
+ switch (entry->rate_type) {
+ case AST_AOC_RATE_TYPE_DURATION:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_DURATION;
+ aoc_s.item[idx].rate.duration.amount.cost = entry->rate.duration.amount;
+ aoc_s.item[idx].rate.duration.amount.multiplier =
+ sig_pri_aoc_multiplier_from_ast(entry->rate.duration.multiplier);
+ aoc_s.item[idx].rate.duration.time.length = entry->rate.duration.time;
+ aoc_s.item[idx].rate.duration.time.scale =
+ sig_pri_aoc_scale_to_pri(entry->rate.duration.time_scale);
+ aoc_s.item[idx].rate.duration.granularity.length = entry->rate.duration.granularity_time;
+ aoc_s.item[idx].rate.duration.granularity.scale =
+ sig_pri_aoc_scale_to_pri(entry->rate.duration.granularity_time_scale);
+ aoc_s.item[idx].rate.duration.charging_type = entry->rate.duration.charging_type;
+
+ if (!ast_strlen_zero(entry->rate.duration.currency_name)) {
+ ast_copy_string(aoc_s.item[idx].rate.duration.currency,
+ entry->rate.duration.currency_name,
+ sizeof(aoc_s.item[idx].rate.duration.currency));
+ }
+
+ break;
+ case AST_AOC_RATE_TYPE_FLAT:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_FLAT;
+ aoc_s.item[idx].rate.flat.amount.cost = entry->rate.flat.amount;
+ aoc_s.item[idx].rate.flat.amount.multiplier =
+ sig_pri_aoc_multiplier_from_ast(entry->rate.flat.multiplier);
+
+ if (!ast_strlen_zero(entry->rate.flat.currency_name)) {
+ ast_copy_string(aoc_s.item[idx].rate.flat.currency,
+ entry->rate.flat.currency_name,
+ sizeof(aoc_s.item[idx].rate.flat.currency));
+ }
+ break;
+ case AST_AOC_RATE_TYPE_VOLUME:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_VOLUME;
+ aoc_s.item[idx].rate.volume.unit = entry->rate.volume.volume_unit;
+ aoc_s.item[idx].rate.volume.amount.cost = entry->rate.volume.amount;
+ aoc_s.item[idx].rate.volume.amount.multiplier =
+ sig_pri_aoc_multiplier_from_ast(entry->rate.volume.multiplier);
+
+ if (!ast_strlen_zero(entry->rate.volume.currency_name)) {
+ ast_copy_string(aoc_s.item[idx].rate.volume.currency,
+ entry->rate.volume.currency_name,
+ sizeof(aoc_s.item[idx].rate.volume.currency));
+ }
+ break;
+ case AST_AOC_RATE_TYPE_SPECIAL_CODE:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_SPECIAL_CODE;
+ aoc_s.item[idx].rate.special = entry->rate.special_code;
+ break;
+ case AST_AOC_RATE_TYPE_FREE:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_FREE;
+ break;
+ case AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_FREE_FROM_BEGINNING;
+ break;
+ case AST_AOC_RATE_TYPE_NA:
+ default:
+ aoc_s.item[idx].rate_type = PRI_AOC_RATE_TYPE_NOT_AVAILABLE;
+ break;
+ }
+ }
+/* todohere uncomment this after libpri function is created to send AOC-S
+ pri_aoc_s_send(pvt->pri->pri, pvt->call, &aoc_s);
+*/
+}
+#endif /* defined(HAVE_PRI_AOC_EVENTS) */
+
+
+#if defined(HAVE_PRI_AOC_EVENTS)
+/*!
+ * \internal
* \brief send an AOC-D message on the current call
*
* \param pvt sig_pri private channel structure.
@@ -2436,7 +2596,7 @@
const char *currency_name = ast_aoc_get_currency_name(decoded);
aoc_d.charge = PRI_AOC_DE_CHARGE_CURRENCY;
aoc_d.recorded.money.amount.cost = ast_aoc_get_currency_amount(decoded);
- aoc_d.recorded.money.amount.multiplier = sig_pri_aoc_multiplier_from_ast(decoded);
+ aoc_d.recorded.money.amount.multiplier = sig_pri_aoc_multiplier_from_ast(ast_aoc_get_currency_multiplier(decoded));
if (!ast_strlen_zero(currency_name)) {
ast_copy_string(aoc_d.recorded.money.currency, currency_name, sizeof(aoc_d.recorded.money.currency));
}
@@ -2535,7 +2695,7 @@
const char *currency_name = ast_aoc_get_currency_name(decoded);
aoc_e.charge = PRI_AOC_DE_CHARGE_CURRENCY;
aoc_e.recorded.money.amount.cost = ast_aoc_get_currency_amount(decoded);
- aoc_e.recorded.money.amount.multiplier = sig_pri_aoc_multiplier_from_ast(decoded);
+ aoc_e.recorded.money.amount.multiplier = sig_pri_aoc_multiplier_from_ast(ast_aoc_get_currency_multiplier(decoded));
if (!ast_strlen_zero(currency_name)) {
ast_copy_string(aoc_e.recorded.money.currency, currency_name, sizeof(aoc_e.recorded.money.currency));
}
@@ -5419,6 +5579,9 @@
ast_debug(1, "Received AST_CONTROL_AOC on %s\n", chan->name);
if (decoded && p->pri && !pri_grab(p, p->pri)) {
switch (ast_aoc_get_msg_type(decoded)) {
+ case AST_AOC_S:
+ sig_pri_aoc_s_from_ast(p, chan, decoded);
+ break;
case AST_AOC_D:
sig_pri_aoc_d_from_ast(p, chan, decoded);
break;
Modified: team/dvossel/generic_aoc/include/asterisk/aoc.h
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/generic_aoc/include/asterisk/aoc.h?view=diff&rev=256361&r1=256360&r2=256361
==============================================================================
--- team/dvossel/generic_aoc/include/asterisk/aoc.h (original)
+++ team/dvossel/generic_aoc/include/asterisk/aoc.h Tue Apr 6 11:33:00 2010
@@ -380,12 +380,13 @@
*
* \param aoc decoded object to add entry to
* \param ast_aoc_s_charged_item
+ * \param int from_beginning. Indicating if the rate is free from beginning or not.
*
* \retval 0 success
* \retval -1 failure
*/
int ast_aoc_s_add_rate_free(struct ast_aoc_decoded *decoded,
- enum ast_aoc_s_charged_item charged_item);
+ enum ast_aoc_s_charged_item charged_item, int from_beginning);
/*! \brief Add AOC-S entry indicating charge item is not available
*
@@ -436,6 +437,15 @@
/*! \brief get the currency amount for AOC-D and AOC-E messages*/
unsigned int ast_aoc_get_currency_amount(struct ast_aoc_decoded *decoded);
+
+/*! \brief get the number rates associated with an AOC-S message */
+unsigned int ast_aoc_s_get_count(struct ast_aoc_decoded *decoded);
+
+/*! \brief get a specific AOC-S rate entry.
+ * \note This can be used in conjunction with ast_aoc_s_get_count to create
+ * a unit entry iterator.
+ */
+const struct ast_aoc_s_entry *ast_aoc_s_get_rate_info(struct ast_aoc_decoded *decoded, unsigned int entry_number);
/*! \brief get the number of unit entries for AOC-D and AOC-E messages*/
unsigned int ast_aoc_get_unit_count(struct ast_aoc_decoded *decoded);
Modified: team/dvossel/generic_aoc/main/aoc.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/generic_aoc/main/aoc.c?view=diff&rev=256361&r1=256360&r2=256361
==============================================================================
--- team/dvossel/generic_aoc/main/aoc.c (original)
+++ team/dvossel/generic_aoc/main/aoc.c Tue Apr 6 11:33:00 2010
@@ -590,6 +590,15 @@
return 0;
}
+const struct ast_aoc_s_entry *ast_aoc_s_get_rate_info(struct ast_aoc_decoded *decoded, unsigned int entry_number)
+{
+ if (entry_number >= decoded->aoc_s_count) {
+ return NULL;
+ }
+
+ return (const struct ast_aoc_s_entry *) &decoded->aoc_s_entries[entry_number];
+}
+
int ast_aoc_s_add_rate_duration(struct ast_aoc_decoded *decoded,
enum ast_aoc_s_charged_item charged_item,
unsigned int amount,
@@ -676,11 +685,12 @@
}
int ast_aoc_s_add_rate_free(struct ast_aoc_decoded *decoded,
- enum ast_aoc_s_charged_item charged_item)
+ enum ast_aoc_s_charged_item charged_item,
+ int from_beginning)
{
struct ast_aoc_s_entry entry = { 0, };
entry.charged_item = charged_item;
- entry.rate_type = AST_AOC_RATE_TYPE_FREE;
+ entry.rate_type = from_beginning ? AST_AOC_RATE_TYPE_FREE_FROM_BEGINNING : AST_AOC_RATE_TYPE_FREE;
return aoc_s_add_entry(decoded, &entry);
}
Modified: team/dvossel/generic_aoc/tests/test_aoc.c
URL: http://svnview.digium.com/svn/asterisk/team/dvossel/generic_aoc/tests/test_aoc.c?view=diff&rev=256361&r1=256360&r2=256361
==============================================================================
--- team/dvossel/generic_aoc/tests/test_aoc.c (original)
+++ team/dvossel/generic_aoc/tests/test_aoc.c Tue Apr 6 11:33:00 2010
@@ -550,6 +550,10 @@
AST_AOC_TIME_SCALE_SECOND,
0);
+ ast_aoc_s_add_rate_free(decoded, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT, 1);
+ ast_aoc_s_add_rate_free(decoded, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT, 0);
+ ast_aoc_s_add_rate_na(decoded, AST_AOC_CHARGED_ITEM_SPECIAL_ARRANGEMENT);
+
if (ast_aoc_test_encode_decode_match(decoded)) {
ast_test_status_update(test, "Test6: encode decode routine for AOC-S did not match expected results\n");
res = AST_TEST_FAIL;
More information about the asterisk-commits
mailing list