Sat Mar 10 01:55:20 2012

Asterisk developer's documentation


dial.h File Reference

Dialing API. More...

Go to the source code of this file.

Typedefs

typedef void(*) ast_dial_state_callback (struct ast_dial *)

Enumerations

enum  ast_dial_option {
  AST_DIAL_OPTION_RINGING, AST_DIAL_OPTION_ANSWER_EXEC, AST_DIAL_OPTION_MUSIC, AST_DIAL_OPTION_DISABLE_CALL_FORWARDING,
  AST_DIAL_OPTION_MAX
}
 List of options that are applicable either globally or per dialed channel. More...
enum  ast_dial_result {
  AST_DIAL_RESULT_INVALID, AST_DIAL_RESULT_FAILED, AST_DIAL_RESULT_TRYING, AST_DIAL_RESULT_RINGING,
  AST_DIAL_RESULT_PROGRESS, AST_DIAL_RESULT_PROCEEDING, AST_DIAL_RESULT_ANSWERED, AST_DIAL_RESULT_TIMEOUT,
  AST_DIAL_RESULT_HANGUP, AST_DIAL_RESULT_UNANSWERED
}
 List of return codes for dial run API calls. More...

Functions

ast_channelast_dial_answered (struct ast_dial *dial)
 Return channel that answered.
ast_channelast_dial_answered_steal (struct ast_dial *dial)
 Steal the channel that answered.
int ast_dial_append (struct ast_dial *dial, const char *tech, const char *device)
 Append a channel.
ast_dialast_dial_create (void)
 New dialing structure.
int ast_dial_destroy (struct ast_dial *dial)
 Destroys a dialing structure.
void ast_dial_hangup (struct ast_dial *dial)
 Hangup channels.
enum ast_dial_result ast_dial_join (struct ast_dial *dial)
 Cancel async thread.
int ast_dial_option_disable (struct ast_dial *dial, int num, enum ast_dial_option option)
 Disables an option per channel.
int ast_dial_option_enable (struct ast_dial *dial, int num, enum ast_dial_option option, void *data)
 Enables an option per channel.
int ast_dial_option_global_disable (struct ast_dial *dial, enum ast_dial_option option)
 Disables an option globally.
int ast_dial_option_global_enable (struct ast_dial *dial, enum ast_dial_option option, void *data)
 Enables an option globally.
enum ast_dial_result ast_dial_run (struct ast_dial *dial, struct ast_channel *chan, int async)
 Execute dialing synchronously or asynchronously.
void ast_dial_set_global_timeout (struct ast_dial *dial, int timeout)
 Set the maximum time (globally) allowed for trying to ring phones.
void ast_dial_set_state_callback (struct ast_dial *dial, ast_dial_state_callback callback)
 Set a callback for state changes.
void ast_dial_set_timeout (struct ast_dial *dial, int num, int timeout)
 Set the maximum time (per channel) allowed for trying to ring the phone.
enum ast_dial_result ast_dial_state (struct ast_dial *dial)
 Return state of dial.


Detailed Description

Dialing API.

Definition in file dial.h.


Typedef Documentation

typedef void(*) ast_dial_state_callback(struct ast_dial *)

Definition at line 36 of file dial.h.


Enumeration Type Documentation

enum ast_dial_option

List of options that are applicable either globally or per dialed channel.

Enumerator:
AST_DIAL_OPTION_RINGING  Always indicate ringing to caller
AST_DIAL_OPTION_ANSWER_EXEC  Execute application upon answer in async mode
AST_DIAL_OPTION_MUSIC  Play music on hold instead of ringing to the calling channel
AST_DIAL_OPTION_DISABLE_CALL_FORWARDING  Disable call forwarding on channels
AST_DIAL_OPTION_MAX  End terminator -- must always remain last

Definition at line 39 of file dial.h.

00039                      {
00040    AST_DIAL_OPTION_RINGING,                 /*!< Always indicate ringing to caller */
00041    AST_DIAL_OPTION_ANSWER_EXEC,             /*!< Execute application upon answer in async mode */
00042    AST_DIAL_OPTION_MUSIC,                   /*!< Play music on hold instead of ringing to the calling channel */
00043    AST_DIAL_OPTION_DISABLE_CALL_FORWARDING, /*!< Disable call forwarding on channels */
00044    AST_DIAL_OPTION_MAX,                     /*!< End terminator -- must always remain last */
00045 };

enum ast_dial_result

List of return codes for dial run API calls.

Enumerator:
AST_DIAL_RESULT_INVALID  Invalid options were passed to run function
AST_DIAL_RESULT_FAILED  Attempts to dial failed before reaching critical state
AST_DIAL_RESULT_TRYING  Currently trying to dial
AST_DIAL_RESULT_RINGING  Dial is presently ringing
AST_DIAL_RESULT_PROGRESS  Dial is presently progressing
AST_DIAL_RESULT_PROCEEDING  Dial is presently proceeding
AST_DIAL_RESULT_ANSWERED  A channel was answered
AST_DIAL_RESULT_TIMEOUT  Timeout was tripped, nobody answered
AST_DIAL_RESULT_HANGUP  Caller hung up
AST_DIAL_RESULT_UNANSWERED  Nobody answered

Definition at line 48 of file dial.h.

00048                      {
00049    AST_DIAL_RESULT_INVALID,     /*!< Invalid options were passed to run function */
00050    AST_DIAL_RESULT_FAILED,      /*!< Attempts to dial failed before reaching critical state */
00051    AST_DIAL_RESULT_TRYING,      /*!< Currently trying to dial */
00052    AST_DIAL_RESULT_RINGING,     /*!< Dial is presently ringing */
00053    AST_DIAL_RESULT_PROGRESS,    /*!< Dial is presently progressing */
00054    AST_DIAL_RESULT_PROCEEDING,  /*!< Dial is presently proceeding */
00055    AST_DIAL_RESULT_ANSWERED,    /*!< A channel was answered */
00056    AST_DIAL_RESULT_TIMEOUT,     /*!< Timeout was tripped, nobody answered */
00057    AST_DIAL_RESULT_HANGUP,      /*!< Caller hung up */
00058    AST_DIAL_RESULT_UNANSWERED,  /*!< Nobody answered */
00059 };


Function Documentation

struct ast_channel* ast_dial_answered ( struct ast_dial dial  ) 

Return channel that answered.

Note:
Returns the Asterisk channel that answered
Parameters:
dial Dialing structure

Definition at line 743 of file dial.c.

References AST_DIAL_RESULT_ANSWERED, AST_LIST_FIRST, ast_dial::channels, and ast_dial::state.

Referenced by dial_trunk(), and sla_handle_dial_state_event().

00744 {
00745    if (!dial)
00746       return NULL;
00747 
00748    return ((dial->state == AST_DIAL_RESULT_ANSWERED) ? AST_LIST_FIRST(&dial->channels)->owner : NULL);
00749 }

struct ast_channel* ast_dial_answered_steal ( struct ast_dial dial  ) 

Steal the channel that answered.

Note:
Returns the Asterisk channel that answered and removes it from the dialing structure
Parameters:
dial Dialing structure

Definition at line 755 of file dial.c.

References AST_DIAL_RESULT_ANSWERED, AST_LIST_FIRST, ast_dial::channels, and ast_dial::state.

Referenced by do_notify().

00756 {
00757    struct ast_channel *chan = NULL;
00758 
00759    if (!dial)
00760       return NULL;
00761 
00762    if (dial->state == AST_DIAL_RESULT_ANSWERED) {
00763       chan = AST_LIST_FIRST(&dial->channels)->owner;
00764       AST_LIST_FIRST(&dial->channels)->owner = NULL;
00765    }
00766 
00767    return chan;
00768 }

int ast_dial_append ( struct ast_dial dial,
const char *  tech,
const char *  device 
)

Append a channel.

Note:
Appends a channel to a dialing structure
Returns:
Returns channel reference number on success, -1 on failure

Definition at line 218 of file dial.c.

References ast_atomic_fetchadd_int(), ast_calloc, AST_LIST_INSERT_TAIL, ast_strdup, ast_dial::channels, ast_dial_channel::list, and ast_dial::num.

