[asterisk-commits] dvossel: branch group/aoc r251777 - in /team/group/aoc: channels/ include/ast...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Mar 10 17:42:20 CST 2010


Author: dvossel
Date: Wed Mar 10 17:42:16 2010
New Revision: 251777

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=251777
Log:
completion of AOCMessage manager action

AOCMessage can now be used to generate an aoc message.  At the moment
when generating a message on a sip channel, a temporary log message
is displayed indicating it was received.  AOCMessage user documentation
has yet to be completed though.

Modified:
    team/group/aoc/channels/chan_sip.c
    team/group/aoc/include/asterisk/aoc.h
    team/group/aoc/main/aoc.c
    team/group/aoc/main/manager.c

Modified: team/group/aoc/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/channels/chan_sip.c?view=diff&rev=251777&r1=251776&r2=251777
==============================================================================
--- team/group/aoc/channels/chan_sip.c (original)
+++ team/group/aoc/channels/chan_sip.c Wed Mar 10 17:42:16 2010
@@ -5364,6 +5364,9 @@
 	case AST_CONTROL_REDIRECTING:
 		update_redirecting(p, data, datalen);
 		break;
+	case AST_CONTROL_AOC:
+		ast_log(LOG_NOTICE, "SIP got the AOC frame\n"); //todohere remove this, just temporary
+		break;
 	case -1:
 		res = -1;
 		break;

Modified: team/group/aoc/include/asterisk/aoc.h
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/include/asterisk/aoc.h?view=diff&rev=251777&r1=251776&r2=251777
==============================================================================
--- team/group/aoc/include/asterisk/aoc.h (original)
+++ team/group/aoc/include/asterisk/aoc.h Wed Mar 10 17:42:16 2010
@@ -122,12 +122,12 @@
 /* \brief encodes a decoded aoc structure so it can be passed on the wire
  *
  * \param ast_aoc_decoded struct to be encoded
- * \param ast_aoc_encoded struct hold encoded data
- *
- * \retval size of encoded data
- * \retval 0 failure
- */
-size_t ast_aoc_encode(struct ast_aoc_decoded *decoded, struct ast_aoc_encoded **encoded_out);
+ * \param output parameter representing size of encoded data
+ *
+ * \retval pointer to encoded data
+ * \retval NULL failure
+ */
+struct ast_aoc_encoded *ast_aoc_encode(struct ast_aoc_decoded *decoded, size_t *out_size);
 
 /* \brief Sets the type of total for a AOC-D message
  *

Modified: team/group/aoc/main/aoc.c
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/main/aoc.c?view=diff&rev=251777&r1=251776&r2=251777
==============================================================================
--- team/group/aoc/main/aoc.c (original)
+++ team/group/aoc/main/aoc.c Wed Mar 10 17:42:16 2010
@@ -344,15 +344,16 @@
 	}
 }
 
-size_t ast_aoc_encode(struct ast_aoc_decoded *decoded, struct ast_aoc_encoded **encoded_out)
+struct ast_aoc_encoded *ast_aoc_encode(struct ast_aoc_decoded *decoded, size_t *out_size)
 {
 	struct aoc_ie_data ied;
-	struct ast_aoc_encoded *encoded;
+	struct ast_aoc_encoded *encoded = NULL;
 	size_t size = 0;
 
-	if (!decoded || !encoded_out) {
-		return 0;
-	}
+	if (!decoded || !out_size) {
+		return NULL;
+	}
+	*out_size = 0;
 
 	/* create information element buffer before allocating the payload,
 	 * by doing this the exact size of the payload + the id data can be
@@ -363,7 +364,7 @@
 
 	if (!(encoded = ast_calloc(1, size))) {
 		ast_log(LOG_WARNING, "Failed to create ast_aoc_encoded object during decode routine. \n");
-		return 0;
+		return NULL;
 	}
 
 	/* -- Set ie data buffer */
@@ -421,10 +422,10 @@
 	/* --- Set Version Number --- */
 	encoded->version = AOC_ENCODE_VERSION;
 
