---
gatchat/gatserver.c | 162 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 162 insertions(+), 0 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c
index 5d2a036..9d4d221 100644
--- a/gatchat/gatserver.c
+++ b/gatchat/gatserver.c
@@ -294,6 +294,159 @@ void g_at_server_send_info_text(GAtServer *server, GSList
*text)
send_common(server, buf, len);
}
+static gboolean get_result_value(GAtServer *server, GAtResult *result,
+ const char *command,
+ int min, int max, int *value)
+{
+ GAtResultIter iter;
+ int val;
+ char prefix[10];
+
+ if (command[0] != 'S')
+ return FALSE;
+
+ sprintf(prefix, "%s=", command);
+
+ g_at_result_iter_init(&iter, result);
+
+ if (!g_at_result_iter_next(&iter, prefix))
+ return FALSE;
+
+ if (!g_at_result_iter_next_number(&iter, &val))
+ return FALSE;
+
+ if (val < min || val > max)
+ return FALSE;
+
+ *value = val;
+
+ return TRUE;
+}
+
+static void send_info_text(GAtServer *server, char *buf)
+{
+ GSList *text = NULL;
+
+ text = g_slist_append(NULL, buf);
+ g_at_server_send_info_text(server, text);
+ g_slist_free(text);
+}
+
+static void set_s_value(GAtServer *server, const char *prefix, int val)
+{
+ char c = prefix[1];
+
+ switch (c) {
+ case '3':
+ server->v250.s3 = val;
+ break;
+
+ case '4':
+ server->v250.s4 = val;
+ break;
+
+ case '5':
+ server->v250.s5 = val;
+ break;
+
+ default:
+ break;
+ }
+}
+
+static int get_s_value(GAtServer *server, const char *prefix)
+{
+ char c = prefix[1];
+ int val = 0;
+
+ switch (c) {
+ case '3':
+ val = server->v250.s3;
+ break;
+
+ case '4':
+ val = server->v250.s4;
+ break;
+
+ case '5':
+ val = server->v250.s5;
+ break;
+
+ default:
+ break;
+ }
+
+ return val;
+}
+
+static void s_template_cb(GAtServerRequestType type,
+ GAtResult *result, gpointer user_data,
+ const char *prefix,
+ int min, int max,
+ GAtServerNotifyCallback cb,
+ gpointer cb_data)
+{
+ GAtServerResult res = G_AT_SERVER_RESULT_ERROR;
+ GAtServer *server = user_data;
+ char buf[20];
+ int val;
+
+ switch (type) {
+ case G_AT_SERVER_REQUEST_TYPE_SET:
+ if (!get_result_value(server, result, prefix, min, max, &val))
+ goto done;
+
+ set_s_value(server, prefix, val);
+ res = G_AT_SERVER_RESULT_OK;
+ break;
+
+ case G_AT_SERVER_REQUEST_TYPE_QUERY:
+ val = get_s_value(server, prefix);
+ sprintf(buf, "%03d", val);
+ send_info_text(server, buf);
+ res = G_AT_SERVER_RESULT_OK;
+ break;
+
+ case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
+ sprintf(buf, "%s: (%d-%d)", prefix, min, max);
+ send_info_text(server, buf);
+ res = G_AT_SERVER_RESULT_OK;
+ break;
+
+ default:
+ break;
+ }
+
+done:
+ g_at_server_send_final(server, res);
+
+ cb(cb_data);
+}
+
+static void at_s3_cb(GAtServerRequestType type, GAtResult *result,
+ gpointer user_data,
+ GAtServerNotifyCallback cb,
+ gpointer cb_data)
+{
+ s_template_cb(type, result, user_data, "S3", 0, 127, cb, cb_data);
+}
+
+static void at_s4_cb(GAtServerRequestType type, GAtResult *result,
+ gpointer user_data,
+ GAtServerNotifyCallback cb,
+ gpointer cb_data)
+{
+ s_template_cb(type, result, user_data, "S4", 0, 127, cb, cb_data);
+}
+
+static void at_s5_cb(GAtServerRequestType type, GAtResult *result,
+ gpointer user_data,
+ GAtServerNotifyCallback cb,
+ gpointer cb_data)
+{
+ s_template_cb(type, result, user_data, "S5", 0, 127, cb, cb_data);
+}
+
static inline gboolean is_extended_command_prefix(const char c)
{
switch (c) {
@@ -1008,6 +1161,13 @@ static void at_notify_node_destroy(gpointer data)
g_free(node);
}
+static void basic_command_register(GAtServer *server)
+{
+ g_at_server_register(server, "S3", at_s3_cb, server, NULL);
+ g_at_server_register(server, "S4", at_s4_cb, server, NULL);
+ g_at_server_register(server, "S5", at_s5_cb, server, NULL);
+}
+
GAtServer *g_at_server_new(GIOChannel *io)
{
GAtServer *server;
@@ -1047,6 +1207,8 @@ GAtServer *g_at_server_new(GIOChannel *io)
received_data, server,
(GDestroyNotify)read_watcher_destroy_notify);
+ basic_command_register(server);
+
return server;
error:
--
1.6.6.1
_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono