From 2867bf724d5578b607226279be80290ea2d46e1b Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 15 Aug 2011 00:22:07 -0500 Subject: [PATCH] gatserver: Add command finished callbacks --- gatchat/gatserver.c | 47 +++++++++++++++++++++++++++++++++++++-------- gatchat/gatserver.h | 7 +++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c index 8579de20..8d7ef059 100644 --- a/gatchat/gatserver.c +++ b/gatchat/gatserver.c @@ -126,6 +126,8 @@ struct _GAtServer { gboolean final_sent; gboolean final_async; gboolean in_read_handler; + GAtServerFinishFunc finishf; /* Callback when cmd finishes */ + gpointer finish_data; /* Finish func data */ }; static void server_wakeup_writer(GAtServer *server); @@ -197,15 +199,25 @@ static void send_result_common(GAtServer *server, const char *result) send_common(server, buf, len); } -static inline void send_numeric(GAtServer *server, GAtServerResult result) +static inline void send_final_common(GAtServer *server, const char *result) +{ + send_result_common(server, result); + server->final_async = FALSE; + + if (server->finishf) + server->finishf(server, server->finish_data); +} + +static inline void send_final_numeric(GAtServer *server, GAtServerResult result) { char buf[1024]; + 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); + send_final_common(server, buf); } void g_at_server_send_final(GAtServer *server, GAtServerResult result) @@ -223,15 +235,14 @@ void g_at_server_send_final(GAtServer *server, GAtServerResult result) return; } - server->final_async = FALSE; - send_numeric(server, result); + send_final_numeric(server, result); } void g_at_server_send_ext_final(GAtServer *server, const char *result) { server->final_sent = TRUE; server->last_result = G_AT_SERVER_RESULT_EXT_ERROR; - send_result_common(server, result); + send_final_common(server, result); } void g_at_server_send_intermediate(GAtServer *server, const char *result) @@ -810,12 +821,11 @@ static void server_parse_line(GAtServer *server) unsigned int pos = server->cur_pos; unsigned int len = strlen(line); - server->final_async = FALSE; - while (pos < len) { unsigned int consumed; server->final_sent = FALSE; + server->final_async = FALSE; if (is_extended_command_prefix(line[pos])) consumed = parse_extended_command(server, line + pos); @@ -844,7 +854,7 @@ static void server_parse_line(GAtServer *server) return; } - send_numeric(server, G_AT_SERVER_RESULT_OK); + send_final_numeric(server, G_AT_SERVER_RESULT_OK); } static enum ParserResult server_feed(GAtServer *server, @@ -1460,3 +1470,24 @@ gboolean g_at_server_unregister(GAtServer *server, const char *prefix) return TRUE; } + +gboolean g_at_server_set_finish_callback(GAtServer *server, + GAtServerFinishFunc finishf, + gpointer user_data) +{ + if (server == NULL) + return FALSE; + + server->finishf = finishf; + server->finish_data = user_data; + + return TRUE; +} + +gboolean g_at_server_command_pending(GAtServer *server) +{ + if (server == NULL) + return FALSE; + + return server->final_async; +} diff --git a/gatchat/gatserver.h b/gatchat/gatserver.h index bb0ae848..5fc030b5 100644 --- a/gatchat/gatserver.h +++ b/gatchat/gatserver.h @@ -69,6 +69,8 @@ typedef void (*GAtServerNotifyFunc)(GAtServer *server, GAtServerRequestType type, GAtResult *result, gpointer user_data); +typedef void (*GAtServerFinishFunc)(GAtServer *server, gpointer user_data); + GAtServer *g_at_server_new(GIOChannel *io); GIOChannel *g_at_server_get_channel(GAtServer *server); GAtIO *g_at_server_get_io(GAtServer *server); @@ -115,6 +117,11 @@ void g_at_server_send_unsolicited(GAtServer *server, const char *result); */ void g_at_server_send_info(GAtServer *server, const char *line, gboolean last); +gboolean g_at_server_set_finish_callback(GAtServer *server, + GAtServerFinishFunc finishf, + gpointer user_data); +gboolean g_at_server_command_pending(GAtServer *server); + #ifdef __cplusplus } #endif