Referenced by dial_trunk(), do_notify(), page_exec(), and sla_ring_station().

00219 {
00220    struct ast_dial_channel *channel = NULL;
00221 
00222    /* Make sure we have required arguments */
00223    if (!dial || !tech || !device)
00224       return -1;
00225 
00226    /* Allocate new memory for dialed channel structure */
00227    if (!(channel = ast_calloc(1, sizeof(*channel))))
00228       return -1;
00229 
00230    /* Record technology and device for when we actually dial */
00231    channel->tech = ast_strdup(tech);
00232    channel->device = ast_strdup(device);
00233 
00234    /* Grab reference number from dial structure */
00235    channel->num = ast_atomic_fetchadd_int(&dial->num, +1);
00236 
00237    /* No timeout exists... yet */
00238    channel->timeout = -1;
00239 
00240    /* Insert into channels list */
00241    AST_LIST_INSERT_TAIL(&dial->channels, channel, list);
00242 
00243    return channel->num;
00244 }

struct ast_dial* ast_dial_create ( void   ) 

New dialing structure.

Note:
Create a dialing structure
Returns:
Returns a calloc'd ast_dial structure, NULL on failure

Definition at line 190 of file dial.c.

References ast_calloc, AST_LIST_HEAD_INIT, ast_mutex_init, and AST_PTHREADT_NULL.

Referenced by dial_trunk(), do_notify(), page_exec(), and sla_ring_station().

00191 {
00192    struct ast_dial *dial = NULL;
00193 
00194    /* Allocate new memory for structure */
00195    if (!(dial = ast_calloc(1, sizeof(*dial))))
00196       return NULL;
00197 
00198    /* Initialize list of channels */
00199    AST_LIST_HEAD_INIT(&dial->channels);
00200 
00201    /* Initialize thread to NULL */
00202    dial->thread = AST_PTHREADT_NULL;
00203 
00204    /* No timeout exists... yet */
00205    dial->timeout = -1;
00206    dial->actual_timeout = -1;
00207 
00208    /* Can't forget about the lock */
00209    ast_mutex_init(&dial->lock);
00210 
00211    return dial;
00212 }

int ast_dial_destroy ( struct ast_dial dial  ) 

Destroys a dialing structure.

