diff options
author | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-02-24 02:06:44 +0000 |
---|---|---|
committer | qwell <qwell@f38db490-d61c-443f-a65b-d21fe96a405b> | 2007-02-24 02:06:44 +0000 |
commit | 90684f71938147f10ecb86c3ce55e6f69205cffc (patch) | |
tree | f0872f6213ae2b0b34ded9c2badcfd566455cc6b /channels/chan_skinny.c | |
parent | eb4a78a9b28bad1a011d592f2f2f3abf83e65da8 (diff) |
Support devicestate requests.
Now you should be able to subscribe to a Skinny device/line.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@56579 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_skinny.c')
-rw-r--r-- | channels/chan_skinny.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/channels/chan_skinny.c b/channels/chan_skinny.c index fb658f76e..c7d037959 100644 --- a/channels/chan_skinny.c +++ b/channels/chan_skinny.c @@ -73,6 +73,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/astobj.h" #include "asterisk/abstract_jb.h" #include "asterisk/threadstorage.h" +#include "asterisk/devicestate.h" /************************************* * Skinny/Asterisk Protocol Settings * @@ -1028,6 +1029,7 @@ static struct skinnysession { } *sessions = NULL; static struct ast_channel *skinny_request(const char *type, int format, void *data, int *cause); +static int skinny_devicestate(void *data); static int skinny_call(struct ast_channel *ast, char *dest, int timeout); static int skinny_hangup(struct ast_channel *ast); static int skinny_answer(struct ast_channel *ast); @@ -1044,6 +1046,7 @@ static const struct ast_channel_tech skinny_tech = { .capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1), .properties = AST_CHAN_TP_WANTSJITTER | AST_CHAN_TP_CREATESJITTER, .requester = skinny_request, + .devicestate = skinny_devicestate, .call = skinny_call, .hangup = skinny_hangup, .answer = skinny_answer, @@ -4416,6 +4419,41 @@ static struct ast_channel *skinny_request(const char *type, int format, void *da return tmpc; } +static int skinny_devicestate(void *data) +{ + struct skinny_line *l; + struct skinny_subchannel *sub; + char *tmp; + int res = AST_DEVICE_UNKNOWN; + + tmp = ast_strdupa(data); + + l = find_line_by_name(tmp); + + if (!l) + res = AST_DEVICE_INVALID; + else if (!l->parent) + res = AST_DEVICE_UNAVAILABLE; + else if (l->dnd) + res = AST_DEVICE_BUSY; + else { + if (l->hookstate == SKINNY_ONHOOK) { + res = AST_DEVICE_NOT_INUSE; + } else { + res = AST_DEVICE_INUSE; + } + + for (sub = l->sub; sub; sub = sub->next) { + if (sub->onhold) { + res = AST_DEVICE_ONHOLD; + break; + } + } + } + + return res; +} + static int reload_config(void) { int on = 1; |