gsm: add SMS PDU creation function

Only for basic SMS-SUBMIT PDUs at the moment, and doesn't
support large SMSs yet.
This commit is contained in:
Dan Williams
2012-01-17 13:13:09 -06:00
parent ad29e8dd88
commit 80a41ed11b
5 changed files with 671 additions and 3 deletions

View File

@@ -420,7 +420,170 @@ test_pduX (void *f, gpointer d)
}
#endif
static void
test_encode_sms_addr_encode_smsc_intl (void *f, gpointer d)
{
static const char *addr = "+19037029920";
static const guint8 expected[] = { 0x07, 0x91, 0x91, 0x30, 0x07, 0x92, 0x29, 0xF0 };
guint enclen;
guint8 buf[20];
enclen = sms_encode_address (addr, buf, sizeof (buf), TRUE);
g_assert_cmpint (enclen, ==, sizeof (expected));
g_assert_cmpint (memcmp (buf, expected, sizeof (expected)), ==, 0);
}
static void
test_encode_sms_addr_encode_smsc_unknown (void *f, gpointer d)
{
static const char *addr = "9037029920";
static const guint8 expected[] = { 0x06, 0x81, 0x09, 0x73, 0x20, 0x99, 0x02 };
guint enclen;
guint8 buf[20];
enclen = sms_encode_address (addr, buf, sizeof (buf), TRUE);
g_assert_cmpint (enclen, ==, sizeof (expected));
g_assert_cmpint (memcmp (buf, expected, sizeof (expected)), ==, 0);
}
static void
test_encode_sms_addr_encode_intl (void *f, gpointer d)
{
static const char *addr = "+19037029920";
static const guint8 expected[] = { 0x0B, 0x91, 0x91, 0x30, 0x07, 0x92, 0x29, 0xF0 };
guint enclen;
guint8 buf[20];
enclen = sms_encode_address (addr, buf, sizeof (buf), FALSE);
g_assert_cmpint (enclen, ==, sizeof (expected));
g_assert_cmpint (memcmp (buf, expected, sizeof (expected)), ==, 0);
}
static void
test_encode_sms_addr_encode_unknown (void *f, gpointer d)
{
static const char *addr = "9037029920";
static const guint8 expected[] = { 0x0A, 0x81, 0x09, 0x73, 0x20, 0x99, 0x02 };
guint enclen;
guint8 buf[20];
enclen = sms_encode_address (addr, buf, sizeof (buf), FALSE);
g_assert_cmpint (enclen, ==, sizeof (expected));
g_assert_cmpint (memcmp (buf, expected, sizeof (expected)), ==, 0);
}
static void
test_create_pdu_ucs2_with_smsc (void *f, gpointer d)
{
static const char *smsc = "+19037029920";
static const char *number = "+15555551234";
static const char *text = "Да здравствует король, детка!";
static const guint8 expected[] = {
0x07, 0x91, 0x91, 0x30, 0x07, 0x92, 0x29, 0xF0, 0x11, 0x00, 0x0B, 0x91,
0x51, 0x55, 0x55, 0x15, 0x32, 0xF4, 0x00, 0x08, 0x00, 0x3A, 0x04, 0x14,
0x04, 0x30, 0x00, 0x20, 0x04, 0x37, 0x04, 0x34, 0x04, 0x40, 0x04, 0x30,
0x04, 0x32, 0x04, 0x41, 0x04, 0x42, 0x04, 0x32, 0x04, 0x43, 0x04, 0x35,
0x04, 0x42, 0x00, 0x20, 0x04, 0x3A, 0x04, 0x3E, 0x04, 0x40, 0x04, 0x3E,
0x04, 0x3B, 0x04, 0x4C, 0x00, 0x2C, 0x00, 0x20, 0x04, 0x34, 0x04, 0x35,
0x04, 0x42, 0x04, 0x3A, 0x04, 0x30, 0x00, 0x21
};
guint8 *pdu;
guint len = 0;
GError *error = NULL;
pdu = sms_create_submit_pdu (number, text, smsc, 1, 0, &len, &error);
g_assert_no_error (error);
g_assert (pdu);
g_assert_cmpint (len, ==, sizeof (expected));
g_assert_cmpint (memcmp (pdu, expected, len), ==, 0);
}
static void
test_create_pdu_ucs2_no_smsc (void *f, gpointer d)
{
static const char *number = "+15555551234";
static const char *text = "Да здравствует король, детка!";
static const guint8 expected[] = {
0x00, 0x11, 0x00, 0x0B, 0x91, 0x51, 0x55, 0x55, 0x15, 0x32, 0xF4, 0x00,
0x08, 0x00, 0x3A, 0x04, 0x14, 0x04, 0x30, 0x00, 0x20, 0x04, 0x37, 0x04,
0x34, 0x04, 0x40, 0x04, 0x30, 0x04, 0x32, 0x04, 0x41, 0x04, 0x42, 0x04,
0x32, 0x04, 0x43, 0x04, 0x35, 0x04, 0x42, 0x00, 0x20, 0x04, 0x3A, 0x04,
0x3E, 0x04, 0x40, 0x04, 0x3E, 0x04, 0x3B, 0x04, 0x4C, 0x00, 0x2C, 0x00,
0x20, 0x04, 0x34, 0x04, 0x35, 0x04, 0x42, 0x04, 0x3A, 0x04, 0x30, 0x00,
0x21
};
guint8 *pdu;
guint len = 0;
GError *error = NULL;
pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &error);
g_assert_no_error (error);
g_assert (pdu);
g_assert_cmpint (len, ==, sizeof (expected));
g_assert_cmpint (memcmp (pdu, expected, len), ==, 0);
}
static void
test_create_pdu_gsm_with_smsc (void *f, gpointer d)
{
static const char *smsc = "+19037029920";
static const char *number = "+15555551234";
static const char *text = "Hi there...Tue 17th Jan 2012 05:30.18 pm (GMT+1) ΔΔΔΔΔ";
static const guint8 expected[] = {
0x07, 0x91, 0x91, 0x30, 0x07, 0x92, 0x29, 0xF0, 0x11, 0x00, 0x0B, 0x91,
0x51, 0x55, 0x55, 0x15, 0x32, 0xF4, 0x00, 0x00, 0x00, 0x36, 0xC8, 0x34,
0x88, 0x8E, 0x2E, 0xCB, 0xCB, 0x2E, 0x97, 0x8B, 0x5A, 0x2F, 0x83, 0x62,
0x37, 0x3A, 0x1A, 0xA4, 0x0C, 0xBB, 0x41, 0x32, 0x58, 0x4C, 0x06, 0x82,
0xD5, 0x74, 0x33, 0x98, 0x2B, 0x86, 0x03, 0xC1, 0xDB, 0x20, 0xD4, 0xB1,
0x49, 0x5D, 0xC5, 0x52, 0x20, 0x08, 0x04, 0x02, 0x81, 0x00
};
guint8 *pdu;
guint len = 0;
GError *error = NULL;
pdu = sms_create_submit_pdu (number, text, smsc, 1, 0, &len, &error);
g_assert_no_error (error);
g_assert (pdu);
g_assert_cmpint (len, ==, sizeof (expected));
g_assert_cmpint (memcmp (pdu, expected, len), ==, 0);
}
static void
test_create_pdu_gsm_no_smsc (void *f, gpointer d)
{
static const char *number = "+15555551234";
static const char *text = "Hi there...Tue 17th Jan 2012 05:30.18 pm (GMT+1) ΔΔΔΔΔ";
static const guint8 expected[] = {
0x00, 0x11, 0x00, 0x0B, 0x91, 0x51, 0x55, 0x55, 0x15, 0x32, 0xF4, 0x00,
0x00, 0x00, 0x36, 0xC8, 0x34, 0x88, 0x8E, 0x2E, 0xCB, 0xCB, 0x2E, 0x97,
0x8B, 0x5A, 0x2F, 0x83, 0x62, 0x37, 0x3A, 0x1A, 0xA4, 0x0C, 0xBB, 0x41,
0x32, 0x58, 0x4C, 0x06, 0x82, 0xD5, 0x74, 0x33, 0x98, 0x2B, 0x86, 0x03,
0xC1, 0xDB, 0x20, 0xD4, 0xB1, 0x49, 0x5D, 0xC5, 0x52, 0x20, 0x08, 0x04,
0x02, 0x81, 0x00
};
guint8 *pdu;
guint len = 0;
GError *error = NULL;
pdu = sms_create_submit_pdu (number, text, NULL, 1, 0, &len, &error);
g_assert_no_error (error);
g_assert (pdu);
g_assert_cmpint (len, ==, sizeof (expected));
g_assert_cmpint (memcmp (pdu, expected, len), ==, 0);
}
#if 0
{
int i;
g_print ("\n ");
for (i = 0; i < len; i++) {
g_print (" 0x%02X", pdu[i]);
if (((i + 1) % 12) == 0)
g_print ("\n ");
}
g_print ("\n");
}
#endif
#if GLIB_CHECK_VERSION(2,25,12)
typedef GTestFixtureFunc TCFunc;
@@ -453,6 +616,16 @@ int main (int argc, char **argv)
g_test_suite_add (suite, TESTCASE (test_pdu_insufficient_data, NULL));
g_test_suite_add (suite, TESTCASE (test_pdu_udhi, NULL));
g_test_suite_add (suite, TESTCASE (test_encode_sms_addr_encode_smsc_intl, NULL));
g_test_suite_add (suite, TESTCASE (test_encode_sms_addr_encode_smsc_unknown, NULL));
g_test_suite_add (suite, TESTCASE (test_encode_sms_addr_encode_intl, NULL));
g_test_suite_add (suite, TESTCASE (test_encode_sms_addr_encode_unknown, NULL));
g_test_suite_add (suite, TESTCASE (test_create_pdu_ucs2_with_smsc, NULL));
g_test_suite_add (suite, TESTCASE (test_create_pdu_ucs2_no_smsc, NULL));
g_test_suite_add (suite, TESTCASE (test_create_pdu_gsm_with_smsc, NULL));
g_test_suite_add (suite, TESTCASE (test_create_pdu_gsm_no_smsc, NULL));
result = g_test_run ();
return result;