diff options
-rw-r--r-- | src/mm-base-call.h | 2 | ||||
-rw-r--r-- | src/mm-modem-helpers.c | 34 | ||||
-rw-r--r-- | src/mm-modem-helpers.h | 4 | ||||
-rw-r--r-- | src/tests/test-modem-helpers.c | 45 |
4 files changed, 83 insertions, 2 deletions
diff --git a/src/mm-base-call.h b/src/mm-base-call.h index 777b6452..2e45ca5f 100644 --- a/src/mm-base-call.h +++ b/src/mm-base-call.h @@ -41,8 +41,6 @@ typedef struct _MMBaseCallPrivate MMBaseCallPrivate; #define MM_CALL_NUMBER "number" #define MM_CALL_DTMF_TONE_DURATION "dtmf-tone-duration" -#define MM_CALL_DTMF_PAUSE_CHAR ',' - #define MM_BASE_CALL_PATH "call-path" #define MM_BASE_CALL_CONNECTION "call-connection" #define MM_BASE_CALL_IFACE_MODEM_VOICE "call-iface-modem-voice" diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 0e258e61..5cbf0836 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -5887,3 +5887,37 @@ mm_dtmf_duration_normalize (guint duration_ms) return CLAMP (duration_ms, 100, 1000); } + +GPtrArray * +mm_dtmf_split (const gchar *dtmf) +{ + GPtrArray *array; + const gchar *p = dtmf; + GString *cur = NULL; + + array = g_ptr_array_new (); + + while (*p) { + if (*p == MM_CALL_DTMF_PAUSE_CHAR) { + if (cur) { + g_ptr_array_add (array, g_string_free (cur, FALSE)); + cur = NULL; + } + g_ptr_array_add (array, g_strdup (",")); + } else { + if (!cur) + cur = g_string_new (NULL); + g_string_append_c (cur, *p); + } + p++; + } + if (cur) + g_ptr_array_add (array, g_string_free (cur, FALSE)); + + if (array->len == 0) { + g_ptr_array_free (array, TRUE); + return NULL; + } + + return array; +} diff --git a/src/mm-modem-helpers.h b/src/mm-modem-helpers.h index 74626c90..1e3dbb12 100644 --- a/src/mm-modem-helpers.h +++ b/src/mm-modem-helpers.h @@ -648,4 +648,8 @@ MMModemLock mm_parse_cpin_response (const gchar *response, /* Helper to clamp duration and round to next 100ms */ guint mm_dtmf_duration_normalize (guint duration_ms); +#define MM_CALL_DTMF_PAUSE_CHAR ',' + +GPtrArray *mm_dtmf_split (const gchar *dtmf); + #endif /* MM_MODEM_HELPERS_H */ diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c index 3421921b..51aedef2 100644 --- a/src/tests/test-modem-helpers.c +++ b/src/tests/test-modem-helpers.c @@ -5120,6 +5120,44 @@ test_cpin_response (void) /*****************************************************************************/ +typedef struct { + const char *desc; + const char *dtmf; + const char *expected[5]; +} DtmfTestData; + +static const DtmfTestData test_dtmf_data[] = { + { "/MM/ModemHelpers/DTMF/empty", "", { NULL } }, + { "/MM/ModemHelpers/DTMF/one", "1", { "1", NULL } }, + { "/MM/ModemHelpers/DTMF/no-pause", "1234", { "1234", NULL } }, + { "/MM/ModemHelpers/DTMF/mid-pause", "123,,456", { "123", ",", ",", "456", NULL } }, + { "/MM/ModemHelpers/DTMF/end-pause", "123,,", { "123", ",", ",", NULL } }, +}; + +static void +test_dtmf_split (gpointer user_data) +{ + DtmfTestData *td = user_data; + GPtrArray *split; + guint expected_len; + guint i; + + split = mm_dtmf_split (td->dtmf); + + expected_len = g_strv_length ((gchar **) td->expected); + if (expected_len == 0) + g_assert_true (split == NULL); + else { + g_assert_true (split != NULL); + g_assert_cmpint (split->len, ==, expected_len); + } + + for (i = 0; i < expected_len; i++) + g_assert_cmpstr (td->expected[i], ==, g_ptr_array_index (split, i)); +} + +/*****************************************************************************/ + #define TESTCASE(t, d) g_test_create_case (#t, 0, d, NULL, (GTestFixtureFunc) t, NULL) int main (int argc, char **argv) @@ -5128,6 +5166,7 @@ int main (int argc, char **argv) RegTestData *reg_data; gint result; DevidItem *item = &devids[0]; + guint i; g_test_init (&argc, &argv, NULL); @@ -5384,6 +5423,12 @@ int main (int argc, char **argv) g_test_suite_add (suite, TESTCASE (test_cpin_response, NULL)); + for (i = 0; i < G_N_ELEMENTS (test_dtmf_data); i++) { + g_test_add_data_func (test_dtmf_data[i].desc, + &test_dtmf_data[i], + (GTestDataFunc) test_dtmf_split); + } + result = g_test_run (); reg_test_data_free (reg_data); |