Commit Graph
41 Commits
Author SHA1 Message Date
Aleksander Morgado 81162df15d charsets: refactor coding style
Mostly to use GLib types like gchar or gint, and also to use
G_N_ELEMENTS() instead of custom end of array terminating items.
2020-08-20 18:13:54 +02:00
Aleksander Morgado eb5443b197 charsets: add UTF-16BE as a possible modem charset
Just as an implementation detail to be taken as an extension of
UCS2BE, never really to be used as a real modem charset.
2020-08-20 18:13:18 +02:00
Aleksander Morgado a399c7e42a charsets: take_and_convert() methods should support GSM encoding
The iconv() operation would fail because we wouldn't give any proper
charset string to convert to/from. Use our custom GSM encoding support
instead.
2020-05-26 15:05:52 +02:00
Aleksander Morgado c4e6a0c4f6 charsets: don't warn in unlikely case of needing to convert to HEX from UTF-8
This would really be an implementation detail, not a real use
case. Just don't warn in this case, as in the conversion in the
opposite direction.
2020-05-26 15:05:52 +02:00
Aleksander Morgado 0926031119 Revert "charsets: don't warn in unlikely case of needing to convert to HEX from UTF-8"
This reverts commit 6a7dd87f30.

Reverting because the merge request was set to squash all together....
2020-05-26 15:04:20 +02:00
Giacinto Cifelli 6a7dd87f30 charsets: don't warn in unlikely case of needing to convert to HEX from UTF-8
This would really be an implementation detail, not a real use
case. Just don't warn in this case, as in the conversion in the
opposite direction.
2020-05-26 12:45:40 +00:00
Aleksander Morgado 2376859f36 charsets: report GError in byte_array_append() failures 2020-04-08 16:35:09 +02:00
Aleksander Morgado 6dfb9d7a7e charsets: fix warnings with -Wswitch-default
mm-charsets.c: In function ‘mm_charset_take_and_convert_to_utf8’:
  mm-charsets.c:730:5: error: switch missing default case [-Werror=switch-default]
    730 |     switch (charset) {
        |     ^~~~~~
  mm-charsets.c: In function ‘mm_utf8_take_and_convert_to_charset’:
  mm-charsets.c:852:5: error: switch missing default case [-Werror=switch-default]
    852 |     switch (charset) {
        |     ^~~~~~
2020-01-31 14:52:49 +01:00
Aleksander Morgado 7619148aa5 charsets: fix warnings with -Wsign-compare
mm-charsets.c: In function ‘mm_charset_gsm_unpacked_to_utf8’:
  mm-charsets.c:423:19: error: comparison of integer expressions of different signedness: ‘int’ and ‘guint32’ {aka ‘unsigned int’} [-Werror=sign-compare]
    423 |     for (i = 0; i < len; i++) {
        |                   ^
  mm-charsets.c: In function ‘pccp437_is_subset’:
  mm-charsets.c:544:19: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare]
    544 |     for (i = 0; i < G_N_ELEMENTS (t); i++) {
        |                   ^
  mm-charsets.c: In function ‘pcdn_is_subset’:
  mm-charsets.c:575:19: error: comparison of integer expressions of different signedness: ‘int’ and ‘long unsigned int’ [-Werror=sign-compare]
    575 |     for (i = 0; i < sizeof (t) / sizeof (t[0]); i++) {
        |                   ^
  mm-charsets.c: In function ‘mm_charset_gsm_unpack’:
  mm-charsets.c:657:19: error: comparison of integer expressions of different signedness: ‘int’ and ‘guint32’ {aka ‘unsigned int’} [-Werror=sign-compare]
    657 |     for (i = 0; i < num_septets; i++) {
        |                   ^
  mm-charsets.c: In function ‘mm_charset_gsm_pack’:
  mm-charsets.c:701:42: error: comparison of integer expressions of different signedness: ‘int’ and ‘guint32’ {aka ‘unsigned int’} [-Werror=sign-compare]
    701 |     for (i = 0, lshift = start_offset; i < src_len; i++) {
        |                                          ^
2020-01-31 14:52:49 +01:00
Aleksander Morgado 2406a5519f charsets: fix handling of 0x00 bytes at the end of GSM encoded strings
When a GSM-7 encoded string is packed, the process of packing the
septets into bytes may end up with one last byte holding the last bit
of the last septet. When this situation happens, the last byte will
end up with the 7 remaining bits set to 0.

When this packed string is unpacked, the logic to unpack will unpack
those last 7 bits as an additional septet, with the value 0x00.

The 0x00 value encoded in GSM-7 is the '@' character, EXCEPT when this
character is found at the end of the string, in which case the value
should be considered as NUL and trigger the end of string already.

So, fix the conversion logic between GSM-7 and UTF-8, so that whenever
we find the 0x00 character at the end of the string, we ignore it
instead of adding a bogus '@' trailing character.

This commit fixes the "/MM/charsets/gsm7/default-chars" unit test
after having it updated to perform the full conversion cycle:
   UTF-8 -> packed GSM7 -> UTF-8
2020-01-24 09:57:54 +01:00
Ben Chan c363c59840 charsets: use G_N_ELEMENTS (t)' instead of sizeof (t) / sizeof (t[0])' 2019-08-02 19:58:01 -07:00
Aleksander Morgado eda46d05cf charsets: new helper to convert binary input data to UTF-8
Most of all the other APIs we have are expecting binary data (e.g.
UCS-2 encoded strings) in ASCII hex format, because they were going
to be used in text AT commands. For binary protocols allowing binary
data, we need use a more generic API that provides an explicit data
size.
2018-08-21 16:50:15 +00:00
Aleksander Morgado 5a01e54066 charsets: simplify check to see if conversion to charset possible
Instead of having a method that returns the expected length after the
conversion and the amount of input UTF-8 characters that couldn't be
converted to the given charset, simplify the logic and just define a
method that returns a boolean specifying whether the conversion is
possible or not.

Also, include unit tests.
2017-08-16 16:27:42 +02:00
Aleksander Morgado 1f2bb64028 charsets: ensure all methods are prefixed with 'mm_' 2017-08-16 16:08:15 +02:00
Ben Chan 7ae32d6c61 charset: fix mm_charset_get_encoded_len
The while loop in mm_charset_get_encoded_len() iterates through each
valid UTF-8 encoded character in the given NULL-terminated UTF-8 string.
It uses g_utf8_find_next_char() to find the position of the next
character. In case, g_utf8_find_next_char() returns NULL, it tries to
find the end (i.e. the NULL character) of the string.

This patch fixes the following issues in the while loop:

1. The loop uses both 'next' and 'end' to track the position of the next
   character in the string.

   When g_utf8_find_next_char() returns a non-NULL value, 'next' is
   essentially the same as 'end'.

   When g_utf8_find_next_char() returns NULL, 'next' remains NULL while
   'end' is adjusted to track the end of the string (but is done
   incorrectly as described in #2). After the 'p = next' assignment, the
   'while (*p)' check results in a NULL dereference. 'p' should thus be
   set to 'end' instead of 'next'.

   'next' is thus redundant and can be removed.

2. When g_utf8_find_next_char() returns NULL and 'end' is adjusted to
   track the end of string, the 'while (*end++)' loop stops when finding
   the NULL character, but 'end' is advanced past the NULL character.
   After the 'p = end' assignment, the 'while (*p)' check results in a
   dereference of out-of-bounds pointer.

   'while (*++end)' should be used instead given that 'p' doesn't point
   to a NULL character when 'end = p' happens. 'end' will be updated to
   point to the NULL character. After the 'p = end' assignment (fixed in
   #1), the 'while (*p)' check will properly stop the loop.
2017-08-15 09:37:24 +02:00
Aleksander Morgado 7fb366c41a core: use MM-specific logging methods always instead of the generic GLib ones 2016-08-15 13:14:47 +02:00
Ben Chan 37b0402ee5 core: minor coding style fixes 2014-05-20 09:32:29 +02:00
Aleksander Morgado c250fa3797 libmm-glib: remove the `libmm-common.h' header
Both the ModemManager daemon and the mmcli will now include `libmm-glib.h' only.

We also handle two new special `_LIBMM_INSIDE_MM' and `LIBMM_INSIDE_MMCLI'
symbols, which if included before the `libmm-glib.h' library allow us to:

 * Don't include the libmm-glib high level API in the ModemManager daemon, as
   the object names would clash with those in the core.

 * Define some of the methods of helper objects to be included only if compiling
   ModemManager daemon or the mmcli.
2012-10-04 10:17:12 +02:00
Aleksander Morgado a66f971a7c libmm-common: added common utils from core
Moved the utils to play with binary to hex strings into libmm-common.
2012-09-14 07:05:26 +02:00
Dan Williams 210af3241c core: fix a leak in "core: better handling of non-UCS2 conversions that should be UCS2 (bgo #683817)" 2012-09-12 23:03:59 -05:00
Dan Williams c524734d9f core: better handling of non-UCS2 conversions that should be UCS2 (bgo #683817)
Some modems return the +COPS operator name in hex-encoded current
character set (as set with +CSCS).  Others return the operator name
in ASCII when set to UCS2, while yet others return the  ASCII name
with trash at the end (*cough* Huawei *cough*).  Handle that better
by not crashing.
2012-09-12 23:03:58 -05:00
Aleksander Morgado 45e4f390eb charsets: plug memleak 2012-03-28 15:50:43 +02:00
Aleksander Morgado e992d5cbd1 charsets: fix compilation with -Werror=maybe-uninitialized 2012-03-16 14:28:15 +01:00
Aleksander Morgado 3028126bd2 charsets: new UTF-8 to given charset converter
UCS-2 strings are always hex-converted.
2012-03-16 14:28:13 +01:00
Aleksander Morgado b42ce2d8e6 charsets: plug memleak
The string passed to utils_bin2hexstr() needs to be freed afterwards.
2012-02-18 11:15:31 +01:00
Aleksander Morgado 1db0004033 charsets: don't crash when passing a NULL string to the UTF-8 converter 2012-02-08 12:06:59 -06:00
Aleksander Morgado 00ce1d6874 charsets: new method to do our best to convert from current charset to UTF-8
This method will try to convert the input string to UTF-8. The input string is
supposed to be in the given charset; or otherwise is supposed to be the hex
representation of the string in the given charset.
2012-02-07 19:24:36 +01:00
Aleksander Morgado 9f6f80a63a charsets: don't warn if we couldn't convert from hex to utf8 2012-02-07 17:52:53 +01:00
Dan Williams 27b981237e core: fix some bugs in GSM7 packing code
The existing gsm_pack() had a bug where if the last
septet should be in an octet by itself, that last
octet wouldn't be added.  Plus, kinda pointless to
use a GByteArray here when we already know what the
length will be through simple arithmetic.

We can also simplify the function too.

Furthermore, there weren't any testcases for starting
packing at an offset other than zero, so add one.
2012-01-18 12:28:50 -06:00
Dan Williams 80a41ed11b gsm: add SMS PDU creation function
Only for basic SMS-SUBMIT PDUs at the moment, and doesn't
support large SMSs yet.
2012-01-17 13:13:09 -06:00
Aleksander Morgado 668726dbd7 charsets: new utf8_to_hex() method 2011-06-06 17:20:16 +02:00
Nathan Williams 487972c1ac gsm: implement basic SMS reception and PDU parsing 2011-04-14 14:07:31 -05:00
Nathan Williams d05c87e4c8 charset: change GSM unpack to take number of characters rather than octets
Change interface to take the number of GSM characters
rather than the number of octets, so that it is possible to
distinguish the 7-character and 8-character cases.
2011-04-14 13:30:15 -05:00
Dan Williams ee4166f66f gsm: add GSM 03.38 pack/unpack functions and testcases 2010-09-04 00:06:36 -05:00
Dan Williams 9e94dd5b61 gsm: add GSM 03.38 encoding/decoding functions and testcases 2010-09-02 19:29:05 -05:00
Dan Williams d18fbaa1c7 gsm: ensure invalid operator names don't get used (rh #597088)
Apparently g_convert() can still return garbage that's not valid in
the character set you're converting to (???).  But even if we don't
need to convert the operator name, make sure it's valid UTF-8 before
we go shoving it through D-Bus.
2010-07-20 12:30:38 -07:00
Torgny Johansson 8873c0a7dc gsm: add GetOperatorID method
Returns the ID of the operator that issued the SIM card.

Cleanups and get_mnc_length_done() by me (dcbw).
2010-06-22 16:50:21 -07:00
Dan Williams 0d381e2f11 gsm: fix CSCS=? parsing and add testcases
Some devices (at least one Blackberry we know about) don't include
the () around the response.  Handle that and add testcases for it.
2010-04-09 13:50:45 -07:00
Dan Williams 6266f949ba gsm: fix operator name on Option devices with UCS2 charset 2010-03-16 16:45:32 -07:00
Dan Williams 3151e0e298 core: add command helper that handles character set conversion 2010-03-15 14:25:49 -07:00
Dan Williams 2a94d38edc core: move charset enum/string conversion to it's own file 2010-03-13 16:37:24 -08:00