Codename Pineapple

Home page | Mailing list | Docs

Last updated: Sat Feb 3 05:01:29 2007

Asterisk developer's documentation :: Codename Pineapple


devicestate.h File Reference


Detailed Description

Device state management.

Definition in file devicestate.h.

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.


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(), and sip_devicestate().

#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(), metermaidstate(), and sip_devicestate().

#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(), getproviderstate(), iax2_devicestate(), local_devicestate(), metermaidstate(), mgcp_devicestate(), and sip_devicestate().

#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(), metermaidstate(), and sip_devicestate().

#define AST_DEVICE_ONHOLD   8
 

Device is on hold

Definition at line 41 of file devicestate.h.

Referenced by ast_extension_state2(), and sip_devicestate().

#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(), and sip_devicestate().

#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(), iax2_devicestate(), sip_devicestate(), and transmit_state_notify().

#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(), local_devicestate(), mgcp_devicestate(), and sip_devicestate().


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

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(), 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    if (!(number = buf)) {
00230       if (!(provider = strsep(&tech, ":")))
00231          return AST_DEVICE_INVALID;
00232       /* We have a provider */
00233       number = tech;
00234       tech = NULL;
00235    }
00236 
00237    if (provider)  {
00238       if (option_debug > 2)
00239          ast_log(LOG_DEBUG, "Checking if I can find provider for \"%s\" - number: %s\n", provider, number);
00240       return getproviderstate(provider, number);
00241    }
00242 
00243    if (option_debug > 3)
00244       ast_log(LOG_DEBUG, "No provider found, checking channel drivers for %s - %s\n", tech, number);
00245 
00246    if (!(chan_tech = ast_get_channel_tech(tech)))
00247       return AST_DEVICE_INVALID;
00248 
00249    if (!(chan_tech->devicestate)) /* Does the channel driver support device state notification? */
00250       return ast_parse_device_state(device); /* No, try the generic function */
00251 
00252    res = chan_tech->devicestate(number);
00253 
00254    if (res != AST_DEVICE_UNKNOWN)
00255       return res;
00256 
00257    res = ast_parse_device_state(device);
00258 
00259    if (res == AST_DEVICE_UNKNOWN)
00260       return AST_DEVICE_NOT_INUSE;
00261 
00262    return res;
00263 }

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 404 of file devicestate.c.

References __ast_device_state_changed_literal(), and ast_strdupa.

Referenced by ast_channel_free(), and ast_setstate().

00405 {
00406    char *buf;
00407    buf = ast_strdupa(dev);
00408    return __ast_device_state_changed_literal(buf);
00409 }

int ast_device_state_engine_init void   ) 
 

Initialize the device state engine in separate thread.

Definition at line 449 of file devicestate.c.

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

00450 {
00451    ast_cond_init(&change_pending, NULL);
00452    if (ast_pthread_create_background(&change_thread, NULL, do_devstate_changes, NULL) < 0) {
00453       ast_log(LOG_ERROR, "Unable to start device state change thread.\n");
00454       return -1;
00455    }
00456 
00457    return 0;
00458 }

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 322 of file devicestate.c.

References ast_calloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

00323 {
00324    struct devstate_cb *devcb;
00325 
00326    if (!callback || !(devcb = ast_calloc(1, sizeof(*devcb))))
00327       return -1;
00328 
00329    devcb->data = data;
00330    devcb->callback = callback;
00331 
00332    AST_RWLIST_WRLOCK(&devstate_cbs);
00333    AST_RWLIST_INSERT_HEAD(&devstate_cbs, devcb, list);
00334    AST_RWLIST_UNLOCK(&devstate_cbs);
00335 
00336    return 0;
00337 }

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 340 of file devicestate.c.

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, devstate_cb::callback, devstate_cb::data, and free.

00341 {
00342    struct devstate_cb *devcb;
00343 
00344    AST_RWLIST_WRLOCK(&devstate_cbs);
00345    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&devstate_cbs, devcb, list) {
00346       if ((devcb->callback == callback) && (devcb->data == data)) {
00347          AST_RWLIST_REMOVE_CURRENT(&devstate_cbs, list);
00348          free(devcb);
00349          break;
00350       }
00351    }
00352    AST_RWLIST_TRAVERSE_SAFE_END;
00353    AST_RWLIST_UNLOCK(&devstate_cbs);
00354 }

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 -1 on failure, ID on success

Definition at line 266 of file devicestate.c.

References ast_calloc, AST_RWLIST_INSERT_HEAD, AST_RWLIST_UNLOCK, and AST_RWLIST_WRLOCK.

Referenced by load_module().

00267 {
00268    struct devstate_prov *devprov;
00269 
00270    if (!callback || !(devprov = ast_calloc(1, sizeof(*devprov))))
00271       return -1;
00272 
00273    devprov->callback = callback;
00274    ast_copy_string(devprov->label, label, sizeof(devprov->label));
00275 
00276    AST_RWLIST_WRLOCK(&devstate_provs);
00277    AST_RWLIST_INSERT_HEAD(&devstate_provs, devprov, list);
00278    AST_RWLIST_UNLOCK(&devstate_provs);
00279 
00280    return 0;
00281 }

void ast_devstate_prov_del const char *  label  ) 
 

Remove device state provider.

Parameters:
label to use in hint, like label:object Return -1 on failure, ID on success

Definition at line 284 of file devicestate.c.

References AST_RWLIST_REMOVE_CURRENT, AST_RWLIST_TRAVERSE_SAFE_BEGIN, AST_RWLIST_TRAVERSE_SAFE_END, AST_RWLIST_UNLOCK, AST_RWLIST_WRLOCK, free, and devstate_prov::label.

Referenced by unload_module().

00285 {
00286    struct devstate_prov *devcb;
00287 
00288    AST_RWLIST_WRLOCK(&devstate_provs);
00289    AST_RWLIST_TRAVERSE_SAFE_BEGIN(&devstate_provs, devcb, list) {
00290       if (!strcasecmp(devcb->label, label)) {
00291          AST_RWLIST_REMOVE_CURRENT(&devstate_provs, list);
00292          free(devcb);
00293          break;
00294       }
00295    }
00296    AST_RWLIST_TRAVERSE_SAFE_END;
00297    AST_RWLIST_UNLOCK(&devstate_provs);
00298 }

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 do_state_change().

00183 {
00184    return devstatestring[devstate];
00185 }


Asterisk is a trademark for Digium, inc.. | Edvina.net | Asterisk.org | This documentation was generated with Doxygen