Handle device state changes properly when formatting characters are present (bug...
authorMark Spencer <markster@digium.com>
Mon, 17 Oct 2005 15:41:55 +0000 (15:41 +0000)
committerMark Spencer <markster@digium.com>
Mon, 17 Oct 2005 15:41:55 +0000 (15:41 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6806 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channel.c
devicestate.c
include/asterisk/devicestate.h

index e4f121f..655bac8 100755 (executable)
--- 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"
index 3b5c581..c85f9a8 100755 (executable)
@@ -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)
 {
index 687e681..ec8c662 100755 (executable)
@@ -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