[asterisk-commits] mvanbaak: trunk r141464 - in /trunk: channels/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Sep 6 07:03:12 CDT 2008


Author: mvanbaak
Date: Sat Sep  6 07:03:11 2008
New Revision: 141464

URL: http://svn.digium.com/view/asterisk?view=rev&rev=141464
Log:
Some fixes to autocompletion in some commands.

Changes applied by this patch:

- Fix autocompletion in 'sip prune realtime', sip peers where never auto completed. Now we complete this command with:
  'sip prune realtime peer' -> all | like | sip peers
  Also I have modified the syntax in the usage, was wrong...
- Pass ast_cli_args->argv and ast_cli_args->argc while running autocompletion on CLI commands (CLI_GENERATE).
  With this we avoid comparisons on ast_cli_args->line like this:
  strcasestr(a->line, " description")
  strcasestr(a->line, "descriptions ")
  strcasestr(a->line, "realtime peer"), and so on..

  Making the code more confusing (check the spaces in description!).
  The only thing we must be sure is to first check a->pos or a->argc.
														      
- Fix 'iax2 prune realtime' autocompletion, now we autocomplete this command with 'all' & 'iax2 peers', check a look that iax2 peers where all the peers, now only the ones in the cache..

(closes issue #13133)
Reported by: eliel
Patches:
      clichanges.patch uploaded by eliel (license 64)

Modified:
    trunk/channels/chan_iax2.c
    trunk/channels/chan_sip.c
    trunk/main/cli.c

Modified: trunk/channels/chan_iax2.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_iax2.c?view=diff&rev=141464&r1=141463&r2=141464
==============================================================================
--- trunk/channels/chan_iax2.c (original)
+++ trunk/channels/chan_iax2.c Sat Sep  6 07:03:11 2008
@@ -731,7 +731,7 @@
 static struct iax2_peer *realtime_peer(const char *peername, struct sockaddr_in *sin);
 
 static int ast_cli_netstats(struct mansession *s, int fd, int limit_fmt);
-static char *complete_iax2_peers(const char *line, const char *word, int pos, int state);
+static char *complete_iax2_peers(const char *line, const char *word, int pos, int state, int flags);
 static char *complete_iax2_unregister(const char *line, const char *word, int pos, int state);
 
 enum iax2_thread_iostate {
@@ -2461,6 +2461,8 @@
 static char *handle_cli_iax2_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 {
 	struct iax2_peer *peer;
+	static char *choices[] = { "all", NULL };
+	char *cmplt;
 
 	switch (cmd) {
 	case CLI_INIT:
@@ -2470,18 +2472,22 @@
 			"       Prunes object(s) from the cache\n";
 		return NULL;
 	case CLI_GENERATE:
-		if (a->pos == 3)
-			return complete_iax2_peers(a->line, a->word, a->pos, a->n);
+		if (a->pos == 3) {
+			cmplt = ast_cli_complete(a->word, choices, a->n);
+			if (!cmplt)
+				cmplt = complete_iax2_peers(a->line, a->word, a->pos, a->n - sizeof(choices), IAX_RTCACHEFRIENDS);
+			return cmplt;
+		}
 		return NULL;
 	}
 
 	if (a->argc != 4)
-        return CLI_SHOWUSAGE;
+		return CLI_SHOWUSAGE;
 	if (!strcmp(a->argv[3], "all")) {
 		reload_config();
 		ast_cli(a->fd, "Cache flushed successfully.\n");
 	} else if ((peer = find_peer(a->argv[3], 0))) {
-		if(ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
+		if (ast_test_flag(peer, IAX_RTCACHEFRIENDS)) {
 			ast_set_flag(peer, IAX_RTAUTOCLEAR);
 			expire_registry(peer_ref(peer));
 			ast_cli(a->fd, "Peer %s was removed from the cache.\n", a->argv[3]);
@@ -2627,7 +2633,7 @@
 		return NULL;
 	case CLI_GENERATE:
 		if (a->pos == 3)
-			return complete_iax2_peers(a->line, a->word, a->pos, a->n);
+			return complete_iax2_peers(a->line, a->word, a->pos, a->n, 0);
 		return NULL;
 	}
 
@@ -2683,7 +2689,7 @@
 	return CLI_SUCCESS;
 }
 
-static char *complete_iax2_peers(const char *line, const char *word, int pos, int state)
+static char *complete_iax2_peers(const char *line, const char *word, int pos, int state, int flags)
 {
 	int which = 0;
 	struct iax2_peer *peer;
@@ -2693,7 +2699,8 @@
 
 	i = ao2_iterator_init(peers, 0);
 	while ((peer = ao2_iterator_next(&i))) {
-		if (!strncasecmp(peer->name, word, wordlen) && ++which > state) {
+		if (!strncasecmp(peer->name, word, wordlen) && ++which > state
+			&& (!flags || ast_test_flag(peer, flags))) {
 			res = ast_strdup(peer->name);
 			peer_unref(peer);
 			break;
@@ -5642,8 +5649,8 @@
 			"       Enables/Disables dumping of IAX packets for debugging purposes.\n";
 		return NULL;
 	case CLI_GENERATE:
-		if (a->pos == 4)
-			return complete_iax2_peers(a->line, a->word, a->pos, a->n);
+		if (a->pos == 4 && !strcasecmp(a->argv[3], "peer"))
+			return complete_iax2_peers(a->line, a->word, a->pos, a->n, 0);
 		return NULL;
 	}
 

Modified: trunk/channels/chan_sip.c
URL: http://svn.digium.com/view/asterisk/trunk/channels/chan_sip.c?view=diff&rev=141464&r1=141463&r2=141464
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Sat Sep  6 07:03:11 2008
@@ -12740,19 +12740,25 @@
 	char *name = NULL;
 	regex_t regexbuf;
 	struct ao2_iterator i;
+	static char *choices[] = { "all", "like", NULL };
+	char *cmplt;
 	
 	if (cmd == CLI_INIT) {
-		e->command = "sip prune realtime [peer|all] [all|like]";
+		e->command = "sip prune realtime [peer|all]";
 		e->usage =
-		"Usage: sip prune realtime [peer] [<name>|all|like <pattern>]\n"
+		"Usage: sip prune realtime [peer [<name>|all|like <pattern>]|all]\n"
 		"       Prunes object(s) from the cache.\n"
 		"       Optional regular expression pattern is used to filter the objects.\n";
 		return NULL;
 	} else if (cmd == CLI_GENERATE) {
-		if (a->pos == 4) {
-			if (strcasestr(a->line, "realtime peer"))
-				return complete_sip_peer(a->word, a->n, SIP_PAGE2_RTCACHEFRIENDS);
-		}
+		if (a->pos == 4 && !strcasecmp(a->argv[3], "peer")) {
+			cmplt = ast_cli_complete(a->word, choices, a->n);
+			if (!cmplt)
+				cmplt = complete_sip_peer(a->word, a->n - sizeof(choices), SIP_PAGE2_RTCACHEFRIENDS);
+			return cmplt;
+		}
+		if (a->pos == 5 && !strcasecmp(a->argv[4], "like"))
+			return complete_sip_peer(a->word, a->n, SIP_PAGE2_RTCACHEFRIENDS);
 		return NULL;
 	}
 	switch (a->argc) {
@@ -12778,9 +12784,9 @@
 			multi = TRUE;
 		} else
 			return CLI_SHOWUSAGE;
-		if (!strcasecmp(a->argv[4], "like"))
+		if (!strcasecmp(name, "like"))
 			return CLI_SHOWUSAGE;
-		if (!multi && !strcasecmp(a->argv[4], "all")) {
+		if (!multi && !strcasecmp(name, "all")) {
 			multi = TRUE;
 			name = NULL;
 		}
@@ -14384,7 +14390,7 @@
 			"       IP address or registered peer.\n";
 		return NULL;
 	} else if (cmd == CLI_GENERATE) {
-		if (a->pos == 4 && strcasestr(a->line, " peer")) /* XXX should check on argv too */
+		if (a->pos == 4 && !strcasecmp(a->argv[3], "peer")) 
 			return complete_sip_peer(a->word, a->n, 0);
 		return NULL;
         }

Modified: trunk/main/cli.c
URL: http://svn.digium.com/view/asterisk/trunk/main/cli.c?view=diff&rev=141464&r1=141463&r2=141464
==============================================================================
--- trunk/main/cli.c (original)
+++ trunk/main/cli.c Sat Sep  6 07:03:11 2008
@@ -1835,7 +1835,9 @@
 				struct ast_cli_args a = {
 					.line = matchstr, .word = word,
 					.pos = argindex,
-					.n = state - matchnum };
+					.n = state - matchnum,
+					.argv = argv,
+					.argc = x};
 				ret = e->handler(e, CLI_GENERATE, &a);
 			}
 			if (ret)




More information about the asterisk-commits mailing list