mirror of git://git.sysmocom.de/ofono
gatserver: Add command finished callbacks
This commit is contained in:
parent
1f1544d0be
commit
2867bf724d
|
@ -126,6 +126,8 @@ struct _GAtServer {
|
||||||
gboolean final_sent;
|
gboolean final_sent;
|
||||||
gboolean final_async;
|
gboolean final_async;
|
||||||
gboolean in_read_handler;
|
gboolean in_read_handler;
|
||||||
|
GAtServerFinishFunc finishf; /* Callback when cmd finishes */
|
||||||
|
gpointer finish_data; /* Finish func data */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void server_wakeup_writer(GAtServer *server);
|
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);
|
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];
|
char buf[1024];
|
||||||
|
|
||||||
if (server->v250.is_v1)
|
if (server->v250.is_v1)
|
||||||
sprintf(buf, "%s", server_result_to_string(result));
|
sprintf(buf, "%s", server_result_to_string(result));
|
||||||
else
|
else
|
||||||
sprintf(buf, "%u", (unsigned int)result);
|
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)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
server->final_async = FALSE;
|
send_final_numeric(server, result);
|
||||||
send_numeric(server, result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void g_at_server_send_ext_final(GAtServer *server, const char *result)
|
void g_at_server_send_ext_final(GAtServer *server, const char *result)
|
||||||
{
|
{
|
||||||
server->final_sent = TRUE;
|
server->final_sent = TRUE;
|
||||||
server->last_result = G_AT_SERVER_RESULT_EXT_ERROR;
|
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)
|
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 pos = server->cur_pos;
|
||||||
unsigned int len = strlen(line);
|
unsigned int len = strlen(line);
|
||||||
|
|
||||||
server->final_async = FALSE;
|
|
||||||
|
|
||||||
while (pos < len) {
|
while (pos < len) {
|
||||||
unsigned int consumed;
|
unsigned int consumed;
|
||||||
|
|
||||||
server->final_sent = FALSE;
|
server->final_sent = FALSE;
|
||||||
|
server->final_async = FALSE;
|
||||||
|
|
||||||
if (is_extended_command_prefix(line[pos]))
|
if (is_extended_command_prefix(line[pos]))
|
||||||
consumed = parse_extended_command(server, line + pos);
|
consumed = parse_extended_command(server, line + pos);
|
||||||
|
@ -844,7 +854,7 @@ static void server_parse_line(GAtServer *server)
|
||||||
return;
|
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,
|
static enum ParserResult server_feed(GAtServer *server,
|
||||||
|
@ -1460,3 +1470,24 @@ gboolean g_at_server_unregister(GAtServer *server, const char *prefix)
|
||||||
|
|
||||||
return TRUE;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -69,6 +69,8 @@ typedef void (*GAtServerNotifyFunc)(GAtServer *server,
|
||||||
GAtServerRequestType type,
|
GAtServerRequestType type,
|
||||||
GAtResult *result, gpointer user_data);
|
GAtResult *result, gpointer user_data);
|
||||||
|
|
||||||
|
typedef void (*GAtServerFinishFunc)(GAtServer *server, gpointer user_data);
|
||||||
|
|
||||||
GAtServer *g_at_server_new(GIOChannel *io);
|
GAtServer *g_at_server_new(GIOChannel *io);
|
||||||
GIOChannel *g_at_server_get_channel(GAtServer *server);
|
GIOChannel *g_at_server_get_channel(GAtServer *server);
|
||||||
GAtIO *g_at_server_get_io(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);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue