diff options
-rw-r--r-- | src/mm-generic-gsm.c | 8 | ||||
-rw-r--r-- | src/mm-sms-utils.c | 6 | ||||
-rw-r--r-- | src/mm-sms-utils.h | 1 | ||||
-rw-r--r-- | src/tests/test-sms.c | 25 |
4 files changed, 25 insertions, 15 deletions
diff --git a/src/mm-generic-gsm.c b/src/mm-generic-gsm.c index 3afe4950..3a95a6b0 100644 --- a/src/mm-generic-gsm.c +++ b/src/mm-generic-gsm.c @@ -4770,16 +4770,14 @@ sms_send (MMModemGsmSms *modem, if (priv->sms_pdu_mode) { guint8 *pdu; - guint pdulen = 0; - guint smsclen = 0; + guint pdulen = 0, msgstart = 0; char *hex; - pdu = sms_create_submit_pdu (number, text, smsc, validity, class, &pdulen, &info->error); + pdu = sms_create_submit_pdu (number, text, smsc, validity, class, &pdulen, &msgstart, &info->error); if (!pdu) { mm_callback_info_schedule (info); return; } - smsclen = pdu[0]; hex = utils_bin2hexstr (pdu, pdulen); g_free (pdu); @@ -4793,7 +4791,7 @@ sms_send (MMModemGsmSms *modem, } /* CMGS length is the size of the PDU without SMSC information */ - command = g_strdup_printf ("+CMGS=%d\r%s\x1a", pdulen - smsclen, hex); + command = g_strdup_printf ("+CMGS=%d\r%s\x1a", pdulen - msgstart, hex); g_free (hex); } else command = g_strdup_printf ("+CMGS=\"%s\"\r%s\x1a", number, text); diff --git a/src/mm-sms-utils.c b/src/mm-sms-utils.c index fc493dc4..025a19dc 100644 --- a/src/mm-sms-utils.c +++ b/src/mm-sms-utils.c @@ -600,6 +600,8 @@ validity_to_relative (guint validity) * suitable default * @class: unused * @out_pdulen: on success, the size of the returned PDU in bytes + * @out_msgstart: on success, the byte index in the returned PDU where the + * message starts (ie, skipping the SMSC length byte and address, if present) * @error: on error, filled with the error that occurred * * Constructs a single-part SMS message with the given details, preferring to @@ -615,6 +617,7 @@ sms_create_submit_pdu (const char *number, guint validity, guint class, guint *out_pdulen, + guint *out_msgstart, GError **error) { guint8 *pdu; @@ -668,6 +671,9 @@ sms_create_submit_pdu (const char *number, pdu[offset++] = 0x00; } + if (out_msgstart) + *out_msgstart = offset; + if (validity > 0) pdu[offset] = 1 << 4; /* TP-VP present; format RELATIVE */ else diff --git a/src/mm-sms-utils.h b/src/mm-sms-utils.h index 8455df9a..5c1c026a 100644 --- a/src/mm-sms-utils.h +++ b/src/mm-sms-utils.h @@ -28,6 +28,7 @@ guint8 *sms_create_submit_pdu (const char *number, guint validity, guint class, guint *out_pdulen, + guint *out_msgstart, GError **error); /* For testcases only */ diff --git a/src/tests/test-sms.c b/src/tests/test-sms.c index a6dda609..11118c06 100644 --- a/src/tests/test-sms.c +++ b/src/tests/test-sms.c @@ -488,14 +488,15 @@ test_create_pdu_ucs2_with_smsc (void *f, gpointer d) 0x04, 0x42, 0x04, 0x3A, 0x04, 0x30, 0x00, 0x21 }; guint8 *pdu; - guint len = 0; + guint len = 0, msgstart = 0; GError *error = NULL; - pdu = sms_create_submit_pdu (number, text, smsc, 1, 0, &len, &error); + pdu = sms_create_submit_pdu (number, text, smsc, 1, 0, &len, &msgstart, &error); g_assert_no_error (error); g_assert (pdu); g_assert_cmpint (len, ==, sizeof (expected)); g_assert_cmpint (memcmp (pdu, expected, len), ==, 0); + g_assert_cmpint (msgstart, ==, 8); } static void @@ -513,14 +514,15 @@ test_create_pdu_ucs2_no_smsc (void *f, gpointer d) 0x21 }; guint8 *pdu; - guint len = 0; + guint len = 0, msgstart = 0; GError *error = NULL; - pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &error); + pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &msgstart, &error); g_assert_no_error (error); g_assert (pdu); g_assert_cmpint (len, ==, sizeof (expected)); g_assert_cmpint (memcmp (pdu, expected, len), ==, 0); + g_assert_cmpint (msgstart, ==, 1); } static void @@ -538,14 +540,15 @@ test_create_pdu_gsm_with_smsc (void *f, gpointer d) 0x49, 0x5D, 0xC5, 0x52, 0x20, 0x08, 0x04, 0x02, 0x81, 0x00 }; guint8 *pdu; - guint len = 0; + guint len = 0, msgstart = 0; GError *error = NULL; - pdu = sms_create_submit_pdu (number, text, smsc, 1, 0, &len, &error); + pdu = sms_create_submit_pdu (number, text, smsc, 1, 0, &len, &msgstart, &error); g_assert_no_error (error); g_assert (pdu); g_assert_cmpint (len, ==, sizeof (expected)); g_assert_cmpint (memcmp (pdu, expected, len), ==, 0); + g_assert_cmpint (msgstart, ==, 8); } static void @@ -562,14 +565,15 @@ test_create_pdu_gsm_no_smsc (void *f, gpointer d) 0x02, 0x81, 0x00 }; guint8 *pdu; - guint len = 0; + guint len = 0, msgstart = 0; GError *error = NULL; - pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &error); + pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &msgstart, &error); g_assert_no_error (error); g_assert (pdu); g_assert_cmpint (len, ==, sizeof (expected)); g_assert_cmpint (memcmp (pdu, expected, len), ==, 0); + g_assert_cmpint (msgstart, ==, 1); } static void @@ -584,7 +588,7 @@ test_create_pdu_gsm_3 (void *f, gpointer d) 0x10 }; guint8 *pdu; - guint len = 0; + guint len = 0, msgstart = 0; GError *error = NULL; /* Tests that a 25-character message (where the last septet is packed into @@ -593,11 +597,12 @@ test_create_pdu_gsm_3 (void *f, gpointer d) * leave off the last octet. */ - pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &error); + pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &msgstart, &error); g_assert_no_error (error); g_assert (pdu); g_assert_cmpint (len, ==, sizeof (expected)); g_assert_cmpint (memcmp (pdu, expected, len), ==, 0); + g_assert_cmpint (msgstart, ==, 1); } #if 0 |