[libpri-commits] dvossel: branch dvossel/aoc_send r1569 - /team/dvossel/aoc_send/
SVN commits to the libpri project
libpri-commits at lists.digium.com
Tue Mar 23 14:34:24 CDT 2010
Author: dvossel
Date: Tue Mar 23 14:34:21 2010
New Revision: 1569
URL: http://svnview.digium.com/svn/libpri?view=rev&rev=1569
Log:
AOC request response support
Modified:
team/dvossel/aoc_send/libpri.h
team/dvossel/aoc_send/pri_aoc.c
Modified: team/dvossel/aoc_send/libpri.h
URL: http://svnview.digium.com/svn/libpri/team/dvossel/aoc_send/libpri.h?view=diff&rev=1569&r1=1568&r2=1569
==============================================================================
--- team/dvossel/aoc_send/libpri.h (original)
+++ team/dvossel/aoc_send/libpri.h Tue Mar 23 14:34:21 2010
@@ -543,6 +543,7 @@
#define PRI_SUBCMD_AOC_D 19 /*!< Advice Of Charge During information */
#define PRI_SUBCMD_AOC_E 20 /*!< Advice Of Charge End information */
#define PRI_SUBCMD_AOC_CHARGING_REQUEST 21 /*!< Advice Of Charge Request information */
+#define PRI_SUBCMD_AOC_CHARGING_REQUEST_RESPONSE 22 /*!< Advice Of Charge Request Response information */
#if defined(STATUS_REQUEST_PLACE_HOLDER)
struct pri_subcmd_status_request {
@@ -653,8 +654,17 @@
};
enum PRI_AOC_REQUEST_RESPONSE {
- PRI_AOC_REQUEST_RESPONSE_NOT_IMPLEMENTED,
- PRI_AOC_REQUEST_RESPONSE_NOT_AVAILABLE,
+
+ /* Error Results */
+ PRI_AOC_REQUEST_RESPONSE_ERROR_NOT_IMPLEMENTED,
+ PRI_AOC_REQUEST_RESPONSE_ERROR_NOT_AVAILABLE,
+ PRI_AOC_REQUEST_RESPONSE_ERROR_TIMEOUT,
+ /* generic error result all other errors are lumped into */
+ PRI_AOC_REQUEST_RESPONSE_ERROR,
+
+ /* AOC Results */
+ PRI_AOC_REQUEST_RESPONSE_CURRENCY_INFO_LIST,
+ PRI_AOC_REQUEST_RESPONSE_SPECIAL_ARG,
PRI_AOC_REQUEST_RESPONSE_CHARGING_INFO_FOLLOWS,
};
@@ -664,6 +674,21 @@
PRI_AOC_REQUEST_E,
};
+struct pri_subcmd_aoc_request_response {
+ /*!
+ * \brief What type of aoc was requested.
+ * \see enum PRI_AOC_REQUEST
+ */
+ int charging_request;
+
+ /*!
+ * \brief response to the charging_request
+ * \see enum PRI_AOC_REQUEST_RESPONSE
+ */
+ int charging_response;
+
+};
+
struct pri_subcmd_aoc_request {
/*!
* \brief What types of aoc are being requested.
@@ -674,7 +699,7 @@
/*!
* \brief Value given by the initiating request.
*/
- unsigned int invoke_id;
+ int invoke_id;
};
/*! \brief What is being charged. */
@@ -904,6 +929,7 @@
struct pri_subcmd_cc_cancel cc_cancel;
struct pri_subcmd_transfer transfer;
struct pri_subcmd_aoc_request aoc_request;
+ struct pri_subcmd_aoc_request_response aoc_request_response;
struct pri_subcmd_aoc_s aoc_s;
struct pri_subcmd_aoc_d aoc_d;
struct pri_subcmd_aoc_e aoc_e;
Modified: team/dvossel/aoc_send/pri_aoc.c
URL: http://svnview.digium.com/svn/libpri/team/dvossel/aoc_send/pri_aoc.c?view=diff&rev=1569&r1=1568&r2=1569
==============================================================================
--- team/dvossel/aoc_send/pri_aoc.c (original)
+++ team/dvossel/aoc_send/pri_aoc.c Tue Mar 23 14:34:21 2010
@@ -970,10 +970,10 @@
* \retval NULL on error.
*/
static unsigned char *enc_etsi_aoc_request_response(struct pri *ctrl, unsigned char *pos,
- unsigned char *end, int response, unsigned int invoke_id)
-{
- struct rose_msg_result msg_result;
- struct rose_msg_error msg_error;
+ unsigned char *end, int response, int invoke_id)
+{
+ struct rose_msg_result msg_result = { 0, };
+ struct rose_msg_error msg_error = { 0, };
int is_error = 0;
pos = facility_encode_header(ctrl, pos, end, NULL);
if (!pos) {
@@ -981,23 +981,26 @@
}
switch (response) {
- case PRI_AOC_REQUEST_RESPONSE_NOT_IMPLEMENTED:
- memset(&msg_error, 0, sizeof(msg_error));
- is_error = 1;
- msg_error.code = ROSE_ERROR_Gen_NotImplemented;
- break;
- case PRI_AOC_REQUEST_RESPONSE_NOT_AVAILABLE:
- memset(&msg_error, 0, sizeof(msg_error));
- msg_error.code = ROSE_ERROR_Gen_NotAvailable;
- is_error = 1;
- break;
- case PRI_AOC_REQUEST_RESPONSE_CHARGING_INFO_FOLLOWS:
- memset(&msg_result, 0, sizeof(msg_result));
- msg_result.args.etsi.ChargingRequest.type = 0;
- break;
- default:
- /* no valid request parameters are present */
- return NULL;
+ case PRI_AOC_REQUEST_RESPONSE_CURRENCY_INFO_LIST:
+ msg_result.args.etsi.ChargingRequest.type = 0;
+ break;
+ case PRI_AOC_REQUEST_RESPONSE_SPECIAL_ARG:
+ msg_result.args.etsi.ChargingRequest.type = 1;
+ break;
+ case PRI_AOC_REQUEST_RESPONSE_CHARGING_INFO_FOLLOWS:
+ msg_result.args.etsi.ChargingRequest.type = 2;
+ break;
+ case PRI_AOC_REQUEST_RESPONSE_ERROR_NOT_IMPLEMENTED:
+ msg_error.code = ROSE_ERROR_Gen_NotImplemented;
+ is_error = 1;
+ break;
+ case PRI_AOC_REQUEST_RESPONSE_ERROR:
+ case PRI_AOC_REQUEST_RESPONSE_ERROR_NOT_AVAILABLE:
+ case PRI_AOC_REQUEST_RESPONSE_ERROR_TIMEOUT:
+ default:
+ is_error = 1;
+ msg_error.code = ROSE_ERROR_Gen_NotAvailable;
+ break;
}
if (is_error) {
@@ -1093,6 +1096,68 @@
}
+
+static int pri_aoc_request_get_response(enum APDU_CALLBACK_REASON reason, struct pri *ctrl, struct q931_call *call, struct apdu_event *apdu, const struct apdu_msg_data *msg)
+{
+ struct pri_subcommand *subcmd;
+ struct pri_subcmd_aoc_request *aoc_request;
+ int errorcode;
+
+ if (!PRI_MASTER(ctrl)->aoc_support) {
+ return -1;
+ }
+
+ subcmd = q931_alloc_subcommand(ctrl);
+ if (!subcmd) {
+ return -1;
+ }
+
+ aoc_request = apdu->response.user.ptr;
+ subcmd->u.aoc_request_response.charging_request = aoc_request->charging_request;
+ subcmd->cmd = PRI_SUBCMD_AOC_CHARGING_REQUEST_RESPONSE;
+
+ switch (reason) {
+ case APDU_CALLBACK_REASON_ERROR:
+ errorcode = msg->response.error->code;
+ switch (errorcode) {
+ case ROSE_ERROR_Gen_NotImplemented:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_ERROR_NOT_IMPLEMENTED;
+ break;
+ case ROSE_ERROR_Gen_NotAvailable:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_ERROR_NOT_AVAILABLE;
+ break;
+ default:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_ERROR;
+ break;
+ }
+ break;
+ case APDU_CALLBACK_REASON_TIMEOUT:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_ERROR_TIMEOUT;
+ break;
+ case APDU_CALLBACK_REASON_MSG_RESULT:
+ switch (msg->response.result->args.etsi.ChargingRequest.type) {
+ case 0:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_CURRENCY_INFO_LIST;
+ break;
+ case 1:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_SPECIAL_ARG;
+ break;
+ case 2:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_CHARGING_INFO_FOLLOWS;
+ break;
+ default:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_ERROR;
+ break;
+ }
+ break;
+ default:
+ subcmd->u.aoc_request_response.charging_response = PRI_AOC_REQUEST_RESPONSE_ERROR;
+ break;
+ }
+
+ return 0;
+}
+
/*!
* \internal
* \brief Send the ETSI AOC Request invoke message.
@@ -1108,16 +1173,23 @@
{
unsigned char buffer[255];
unsigned char *end = 0;
+ struct apdu_callback_data response;
end = enc_etsi_aoc_request(ctrl, buffer, buffer + sizeof(buffer), aoc_request);
if (!end) {
return -1;
}
+
+ memset(&response, 0, sizeof(response));
+ response.invoke_id = ctrl->last_invoke;
+ response.timeout_time = ctrl->timers[PRI_TIMER_T_CCBS1];
+ response.callback = pri_aoc_request_get_response;
+ response.user.ptr = (void *) aoc_request;
/* in the case of an AOC request message, we queue this on a SETUP message and
* do not have to send it ourselves in this function */
- return pri_call_apdu_queue(call, Q931_SETUP, buffer, end - buffer, NULL); /*TODO change NULL to callback function to handle reply */
+ return pri_call_apdu_queue(call, Q931_SETUP, buffer, end - buffer, &response);
}
/*!
More information about the libpri-commits
mailing list