summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2015-11-05 22:22:47 -0600
committerDenis Kenzior <denkenz@gmail.com>2015-11-05 22:22:47 -0600
commit5a16ea8c4eac42d493d4c37b87480f19154966d7 (patch)
tree131328449d01aeee22258cfa8c0a84c1d6470077 /drivers
parent5a8e313390f9dcb3373cba96c501e30d2b5e3963 (diff)
downloadofono-5a16ea8c4eac42d493d4c37b87480f19154966d7.tar.bz2
rilmodem: Implement ril_cmgs inline
Diffstat (limited to 'drivers')
-rw-r--r--drivers/rilmodem/sms.c44
1 files changed, 35 insertions, 9 deletions
diff --git a/drivers/rilmodem/sms.c b/drivers/rilmodem/sms.c
index 51096d63..2ed8135e 100644
--- a/drivers/rilmodem/sms.c
+++ b/drivers/rilmodem/sms.c
@@ -154,23 +154,49 @@ static void ril_cmgs(struct ofono_sms *sms, const unsigned char *pdu,
struct sms_data *sd = ofono_sms_get_data(sms);
struct cb_data *cbd = cb_data_new(cb, user_data, sd);
struct parcel rilp;
- struct req_sms_cmgs req;
+ int smsc_len;
+ char hexbuf[tpdu_len * 2 + 1];
DBG("pdu_len: %d, tpdu_len: %d mms: %d", pdu_len, tpdu_len, mms);
/* TODO: if (mms) { ... } */
- req.pdu = pdu;
- req.pdu_len = pdu_len;
- req.tpdu_len = tpdu_len;
+ parcel_init(&rilp);
+ parcel_w_int32(&rilp, 2); /* Number of strings */
+
+ /*
+ * SMSC address:
+ *
+ * smsc_len == 1, then zero-length SMSC was spec'd
+ * RILD expects a NULL string in this case instead
+ * of a zero-length string.
+ */
+ smsc_len = pdu_len - tpdu_len;
+ /* TODO: encode SMSC & write to parcel */
+ if (smsc_len > 1)
+ ofono_error("SMSC address specified (smsc_len %d); "
+ "NOT-IMPLEMENTED", smsc_len);
- g_ril_request_sms_cmgs(sd->ril, &req, &rilp);
+ parcel_w_string(&rilp, NULL); /* SMSC address; NULL == default */
+
+ /*
+ * TPDU:
+ *
+ * 'pdu' is a raw hexadecimal string
+ * encode_hex() turns it into an ASCII/hex UTF8 buffer
+ * parcel_w_string() encodes utf8 -> utf16
+ */
+ encode_hex_own_buf(pdu + smsc_len, tpdu_len, 0, hexbuf);
+ parcel_w_string(&rilp, hexbuf);
+
+ g_ril_append_print_buf(sd->ril, "(%s)", hexbuf);
if (g_ril_send(sd->ril, RIL_REQUEST_SEND_SMS, &rilp,
- ril_submit_sms_cb, cbd, g_free) == 0) {
- g_free(cbd);
- CALLBACK_WITH_FAILURE(cb, -1, user_data);
- }
+ ril_submit_sms_cb, cbd, g_free) > 0)
+ return;
+
+ g_free(cbd);
+ CALLBACK_WITH_FAILURE(cb, -1, user_data);
}
static void ril_ack_delivery_cb(struct ril_msg *message, gpointer user_data)