[svn-commits] dvossel: branch dvossel/generic_aoc r256361 - in /team/dvossel/generic_aoc: c...

SVN commits to the Digium repositories svn-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 svn-commits mailing list