]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ftmod_r2 - refactored ftdm_span_next_event(), ftdm_channel_read_event()...
authorArnaldo Pereira <arnaldo@sangoma.com>
Wed, 22 Dec 2010 19:35:55 +0000 (17:35 -0200)
committerArnaldo Pereira <arnaldo@sangoma.com>
Wed, 22 Dec 2010 19:35:55 +0000 (17:35 -0200)
                    which handle oob events and notify the user by sending the proper SIGEVENT message

libs/freetdm/src/ftdm_io.c

index b8124147e9b77187fb94883070a51ed19940a1cd..a8b60493c16d95ca5b10f07e670957a144031e25 100644 (file)
@@ -1091,54 +1091,65 @@ FT_DECLARE(ftdm_status_t) ftdm_span_poll_event(ftdm_span_t *span, uint32_t ms, s
        return FTDM_NOTIMPL;
 }
 
-FT_DECLARE(ftdm_status_t) ftdm_span_next_event(ftdm_span_t *span, ftdm_event_t **event)
+/* handle oob events and send the proper SIGEVENT signal to user, when applicable */
+static __inline__ ftdm_status_t ftdm_event_handle_oob(ftdm_event_t *event)
 {
-       ftdm_status_t status = FTDM_FAIL;
        ftdm_sigmsg_t sigmsg;
-       ftdm_assert_return(span->fio != NULL, FTDM_FAIL, "No I/O module attached to this span!\n");
-
-       if (!span->fio->next_event) {
-               ftdm_log(FTDM_LOG_ERROR, "next_event method not implemented in module %s!", span->fio->name);
-               return FTDM_NOTIMPL;
-       }
-
-       status = span->fio->next_event(span, event);
-       if (status != FTDM_SUCCESS) {
-               return status;
-       }
+       ftdm_status_t status = FTDM_SUCCESS;
+       ftdm_channel_t *fchan = event->channel;
+       ftdm_span_t *span = fchan->span;
 
-       /* before returning the event to the user we do some core operations with certain OOB events */
        memset(&sigmsg, 0, sizeof(sigmsg));
        sigmsg.span_id = span->span_id;
-       sigmsg.chan_id = (*event)->channel->chan_id;
-       sigmsg.channel = (*event)->channel;
-       switch ((*event)->enum_id) {
+       sigmsg.chan_id = fchan->chan_id;
+       sigmsg.channel = fchan;
+       switch (event->enum_id) {
        case FTDM_OOB_ALARM_CLEAR:
                {
                        sigmsg.event_id = FTDM_SIGEVENT_ALARM_CLEAR;
-                       ftdm_clear_flag_locked((*event)->channel, FTDM_CHANNEL_IN_ALARM);
-                       ftdm_span_send_signal(span, &sigmsg);
+                       ftdm_clear_flag_locked(fchan, FTDM_CHANNEL_IN_ALARM);
+                       status = ftdm_span_send_signal(span, &sigmsg);
                }
                break;
        case FTDM_OOB_ALARM_TRAP:
                {
                        sigmsg.event_id = FTDM_SIGEVENT_ALARM_TRAP;
-                       ftdm_set_flag_locked((*event)->channel, FTDM_CHANNEL_IN_ALARM);
-                       ftdm_span_send_signal(span, &sigmsg);
+                       ftdm_set_flag_locked(fchan, FTDM_CHANNEL_IN_ALARM);
+                       status = ftdm_span_send_signal(span, &sigmsg);
                }
                break;
        default:
                /* NOOP */
                break;
        }
+       return status;
+}
+
+FT_DECLARE(ftdm_status_t) ftdm_span_next_event(ftdm_span_t *span, ftdm_event_t **event)
+{
+       ftdm_status_t status = FTDM_FAIL;
+       ftdm_assert_return(span->fio != NULL, FTDM_FAIL, "No I/O module attached to this span!\n");
+
+       if (!span->fio->next_event) {
+               ftdm_log(FTDM_LOG_ERROR, "next_event method not implemented in module %s!", span->fio->name);
+               return FTDM_NOTIMPL;
+       }
 
+       status = span->fio->next_event(span, event);
+       if (status != FTDM_SUCCESS) {
+               return status;
+       }
+
+       status = ftdm_event_handle_oob(*event);
+       if (status != FTDM_SUCCESS) {
+               ftdm_log(FTDM_LOG_ERROR, "failed to send SIGEVENT signal to user\n");
+       }
        return status;
 }
 
 FT_DECLARE(ftdm_status_t) ftdm_channel_read_event(ftdm_channel_t *ftdmchan, ftdm_event_t **event)
 {
        ftdm_status_t status = FTDM_FAIL;
-       ftdm_sigmsg_t sigmsg;
        ftdm_span_t *span = ftdmchan->span;
        ftdm_assert_return(span->fio != NULL, FTDM_FAIL, "No I/O module attached to this span!\n");
 
@@ -1152,31 +1163,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_read_event(ftdm_channel_t *ftdmchan, ftdm
                return status;
        }
 
-       /* before returning the event to the user we do some core operations with certain OOB events */
-       memset(&sigmsg, 0, sizeof(sigmsg));
-       sigmsg.span_id = span->span_id;
-       sigmsg.chan_id = (*event)->channel->chan_id;
-       sigmsg.channel = (*event)->channel;
-       switch ((*event)->enum_id) {
-       case FTDM_OOB_ALARM_CLEAR:
-               {
-                       sigmsg.event_id = FTDM_SIGEVENT_ALARM_CLEAR;
-                       ftdm_clear_flag_locked((*event)->channel, FTDM_CHANNEL_IN_ALARM);
-                       ftdm_span_send_signal(span, &sigmsg);
-               }
-               break;
-       case FTDM_OOB_ALARM_TRAP:
-               {
-                       sigmsg.event_id = FTDM_SIGEVENT_ALARM_TRAP;
-                       ftdm_set_flag_locked((*event)->channel, FTDM_CHANNEL_IN_ALARM);
-                       ftdm_span_send_signal(span, &sigmsg);
-               }
-               break;
-       default:
-               /* NOOP */
-               break;
+       status = ftdm_event_handle_oob(*event);
+       if (status != FTDM_SUCCESS) {
+               ftdm_log(FTDM_LOG_ERROR, "failed to send SIGEVENT signal to user\n");
        }
-
        return status;
 }