Cache the result code as last_result from at command callback. And flush out the last result code when the whole command line is parsed, except the last result is an extended error code, like +CMS ERROR or +CME ERROR. --- gatchat/gatserver.c | 55 ++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c index 9683fa3..b4f7563 100644 --- a/gatchat/gatserver.c +++ b/gatchat/gatserver.c @@ -33,6 +33,8 @@ #include "gatserver.h" #define BUF_SIZE 4096 +/* <cr><lf> + the max length of information text + <cr><lf> */ +#define MAX_TEXT_SIZE 2048+4 /* #define WRITE_SCHEDULER_DEBUG 1 */ enum ParserState { @@ -112,6 +114,7 @@ struct _GAtServer { guint max_read_attempts; /* Max reads per select */ enum ParserState parser_state; gboolean destroyed; /* Re-entrancy guard */ + GAtServerResult last_result; /* Result of last command */ }; static void g_at_server_wakeup_writer(GAtServer *server); @@ -156,35 +159,52 @@ static void send_common(GAtServer *server, const char *buf, unsigned int len) g_at_server_wakeup_writer(server); } -static void g_at_server_send_final(GAtServer *server, GAtServerResult result) +static void send_result_common(GAtServer *server, const char *result) { - struct v250_settings v250 = server->v250; - const char *result_str = server_result_to_string(result); - char buf[1024]; - char t = v250.s3; - char r = v250.s4; + char buf[MAX_TEXT_SIZE]; + char t = server->v250.s3; + char r = server->v250.s4; unsigned int len; - /* Do not emit error if extended error has already been emitted */ - if (result == G_AT_SERVER_RESULT_EXT_ERROR) - return; - - if (v250.quiet) + if (server->v250.quiet) return; - if (result_str == NULL) + if (result == NULL) return; - if (v250.is_v1) - len = snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result_str, + if (server->v250.is_v1) + len = snprintf(buf, sizeof(buf), "%c%c%s%c%c", t, r, result, t, r); else - len = snprintf(buf, sizeof(buf), "%u%c", (unsigned int) result, - t); + len = snprintf(buf, sizeof(buf), "%s%c", result, t); send_common(server, buf, MIN(len, sizeof(buf)-1)); } +static void g_at_server_send_flush(GAtServer *server) +{ + GAtServerResult result = server->last_result; + char buf[1024]; + + /* Do not emit error if extended error has already been emitted */ + if (result == G_AT_SERVER_RESULT_EXT_ERROR) + return; + + if (server->v250.is_v1) + sprintf(buf, "%s", server_result_to_string(result)); + else + sprintf(buf, "%u", (unsigned int)result); + + send_result_common(server, buf); +} + +static inline void g_at_server_send_final(GAtServer *server, + GAtServerResult result) +{ + /* Cache the result until the whole command line is parsed */ + server->last_result = result; +} + static inline gboolean is_extended_command_prefix(const char c) { switch (c) { @@ -633,16 +653,19 @@ static void new_bytes(GAtServer *p) * Empty commands must be OK by the DCE */ g_at_server_send_final(p, G_AT_SERVER_RESULT_OK); + g_at_server_send_flush(p); ring_buffer_drain(p->read_buf, p->read_so_far); break; case PARSER_RESULT_COMMAND: server_parse_line(p, extract_line(p)); + g_at_server_send_flush(p); break; case PARSER_RESULT_REPEAT_LAST: /* TODO */ g_at_server_send_final(p, G_AT_SERVER_RESULT_OK); + g_at_server_send_flush(p); ring_buffer_drain(p->read_buf, p->read_so_far); break; -- 1.6.6.1 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono