summaryrefslogtreecommitdiff
path: root/channels/chan_skinny.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/chan_skinny.c')
-rw-r--r--channels/chan_skinny.c38
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;