Fix/Implement error events for non-existing files
authorDavid Ruggles <thedavidfactor@gmail.com>
Fri, 20 Nov 2009 17:28:01 +0000 (17:28 +0000)
committerDavid Ruggles <thedavidfactor@gmail.com>
Fri, 20 Nov 2009 17:28:01 +0000 (17:28 +0000)
also include a better cmd define for S command

Review: https://reviewboard.asterisk.org/r/430/

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@230584 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_externalivr.c
doc/externalivr.txt

index f004617..39088c5 100644 (file)
@@ -98,7 +98,7 @@ static const char app[] = "ExternalIVR";
 /* Commands */
 #define EIVR_CMD_PARM 'P' /* return supplied params */
 #define EIVR_CMD_ANS 'T'  /* answer channel */
-#define EIVR_CMD_STRT 'S' /* start prompt queue over */
+#define EIVR_CMD_SQUE 'S' /* (re)set prompt queue */
 #define EIVR_CMD_APND 'A' /* append to prompt queue */
 #define EIVR_CMD_GET 'G'  /* get channel varable(s) */
 #define EIVR_CMD_SVAR 'V' /* set channel varable(s) */
@@ -706,23 +706,23 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
                                                u->gen_active = 1;
                                        }
                                }
-                       } else if (input[0] == EIVR_CMD_STRT) {
+                       } else if (input[0] == EIVR_CMD_SQUE) {
                                if (chan->_state != AST_STATE_UP || ast_check_hangup(chan)) {
-                                       ast_chan_log(LOG_WARNING, chan, "Queue 'S'et called on unanswered channel\n");
+                                       ast_chan_log(LOG_WARNING, chan, "Queue re'S'et called on unanswered channel\n");
                                        send_eivr_event(eivr_events, 'Z', NULL, chan);
                                        continue;
                                }
-                               if (ast_fileexists(&input[2], NULL, u->chan->language) == -1) {
+                               if (!ast_fileexists(&input[2], NULL, u->chan->language)) {
                                        ast_chan_log(LOG_WARNING, chan, "Unknown file requested '%s'\n", &input[2]);
-                                       send_eivr_event(eivr_events, 'Z', NULL, chan);
-                                       strcpy(&input[2], "exception");
-                               }
-                               if (!u->abort_current_sound && !u->playing_silence)
-                                       send_eivr_event(eivr_events, 'T', NULL, chan);
-                               AST_LIST_LOCK(&u->playlist);
-                               while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
-                                       send_eivr_event(eivr_events, 'D', entry->filename, chan);
-                                       ast_free(entry);
+                                       send_eivr_event(eivr_events, 'Z', &input[2], chan);
+                               } else {
+                                       if (!u->abort_current_sound && !u->playing_silence)
+                                               send_eivr_event(eivr_events, 'T', NULL, chan);
+                                       AST_LIST_LOCK(&u->playlist);
+                                       while ((entry = AST_LIST_REMOVE_HEAD(&u->playlist, list))) {
+                                               send_eivr_event(eivr_events, 'D', entry->filename, chan);
+                                               ast_free(entry);
+                                       }
                                }
                                if (!u->playing_silence)
                                        u->abort_current_sound = 1;
@@ -736,16 +736,16 @@ static int eivr_comm(struct ast_channel *chan, struct ivr_localuser *u,
                                        send_eivr_event(eivr_events, 'Z', NULL, chan);
                                        continue;
                                }
-                               if (ast_fileexists(&input[2], NULL, u->chan->language) == -1) {
+                               if (!ast_fileexists(&input[2], NULL, u->chan->language)) {
                                        ast_chan_log(LOG_WARNING, chan, "Unknown file requested '%s'\n", &input[2]);
-                                       send_eivr_event(eivr_events, 'Z', NULL, chan);
-                                       strcpy(&input[2], "exception");
-                               }
-                               entry = make_entry(&input[2]);
-                               if (entry) {
-                                       AST_LIST_LOCK(&u->playlist);
-                                       AST_LIST_INSERT_TAIL(&u->playlist, entry, list);
-                                       AST_LIST_UNLOCK(&u->playlist);
+                                       send_eivr_event(eivr_events, 'Z', &input[2], chan);
+                               } else {
+                                       entry = make_entry(&input[2]);
+                                       if (entry) {
+                                               AST_LIST_LOCK(&u->playlist);
+                                               AST_LIST_INSERT_TAIL(&u->playlist, entry, list);
+                                               AST_LIST_UNLOCK(&u->playlist);
+                                       }
                                }
                        } else if (input[0] == EIVR_CMD_GET) {
                                char response[2048];
index 75a5610..b1a37be 100644 (file)
@@ -103,10 +103,11 @@ The 'S' command checks to see if there is a playable audio file with
 the specified name, and if so, clear's the generator's playlist and
 places the file onto the list. Note that the playability check does
 not take into account transcoding requirements, so it is possible for
-the file to not be played even though it was found. If the generator
-is not currently playing silence, then T and D events will be sent
-to the child to signal the playlist interruption and notify it of
-the files that will not be played.
+the file to not be played even though it was found. If the file does
+not exist it sends a Z response with the data element set to the file
+requested. If the generator is not currently playing silence, then T
+and D events will be sent to the child to signal the playlist
+interruption and notify it of the files that will not be played.
 
 The 'A' command checks to see if there is a playable audio file with
 the specified name, and if so, adds it to the generator's