FreeTDM: Add span iterator

Part of my ongoing effort to split ftdm_io.c into more manageable pieces.

This change (along with others in the future) allows decoupling of the
span registry and its users, in preparation of moving all span related
functions and data structures into ftdm_span.c.

Signed-off-by: Stefan Knoblich <stkn@openisdn.net>
This commit is contained in:
Stefan Knoblich 2013-06-01 15:20:51 +02:00
parent 5835e0d541
commit 4bc05eae68
3 changed files with 21 additions and 0 deletions

View File

@ -4438,6 +4438,16 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_get_iterator(ftdm_iterator_type_t type, ftdm_
return iter;
}
FT_DECLARE(ftdm_iterator_t *) ftdm_get_span_iterator(ftdm_iterator_t *iter)
{
if (!(iter = ftdm_get_iterator(FTDM_ITERATOR_SPANS, iter))) {
return NULL;
}
iter->pvt.hashiter = hashtable_first(globals.span_hash);
return iter;
}
FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *span, ftdm_iterator_t *iter)
{
if (!span->chan_count) {
@ -4457,6 +4467,7 @@ FT_DECLARE(ftdm_iterator_t *) ftdm_iterator_next(ftdm_iterator_t *iter)
switch (iter->type) {
case FTDM_ITERATOR_VARS:
case FTDM_ITERATOR_SPANS:
if (!iter->pvt.hashiter) {
return NULL;
}
@ -4492,6 +4503,9 @@ FT_DECLARE(void *) ftdm_iterator_current(ftdm_iterator_t *iter)
hashtable_this(iter->pvt.hashiter, &key, NULL, &val);
/* I decided to return the key instead of the value since the value can be retrieved using the key */
return (void *)key;
case FTDM_ITERATOR_SPANS:
hashtable_this(iter->pvt.hashiter, &key, NULL, &val);
return (void *)val;
case FTDM_ITERATOR_CHANS:
ftdm_assert_return(iter->pvt.chaniter.index, NULL, "channel iterator index cannot be zero!\n");
ftdm_assert_return(iter->pvt.chaniter.index <= iter->pvt.chaniter.span->chan_count, NULL, "channel iterator index bigger than span chan count!\n");

View File

@ -1589,6 +1589,7 @@ FT_DECLARE(ftdm_status_t) ftdm_usrmsg_set_raw_data(ftdm_usrmsg_t *usrmsg, void *
/*! \brief Get iterator current value (depends on the iterator type)
* \note Channel iterators return a pointer to ftdm_channel_t
* Span iterators return a pointer to ftdm_span_t
* Variable iterators return a pointer to the variable name (not the variable value)
*/
FT_DECLARE(void *) ftdm_iterator_current(ftdm_iterator_t *iter);
@ -1725,6 +1726,11 @@ FT_DECLARE(const char *) ftdm_span_get_name(const ftdm_span_t *span);
*/
FT_DECLARE(ftdm_iterator_t *) ftdm_span_get_chan_iterator(const ftdm_span_t *span, ftdm_iterator_t *iter);
/*! \brief Get iterator for spans
* \param iter Optional iterator. You can reuse an old iterator (not previously freed) to avoid the extra allocation of a new iterator.
*/
FT_DECLARE(ftdm_iterator_t *) ftdm_get_span_iterator(ftdm_iterator_t *iter);
/*!
* \brief Execute a text command. The text command output will be returned and must be free'd
*

View File

@ -360,6 +360,7 @@ typedef ftdm_status_t (*ftdm_channel_sig_dtmf_t)(ftdm_channel_t *ftdmchan, const
typedef enum {
FTDM_ITERATOR_VARS = 1,
FTDM_ITERATOR_CHANS,
FTDM_ITERATOR_SPANS,
} ftdm_iterator_type_t;
struct ftdm_iterator {