--- gatchat/gatserver.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 191 insertions(+), 4 deletions(-)
diff --git a/gatchat/gatserver.c b/gatchat/gatserver.c index 9d4d221..06b5751 100644 --- a/gatchat/gatserver.c +++ b/gatchat/gatserver.c @@ -302,10 +302,10 @@ static gboolean get_result_value(GAtServer *server, GAtResult *result, int val; char prefix[10]; - if (command[0] != 'S') - return FALSE; - - sprintf(prefix, "%s=", command); + if (command[0] == 'S') + sprintf(prefix, "%s=", command); + else + strcpy(prefix, command); g_at_result_iter_init(&iter, result); @@ -447,6 +447,187 @@ static void at_s5_cb(GAtServerRequestType type, GAtResult *result, s_template_cb(type, result, user_data, "S5", 0, 127, cb, cb_data); } +static void set_v250_value(GAtServer *server, const char *prefix, int val) +{ + char c = prefix[0]; + + if (c == '&') { + c = prefix[1]; + switch (c) { + case 'C': + server->v250.c109 = val; + break; + + case 'D': + server->v250.c108 = val; + break; + default: + break; + } + } else { + switch (c) { + case 'E': + server->v250.echo = val; + break; + + case 'Q': + server->v250.quiet = val; + break; + + case 'V': + server->v250.is_v1 = val; + break; + + case 'X': + server->v250.res_format = val; + break; + } + } +} + +static int get_v250_value(GAtServer *server, const char *prefix) +{ + char c = prefix[0]; + int val = 0; + + if (c == '&') { + c = prefix[1]; + + switch (c) { + case 'C': + val = server->v250.c109; + break; + + case 'D': + val = server->v250.c108; + break; + + default: + break; + } + } else { + switch (c) { + case 'E': + val = server->v250.echo; + break; + + case 'Q': + val = server->v250.quiet; + break; + + case 'V': + val = server->v250.is_v1; + break; + + case 'X': + val = server->v250.res_format; + break; + + default: + break; + } + } + + return val; +} + +static void at_template_cb(GAtServerRequestType type, + GAtResult *result, gpointer user_data, + const char *prefix, + int min, int max, int deftval, + 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_v250_value(server, prefix, val); + res = G_AT_SERVER_RESULT_OK; + break; + + case G_AT_SERVER_REQUEST_TYPE_QUERY: + val = get_v250_value(server, prefix); + sprintf(buf, "%s: %d", prefix, 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; + + case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY: + set_v250_value(server, prefix, deftval); + res = G_AT_SERVER_RESULT_OK; + break; + + default: + break; + } + +done: + g_at_server_send_final(server, res); + + cb(cb_data); +} + +static void at_e_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, + GAtServerNotifyCallback cb, + gpointer cb_data) +{ + at_template_cb(type, result, user_data, "E", 0, 1, 1, cb, cb_data); +} + +static void at_q_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, + GAtServerNotifyCallback cb, + gpointer cb_data) +{ + at_template_cb(type, result, user_data, "Q", 0, 1, 0, cb, cb_data); +} + +static void at_v_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, + GAtServerNotifyCallback cb, + gpointer cb_data) +{ + at_template_cb(type, result, user_data, "V", 0, 1, 1, cb, cb_data); +} + +static void at_x_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, + GAtServerNotifyCallback cb, + gpointer cb_data) +{ + at_template_cb(type, result, user_data, "X", 0, 4, 4, cb, cb_data); +} + +static void at_c109_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, + GAtServerNotifyCallback cb, + gpointer cb_data) +{ + at_template_cb(type, result, user_data, "&C", 0, 1, 1, cb, cb_data); +} + +static void at_c108_cb(GAtServerRequestType type, GAtResult *result, + gpointer user_data, + GAtServerNotifyCallback cb, + gpointer cb_data) +{ + at_template_cb(type, result, user_data, "&D", 0, 2, 2, cb, cb_data); +} + static inline gboolean is_extended_command_prefix(const char c) { switch (c) { @@ -1166,6 +1347,12 @@ 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); + g_at_server_register(server, "E", at_e_cb, server, NULL); + g_at_server_register(server, "Q", at_q_cb, server, NULL); + g_at_server_register(server, "V", at_v_cb, server, NULL); + g_at_server_register(server, "X", at_x_cb, server, NULL); + g_at_server_register(server, "&C", at_c109_cb, server, NULL); + g_at_server_register(server, "&D", at_c108_cb, server, NULL); } GAtServer *g_at_server_new(GIOChannel *io) -- 1.6.6.1 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono