[PATCH BlueZ] mesh: Make use of rl_prompt_input

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>

This removes unnecessary code to ask user input which is already
supported by rl_prompt_input.
---
 mesh/agent.c | 127 ++++++++++++++---------------------------------------------
 mesh/main.c  |   4 +-
 2 files changed, 31 insertions(+), 100 deletions(-)

diff --git a/mesh/agent.c b/mesh/agent.c
index 026f26058..c789b0c1a 100644
--- a/mesh/agent.c
+++ b/mesh/agent.c
@@ -38,11 +38,6 @@
 #include "mesh/util.h"
 #include "mesh/agent.h"
 
-#define AGENT_PROMPT	COLOR_RED "[agent]" COLOR_OFF " "
-
-static char *agent_saved_prompt = NULL;
-static int agent_saved_point = 0;
-
 struct input_request {
 	oob_type_t type;
 	uint16_t len;
@@ -52,45 +47,6 @@ struct input_request {
 
 static struct input_request pending_request = {NONE, 0, NULL, NULL};
 
-static void agent_prompt(const char *msg)
-{
-	char *prompt;
-
-	/* Normal use should not prompt for user input to the agent a second
-	 * time before it releases the prompt, but we take a safe action. */
-	if (agent_saved_prompt)
-		return;
-
-	agent_saved_point = rl_point;
-	agent_saved_prompt = g_strdup(rl_prompt);
-
-	rl_set_prompt("");
-	rl_redisplay();
-
-	prompt = g_strdup_printf(AGENT_PROMPT "%s", msg);
-	rl_set_prompt(prompt);
-	g_free(prompt);
-
-	rl_replace_line("", 0);
-	rl_redisplay();
-}
-
-static void agent_release_prompt(void)
-{
-	if (!agent_saved_prompt)
-		return;
-
-	/* This will cause rl_expand_prompt to re-run over the last prompt, but
-	 * our prompt doesn't expand anyway. */
-	rl_set_prompt(agent_saved_prompt);
-	rl_replace_line("", 0);
-	rl_point = agent_saved_point;
-	rl_redisplay();
-
-	g_free(agent_saved_prompt);
-	agent_saved_prompt = NULL;
-}
-
 bool agent_completion(void)
 {
 	if (pending_request.type == NONE)
@@ -99,28 +55,37 @@ bool agent_completion(void)
 	return true;
 }
 
-static bool response_hexadecimal(const char *input)
+static void reset_input_request(void)
+{
+	pending_request.type = NONE;
+	pending_request.len = 0;
+	pending_request.cb = NULL;
+	pending_request.user_data = NULL;
+}
+
+static void response_hexadecimal(const char *input, void *user_data)
 {
 	uint8_t buf[MAX_HEXADECIMAL_OOB_LEN];
 
 	if (!str2hex(input, strlen(input), buf, pending_request.len) ) {
 		rl_printf("Incorrect input: expecting %d hex octets\n",
 			  pending_request.len);
-		return false;
+		return;
 	}
 
 	if (pending_request.cb)
 		pending_request.cb(HEXADECIMAL, buf, pending_request.len,
 					pending_request.user_data);
-	return true;
+
+	reset_input_request();
 }
 
-static bool response_decimal(const char *input)
+static void response_decimal(const char *input, void *user_data)
 {
 	uint8_t buf[DECIMAL_OOB_LEN];
 
 	if (strlen(input) > pending_request.len)
-		return false;
+		return;
 
 	bt_put_be32(atoi(input), buf);
 
@@ -128,57 +93,16 @@ static bool response_decimal(const char *input)
 		pending_request.cb(DECIMAL, buf, DECIMAL_OOB_LEN,
 					pending_request.user_data);
 
-	return true;
+	reset_input_request();
 }
 
-static void response_ascii(const char *input)
+static void response_ascii(const char *input, void *user_data)
 {
 	if (pending_request.cb)
 		pending_request.cb(ASCII, (uint8_t *) input, strlen(input),
 					pending_request.user_data);
-}
-
-bool agent_input(const char *input)
-{
-	bool repeat = false;
-
-	if (pending_request.type == NONE)
-		return false;
-
-	switch (pending_request.type) {
-	case HEXADECIMAL:
-		if (!response_hexadecimal(input))
-			repeat = true;
-		break;
-	case DECIMAL:
-		if (!response_decimal(input))
-			repeat = true;
-		break;
-	case ASCII:
-		response_ascii(input);
-		break;
-	case OUTPUT:
-		repeat = true;
-	case NONE:
-	default:
-		break;
-	};
-
-	if (!repeat) {
-		pending_request.type = NONE;
-		pending_request.len = 0;
-		pending_request.cb = NULL;
-		pending_request.user_data = NULL;
-
-		agent_release_prompt();
-	}
 
-	return true;
-}
-
-void agent_release(void)
-{
-	agent_release_prompt();
+	reset_input_request();
 }
 
 static bool request_hexadecimal(uint16_t len)
@@ -187,7 +111,8 @@ static bool request_hexadecimal(uint16_t len)
 		return false;
 
 	rl_printf("Request hexadecimal key (hex %d octets)\n", len);
-	agent_prompt("Enter key (hex number): ");
+	rl_prompt_input("mesh", "Enter key (hex number):", response_hexadecimal,
+								NULL);
 
 	return true;
 }
@@ -205,7 +130,7 @@ static uint32_t power_ten(uint8_t power)
 static bool request_decimal(uint16_t len)
 {
 	rl_printf("Request decimal key (0 - %d)\n", power_ten(len) - 1);
-	agent_prompt("Enter Numeric key: ");
+	rl_prompt_input("mesh", "Enter Numeric key:", response_decimal, NULL);
 
 	return true;
 }
@@ -216,7 +141,8 @@ static bool request_ascii(uint16_t len)
 		return false;
 
 	rl_printf("Request ASCII key (max characters %d)\n", len);
-	agent_prompt("Enter key (ascii string): ");
+	rl_prompt_input("mesh", "Enter key (ascii string):", response_ascii,
+									NULL);
 
 	return true;
 }
@@ -257,13 +183,18 @@ bool agent_input_request(oob_type_t type, uint16_t max_len, agent_input_cb cb,
 	return false;
 }
 
+static void response_output(const char *input, void *user_data)
+{
+	reset_input_request();
+}
+
 bool agent_output_request(const char* str)
 {
 	if (pending_request.type != NONE)
 		return false;
 
 	pending_request.type = OUTPUT;
-	agent_prompt(str);
+	rl_prompt_input("mesh", str, response_output, NULL);
 	return true;
 }
 
@@ -272,5 +203,5 @@ void agent_output_request_cancel(void)
 	if (pending_request.type != OUTPUT)
 		return;
 	pending_request.type = NONE;
-	agent_release_prompt();
+	rl_release_prompt("");
 }
diff --git a/mesh/main.c b/mesh/main.c
index 0a7fc1ee9..b06f4352a 100644
--- a/mesh/main.c
+++ b/mesh/main.c
@@ -2005,7 +2005,7 @@ static void rl_handler(char *input)
 		goto done;
 	}
 
-	if (agent_input(input) == TRUE)
+	if (!rl_release_prompt(input))
 		goto done;
 
 	add_history(input);
@@ -2263,7 +2263,7 @@ int main(int argc, char *argv[])
 	g_list_free(service_list);
 	g_list_free_full(ctrl_list, proxy_leak);
 
-	agent_release();
+	rl_release_prompt("");
 
 	return 0;
 }
-- 
2.13.5

--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux