summaryrefslogtreecommitdiff
path: root/gatchat
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2011-08-15 00:22:07 -0500
committerDenis Kenzior <denkenz@gmail.com>2011-08-15 00:25:27 -0500
commit2867bf724d5578b607226279be80290ea2d46e1b (patch)
tree15e9abcacdd451cfe564ed5eb3dc8f3cf1454d2b /gatchat
parent1f1544d0be88776889df5102f5a4288c26c6f665 (diff)
downloadofono-2867bf724d5578b607226279be80290ea2d46e1b.tar.gz
gatserver: Add command finished callbacks
Diffstat (limited to 'gatchat')
-rw-r--r--gatchat/gatserver.c47
-rw-r--r--gatchat/gatserver.h7
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