Note:
Destroys (free's) the given ast_dial structure
Parameters:
dial Dialing structure to free
Returns:
Returns 0 on success, -1 on failure

Definition at line 855 of file dial.c.

References AST_DIAL_OPTION_MAX, ast_free, ast_hangup(), AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, ast_dial::channels, ast_dial_channel::device, ast_dial_channel::list, option_types, ast_dial_channel::options, ast_dial_channel::owner, and ast_dial_channel::tech.

Referenced by dial_trunk(), do_notify(), page_exec(), run_station(), sla_hangup_stations(), sla_ring_station(), and sla_stop_ringing_station().

00856 {
00857    int i = 0;
00858    struct ast_dial_channel *channel = NULL;
00859 
00860    if (!dial)
00861       return -1;
00862    
00863    /* Hangup and deallocate all the dialed channels */
00864    AST_LIST_LOCK(&dial->channels);
00865    AST_LIST_TRAVERSE_SAFE_BEGIN(&dial->channels, channel, list) {
00866       /* Disable any enabled options */
00867       for (i = 0; i < AST_DIAL_OPTION_MAX; i++) {
00868          if (!channel->options[i])
00869             continue;
00870          if (option_types[i].disable)
00871             option_types[i].disable(channel->options[i]);
00872          channel->options[i] = NULL;
00873       }
00874       /* Hang up channel if need be */
00875       if (channel->owner) {
00876          ast_hangup(channel->owner);
00877          channel->owner = NULL;
00878       }
00879       /* Free structure */
00880       ast_free(channel->tech);
00881       ast_free(channel->device);
00882       AST_LIST_REMOVE_CURRENT(list);
00883       ast_free(channel);
00884    }
00885    AST_LIST_TRAVERSE_SAFE_END;
00886    AST_LIST_UNLOCK(&dial->channels);
00887  
00888    /* Disable any enabled options globally */
00889    for (i = 0; i < AST_DIAL_OPTION_MAX; i++) {
00890       if (!dial->options[i])
00891          continue;
00892       if (option_types[i].disable)
00893          option_types[i].disable(dial->options[i]);
00894       dial->options[i] = NULL;
00895    }
00896 
00897    /* Lock be gone! */
00898    ast_mutex_destroy(&dial->lock);
00899 
00900    /* Free structure */
00901    ast_free(dial);
00902 
00903    return 0;
00904 }

void ast_dial_hangup ( struct ast_dial dial  ) 

Hangup channels.

Note:
Hangup all active channels
Parameters:
dial Dialing structure

Definition at line 831 of file dial.c.

References ast_hangup(), AST_LIST_LOCK, AST_LIST_TRAVERSE, AST_LIST_UNLOCK, ast_dial::channels, ast_dial_channel::list, and ast_dial_channel::owner.

Referenced by ast_dial_run(), and page_exec().

00832 {
00833    struct ast_dial_channel *channel = NULL;
00834 
00835    if (!dial)
00836       return;
00837    
00838    AST_LIST_LOCK(&dial->channels);
00839    AST_LIST_TRAVERSE(&dial->channels, channel, list) {
00840       if (channel->owner) {
00841          ast_hangup(channel->owner);
00842          channel->owner = NULL;
00843       }
00844    }
00845    AST_LIST_UNLOCK(&dial->channels);
00846 
00847    return;
00848 }

enum ast_dial_result ast_dial_join ( struct ast_dial dial  ) 

Cancel async thread.

Note:
Cancel a running async thread
Parameters:
dial Dialing structure

Definition at line 783 of file dial.c.

References ast_channel_lock, ast_channel_unlock, AST_DIAL_RESULT_FAILED, AST_LIST_FIRST, AST_LIST_LOCK, AST_LIST_UNLOCK, ast_mutex_lock, ast_mutex_unlock, AST_PTHREADT_NULL, AST_PTHREADT_STOP, ast_softhangup(), AST_SOFTHANGUP_EXPLICIT, ast_dial::channels, ast_dial::lock, ast_dial::state, and ast_dial::thread.

Referenced by dial_trunk(), page_exec(), run_station(), sla_hangup_stations(), sla_ring_station(), and sla_stop_ringing_station().

00784 {
00785    pthread_t thread;
00786 
00787    /* If the dial structure is not running in async, return failed */
00788    if (dial->thread == AST_PTHREADT_NULL)
00789       return AST_DIAL_RESULT_FAILED;
00790 
00791    /* Record thread */
00792    thread = dial->thread;
00793 
00794    /* Boom, commence locking */
00795    ast_mutex_lock(&dial->lock);
00796 
00797    /* Stop the thread */
00798    dial->thread = AST_PTHREADT_STOP;
00799 
00800    /* If the answered channel is running an application we have to soft hangup it, can't just poke the thread */
00801    AST_LIST_LOCK(&dial->channels);
00802    if (AST_LIST_FIRST(&dial->channels)->is_running_app) {
00803       struct ast_channel *chan = AST_LIST_FIRST(&dial->channels)->owner;
00804       if (chan) {
00805          ast_channel_lock(chan);
00806          ast_softhangup(chan, AST_SOFTHANGUP_EXPLICIT);
00807          ast_channel_unlock(chan);
00808       }
00809    } else {
00810       /* Now we signal it with SIGURG so it will break out of it's waitfor */
00811       pthread_kill(thread, SIGURG);
00812    }
00813    AST_LIST_UNLOCK(&dial->channels);
00814 
00815    /* Yay done with it */
00816    ast_mutex_unlock(&dial->lock);
00817 
00818    /* Finally wait for the thread to exit */
00819    pthread_join(thread, NULL);
00820 
00821    /* Yay thread is all gone */
00822    dial->thread = AST_PTHREADT_NULL;
00823 
00824    return dial->state;
00825 }

int ast_dial_option_disable ( struct ast_dial dial,
int  num,
enum ast_dial_option  option 
)

Disables an option per channel.

Parameters:
dial Dial structure
num Channel number to disable option on
option Option to disable
Returns:
Returns 0 on success, -1 on failure

Definition at line 1007 of file dial.c.

References AST_LIST_EMPTY, ast_dial::channels, ast_option_types::disable, find_dial_channel(), option_types, and ast_dial_channel::options.

01008 {
01009    struct ast_dial_channel *channel = NULL;
01010 
01011    /* Ensure we have required arguments */
01012    if (!dial || AST_LIST_EMPTY(&dial->channels))
01013       return -1;
01014 
01015    if (!(channel = find_dial_channel(dial, num)))
01016       return -1;
01017 
01018    /* If the option is not enabled, return failure */
01019    if (!channel->options[option])
01020       return -1;
01021 
01022    /* Execute callback of option to disable it if it exists */
01023    if (option_types[option].disable)
01024       option_types[option].disable(channel->options[option]);
01025 
01026    /* Finally disable the option on the structure */
01027    channel->options[option] = NULL;
01028 
01029    return 0;
01030 }

int ast_dial_option_enable ( struct ast_dial dial,
int  num,
enum ast_dial_option  option,
void *  data 
)

Enables an option per channel.

Parameters:
dial Dial structure
num Channel number to enable option on
option Option to enable
data Data to pass to this option (not always needed)
Returns:
Returns 0 on success, -1 on failure

Definition at line 955 of file dial.c.

References AST_LIST_EMPTY, ast_dial::channels, ast_option_types::enable, find_dial_channel(), option_types, and ast_dial_channel::options.

00956 {
00957    struct ast_dial_channel *channel = NULL;
00958 
00959    /* Ensure we have required arguments */
00960    if (!dial || AST_LIST_EMPTY(&dial->channels))
00961       return -1;
00962 
00963    if (!(channel = find_dial_channel(dial, num)))
00964       return -1;
00965 
00966    /* If the option is already enabled, return failure */
00967    if (channel->options[option])
00968       return -1;
00969 
00970    /* Execute enable callback if it exists, if not simply make sure the value is set */
00971    if (option_types[option].enable)
00972       channel->options[option] = option_types[option].enable(data);
00973    else
00974       channel->options[option] = (void*)1;
00975 
00976    return 0;
00977 }

int ast_dial_option_global_disable ( struct ast_dial dial,
enum ast_dial_option  option 
)

Disables an option globally.

Parameters:
dial Dial structure to disable option on
option Option to disable
Returns:
Returns 0 on success, -1 on failure

Definition at line 984 of file dial.c.

References ast_option_types::disable, option_types, and ast_dial::options.

00985 {
00986    /* If the option is not enabled, return failure */
00987    if (!dial->options[option]) {
00988       return -1;
00989    }
00990 
00991    /* Execute callback of option to disable if it exists */
00992    if (option_types[option].disable)
00993       option_types[option].disable(dial->options[option]);
00994 
00995    /* Finally disable option on the structure */
00996    dial->options[option] = NULL;
00997 
00998    return 0;
00999 }

int ast_dial_option_global_enable ( struct ast_dial dial,
enum ast_dial_option  option,
void *  data 
)

Enables an option globally.

Parameters:
dial Dial structure to enable option on
option Option to enable
data Data to pass to this option (not always needed)
Returns:
Returns 0 on success, -1 on failure

Definition at line 912 of file dial.c.

References ast_option_types::enable, option_types, and ast_dial::options.

Referenced by do_notify(), and page_exec().

00913 {
00914    /* If the option is already enabled, return failure */
00915    if (dial->options[option])
00916       return -1;
00917 
00918    /* Execute enable callback if it exists, if not simply make sure the value is set */
00919    if (option_types[option].enable)
00920       dial->options[option] = option_types[option].enable(data);
00921    else
00922       dial->options[option] = (void*)1;
00923 
00924    return 0;
00925 }

enum ast_dial_result ast_dial_run ( struct ast_dial dial,
struct ast_channel chan,
int  async 
)

Execute dialing synchronously or asynchronously.

Note:
Dials channels in a dial structure.
Returns:
Returns dial result code. (TRYING/INVALID/FAILED/ANSWERED/TIMEOUT/UNANSWERED).

Definition at line 703 of file dial.c.

References ast_debug, ast_dial_hangup(), AST_DIAL_RESULT_FAILED, AST_DIAL_RESULT_INVALID, AST_DIAL_RESULT_TRYING, AST_LIST_EMPTY, ast_pthread_create, async_dial(), begin_dial(), ast_dial::channels, monitor_dial(), ast_dial::state, and ast_dial::thread.

Referenced by dial_trunk(), do_notify(), page_exec(), and sla_ring_station().

00704 {
00705    enum ast_dial_result res = AST_DIAL_RESULT_TRYING;
00706 
00707    /* Ensure required arguments are passed */
00708    if (!dial || (!chan && !async)) {
00709       ast_debug(1, "invalid #1\n");
00710       return AST_DIAL_RESULT_INVALID;
00711    }
00712 
00713    /* If there are no channels to dial we can't very well try to dial them */
00714    if (AST_LIST_EMPTY(&dial->channels)) {
00715       ast_debug(1, "invalid #2\n");
00716       return AST_DIAL_RESULT_INVALID;
00717    }
00718 
00719    /* Dial each requested channel */
00720    if (!begin_dial(dial, chan))
00721       return AST_DIAL_RESULT_FAILED;
00722 
00723    /* If we are running async spawn a thread and send it away... otherwise block here */
00724    if (async) {
00725       dial->state = AST_DIAL_RESULT_TRYING;
00726       /* Try to create a thread */
00727       if (ast_pthread_create(&dial->thread, NULL, async_dial, dial)) {
00728          /* Failed to create the thread - hangup all dialed channels and return failed */
00729          ast_dial_hangup(dial);
00730          res = AST_DIAL_RESULT_FAILED;
00731       }
00732    } else {
00733       res = monitor_dial(dial, chan);
00734    }
00735 
00736    return res;
00737 }

void ast_dial_set_global_timeout ( struct ast_dial dial,
int  timeout 
)

Set the maximum time (globally) allowed for trying to ring phones.

Parameters:
dial The dial structure to apply the time limit to
timeout Maximum time allowed
Returns:
nothing

Definition at line 1042 of file dial.c.

References ast_dial::actual_timeout, and ast_dial::timeout.

Referenced by do_notify(), and page_exec().

01043 {
01044    dial->timeout = timeout;
01045 
01046    if (dial->timeout > 0 && (dial->actual_timeout > dial->timeout || dial->actual_timeout == -1))
01047       dial->actual_timeout = dial->timeout;
01048 
01049    return;
01050 }

void ast_dial_set_state_callback ( struct ast_dial dial,
ast_dial_state_callback  callback 
)

Set a callback for state changes.

Parameters:
dial The dial structure to watch for state changes
callback the callback
Returns:
nothing

Definition at line 1032 of file dial.c.

References ast_dial::state_callback.

Referenced by sla_ring_station().

01033 {
01034    dial->state_callback = callback;
01035 }

void ast_dial_set_timeout ( struct ast_dial dial,
int  num,
int  timeout 
)

Set the maximum time (per channel) allowed for trying to ring the phone.

Parameters:
dial The dial structure the channel belongs to
num Channel number to set timeout on
timeout Maximum time allowed
Returns:
nothing

Definition at line 1058 of file dial.c.

References ast_dial::actual_timeout, find_dial_channel(), and ast_dial_channel::timeout.

01059 {
01060    struct ast_dial_channel *channel = NULL;
01061 
01062    if (!(channel = find_dial_channel(dial, num)))
01063       return;
01064 
01065    channel->timeout = timeout;
01066 
01067    if (channel->timeout > 0 && (dial->actual_timeout > channel->timeout || dial->actual_timeout == -1))
01068       dial->actual_timeout = channel->timeout;
01069 
01070    return;
01071 }

enum ast_dial_result ast_dial_state ( struct ast_dial dial  ) 

Return state of dial.

Note:
Returns the state of the dial attempt
Parameters:
dial Dialing structure

Definition at line 774 of file dial.c.

References ast_dial::state.

Referenced by dial_trunk(), and sla_handle_dial_state_event().

00775 {
00776    return dial->state;
00777 }


Generated on Sat Mar 10 01:55:20 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7