Mon May 14 04:48:19 2007

Asterisk developer's documentation


devicestate.h File Reference

Device state management. More...

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

DeviceStates

#define AST_DEVICE_BUSY   3
#define AST_DEVICE_INUSE   2
#define AST_DEVICE_INVALID   4
#define AST_DEVICE_NOT_INUSE   1
#define AST_DEVICE_ONHOLD   8
#define AST_DEVICE_RINGING   6
#define AST_DEVICE_RINGINUSE   7
#define AST_DEVICE_UNAVAILABLE   5
#define AST_DEVICE_UNKNOWN   0
typedef int(*) ast_devstate_cb_type (const char *dev, int state, void *data)
 Devicestate watcher call back.
typedef int(*) ast_devstate_prov_cb_type (const char *data)
 Devicestate provider call back.
int ast_device_state (const char *device)
 Asks a channel for device state.
int ast_device_state_changed (const char *fmt,...) __attribute__((format(printf
 Tells Asterisk the State for Device is changed.
int int ast_device_state_changed_literal (const char *device)
 Tells Asterisk the State for Device is changed.
int ast_device_state_engine_init (void)
 Initialize the device state engine in separate thread.
int ast_devstate_add (ast_devstate_cb_type callback, void *data)
 Registers a device state change callback.
void ast_devstate_del (ast_devstate_cb_type callback, void *data)
 Unregisters a device state change callback.
int ast_devstate_prov_add (const char *label, ast_devstate_prov_cb_type callback)
 Add device state provider.
void ast_devstate_prov_del (const char *label)
 Remove device state provider.
int ast_parse_device_state (const char *device)
 Search the Channels by Name.
const char * devstate2str (int devstate)
 Convert device state to text string for output.


Detailed Description

Device state management.

Definition in file devicestate.h.


Define Documentation

#define AST_DEVICE_BUSY   3

Device is busy

Definition at line 36 of file devicestate.h.

Referenced by agent_devicestate(), ast_extension_state2(), sip_devicestate(), and update_dial_status().

#define AST_DEVICE_INUSE   2

Device is in use

Definition at line 35 of file devicestate.h.

Referenced by agent_devicestate(), ast_extension_state2(), ast_parse_device_state(), meetmestate(), metermaidstate(), sip_devicestate(), and sla_state().

#define AST_DEVICE_INVALID   4

Device is invalid

Definition at line 37 of file devicestate.h.

Referenced by agent_devicestate(), ast_device_state(), ast_extension_state2(), get_member_status(), getproviderstate(), iax2_devicestate(), local_devicestate(), meetmestate(), metermaidstate(), mgcp_devicestate(), queue_function_qac(), sip_devicestate(), sla_state(), and update_dial_status().

#define AST_DEVICE_NOT_INUSE   1

Device is not used

Definition at line 34 of file devicestate.h.

Referenced by ast_device_state(), ast_extension_state2(), is_our_turn(), meetmestate(), metermaidstate(), ring_entry(), sip_devicestate(), sla_state(), and try_calling().

#define AST_DEVICE_ONHOLD   8

Device is on hold

Definition at line 41 of file devicestate.h.

Referenced by ast_extension_state2(), sip_devicestate(), and sla_state().

#define AST_DEVICE_RINGING   6

Device is ringing

Definition at line 39 of file devicestate.h.

Referenced by ast_extension_state2(), ast_parse_device_state(), sip_devicestate(), and sla_state().

#define AST_DEVICE_RINGINUSE   7

Device is ringing *and* in use

Definition at line 40 of file devicestate.h.

Referenced by ast_extension_state2(), and sip_devicestate().

#define AST_DEVICE_UNAVAILABLE   5

Device is unavailable

Definition at line 38 of file devicestate.h.

Referenced by agent_devicestate(), ast_extension_state2(), get_member_status(), iax2_devicestate(), queue_function_qac(), sip_devicestate(), transmit_state_notify(), and update_dial_status().

#define AST_DEVICE_UNKNOWN   0

@{ Device is valid but channel didn't know state

Definition at line 33 of file devicestate.h.

Referenced by agent_devicestate(), ast_device_state(), ast_parse_device_state(), iax2_devicestate(), is_our_turn(), local_devicestate(), mgcp_devicestate(), ring_entry(), sip_devicestate(), and update_dial_status().


Typedef Documentation

typedef int(*) ast_devstate_cb_type(const char *dev, int state, void *data)

Devicestate watcher call back.

Definition at line 45 of file devicestate.h.

typedef int(*) ast_devstate_prov_cb_type(const char *data)

Devicestate provider call back.

Definition at line 48 of file devicestate.h.


Function Documentation

int ast_device_state ( const char *  device  ) 

Asks a channel for device state.

Parameters:
device like a dialstring Asks a channel for device state, data is normaly a number from dialstring used by the low level module Trys the channel devicestate callback if not supported search in the active channels list for the device. Returns an AST_DEVICE_??? state -1 on failure

Channel driver that provides device state

Another provider of device state

Definition at line 216 of file devicestate.c.

References AST_DEVICE_INVALID, AST_DEVICE_NOT_INUSE, AST_DEVICE_UNKNOWN, ast_get_channel_tech(), ast_log(), ast_parse_device_state(), ast_strdupa, ast_channel_tech::devicestate, getproviderstate(), LOG_DEBUG, option_debug, and strsep().

Referenced by ast_extension_state2(), chanavail_exec(), create_queue_member(), do_state_change(), and transmit_state_notify().

00217 {
00218    char *buf;
00219    char *number;
00220    const struct ast_channel_tech *chan_tech;
00221    int res = 0;
00222    /*! \brief Channel driver that provides device state */
00223    char *tech;
00224    /*! \brief Another provider of device state */
00225    char *provider = NULL;
00226    
00227    buf = ast_strdupa(device);
00228    tech = strsep(&buf, "/");
00229    number = buf;
00230    if (!number) {
00231       provider = strsep(&tech, ":");
00232       if (!provider)
00233          return AST_DEVICE_INVALID;
00234       /* We have a provider */
00235       number = tech;
00236       tech = NULL;
00237    }
00238 
00239    if (provider)  {
00240       if(option_debug > 2)
00241          ast_log(LOG_DEBUG, "Checking if I can find provider for \"%s\" - number: %s\n", provider, number);
00242       return getproviderstate(provider, number);
00243    }
00244    if (option_debug > 3)
00245       ast_log(LOG_DEBUG, "No provider found, checking channel drivers for %s - %s\n", tech, number);
00246 
00247    chan_tech = ast_get_channel_tech(tech);
00248    if (!chan_tech)
00249       return AST_DEVICE_INVALID;
00250 
00251    if (!chan_tech->devicestate)  /* Does the channel driver support device state notification? */
00252       return ast_parse_device_state(device); /* No, try the generic function */
00253    else {
00254       res = chan_tech->devicestate(number);  /* Ask the channel driver for device state */
00255       if (res == AST_DEVICE_UNKNOWN) {
00256          res = ast_parse_device_state(device);
00257          /* at this point we know the device exists, but the channel driver
00258             could not give us a state; if there is no channel state available,
00259             it must be 'not in use'
00260          */
00261          if (res == AST_DEVICE_UNKNOWN)
00262             res = AST_DEVICE_NOT_INUSE;
00263          return res;
00264       } else
00265          return res;
00266    }
00267 }

int ast_device_state_changed ( const char *  fmt,
  ... 
)

Tells Asterisk the State for Device is changed.

Parameters:
fmt devicename like a dialstring with format parameters Asterisk polls the new extensionstates and calls the registered callbacks for the changed extensions Returns 0 on success, -1 on failure

int int ast_device_state_changed_literal ( const char *  device  ) 

Tells Asterisk the State for Device is changed.

Parameters:
device devicename like a dialstring Asterisk polls the new extensionstates and calls the registered callbacks for the changed extensions Returns 0 on success, -1 on failure

Definition at line 413 of file devicestate.c.

References __ast_device_state_changed_literal(), and ast_strdupa.

Referenced by ast_channel_free(), and ast_setstate().

00414 {
00415    char *buf;
00416    buf = ast_strdupa(dev);
00417    return __ast_device_state_changed_literal(buf);
00418 }

int ast_device_state_engine_init ( void   ) 

Initialize the device state engine in separate thread.

Definition at line 458 of file devicestate.c.

References ast_cond_init(), ast_log(), ast_pthread_create_background, do_devstate_changes(), and LOG_ERROR.

Referenced by main().

00459 {
00460    ast_cond_init(&change_pending, NULL);
00461    if (ast_pthread_create_background(&change_thread, NULL, do_devstate_changes, NULL) < 0) {
00462       ast_log(LOG_ERROR, "Unable to start device state change thread.\n");
00463       return -1;
00464    }
00465 
00466    return 0;
00467 }

int ast_devstate_add ( ast_devstate_cb_type  callback,
void *  data 
)

Registers a device state change callback.

Parameters:
callback Callback
data to pass to callback The callback is called if the state for extension is changed Return -1 on failure, ID on success

Definition at line 327 of file devicestate.c.

References ast_calloc, AST_LIST_INSERT_HEAD, AST_LIST_LOCK, and AST_LIST_UNLOCK.

Referenced by load_module().

00328 {
00329    struct devstate_cb *devcb;
00330 
00331    if (!callback || !(devcb = ast_calloc(1, sizeof(*devcb))))
00332       return -1;
00333 
00334    devcb->data = data;
00335    devcb->callback = callback;
00336 
00337    AST_LIST_LOCK(&devstate_cbs);
00338    AST_LIST_INSERT_HEAD(&devstate_cbs, devcb, list);
00339    AST_LIST_UNLOCK(&devstate_cbs);
00340 
00341    return 0;
00342 }

void ast_devstate_del ( ast_devstate_cb_type  callback,
void *  data 
)

Unregisters a device state change callback.

Parameters:
callback Callback
data to pass to callback The callback is called if the state for extension is changed Return -1 on failure, ID on success

Definition at line 345 of file devicestate.c.

References AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, devstate_cb::callback, devstate_cb::data, and free.

00346 {
00347    struct devstate_cb *devcb;
00348 
00349    AST_LIST_LOCK(&devstate_cbs);
00350    AST_LIST_TRAVERSE_SAFE_BEGIN(&devstate_cbs, devcb, list) {
00351       if ((devcb->callback == callback) && (devcb->data == data)) {
00352          AST_LIST_REMOVE_CURRENT(&devstate_cbs, list);
00353          free(devcb);
00354          break;
00355       }
00356    }
00357    AST_LIST_TRAVERSE_SAFE_END;
00358    AST_LIST_UNLOCK(&devstate_cbs);
00359 }

int ast_devstate_prov_add ( const char *  label,
ast_devstate_prov_cb_type  callback 
)

Add device state provider.

Parameters:
label to use in hint, like label:object
callback Callback
Return values:
-1 failure
0 success

Definition at line 270 of file devicestate.c.

References ast_calloc, AST_LIST_INSERT_HEAD, AST_LIST_LOCK, and AST_LIST_UNLOCK.

Referenced by load_module().

00271 {
00272    struct devstate_prov *devprov;
00273 
00274    if (!callback || !(devprov = ast_calloc(1, sizeof(*devprov))))
00275       return -1;
00276 
00277    devprov->callback = callback;
00278    ast_copy_string(devprov->label, label, sizeof(devprov->label));
00279 
00280    AST_LIST_LOCK(&devstate_provs);
00281    AST_LIST_INSERT_HEAD(&devstate_provs, devprov, list);
00282    AST_LIST_UNLOCK(&devstate_provs);
00283 
00284    return 0;
00285 }

void ast_devstate_prov_del ( const char *  label  ) 

Remove device state provider.

Parameters:
label to use in hint, like label:object
Returns:
nothing

Definition at line 288 of file devicestate.c.

References AST_LIST_LOCK, AST_LIST_REMOVE_CURRENT, AST_LIST_TRAVERSE_SAFE_BEGIN, AST_LIST_TRAVERSE_SAFE_END, AST_LIST_UNLOCK, free, and devstate_prov::label.

Referenced by unload_module().

00289 {
00290    struct devstate_prov *devcb;
00291 
00292    AST_LIST_LOCK(&devstate_provs);
00293    AST_LIST_TRAVERSE_SAFE_BEGIN(&devstate_provs, devcb, list) {
00294       if (!strcasecmp(devcb->label, label)) {
00295          AST_LIST_REMOVE_CURRENT(&devstate_provs, list);
00296          free(devcb);
00297          break;
00298       }
00299    }
00300    AST_LIST_TRAVERSE_SAFE_END;
00301    AST_LIST_UNLOCK(&devstate_provs);
00302 }

int ast_parse_device_state ( const char *  device  ) 

Search the Channels by Name.

Note:
find channels with the device's name in it This function is only used for channels that does not implement devicestate natively

Definition at line 192 of file devicestate.c.

References ast_channel::_state, AST_CHANNEL_NAME, ast_channel_unlock, AST_DEVICE_INUSE, AST_DEVICE_RINGING, AST_DEVICE_UNKNOWN, ast_get_channel_by_name_prefix_locked(), AST_STATE_RINGING, and match().

Referenced by ast_device_state().

00193 {
00194    struct ast_channel *chan;
00195    char match[AST_CHANNEL_NAME];
00196    int res;
00197 
00198    ast_copy_string(match, device, sizeof(match)-1);
00199    strcat(match, "-");
00200    chan = ast_get_channel_by_name_prefix_locked(match, strlen(match));
00201 
00202    if (!chan)
00203       return AST_DEVICE_UNKNOWN;
00204 
00205    if (chan->_state == AST_STATE_RINGING)
00206       res = AST_DEVICE_RINGING;
00207    else
00208       res = AST_DEVICE_INUSE;
00209    
00210    ast_channel_unlock(chan);
00211 
00212    return res;
00213 }

const char* devstate2str ( int  devstate  ) 

Convert device state to text string for output.

Parameters:
devstate Current device state

Definition at line 182 of file devicestate.c.

Referenced by __queues_show(), changethread(), and do_state_change().

00183 {
00184    return devstatestring[devstate];
00185 }


Generated on Mon May 14 04:48:20 2007 for Asterisk - the Open Source PBX by  doxygen 1.5.1