From 52da98881610e08a7470227dd8720bef2f7c319c Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Fri, 25 Jun 2010 14:21:48 -0500 Subject: [PATCH] atmodem: Add CGSMS support to sms driver --- drivers/atmodem/sms.c | 88 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/drivers/atmodem/sms.c b/drivers/atmodem/sms.c index f7c3344c..ba98c12f 100644 --- a/drivers/atmodem/sms.c +++ b/drivers/atmodem/sms.c @@ -43,6 +43,7 @@ #include "atmodem.h" static const char *csca_prefix[] = { "+CSCA:", NULL }; +static const char *cgsms_prefix[] = { "+CGSMS:", NULL }; static const char *csms_prefix[] = { "+CSMS:", NULL }; static const char *cmgf_prefix[] = { "+CMGF:", NULL }; static const char *cpms_prefix[] = { "+CPMS:", NULL }; @@ -251,6 +252,91 @@ error: CALLBACK_WITH_FAILURE(cb, -1, user_data); } +static void at_cgsms_set_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + struct cb_data *cbd = user_data; + ofono_sms_sca_set_cb_t cb = cbd->cb; + struct ofono_error error; + + decode_at_error(&error, g_at_result_final_response(result)); + + cb(&error, cbd->data); +} + +static void at_cgsms_set(struct ofono_sms *sms, int bearer, + ofono_sms_bearer_set_cb_t cb, void *user_data) +{ + struct sms_data *data = ofono_sms_get_data(sms); + struct cb_data *cbd = cb_data_new(cb, user_data); + char buf[64]; + + if (!cbd) + goto error; + + snprintf(buf, sizeof(buf), "AT+CGSMS=%d", bearer); + + if (g_at_chat_send(data->chat, buf, none_prefix, + at_cgsms_set_cb, cbd, g_free) > 0) + return; + +error: + if (cbd) + g_free(cbd); + + CALLBACK_WITH_FAILURE(cb, user_data); +} + +static void at_cgsms_query_cb(gboolean ok, GAtResult *result, + gpointer user_data) +{ + struct cb_data *cbd = user_data; + ofono_sms_bearer_query_cb_t cb = cbd->cb; + struct ofono_error error; + GAtResultIter iter; + int bearer; + + decode_at_error(&error, g_at_result_final_response(result)); + + if (!ok) { + cb(&error, -1, cbd->data); + return; + } + + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CGSMS:")) + goto err; + + g_at_result_iter_next_number(&iter, &bearer); + + cb(&error, bearer, cbd->data); + + return; + +err: + CALLBACK_WITH_FAILURE(cb, -1, cbd->data); +} + +static void at_cgsms_query(struct ofono_sms *sms, + ofono_sms_bearer_query_cb_t cb, void *user_data) +{ + struct sms_data *data = ofono_sms_get_data(sms); + struct cb_data *cbd = cb_data_new(cb, user_data); + + if (!cbd) + goto error; + + if (g_at_chat_send(data->chat, "AT+CGSMS?", cgsms_prefix, + at_cgsms_query_cb, cbd, g_free) > 0) + return; + +error: + if (cbd) + g_free(cbd); + + CALLBACK_WITH_FAILURE(cb, -1, user_data); +} + static void at_cnma_cb(gboolean ok, GAtResult *result, gpointer user_data) { if (!ok) @@ -1157,6 +1243,8 @@ static struct ofono_sms_driver driver = { .sca_query = at_csca_query, .sca_set = at_csca_set, .submit = at_cmgs, + .bearer_query = at_cgsms_query, + .bearer_set = at_cgsms_set, }; void at_sms_init()