-	/* set the output param */
-	*encoded_out = encoded;
-
-	return size;
+	/* set the output size  */
+	*out_size = size;
+
+	return encoded;
 }
 
 enum ast_aoc_type ast_aoc_get_msg_type(struct ast_aoc_decoded *decoded)
@@ -571,10 +572,10 @@
 {
 	struct ast_aoc_decoded *new = NULL;
 	struct ast_aoc_encoded *encoded = NULL;
-	unsigned int size;
+	size_t size;
 	int res = 0;
 
-	if (!(size = ast_aoc_encode(decoded, &encoded))) {
+	if (!(encoded = ast_aoc_encode(decoded, &size))) {
 		return -1;
 	}
 

Modified: team/group/aoc/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/team/group/aoc/main/manager.c?view=diff&rev=251777&r1=251776&r2=251777
==============================================================================
--- team/group/aoc/main/manager.c (original)
+++ team/group/aoc/main/manager.c Wed Mar 10 17:42:16 2010
@@ -3403,6 +3403,7 @@
 static int action_aocmessage(struct mansession *s, const struct message *m)
 {
 	const char *channel = astman_get_header(m, "Channel");
+	const char *pchannel = astman_get_header(m, "PartialChannel");
 	const char *msgtype = astman_get_header(m, "MsgType");
 	const char *chargetype = astman_get_header(m, "ChargeType");
 	const char *currencyname = astman_get_header(m, "CurrencyName");
@@ -3413,7 +3414,6 @@
 	const char *aocdbillingid = astman_get_header(m, "AOCDBillingId");
 	const char *association_id= astman_get_header(m, "ChargingAssociationId");
 	const char *association_num = astman_get_header(m, "ChargingAssociationNumber");
-/*	const char *actionid = astman_get_header(m, "ActionId"); TODO XXX take care of adding action id to this*/
 
 	enum ast_aoc_type _msgtype;
 	enum ast_aoc_charge_type _chargetype;
@@ -3422,29 +3422,34 @@
 	enum ast_aoc_billing_id _billingid = AOC_BILLING_NA;
 	unsigned int _currencyamount = 0;
 	int _association_id = 0;
-	struct ast_channel *chan;
+	struct ast_channel *chan = NULL;
 
 	struct ast_aoc_decoded *decoded = NULL;
 	struct ast_aoc_encoded *encoded = NULL;
-
-	if (ast_strlen_zero(channel)) {
-		astman_send_error(s, m, "Channel not specified");
-		return 0;
-	}
-
-	if (!(chan = ast_channel_get_by_name(channel))) {
+	size_t encoded_size = 0;
+
+	if (ast_strlen_zero(channel) && ast_strlen_zero(pchannel)) {
+		astman_send_error(s, m, "Channel and PartialChannel are not specified. Specify at least one of these.");
+		goto aocmessage_cleanup;
+	}
+
+	if (!(chan = ast_channel_get_by_name(channel)) && !ast_strlen_zero(pchannel)) {
+		chan = ast_channel_get_by_name_prefix(pchannel, strlen(pchannel));
+	}
+
+	if (!chan) {
 		astman_send_error(s, m, "No such channel");
-		return 0;
+		goto aocmessage_cleanup;
 	}
 
 	if (ast_strlen_zero(msgtype) || (strcasecmp(msgtype, "d") && strcasecmp(msgtype, "e"))) {
 		astman_send_error(s, m, "Invalid MsgType");
-		return 0;
+		goto aocmessage_cleanup;
 	}
 
 	if (ast_strlen_zero(chargetype)) {
 		astman_send_error(s, m, "ChargeType not specified");
-		return 0;
+		goto aocmessage_cleanup;
 	}
 
 	_msgtype = strcasecmp(msgtype, "d") ? AOC_E : AOC_D;
@@ -3459,7 +3464,7 @@
 		_chargetype = AOC_CHARGE_UNIT;
 	} else {
 		astman_send_error(s, m, "Invalid ChargeType");
-		return 0;
+		goto aocmessage_cleanup;
 	}
 
 	if (_chargetype == AOC_CHARGE_CURRENCY) {
@@ -3470,7 +3475,7 @@
 
 		if (ast_strlen_zero(mult)) {
 			astman_send_error(s, m, "ChargeMultiplier unspecified, ChargeMultiplier is required when ChargeType is Currency.");
-			return 0;
+			goto aocmessage_cleanup;
 		} else if (!strcasecmp(mult, "onethousandth")) {
 			_mult = AOC_MULT_ONETHOUSANDTH;
 		} else if (!strcasecmp(mult, "onehundredth")) {
@@ -3487,7 +3492,7 @@
 			_mult = AOC_MULT_THOUSAND;
 		} else {
 			astman_send_error(s, m, "Invalid ChargeMultiplier");
-			return 0;
+			goto aocmessage_cleanup;
 		}
 	}
 
@@ -3496,7 +3501,7 @@
 			_totaltype = AOC_SUBTOTAL;
 		}
 
-		if (!ast_strlen_zero(aocdbillingid)) {
+		if (ast_strlen_zero(aocdbillingid)) {
 			/* ignore this is optional */
 		} else if (!strcasecmp(aocdbillingid, "Normal")) {
 			_billingid = AOC_BILLING_NORMAL;
@@ -3506,10 +3511,10 @@
 			_billingid = AOC_BILLING_CREDIT_CARD;
 		} else {
 			astman_send_error(s, m, "Invalid AOCDBillingId");
-			return 0;
+			goto aocmessage_cleanup;
 		}
 	} else {
-		if (!ast_strlen_zero(aocebillingid)) {
+		if (ast_strlen_zero(aocebillingid)) {
 			/* ignore this is optional */
 		} else if (!strcasecmp(aocebillingid, "Normal")) {
 			_billingid = AOC_BILLING_NORMAL;
@@ -3529,10 +3534,10 @@
 			_billingid = AOC_BILLING_CALL_TRANSFER;
 		} else {
 			astman_send_error(s, m, "Invalid AOCEBillingId");
-			return 0;
-		}
-
-		if (!ast_strlen_zero(association_id) || (sscanf(association_id, "%30d", &_association_id) != 1)) {
+			goto aocmessage_cleanup;
+		}
+
+		if (!ast_strlen_zero(association_id) && (sscanf(association_id, "%30d", &_association_id) != 1)) {
 			astman_send_error(s, m, "Invalid ChargingAssociationId");
 		}
 
@@ -3541,7 +3546,7 @@
 	/* create decoded object and start setting values */
 	if (!(decoded = ast_aoc_create(_msgtype, _chargetype, 0))) {
 			astman_send_error(s, m, "Message Creation Failed");
-			return 0;
+			goto aocmessage_cleanup;
 	}
 
 	if (_chargetype == AOC_CHARGE_CURRENCY) {
@@ -3559,10 +3564,10 @@
 			ast_aoc_add_unit_entry(decoded, entry.amount, entry.type);
 		}
 
+		/* at least one unit entry is required */
 		if (!i) {
-			astman_send_error(s, m, "Invalid Unit entry, UnitAmount(0) is required.");
-			ast_aoc_destroy_decoded(decoded);
-			return 0;
+			astman_send_error(s, m, "Invalid UnitAmount(0), At least one valid unit entry is required when ChargeType is set to Unit");
+			goto aocmessage_cleanup;
 		}
 
 	}
@@ -3573,9 +3578,20 @@
 	ast_aoc_set_total_type(decoded, _totaltype);
 
 
+	if ((encoded = ast_aoc_encode(decoded, &encoded_size)) && !ast_indicate_data(chan, AST_CONTROL_AOC, encoded, encoded_size)) {
+		astman_send_ack(s, m, "AOC Message successfully queued on channel");
+	} else {
+		astman_send_error(s, m, "Error encoding AOC message, could not queue onto channel");
+	}
+
+aocmessage_cleanup:
+
 	ast_aoc_destroy_decoded(decoded);
 	ast_aoc_destroy_encoded(encoded);
 
+	if (chan) {
+		chan = ast_channel_unref(chan);
+	}
 	return 0;
 }
 




More information about the asterisk-commits mailing list