aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xchannel.c4
-rwxr-xr-xdevicestate.c29
-rwxr-xr-xinclude/asterisk/devicestate.h10
3 files changed, 32 insertions, 11 deletions
diff --git a/channel.c b/channel.c
index e4f121f84..655bac85f 100755
--- a/channel.c
+++ b/channel.c
@@ -939,7 +939,7 @@ void ast_channel_free(struct ast_channel *chan)
free(chan);
ast_mutex_unlock(&chlock);
- ast_device_state_changed(name);
+ ast_device_state_changed_literal(name);
}
static void ast_spy_detach(struct ast_channel *chan)
@@ -2883,7 +2883,7 @@ int ast_setstate(struct ast_channel *chan, int state)
return 0;
chan->_state = state;
- ast_device_state_changed(chan->name);
+ ast_device_state_changed_literal(chan->name);
manager_event(EVENT_FLAG_CALL,
(oldstate == AST_STATE_DOWN) ? "Newchannel" : "Newstate",
"Channel: %s\r\n"
diff --git a/devicestate.c b/devicestate.c
index 3b5c581f4..c85f9a8fe 100755
--- a/devicestate.c
+++ b/devicestate.c
@@ -193,22 +193,14 @@ static void do_state_change(const char *device)
ast_hint_state_changed(device);
}
-/*--- ast_device_state_changed: Accept change notification, add it to change queue */
-int ast_device_state_changed(const char *fmt, ...)
+static int __ast_device_state_changed_literal(char *buf)
{
- char buf[AST_MAX_EXTENSION];
char *device;
char *parse;
struct state_change *change = NULL;
- va_list ap;
-
- va_start(ap, fmt);
- vsnprintf(buf, sizeof(buf), fmt, ap);
- va_end(ap);
parse = buf;
device = strsep(&parse, "-");
-
if (change_thread != AST_PTHREADT_NULL)
change = calloc(1, sizeof(*change) + strlen(device));
@@ -230,6 +222,25 @@ int ast_device_state_changed(const char *fmt, ...)
return 1;
}
+int ast_device_state_changed_literal(const char *dev)
+{
+ char *buf;
+ buf = ast_strdupa(dev);
+ return __ast_device_state_changed_literal(buf);
+}
+
+/*--- ast_device_state_changed: Accept change notification, add it to change queue */
+int ast_device_state_changed(const char *fmt, ...)
+{
+ char buf[AST_MAX_EXTENSION];
+ va_list ap;
+
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+ return __ast_device_state_changed_literal(buf);
+}
+
/*--- do_devstate_changes: Go through the dev state change queue and update changes in the dev state thread */
static void *do_devstate_changes(void *data)
{
diff --git a/include/asterisk/devicestate.h b/include/asterisk/devicestate.h
index 687e6819f..ec8c6620b 100755
--- a/include/asterisk/devicestate.h
+++ b/include/asterisk/devicestate.h
@@ -79,6 +79,16 @@ int ast_device_state(const char *device);
int ast_device_state_changed(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2)));
+
+/*! Tells Asterisk the State for Device is changed */
+/*!
+ * \param device devicename like a dialstrin
+ * Asterisk polls the new extensionstates and calls the registered
+ * callbacks for the changed extensions
+ * Returns 0 on success, -1 on failure
+ */
+int ast_device_state_changed_literal(const char *device);
+
/*! Registers a device state change callback */
/*!
* \param data to pass to callback