]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
cli: Enable ast_cli_completion_add on public completion generators.
authorCorey Farrell <git@cfware.com>
Wed, 14 Mar 2018 17:38:01 +0000 (13:38 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 15 Mar 2018 11:27:33 +0000 (05:27 -0600)
* ast_cli_complete
* ast_complete_channels
* ast_complete_applications

These generators will now use ast_cli_completion_add if state == -1.

Change-Id: I7ff311f0873099be0e43a3dc5415c0cd06d15756

main/cli.c
main/pbx_app.c

index b34da19c1fdaf8ea9d44c596e0ef31379652770b..556c09bd812589d98487957e5c44ec2ca26751d9 100644 (file)
@@ -1682,8 +1682,15 @@ char *ast_cli_complete(const char *word, const char * const choices[], int state
        len = ast_strlen_zero(word) ? 0 : strlen(word);
 
        for (i = 0; choices[i]; i++) {
-               if ((!len || !strncasecmp(word, choices[i], len)) && ++which > state)
-                       return ast_strdup(choices[i]);
+               if ((!len || !strncasecmp(word, choices[i], len)) && ++which > state) {
+                       if (state != -1) {
+                               return ast_strdup(choices[i]);
+                       }
+
+                       if (ast_cli_completion_add(ast_strdup(choices[i]))) {
+                               return NULL;
+                       }
+               }
        }
        return NULL;
 }
@@ -1709,9 +1716,16 @@ char *ast_complete_channels(const char *line, const char *word, int pos, int sta
                struct ast_channel_snapshot *snapshot = stasis_message_data(msg);
 
                if (!strncasecmp(word, snapshot->name, wordlen) && (++which > state)) {
-                       ret = ast_strdup(snapshot->name);
-                       ao2_ref(msg, -1);
-                       break;
+                       if (state != -1) {
+                               ret = ast_strdup(snapshot->name);
+                               ao2_ref(msg, -1);
+                               break;
+                       }
+
+                       if (ast_cli_completion_add(ast_strdup(snapshot->name))) {
+                               ao2_ref(msg, -1);
+                               break;
+                       }
                }
        }
        ao2_iterator_destroy(&iter);
index ec6bc75890a5fd7d8d5ac012b0fd4b131fe36cfd..df8126c7f17a34b32a778f6259fa1a6e6682d68c 100644 (file)
@@ -275,7 +275,7 @@ static char *handle_show_application(struct ast_cli_entry *e, int cmd, struct as
                 * application at one time. You can type 'show application Dial Echo' and
                 * you will see informations about these two applications ...
                 */
-               return ast_complete_applications(a->line, a->word, a->n);
+               return ast_complete_applications(a->line, a->word, -1);
        }
 
        if (a->argc < 4) {
@@ -437,20 +437,23 @@ char *ast_complete_applications(const char *line, const char *word, int state)
        AST_RWLIST_RDLOCK(&apps);
        AST_RWLIST_TRAVERSE(&apps, app, list) {
                cmp = strncasecmp(word, app->name, wordlen);
-               if (cmp > 0) {
-                       continue;
-               }
-               if (!cmp) {
+               if (cmp < 0) {
+                       /* No more matches. */
+                       break;
+               } else if (!cmp) {
                        /* Found match. */
-                       if (++which <= state) {
-                               /* Not enough matches. */
-                               continue;
+                       if (state != -1) {
+                               if (++which <= state) {
+                                       /* Not enough matches. */
+                                       continue;
+                               }
+                               ret = ast_strdup(app->name);
+                               break;
+                       }
+                       if (ast_cli_completion_add(ast_strdup(app->name))) {
+                               break;
                        }
-                       ret = ast_strdup(app->name);
-                       break;
                }
-               /* Not in container. */
-               break;
        }
        AST_RWLIST_UNLOCK(&apps);