Update "manager show event" to support tab completion
authorMatthew Jordan <mjordan@digium.com>
Mon, 25 Jun 2012 20:43:26 +0000 (20:43 +0000)
committerMatthew Jordan <mjordan@digium.com>
Mon, 25 Jun 2012 20:43:26 +0000 (20:43 +0000)
Thank you rmudgett for pointing out that I was missing this in the initial
check-in for AMI event documentation (r369346)

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

main/manager.c

index 4126247..3eb1133 100644 (file)
@@ -6896,21 +6896,19 @@ static char *handle_manager_show_events(struct ast_cli_entry *e, int cmd, struct
 static char *handle_manager_show_event(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
        struct ao2_container *events;
+       struct ao2_iterator it_events;
        struct ast_xml_doc_item *item, *temp;
+       int length;
+       int which;
+       char *match = NULL;
        char syntax_title[64], description_title[64], synopsis_title[64], seealso_title[64], arguments_title[64];
 
-       switch (cmd) {
-       case CLI_INIT:
+       if (cmd == CLI_INIT) {
                e->command = "manager show event";
                e->usage =
                        "Usage: manager show event <eventname>\n"
                        "       Provides a detailed description a Manager interface event.\n";
                return NULL;
-       case CLI_GENERATE:
-               return NULL;
-       }
-       if (a->argc != 4) {
-               return CLI_SHOWUSAGE;
        }
 
        events = ao2_global_obj_ref(event_docs);
@@ -6919,6 +6917,27 @@ static char *handle_manager_show_event(struct ast_cli_entry *e, int cmd, struct
                return CLI_SUCCESS;
        }
 
+       if (cmd == CLI_GENERATE) {
+               length = strlen(a->word);
+               which = 0;
+               it_events = ao2_iterator_init(events, 0);
+               while ((item = ao2_iterator_next(&it_events))) {
+                       if (!strncasecmp(a->word, item->name, length) && ++which > a->n) {
+                               match = ast_strdup(item->name);
+                               ao2_ref(item, -1);
+                               break;
+                       }
+                       ao2_ref(item, -1);
+               }
+               ao2_iterator_destroy(&it_events);
+               ao2_ref(events, -1);
+               return match;
+       }
+
+       if (a->argc != 4) {
+               return CLI_SHOWUSAGE;
+       }
+
        if (!(item = ao2_find(events, a->argv[3], OBJ_KEY))) {
                ast_cli(a->fd, "Could not find event '%s'\n", a->argv[3]);
                ao2_ref(events, -1);