[asterisk-commits] qwell: trunk r56579 - /trunk/channels/chan_skinny.c

asterisk-commits at lists.digium.com asterisk-commits at lists.digium.com
Fri Feb 23 19:06:45 MST 2007


Author: qwell
Date: Fri Feb 23 20:06:44 2007
New Revision: 56579

URL: http://svn.digium.com/view/asterisk?view=rev&rev=56579
Log:
Support devicestate requests.

Now you should be able to subscribe to a Skinny device/line.

Modified:
    trunk/channels/chan_skinny.c

Modified: trunk/channels/chan_skinny.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_skinny.c?view=diff&rev=56579&r1=56578&r2=56579
==============================================================================
--- trunk/channels/chan_skinny.c (original)
+++ trunk/channels/chan_skinny.c Fri Feb 23 20:06:44 2007
@@ -73,6 +73,7 @@
 #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 @@
 } *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 @@
 	.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 @@
 	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;



More information about the asterisk-commits mailing list