[commit] r2107 - in freeswitch/branches/cypromis/trunk/src: . include mod/endpoints/mod_exosip
Author: cypromis Date: Tue Jul 25 09:16:01 2006 New Revision: 2107 Modified: freeswitch/branches/cypromis/trunk/src/ (props changed) freeswitch/branches/cypromis/trunk/src/include/switch_core.h freeswitch/branches/cypromis/trunk/src/include/switch_module_interfaces.h freeswitch/branches/cypromis/trunk/src/include/switch_types.h freeswitch/branches/cypromis/trunk/src/mod/endpoints/mod_exosip/Makefile freeswitch/branches/cypromis/trunk/src/switch_core.c Log: more udpates from trunk Modified: freeswitch/branches/cypromis/trunk/src/include/switch_core.h ============================================================================== --- freeswitch/branches/cypromis/trunk/src/include/switch_core.h (original) +++ freeswitch/branches/cypromis/trunk/src/include/switch_core.h Tue Jul 25 09:16:01 2006 @@ -335,9 +335,17 @@ \param event the event to send \return the status returned by the message handler */ -SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t *event); +SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t **event); /*! + \brief Send an event to a session translating it to it's native message format + \param session the session to receive the event + \param event the event to receive + \return the status returned by the handler +*/ +SWITCH_DECLARE(switch_status_t) switch_core_session_receive_event(switch_core_session_t *session, switch_event_t **event); + +/*! \brief Retrieve private user data from a session \param session the session to retrieve from \return a pointer to the private data @@ -433,7 +441,16 @@ \param event the event to queue \return the status returned by the message handler */ -SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t *event); +SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t **event); + +/*! + \brief DE-Queue an event on a given session + \param session the session to de-queue the message on + \param event the de-queued event + \return the SWITCH_STATUS_SUCCESS if the event was de-queued +*/ +SWITCH_DECLARE(switch_status_t) switch_core_session_dequeue_event(switch_core_session_t *session, switch_event_t **event); + /*! \brief Read a frame from a session Modified: freeswitch/branches/cypromis/trunk/src/include/switch_module_interfaces.h ============================================================================== --- freeswitch/branches/cypromis/trunk/src/include/switch_module_interfaces.h (original) +++ freeswitch/branches/cypromis/trunk/src/include/switch_module_interfaces.h Tue Jul 25 09:16:01 2006 @@ -93,10 +93,10 @@ }; /*! \brief Node in which to store custom receive message callback hooks */ -struct switch_io_event_hook_queue_event { +struct switch_io_event_hook_receive_event { /*! the answer channel callback hook*/ - switch_queue_event_hook_t queue_event; - struct switch_io_event_hook_queue_event *next; + switch_receive_event_hook_t receive_event; + struct switch_io_event_hook_receive_event *next; }; /*! \brief Node in which to store custom read frame channel callback hooks */ @@ -150,7 +150,7 @@ /*! a list of receive message hooks */ switch_io_event_hook_receive_message_t *receive_message; /*! a list of queue message hooks */ - switch_io_event_hook_queue_event_t *queue_event; + switch_io_event_hook_receive_event_t *receive_event; /*! a list of read frame hooks */ switch_io_event_hook_read_frame_t *read_frame; /*! a list of write frame hooks */ @@ -186,7 +186,7 @@ /*! receive a message from another session*/ switch_status_t (*receive_message)(switch_core_session_t *, switch_core_session_message_t *); /*! queue a message for another session*/ - switch_status_t (*queue_event)(switch_core_session_t *, switch_event_t *); + switch_status_t (*receive_event)(switch_core_session_t *, switch_event_t *); }; /*! \brief Abstraction of an module endpoint interface Modified: freeswitch/branches/cypromis/trunk/src/include/switch_types.h ============================================================================== --- freeswitch/branches/cypromis/trunk/src/include/switch_types.h (original) +++ freeswitch/branches/cypromis/trunk/src/include/switch_types.h Tue Jul 25 09:16:01 2006 @@ -573,6 +573,10 @@ SWITCH_EVENT_ALL } switch_event_types_t; +typedef enum { + SWITCH_INPUT_TYPE_DTMF, + SWITCH_INPUT_TYPE_EVENT +} switch_input_type_t; typedef enum { SWITCH_CAUSE_UNALLOCATED = 1, @@ -651,7 +655,7 @@ typedef struct switch_io_event_hook_outgoing_channel switch_io_event_hook_outgoing_channel_t; typedef struct switch_io_event_hook_answer_channel switch_io_event_hook_answer_channel_t; typedef struct switch_io_event_hook_receive_message switch_io_event_hook_receive_message_t; -typedef struct switch_io_event_hook_queue_event switch_io_event_hook_queue_event_t; +typedef struct switch_io_event_hook_receive_event switch_io_event_hook_receive_event_t; typedef struct switch_io_event_hook_read_frame switch_io_event_hook_read_frame_t; typedef struct switch_io_event_hook_write_frame switch_io_event_hook_write_frame_t; typedef struct switch_io_event_hook_kill_channel switch_io_event_hook_kill_channel_t; @@ -682,7 +686,7 @@ typedef switch_status_t (*switch_outgoing_channel_hook_t)(switch_core_session_t *, switch_caller_profile_t *, switch_core_session_t *); typedef switch_status_t (*switch_answer_channel_hook_t)(switch_core_session_t *); typedef switch_status_t (*switch_receive_message_hook_t)(switch_core_session_t *, switch_core_session_message_t *); -typedef switch_status_t (*switch_queue_event_hook_t)(switch_core_session_t *, switch_event_t *); +typedef switch_status_t (*switch_receive_event_hook_t)(switch_core_session_t *, switch_event_t *); typedef switch_status_t (*switch_read_frame_hook_t)(switch_core_session_t *, switch_frame_t **, int, switch_io_flag_t, int); typedef switch_status_t (*switch_write_frame_hook_t)(switch_core_session_t *, switch_frame_t *, int, switch_io_flag_t, int); typedef switch_status_t (*switch_kill_channel_hook_t)(switch_core_session_t *, int); @@ -692,7 +696,11 @@ typedef struct switch_stream_handle switch_stream_handle_t; typedef switch_status_t (*switch_stream_handle_write_function_t)(switch_stream_handle_t *handle, char *fmt, ...); typedef switch_status_t (*switch_api_function_t)(char *in, switch_stream_handle_t *stream); -typedef switch_status_t (*switch_dtmf_callback_function_t)(switch_core_session_t *session, char *dtmf, void *buf, unsigned int buflen); +typedef switch_status_t (*switch_input_callback_function_t)(switch_core_session_t *session, + void *input, + switch_input_type_t input_type, + void *buf, + unsigned int buflen); typedef int (*switch_core_db_callback_func_t)(void *pArg, int argc, char **argv, char **columnNames); typedef switch_status_t (*switch_module_load_t) (switch_loadable_module_interface_t **, char *); typedef switch_status_t (*switch_module_reload_t) (void); Modified: freeswitch/branches/cypromis/trunk/src/mod/endpoints/mod_exosip/Makefile ============================================================================== Modified: freeswitch/branches/cypromis/trunk/src/switch_core.c ============================================================================== --- freeswitch/branches/cypromis/trunk/src/switch_core.c (original) +++ freeswitch/branches/cypromis/trunk/src/switch_core.c Tue Jul 25 09:16:01 2006 @@ -307,7 +307,7 @@ return status; } -SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t *event) +SWITCH_DECLARE(switch_status_t) switch_core_session_event_send(char *uuid_str, switch_event_t **event) { switch_core_session_t *session = NULL; switch_status_t status = SWITCH_STATUS_FALSE; @@ -1089,29 +1089,76 @@ return status; } -SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t *event) + +SWITCH_DECLARE(switch_status_t) switch_core_session_receive_event(switch_core_session_t *session, switch_event_t **event) { - switch_io_event_hook_queue_event_t *ptr; - switch_status_t status = SWITCH_STATUS_FALSE, istatus = SWITCH_STATUS_FALSE;; + switch_io_event_hook_receive_event_t *ptr; + switch_status_t status = SWITCH_STATUS_FALSE; assert(session != NULL); - if (session->endpoint_interface->io_routines->queue_event) { - status = session->endpoint_interface->io_routines->queue_event(session, event); - if (status != SWITCH_STATUS_SUCCESS && status != SWITCH_STATUS_BREAK) { - for (ptr = session->event_hooks.queue_event; ptr; ptr = ptr->next) { - if ((istatus = ptr->queue_event(session, event)) != SWITCH_STATUS_SUCCESS) { - break; + /* Acquire a read lock on the session or forget it the channel is dead */ + if (switch_thread_rwlock_tryrdlock(session->rwlock) == SWITCH_STATUS_SUCCESS) { + if (switch_channel_get_state(session->channel) < CS_HANGUP) { + if (session->endpoint_interface->io_routines->receive_event) { + status = session->endpoint_interface->io_routines->receive_event(session, *event); + } + + if (status == SWITCH_STATUS_SUCCESS) { + for (ptr = session->event_hooks.receive_event; ptr; ptr = ptr->next) { + if ((status = ptr->receive_event(session, *event)) != SWITCH_STATUS_SUCCESS) { + break; + } } } - } - - if (status == SWITCH_STATUS_SUCCESS || status == SWITCH_STATUS_BREAK) { - if (!session->event_queue) { - switch_queue_create(&session->event_queue, SWITCH_EVENT_QUEUE_LEN, session->pool); + + if (status == SWITCH_STATUS_BREAK) { + status = SWITCH_STATUS_SUCCESS; } - switch_queue_push(session->event_queue, event); + + if (status == SWITCH_STATUS_SUCCESS) { + switch_event_destroy(event); + } + } + switch_thread_rwlock_unlock(session->rwlock); + } + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_core_session_queue_event(switch_core_session_t *session, switch_event_t **event) + +{ + switch_status_t status = SWITCH_STATUS_FALSE; + + assert(session != NULL); + + if (!session->event_queue) { + switch_queue_create(&session->event_queue, SWITCH_EVENT_QUEUE_LEN, session->pool); + } + + if (session->event_queue) { + if (switch_queue_trypush(session->event_queue, *event) == SWITCH_STATUS_SUCCESS) { + *event = NULL; + status = SWITCH_STATUS_SUCCESS; + } + } + + return status; +} + +SWITCH_DECLARE(switch_status_t) switch_core_session_dequeue_event(switch_core_session_t *session, switch_event_t **event) + +{ + switch_status_t status = SWITCH_STATUS_FALSE; + void *pop; + + assert(session != NULL); + + if (session->event_queue) { + if ((status = (switch_status_t) switch_queue_trypop(session->event_queue, &pop)) == SWITCH_STATUS_SUCCESS) { + *event = (switch_event_t *) pop; } }
participants (1)
-
Freeswitch SVN