From c70ffb74aa0e0b97590b391a7f3873ea35c55235 Mon Sep 17 00:00:00 2001
From: Sebastian Krzyszkowiak
Date: Sat, 17 Oct 2020 18:50:52 +0200
Subject: [PATCH] New upstream version 1.14.6
---
ChangeLog | 1527 ++++++++++++++++-
NEWS | 77 +
configure | 47 +-
configure.ac | 7 +-
data/org.freedesktop.ModemManager1.policy.in | 8 +-
docs/reference/api/Makefile.in | 6 +-
.../api/html/ModemManager-Version-checks.html | 2 +-
docs/reference/api/html/index.html | 2 +-
docs/reference/libmm-glib/Makefile.in | 6 +-
docs/reference/libmm-glib/html/index.html | 2 +-
include/ModemManager-version.h | 2 +-
libmm-glib/mm-location-gps-nmea.c | 5 +-
plugins/Makefile.am | 7 +-
plugins/Makefile.in | 106 +-
.../77-mm-cinterion-port-types.rules | 8 +-
.../cinterion/mm-broadband-bearer-cinterion.c | 50 +-
.../cinterion/mm-broadband-modem-cinterion.c | 99 +-
.../cinterion/mm-broadband-modem-cinterion.h | 3 +
.../cinterion/mm-modem-helpers-cinterion.c | 13 +-
plugins/cinterion/mm-shared-cinterion.c | 4 +-
.../tests/test-modem-helpers-cinterion.c | 18 -
.../quectel/77-mm-quectel-port-types.rules | 10 +
plugins/quectel/mm-plugin-quectel.c | 16 +
.../simtech/77-mm-simtech-port-types.rules | 14 +
plugins/simtech/mm-shared-simtech.c | 4 +-
plugins/telit/77-mm-telit-port-types.rules | 58 +-
plugins/telit/mm-broadband-modem-telit.c | 2 +-
plugins/telit/mm-common-telit.c | 82 +-
plugins/tests/test-udev-rules.c | 11 +
plugins/xmm/mm-shared-xmm.c | 4 +-
po/Makevars | 2 +-
po/ModemManager.pot | 7 +-
po/cs.gmo | Bin 3149 -> 3176 bytes
po/cs.po | 5 +-
po/da.gmo | Bin 2842 -> 2869 bytes
po/da.po | 5 +-
po/de.gmo | Bin 2449 -> 2476 bytes
po/de.po | 5 +-
po/fr.gmo | Bin 3061 -> 3088 bytes
po/fr.po | 5 +-
po/fur.gmo | Bin 3099 -> 3126 bytes
po/fur.po | 5 +-
po/hu.gmo | Bin 3174 -> 3201 bytes
po/hu.po | 5 +-
po/id.gmo | Bin 3069 -> 3096 bytes
po/id.po | 5 +-
po/it.gmo | Bin 3343 -> 3370 bytes
po/it.po | 5 +-
po/lt.gmo | Bin 3082 -> 3109 bytes
po/lt.po | 5 +-
po/pl.gmo | Bin 3427 -> 3454 bytes
po/pl.po | 5 +-
po/pt_BR.gmo | Bin 3323 -> 3350 bytes
po/pt_BR.po | 5 +-
po/ru.gmo | Bin 4524 -> 4551 bytes
po/ru.po | 5 +-
po/sk.gmo | Bin 3131 -> 3427 bytes
po/sk.po | 20 +-
po/sv.gmo | Bin 2935 -> 3230 bytes
po/sv.po | 25 +-
po/tr.gmo | Bin 3198 -> 3225 bytes
po/tr.po | 5 +-
po/uk.gmo | Bin 4583 -> 4610 bytes
po/uk.po | 5 +-
po/zh_CN.gmo | Bin 2644 -> 2671 bytes
po/zh_CN.po | 5 +-
src/kerneldevice/mm-kernel-device-generic.h | 4 +-
src/kerneldevice/mm-kernel-device-udev.h | 4 +-
src/kerneldevice/mm-kernel-device.h | 1 +
src/mm-base-bearer.h | 1 +
src/mm-base-call.h | 1 +
src/mm-base-manager.h | 1 +
src/mm-base-modem.h | 1 +
src/mm-base-sim.h | 1 +
src/mm-base-sms.h | 1 +
src/mm-bearer-list.h | 1 +
src/mm-bearer-mbim.c | 42 +-
src/mm-bearer-mbim.h | 1 +
src/mm-bearer-qmi.c | 65 +-
src/mm-bearer-qmi.h | 1 +
src/mm-broadband-bearer.h | 1 +
src/mm-broadband-modem-mbim.c | 22 +-
src/mm-broadband-modem-mbim.h | 1 +
src/mm-broadband-modem-qmi.c | 128 +-
src/mm-broadband-modem-qmi.h | 1 +
src/mm-broadband-modem.c | 4 +-
src/mm-broadband-modem.h | 3 +-
src/mm-call-list.h | 1 +
src/mm-charsets.c | 302 ++--
src/mm-charsets.h | 45 +-
src/mm-device.h | 1 +
src/mm-filter.h | 1 +
src/mm-iface-modem-3gpp-ussd.h | 1 +
src/mm-iface-modem-3gpp.c | 94 +-
src/mm-iface-modem-3gpp.h | 1 +
src/mm-iface-modem-cdma.h | 1 +
src/mm-iface-modem-firmware.h | 1 +
src/mm-iface-modem-location.c | 70 +-
src/mm-iface-modem-location.h | 1 +
src/mm-iface-modem-messaging.c | 28 +-
src/mm-iface-modem-messaging.h | 1 +
src/mm-iface-modem-oma.h | 1 +
src/mm-iface-modem-signal.c | 1 -
src/mm-iface-modem-signal.h | 1 +
src/mm-iface-modem-simple.h | 1 +
src/mm-iface-modem-time.h | 1 +
src/mm-iface-modem-voice.h | 1 +
src/mm-iface-modem.c | 56 +-
src/mm-iface-modem.h | 1 +
src/mm-modem-helpers.c | 5 +-
src/mm-plugin-manager.h | 4 +-
src/mm-plugin.c | 2 +-
src/mm-plugin.h | 1 +
src/mm-port-mbim.h | 1 +
src/mm-port-probe.h | 1 +
src/mm-port-qmi.c | 2 +-
src/mm-port-qmi.h | 1 +
src/mm-port-serial-at.h | 1 +
src/mm-port-serial-gps.h | 1 +
src/mm-port-serial-qcdm.h | 1 +
src/mm-port-serial.h | 1 +
src/mm-port.h | 1 +
src/mm-shared-qmi.c | 138 +-
src/mm-shared-qmi.h | 1 +
src/mm-sim-mbim.h | 1 +
src/mm-sim-qmi.h | 1 +
src/mm-sms-list.h | 1 +
src/mm-sms-mbim.h | 1 +
src/mm-sms-part-3gpp.c | 230 +--
src/mm-sms-part-cdma.c | 2 +-
src/mm-sms-part.h | 20 +-
src/mm-sms-qmi.h | 1 +
src/tests/test-charsets.c | 18 +-
src/tests/test-sms-part-3gpp.c | 78 +-
134 files changed, 2936 insertions(+), 803 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index bdf139fe..682d576f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,1472 @@
+commit 5ac0d258a3d20e1bde3b1d9858f3856559ee42fa
+Author: Aleksander Morgado
+Date: Wed Oct 14 14:47:15 2020 +0200
+
+ release: bump version to 1.14.6
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c04d343b902b693bbebebb9183c1d21743a8f51e
+Author: Aleksander Morgado
+Date: Wed Oct 14 14:31:44 2020 +0200
+
+ NEWS: update for 1.14.6
+
+ NEWS | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit 5ca8f8ce1208fcf8b3216b1acfc44406e2881477
+Author: Aleksander Morgado
+Date: Wed Oct 14 14:40:00 2020 +0200
+
+ xmm: fix missing GError initialization
+
+ (cherry picked from commit f013e94ff89680d1acd7dba12ff4a6a0fa7b58bf)
+
+ plugins/xmm/mm-shared-xmm.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 889d301854346f74f215101508be9b636e9ed797
+Author: Aleksander Morgado
+Date: Wed Oct 14 14:38:52 2020 +0200
+
+ simtech: fix missing GError initialization
+
+ (cherry picked from commit 3b6176cbe2bc64bbf19fa0378b1c65b646bb6d13)
+
+ plugins/simtech/mm-shared-simtech.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 60b603117f61539762688ffc48184da4ea9c72e6
+Author: Aleksander Morgado
+Date: Wed Oct 14 14:38:40 2020 +0200
+
+ cinterion: fix missing GError initialization
+
+ (cherry picked from commit 50c1550c9f808ddd080f7992bf2d7f4dfae6e0ec)
+
+ plugins/cinterion/mm-shared-cinterion.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 781cc706cad1fae080ad952b2a357e480fe04da8
+Author: Aleksander Morgado
+Date: Wed Oct 14 14:24:35 2020 +0200
+
+ broadband-modem-qmi: ensure GError is initialized to NULL
+
+ (ModemManager:21568): GLib-WARNING **: 22:11:27.828: GError set
+ over the top of a previous GError or uninitialized memory.
+ This indicates a bug in someone's code. You must ensure an error
+ is NULL before it's set.
+ The overwriting error message was: QMI protocol error (94):
+ 'NotSupported'
+ [21568]: [1582841487.829678] [modem0] couldn't load facility
+ locks: (NULL)
+ [21568]: [1582841487.830746] [modem0] loading UE mode of
+ operation for EPS...
+ [21568]: [1582841487.832138] [modem0/ttyUSB2/at] device
+ open count is 2 (open)
+ Segmentation fault
+
+ This issue is only applicable in the mm-1-14 branch.
+ Fixes cd686f10e049cf0494678f4d87e17e62e8f53e76.
+
+ src/mm-broadband-modem-qmi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 327f509f04224c105ab2227317270ce6b998d9ed
+Author: Aleksander Morgado
+Date: Wed Oct 14 12:51:08 2020 +0200
+
+ build: post-release version bump to 1.14.5
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit db38b333c0f0915e4e7c9a0344a8c4c95baba484
+Author: Aleksander Morgado
+Date: Wed Oct 14 12:29:08 2020 +0200
+
+ release: bump version to 1.14.4
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c67b1ef8acbbaf2ea805be283aee42a7c99717c7
+Author: Aleksander Morgado
+Date: Wed Oct 14 12:28:13 2020 +0200
+
+ NEWS: update for 1.14.4
+
+ NEWS | 35 +++++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+commit 38b4b8e507c3b2d414c75a1a2d48d607db592dc4
+Author: Aleksander Morgado
+Date: Sat Oct 10 15:08:29 2020 +0200
+
+ iface-modem-3gpp: print consolidated reg state info only when updating
+
+ (cherry picked from commit c6f38ecac3ed2ac783dbab706c5e155ba7409747)
+
+ src/mm-iface-modem-3gpp.c | 86
+ +++++++++++++++++++----------------------------
+ 1 file changed, 34 insertions(+), 52 deletions(-)
+
+commit b871d4f1dd7213a4d3a152c9c7574e0561d8ac3a
+Author: Aleksander Morgado
+Date: Sat Oct 10 14:38:24 2020 +0200
+
+ iface-modem-location: log old and new 3GPP location ids when updating
+
+ (cherry picked from commit df9cb4a8f6f0abaad8052e36c10874bfbea2ac76)
+
+ src/mm-iface-modem-location.c | 74
+ ++++++++++++++++++++++++++++---------------
+ 1 file changed, 49 insertions(+), 25 deletions(-)
+
+commit 846765afeba2a57da63d21272e180ff519ed9dfc
+Author: Aleksander Morgado
+Date: Fri Oct 9 12:50:49 2020 +0200
+
+ iface-modem-location: allow Cell ID only updates
+
+ The "Serving System" indications reported via QMI when the device is
+ moving may contain LAC/TAC+CID updates or just CID updates.
+
+ E.g. this one has "CID 3GPP" (0x1e):
+
+ Mon Aug 3 11:22:42 2020 daemon.debug [1567]: [/dev/cdc-wdm0]
+ received
+ generic indication (translated)... <<<<<< QMUX: <<<<<< length
+ = 33
+ <<<<<< flags = 0x80 <<<<<< service = "nas" <<<<<< client
+ = 3
+ <<<<<< QMI: <<<<<< flags = "indication" <<<<<<
+ transaction =
+ 4512 <<<<<< tlv_length = 21 <<<<<< message = "Serving
+ System"
+ (0x0024) <<<<<< TLV: <<<<<< type = "Serving System" (0x01)
+ <<<<<< length = 6 <<<<<< value = 01:01:01:02:01:08
+ <<<<<<
+ translated = [ registration_state = 'registered' cs_attach_state =
+ 'attached' ps_attach_state = 'attached' selected_network = '3gpp'
+ radio_interfaces = '{ [0] = 'lte '}' ] <<<<<< TLV: <<<<<< type
+ = "Data Service Capability" (0x11) <<<<<< length = 2 <<<<<<
+ value = 01:0B <<<<<< translated = { [0] = 'lte '} <<<<<< TLV:
+ <<<<<< type = "CID 3GPP" (0x1e) <<<<<< length =
+ 4 <<<<<<
+ value = 14:C2:A8:00 <<<<<< translated = 11059732
+
+ And this one has both "CID 3GPP" (0x1e) and "LTE TAC" (0x25):
+
+ Mon Aug 3 11:23:05 2020 daemon.debug [1567]: [/dev/cdc-wdm0]
+ received
+ generic indication (translated)... <<<<<< QMUX: <<<<<< length
+ = 38
+ <<<<<< flags = 0x80 <<<<<< service = "nas" <<<<<< client
+ = 3
+ <<<<<< QMI: <<<<<< flags = "indication" <<<<<<
+ transaction =
+ 4513 <<<<<< tlv_length = 26 <<<<<< message = "Serving
+ System"
+ (0x0024) <<<<<< TLV: <<<<<< type = "Serving System" (0x01)
+ <<<<<< length = 6 <<<<<< value = 01:01:01:02:01:08
+ <<<<<<
+ translated = [ registration_state = 'registered' cs_attach_state =
+ 'attached' ps_attach_state = 'attached' selected_network = '3gpp'
+ radio_interfaces = '{ [0] = 'lte '}' ] <<<<<< TLV: <<<<<< type
+ = "Data Service Capability" (0x11) <<<<<< length = 2 <<<<<<
+ value = 01:0B <<<<<< translated = { [0] = 'lte '} <<<<<< TLV:
+ <<<<<< type = "CID 3GPP" (0x1e) <<<<<< length =
+ 4 <<<<<<
+ value = 32:36:BC:00 <<<<<< translated = 12334642 <<<<<<
+ TLV:
+ <<<<<< type = "LTE TAC" (0x25) <<<<<< length = 2 <<<
+
+ We should therefore allow changes only in the CID, maintaining
+ whatever LAC/TAC value we had before.
+
+ (cherry picked from commit 135d484501dbf641b51b02033377871100323049)
+
+ src/mm-broadband-modem-qmi.c | 2 +-
+ src/mm-iface-modem-3gpp.c | 8 ++++----
+ src/mm-iface-modem-location.c | 26 ++++++++++++++++++++------
+ 3 files changed, 25 insertions(+), 11 deletions(-)
+
+commit 97a1a763792967c5581dcd9fe8fcb8558f3d4784
+Author: Daniele Palmas
+Date: Thu Oct 1 13:19:28 2020 +0200
+
+ port-qmi: increase qmi_device_open retries
+
+ Telit FN980 requires more time for becoming responsive to
+ qmi requests after device appearance.
+
+ (cherry picked from commit 075bcb74f30d18985e1ada82312fe58215f82040)
+
+ src/mm-port-qmi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6af45d01b962eae87eb9f51f569b92b15ee30295
+Author: Daniele Palmas
+Date: Tue Sep 29 22:43:55 2020 +0200
+
+ telit: add tag ID_MM_TELIT_PORT_DELAY for initial delay mechanism
+
+ (cherry picked from commit dcf188d2ef27a17afc0b3447c5c464286e7d250b)
+
+ plugins/telit/77-mm-telit-port-types.rules | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 5d4567fc3dadc5c81cf0e35bcb1b1b4ec8b9a73a
+Author: Daniele Palmas
+Date: Tue Sep 29 16:03:55 2020 +0200
+
+ telit: add initial delay for AT ports to become responsive
+
+ Add a polling mechanism for port responsiveness, since some modem
+ families require some time before being usable after the serial
+ ports have been exposed by the kernel.
+
+ (cherry picked from commit f6c4e3369a29c1f1bf14325be5a362a3ba29a71c)
+
+ plugins/telit/mm-common-telit.c | 82
+ ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 81 insertions(+), 1 deletion(-)
+
+commit d5af56365eb2be776cf8f5b5f70df773c197b78a
+Author: Daniele Palmas
+Date: Tue Sep 29 22:37:00 2020 +0200
+
+ telit: add FN980 and LM9x0 MBIM compositions rules
+
+ (cherry picked from commit 71cd727425d66bb5f7854cde2d4c033e73cbba97)
+
+ plugins/telit/77-mm-telit-port-types.rules | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit bf01ae5d66289e766932f3ab52af02bc72b6e1aa
+Author: Daniele Palmas
+Date: Tue Sep 29 10:16:22 2020 +0200
+
+ telit: fix LM9x0 udev rules
+
+ (cherry picked from commit ed8cf8d04c38495526a2958ee9454adca2d2a67d)
+
+ plugins/telit/77-mm-telit-port-types.rules | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit b891e4bcb290a1850fa4addb2722298cfe725d9b
+Author: Pavan Holla
+Date: Wed Sep 30 20:44:48 2020 +0000
+
+ broadband-modem-qmi: Report FIXED_DIALING lock correctly
+
+ Querying facility locks should return a FIXED_DIALING lock if
+ PIN2 lock
+ is enabled.
+
+ (cherry picked from commit bab0f44e74031896b9fd4c3a0390285d838aaa07)
+
+ src/mm-broadband-modem-qmi.c | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit cd686f10e049cf0494678f4d87e17e62e8f53e76
+Author: Pavan Holla
+Date: Wed Sep 30 20:29:36 2020 +0000
+
+ broadband-modem-qmi: Return error if get_pin_status fails
+
+ Prior to this CL, failure to get pin status while probing facility
+ locks
+ would not flag an error. Failure to read a pin lock is a critical
+ error
+ and we return it to higher layers.
+
+ (cherry picked from commit 74ab15d3239b62c53a0eecfac5a0488b6731bb71)
+
+ src/mm-broadband-modem-qmi.c | 51
+ +++++++++++++++++++++++---------------------
+ 1 file changed, 27 insertions(+), 24 deletions(-)
+
+commit 072ce5920f8266be7f92478dfbda3139389ccbfc
+Author: Dušan Kazik
+Date: Fri Sep 18 05:36:07 2020 +0000
+
+ po: slovak translation update
+
+ (cherry picked from commit 318b2b01e340936e3f3b8d443f89acc432b85190)
+
+ po/sk.po | 17 +++++++----------
+ 1 file changed, 7 insertions(+), 10 deletions(-)
+
+commit 1892d975c8d1bd92ff17dc112d09f2ec9853d243
+Author: Aleksander Morgado
+Date: Fri Sep 25 09:27:15 2020 +0200
+
+ samsung: fix typo in plugin name
+
+ (cherry picked from commit 8e8c794815fe1ef079101ce2eff5af43ee48b0f1)
+
+ plugins/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2e8d1d8c5dbd8bdf0b38585bb03b9a66b809080a
+Author: Aleksander Morgado
+Date: Sat Sep 19 18:38:04 2020 +0200
+
+ iface-modem-messaging: if sms list doesn't exist, free part
+
+ If the device goes away while we are listing SMS messages, it may
+ happen that we ask the messaging interface to take a part and the
+ sms list object has already been disposed. Make sure the part is freed
+ in that case, so that we avoid memory leaks.
+
+ ==19138== 6,914 (1,232 direct, 5,682 indirect) bytes in 11 blocks
+ are definitely lost in loss record 5,282 of 5,287
+ ==19138== at 0x483A77F: malloc (vg_replace_malloc.c:307)
+ ==19138== by 0x5023349: g_malloc (in
+ /usr/lib/libglib-2.0.so.0.6600.0)
+ ==19138== by 0x50446FF: g_slice_alloc (in
+ /usr/lib/libglib-2.0.so.0.6600.0)
+ ==19138== by 0x5044D6A: g_slice_alloc0 (in
+ /usr/lib/libglib-2.0.so.0.6600.0)
+ ==19138== by 0x2577FC: mm_sms_part_new (mm-sms-part.c:180)
+ ==19138== by 0x2504D0: mm_sms_part_3gpp_new_from_binary_pdu
+ (mm-sms-part-3gpp.c:385)
+ ==19138== by 0x21A15C: add_sms_part
+ (mm-broadband-modem-mbim.c:5169)
+ ==19138== by 0x21A31F: sms_read_query_ready
+ (mm-broadband-modem-mbim.c:5215)
+ ==19138== by 0x4E600F3: ??? (in /usr/lib/libgio-2.0.so.0.6600.0)
+ ==19138== by 0x4E64638: ??? (in /usr/lib/libgio-2.0.so.0.6600.0)
+ ==19138== by 0x4D3870D: transaction_task_complete_and_free
+ (mbim-device.c:236)
+ ==19138== by 0x4D396B9: process_message (mbim-device.c:616)
+
+ (cherry picked from commit 4e0f849bb98b535a9d48795ef85174727d9636da)
+
+ src/mm-iface-modem-messaging.c | 28 +++++++++++++---------------
+ 1 file changed, 13 insertions(+), 15 deletions(-)
+
+commit a4d34530a76dadebeba4aab343c5f143d43e1842
+Author: Aleksander Morgado
+Date: Sat Sep 19 20:26:43 2020 +0200
+
+ core: add autoptr cleanup methods to all internal types
+
+ (cherry picked from commit 00949c4ad34326722f6044a39aff8e1a33da6f18)
+
+ src/kerneldevice/mm-kernel-device-generic.h | 4 +++-
+ src/kerneldevice/mm-kernel-device-udev.h | 4 +++-
+ src/kerneldevice/mm-kernel-device.h | 1 +
+ src/mm-base-bearer.h | 1 +
+ src/mm-base-call.h | 1 +
+ src/mm-base-manager.h | 1 +
+ src/mm-base-modem.h | 1 +
+ src/mm-base-sim.h | 1 +
+ src/mm-base-sms.h | 1 +
+ src/mm-bearer-list.h | 1 +
+ src/mm-bearer-mbim.h | 1 +
+ src/mm-bearer-qmi.h | 1 +
+ src/mm-broadband-bearer.h | 1 +
+ src/mm-broadband-modem-mbim.h | 1 +
+ src/mm-broadband-modem-qmi.h | 1 +
+ src/mm-broadband-modem.h | 1 +
+ src/mm-call-list.h | 1 +
+ src/mm-device.h | 1 +
+ src/mm-filter.h | 1 +
+ src/mm-iface-modem-3gpp-ussd.h | 1 +
+ src/mm-iface-modem-3gpp.h | 1 +
+ src/mm-iface-modem-cdma.h | 1 +
+ src/mm-iface-modem-firmware.h | 1 +
+ src/mm-iface-modem-location.h | 1 +
+ src/mm-iface-modem-messaging.h | 1 +
+ src/mm-iface-modem-oma.h | 1 +
+ src/mm-iface-modem-signal.h | 1 +
+ src/mm-iface-modem-simple.h | 1 +
+ src/mm-iface-modem-time.h | 1 +
+ src/mm-iface-modem-voice.h | 1 +
+ src/mm-iface-modem.h | 1 +
+ src/mm-plugin-manager.h | 4 +++-
+ src/mm-plugin.h | 1 +
+ src/mm-port-mbim.h | 1 +
+ src/mm-port-probe.h | 1 +
+ src/mm-port-qmi.h | 1 +
+ src/mm-port-serial-at.h | 1 +
+ src/mm-port-serial-gps.h | 1 +
+ src/mm-port-serial-qcdm.h | 1 +
+ src/mm-port-serial.h | 1 +
+ src/mm-port.h | 1 +
+ src/mm-shared-qmi.h | 1 +
+ src/mm-sim-mbim.h | 1 +
+ src/mm-sim-qmi.h | 1 +
+ src/mm-sms-list.h | 1 +
+ src/mm-sms-mbim.h | 1 +
+ src/mm-sms-part.h | 2 ++
+ src/mm-sms-qmi.h | 1 +
+ 48 files changed, 55 insertions(+), 3 deletions(-)
+
+commit bd96f8874c66f7b3a96e58e6fb7454da21afd2b8
+Author: Anders Jonsson
+Date: Sat Sep 19 00:05:53 2020 +0200
+
+ po: Update Swedish translation
+
+ (cherry picked from commit 19ddfa18bbbce29315429436f461696d50b752b3)
+
+ po/sv.po | 22 ++++++++++------------
+ 1 file changed, 10 insertions(+), 12 deletions(-)
+
+commit 8d8ac9e8462f6dd209c3833e8bef378cbc3a002d
+Author: Aleksander Morgado
+Date: Fri Sep 18 10:32:02 2020 +0200
+
+ po: use package bugreport as MSGID_BUGS_ADDRESS
+
+ (cherry picked from commit 856ea932678e62ffccd9f1cf53e8671324efd569)
+
+ po/Makevars | 2 +-
+ po/cs.po | 5 +++--
+ po/da.po | 5 +++--
+ po/de.po | 5 +++--
+ po/fr.po | 5 +++--
+ po/fur.po | 5 +++--
+ po/hu.po | 5 +++--
+ po/id.po | 5 +++--
+ po/it.po | 5 +++--
+ po/lt.po | 5 +++--
+ po/pl.po | 5 +++--
+ po/pt_BR.po | 5 +++--
+ po/ru.po | 5 +++--
+ po/sk.po | 5 +++--
+ po/sv.po | 5 +++--
+ po/tr.po | 5 +++--
+ po/uk.po | 5 +++--
+ po/zh_CN.po | 5 +++--
+ 18 files changed, 52 insertions(+), 35 deletions(-)
+
+commit f5ff58729d0cc2d6badb926b9957ddb23ffe7632
+Author: Aleksander Morgado
+Date: Fri Sep 18 10:31:32 2020 +0200
+
+ build: set package bugreport to the gitlab issues URL
+
+ (cherry picked from commit 6a3b7bdf95bbdb4b6bf75ea331abc1f885f802dc)
+
+ configure.ac | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit ae03d32c7a72bf034ff3c636013a692a6d03f5b8
+Author: Jessy Diamond Exum
+Date: Wed Aug 26 13:52:04 2020 -0700
+
+ cinterion: Configure the PLAS9 to correctly send Unsolicited Result
+ Codes.
+
+ The PLS8 and PLAS9 modems (and likely many others modems supported by
+ this driver) have two AT capable serial ports: The 'MODEM' AT port
+ (default for PPP) and the 'APPLICATION' AT port (used for general
+ control).
+
+ The PLS8 modem sends URCs to the APPLICATION port by default, while he
+ PLAS9 defaults sending URCs to the MODEM port. To get URCs to behave
+ on both modems, it is necessary to explicitly set the URC reporting
+ port to APPLICATION.
+
+ (cherry picked from commit b1679b58939fc2563b827d478ac0eea937fd16c8)
+
+ plugins/cinterion/mm-broadband-modem-cinterion.c | 29
+ ++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 5 deletions(-)
+
+commit 1cd78cc28a9c82be70b56731636bb9299bdd1fb2
+Author: Aleksander Morgado
+Date: Mon Sep 7 10:55:02 2020 +0200
+
+ bearer-mbim: avoid attempting to load deactivated IP types
+
+ If we're asking for IPv4v6 and we get IPv4-only connected, we
+ shouldn't attempt to provide IPv6 addressing details in the bearer
+ object, because we would fallback to say DHCP is needed if we were not
+ able to load any IPv6 details from the modem.
+
+ This is, instead of provinding both IPv4 and IPv6 details:
+ ------------------------------------
+ Properties | apn: internet
+ | roaming: allowed
+ | ip type: ipv4v6
+ | allowed-auth: none, pap, chap, mschap,
+ mschapv2, eap
+ ------------------------------------
+ IPv4 configuration | method: static
+ | address: 10.182.100.233
+ | prefix: 24
+ | gateway: 10.182.100.1
+ | dns: 80.58.61.250, 80.58.61.254
+ ------------------------------------
+ IPv6 configuration | method: dhcp
+ | prefix: 0
+
+ We should report only IPv4 details:
+ ----------------------------------
+ Properties | apn: internet
+ | roaming: allowed
+ | ip type: ipv4v6
+ | allowed-auth: none, pap, chap, mschap,
+ mschapv2, eap
+ ----------------------------------
+ IPv4 configuration | method: static
+ | address: 10.182.100.233
+ | prefix: 24
+ | gateway: 10.182.100.1
+ | dns: 80.58.61.250, 80.58.61.254
+
+ (cherry picked from commit 958ca74391481616db41cd412a9e12556dd21971)
+
+ src/mm-bearer-mbim.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 4d78be6fd99ce4c20862eee921ad6c351d811b11
+Author: Aleksander Morgado
+Date: Mon Sep 7 10:46:38 2020 +0200
+
+ bearer-mbim: don't fail IPv4 connection if IPv4v6 was requested
+
+ If we ask for IPv4v6 is requested but the network only grants IPv4, we
+ end up receiving the 'Connect Set' response with nw_error set to
+ 'pdp-type-ipv4-only-allowed'. In this case, we should still succeed
+ the connection attempt and only report the IPv4 info.
+
+ We therefore change the logic to skip processing the nw_error unless
+ the activation state is reported as ACTIVATED or ACTIVATING.
+
+ (cherry picked from commit f8eeab21213e4ec487ce3f91b0ca09f11e52cec0)
+
+ src/mm-bearer-mbim.c | 37 ++++++++++++++++++++++---------------
+ 1 file changed, 22 insertions(+), 15 deletions(-)
+
+commit d195ee9d3399f8c7dc709e6893c268453768a792
+Author: Aleksander Morgado
+Date: Fri Aug 28 18:45:59 2020 +0200
+
+ simtech: add SIM7070/SIM7080/SIM7090 port type hints
+
+ These modules have 2 different USB layouts:
+
+ The default layout with PID 0x9205 (AT+CUSBSELNV=1) exposes 4 TTYs and
+ an ECM interface:
+
+ T: Bus=02 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 6 Spd=480 MxCh= 0
+ D: Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1
+ P: Vendor=1e0e ProdID=9205 Rev=00.00
+ S: Manufacturer=SimTech, Incorporated
+ S: Product=SimTech SIM7080
+ S: SerialNumber=1234567890ABCDEF
+ C: #Ifs= 6 Cfg#= 1 Atr=e0 MxPwr=500mA
+ I: If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x3 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x4 Alt= 0 #EPs= 1 Cls=02(commc) Sub=06 Prot=00
+ Driver=cdc_ether
+ I: If#=0x5 Alt= 1 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00
+ Driver=cdc_ether
+
+ The purpose of each TTY is as follows:
+ * ttyUSB0: DIAG/QCDM port.
+ * ttyUSB1: GNSS data.
+ * ttyUSB2: AT-capable port (control).
+ * ttyUSB3: AT-capable port (data).
+
+ In the secondary layout with PID=0x9206 (AT+CUSBSELNV=86) the module
+ exposes 6 TTY ports:
+
+ T: Bus=02 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 8 Spd=480 MxCh= 0
+ D: Ver= 2.00 Cls=02(commc) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
+ P: Vendor=1e0e ProdID=9206 Rev=00.00
+ S: Manufacturer=SimTech, Incorporated
+ S: Product=SimTech SIM7080
+ S: SerialNumber=1234567890ABCDEF
+ C: #Ifs= 6 Cfg#= 1 Atr=e0 MxPwr=500mA
+ I: If#=0x0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x3 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x4 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+ I: If#=0x5 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff
+ Driver=option
+
+ The purpose of each TTY is as follows:
+ * ttyUSB0: DIAG/QCDM port.
+ * ttyUSB1: GNSS data.
+ * ttyUSB2: AT-capable port (control).
+ * ttyUSB3: QFLOG interface.
+ * ttyUSB4: DAM interface.
+ * ttyUSB5: AT-capable port (data).
+
+ (cherry picked from commit 42288fc2a10b5e1740d86ebe6249e21a2337d3bc)
+
+ plugins/simtech/77-mm-simtech-port-types.rules | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 97e20d1e2b93e9908ebebb17c2d59f3c8fe4e781
+Author: David Leonard
+Date: Wed Aug 26 14:37:10 2020 +1000
+
+ sms: fix CMDA SMS UTF-8 translation
+
+ Fixes incoming SMS translation issue seen on MC7354 when translating
+ contents from Latin-1 encoding to UTF-8, because the encoding
+ parameter
+ "ISO−8859−1" used U+2212 (MINUS SIGN) instead of U+002D
+ (HYPHEN-MINUS).
+
+ [mm-sms-part-cdma.c:873] read_bearer_data_user_data():
+ text/data: ignored (latin to UTF-8 conversion error): 0:
+ Conversion from character set 'ISO−8859−1' to 'UTF-8' is
+ not supported
+
+ Fix thanks to Peter Hunt
+
+ (cherry picked from commit 48973e3d72307ca84375d1c7811eb0b04def91ce)
+
+ src/mm-sms-part-cdma.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5bbef22215bf3cfead5436a431543c17a6ffa29f
+Author: Aleksander Morgado
+Date: Thu Aug 20 12:18:05 2020 +0200
+
+ sms-part-3gpp: allow sending UTF-16 as if it were UCS-2
+
+ Despite 3GPP TS 23.038 specifies that Unicode SMS messages are
+ encoded in UCS-2, UTF-16 encoding is commonly used instead on many
+ modern platforms to allow encoding code points that fall outside the
+ Basic Multilingual Plane (BMP), such as Emoji.
+
+ Update the logic to always use UTF-16 instead of UCS-2 when creating
+ or parsing PDUs (even if we always report as sending or receiving
+ UCS-2). For all purposes, UCS-2 is considered a subset of UTF-16
+ (assuming that code points out of the [U+0000,U+D7FF] and
+ [U+E000,U+FFFF] ranges are not applicable in UCS-2).
+
+ Fixes
+ https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/250
+
+ (cherry picked from commit 599f545c0d905505516c6546ff77caced2aa14f1)
+
+ src/mm-sms-part-3gpp.c | 159
+ +++++++++++++++++++++--------------------
+ src/mm-sms-part.h | 18 ++++-
+ src/tests/test-sms-part-3gpp.c | 78 ++++++++++++++++----
+ 3 files changed, 165 insertions(+), 90 deletions(-)
+
+commit f38c3bf7615b9d8366598f32cdd645d0bc503363
+Author: Aleksander Morgado
+Date: Thu Aug 20 11:32:18 2020 +0200
+
+ 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.
+
+ (cherry picked from commit 81162df15dc9a409d0979ff8d472a026f31ed883)
+
+ src/mm-charsets.c | 290
+ ++++++++++++++++++++++++++++--------------------------
+ src/mm-charsets.h | 42 ++++----
+ 2 files changed, 170 insertions(+), 162 deletions(-)
+
+commit 901426c3ac3e52971e06530066ac6527ab7cb08f
+Author: Aleksander Morgado
+Date: Thu Aug 20 10:58:24 2020 +0200
+
+ 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.
+
+ (cherry picked from commit eb5443b197464e55c85d7a8af67a28f2088506a3)
+
+ src/mm-charsets.c | 16 ++++++++++++++--
+ src/mm-charsets.h | 3 ++-
+ src/tests/test-charsets.c | 18 ++++++++++--------
+ 3 files changed, 26 insertions(+), 11 deletions(-)
+
+commit 55f90b1dafcd50fec79b20e4ecd73a31b2a86339
+Author: Aleksander Morgado
+Date: Thu Aug 20 10:57:01 2020 +0200
+
+ sms-part-3gpp: minor refactor in text split logic
+
+ (cherry picked from commit 93686510d737bc373100beaeeb3edb7ca091a3f0)
+
+ src/mm-sms-part-3gpp.c | 167
+ ++++++++++++++++++++++++++++---------------------
+ 1 file changed, 94 insertions(+), 73 deletions(-)
+
+commit 028b359d0365f6750834aed90bd545c1a5768cc3
+Author: Aleksander Morgado
+Date: Wed Aug 19 18:34:04 2020 +0200
+
+ build: post-release version bump to 1.14.3
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 88bbae4fe8b2b3b4dfca6bf4370a8124810ed74f
+Author: Aleksander Morgado
+Date: Wed Aug 19 18:09:32 2020 +0200
+
+ release: bump version to 1.14.2
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d2b1beb9ea73af92555e173bb84d1092ac36f06f
+Author: Aleksander Morgado
+Date: Wed Aug 19 18:08:31 2020 +0200
+
+ NEWS: update for 1.14.2
+
+ NEWS | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+commit 901d994a1291864ac0ec493401f95f7148c139c5
+Author: root
+Date: Thu Aug 13 11:25:59 2020 +0800
+
+ quectel: allow MBIM devices
+
+ (cherry picked from commit d9a64c74ff0244b96a44fa27abcdc411d29f4874)
+
+ plugins/quectel/mm-plugin-quectel.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit ec1ddf30828adc743d09412d64bd36b83b84e5bd
+Author: carlyin
+Date: Sun Aug 16 16:55:25 2020 +0800
+
+ quectel: add port type hints for the Quectel 5G RM500
+
+ (cherry picked from commit 5346d3c55c7ffc38af58c879fd426a2c3accd489)
+
+ plugins/quectel/77-mm-quectel-port-types.rules | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit f192ffc3774a02dc451216b7ad0fae2d0df47b80
+Author: Aleksander Morgado
+Date: Sun Aug 16 11:13:26 2020 +0200
+
+ modem-helpers: ensure error is set in
+ mm_3gpp_parse_cpms_test_response()
+
+ If splitting the +CPMS=? response in groups fails, make sure we set
+ the GError when returning FALSE.
+
+ (cherry picked from commit de23b53ee4d91367b50a960f8b19b2e29449e49a)
+
+ src/mm-modem-helpers.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 37af15eba298c0676225d4dded01a65495655028
+Author: Aleksander Morgado
+Date: Sun Aug 16 11:06:57 2020 +0200
+
+ quectel: add udev rules unit tester
+
+ (cherry picked from commit 55ae47a3bb874991ca621e4aa17cf16b08d28139)
+
+ plugins/Makefile.am | 5 +++--
+ plugins/tests/test-udev-rules.c | 11 +++++++++++
+ 2 files changed, 14 insertions(+), 2 deletions(-)
+
+commit 0d53df68c78203bc2f2f4ee279a20f0306a6b41b
+Author: Aleksander Morgado
+Date: Tue Aug 4 16:33:11 2020 +0200
+
+ bearer-qmi: if connection aborted, ensure network handles are released
+
+ If the connection attempt is aborted before finishing (either network
+ triggered or user triggered), we need to make sure that we run a 'Stop
+ Network' request for every 'Start Network' that had succeeded until
+ then, or otherwise we'll no longer be able to re-run a 'Start Network'
+ with the same settings and get a proper packet data handle.
+
+ E.g. in this sequence we attempt a IPv4v6 connection. The logic starts
+ setting up the IPv4 path:
+
+ Wed Jul 29 14:44:06 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: state changed (registered
+ -> connecting)
+ Wed Jul 29 14:44:06 2020 daemon.debug [1567]: Launching
+ connection with QMI port (usb/cdc-wdm0) and data port (net/wwan0)
+ Wed Jul 29 14:44:06 2020 daemon.debug [1567]: Defaulting
+ to use static IP method
+ Wed Jul 29 14:44:06 2020 daemon.debug [1567]: Running
+ IPv4 connection setup
+ ...
+
+ The 'Start Network' for IPv4 succeeds and we get a proper packet data
+ handle:
+
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: [/dev/cdc-wdm0]
+ sent generic request (translated)... <<<<<< QMUX: <<<<<< length
+ = 23 <<<<<< flags = 0x00 <<<<<< service = "wds" <<<<<<
+ client = 20 <<<<<< QMI: <<<<<< flags = "none" <<<<<<
+ transaction = 3075 <<<<<< tlv_length = 11 <<<<<< message
+ = "Start Network" (0x0020) <<<<<< TLV: <<<<<< type =
+ "APN" (0x14) <<<<<< length = 8 <<<<<< value =
+ 69:6E:74:65:72:6E:65:74 <<<<<< translated = internet
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: [/dev/cdc-wdm0]
+ received generic response (translated)... <<<<<< QMUX: <<<<<<
+ length = 26 <<<<<< flags = 0x80 <<<<<< service =
+ "wds" <<<<<< client = 20 <<<<<< QMI: <<<<<< flags =
+ "response" <<<<<< transaction = 3075 <<<<<< tlv_length =
+ 14 <<<<<< message = "Start Network" (0x0020) <<<<<< TLV:
+ <<<<<< type = "Result" (0x02) <<<<<< length = 4
+ <<<<<< value = 00:00:00:00 <<<<<< translated = SUCCESS
+ <<<<<< TLV: <<<<<< type = "Packet Data Handle" (0x01)
+ <<<<<< length = 4 <<<<<< value = 80:CD:AD:81 <<<<<<
+ translated = 2175651200
+
+ Then, we start the IPv6 connection path:
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: Running
+ IPv6 connection setup
+ ...
+
+ But, because we suddenly are not registered in the network, the
+ connection is aborted, and we don't cleanup the IPv4 path at this
+ point, as this patch wasn't available.
+
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: Bearer
+ not allowed to connect, not registered in 3GPP network
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: Forcing
+ disconnection of bearer '/org/freedesktop/ModemManager1/Bearer/56'
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: transaction 0xe1
+ aborted, but message is not abortable
+ Wed Jul 29 14:44:07 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: state changed (connecting
+ -> enabled)
+ Wed Jul 29 14:44:07 2020 daemon.debug [1567]: Couldn't
+ connect bearer '/org/freedesktop/ModemManager1/Bearer/56':
+ 'operation cancelled'
+
+ We then attempt a new connection request with the same settings:
+
+ Wed Jul 29 14:44:22 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: state changed (registered
+ -> connecting)
+ Wed Jul 29 14:44:22 2020 daemon.debug [1567]: Launching
+ connection with QMI port (usb/cdc-wdm0) and data port (net/wwan0)
+ Wed Jul 29 14:44:22 2020 daemon.debug [1567]: Defaulting
+ to use static IP method
+ Wed Jul 29 14:44:22 2020 daemon.debug [1567]: Running
+ IPv4 connection setup
+
+ And we see how the 'Start Network' command fails with a 'No Effect'
+ error, as the IPv4 was left connected earlier. Due to this, the modem
+ is assumed connected, but we won't have a valid packet data handle to
+ stop the connection cleanly:
+
+ Wed Jul 29 14:44:22 2020 daemon.debug [1567]: [/dev/cdc-wdm0]
+ sent generic request (translated)... <<<<<< QMUX: <<<<<< length
+ = 23 <<<<<< flags = 0x00 <<<<<< service = "wds" <<<<<<
+ client = 20 <<<<<< QMI: <<<<<< flags = "none" <<<<<<
+ transaction = 3080 <<<<<< tlv_length = 11 <<<<<< message
+ = "Start Network" (0x0020) <<<<<< TLV: <<<<<< type =
+ "APN" (0x14) <<<<<< length = 8 <<<<<< value =
+ 69:6E:74:65:72:6E:65:74 <<<<<< translated = internet
+ Wed Jul 29 14:44:23 2020 daemon.debug [1567]: [/dev/cdc-wdm0]
+ received generic response (translated)... <<<<<< QMUX: <<<<<<
+ length = 26 <<<<<< flags = 0x80 <<<<<< service =
+ "wds" <<<<<< client = 20 <<<<<< QMI: <<<<<< flags =
+ "response" <<<<<< transaction = 3080 <<<<<< tlv_length =
+ 14 <<<<<< message = "Start Network" (0x0020) <<<<<< TLV:
+ <<<<<< type = "Result" (0x02) <<<<<< length = 4
+ <<<<<< value = 01:00:1A:00 <<<<<< translated = FAILURE:
+ NoEffect <<<<<< TLV: <<<<<< type = "Packet Data Handle"
+ (0x01) <<<<<< length = 4 <<<<<< value = 00:00:00:00
+ <<<<<< translated = 0
+
+ (cherry picked from commit 7cd373589cb7d81633a5df279e0b63c405cc2bb6)
+
+ src/mm-bearer-qmi.c | 65
+ +++++++++++++++++++++++++++++++++++------------------
+ 1 file changed, 43 insertions(+), 22 deletions(-)
+
+commit 8c0872fb554dc4bd07b3498d34be1b8ed5d082dc
+Author: Aleksander Morgado
+Date: Tue Aug 4 14:13:45 2020 +0200
+
+ iface-modem: avoid connection status flapping if briefly unregistered
+
+ If the modem is connected and we receive indications of a quick
+ unregistration cycle (i.e. unregistered, then registered again) we
+ should not end up flagging the modem as disconnected.
+
+ We already had some logic to avoid this with the "deferred 3GPP
+ unregistration" logic in the base bearer object, but this logic only
+ took into account the status of the bearer, not the status of the
+ modem.
+
+ Wed Jul 29 15:35:44 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: 3GPP Registration state
+ changed (home -> idle)
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: 3GPP location updated
+ (MCC: '0', MNC: '0', Location area code: '0', Tracking area code:
+ '1CE8', Cell ID: '68F832')
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Connected
+ bearer not registered in 3GPP network
+ Wed Jul 29 15:35:44 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: state changed (connected
+ -> enabled)
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: signal quality updated (0)
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: access technology changed
+ (lte -> unknown)
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Periodic
+ signal checks disabled
+ Wed Jul 29 15:35:44 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: 3GPP Registration state
+ changed (idle -> registering)
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: 3GPP location updated
+ (MCC: '0', MNC: '0', Location area code: '0', Tracking area code:
+ '1C84', Cell ID: 'A3E050')
+ Wed Jul 29 15:35:44 2020 daemon.debug [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: 3GPP location updated
+ (MCC: '238', MNC: '1', Location area code: '0', Tracking area
+ code: '1C84', Cell ID: 'A3E050')
+ Wed Jul 29 15:35:44 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: 3GPP Registration state
+ changed (registering -> home)
+ Wed Jul 29 15:35:44 2020 daemon.info [1567]: Modem
+ /org/freedesktop/ModemManager1/Modem/0: state changed (enabled
+ -> registered)
+
+ We now try to improve this situation by also considering the case
+ where modem is supposed to get into "enabled" state (i.e. not
+ registered, not searching), but we still consider the amount of
+ connected bearers to decide the final state reported by the modem. In
+ other words, a modem with the 3GPP registration reported as 'idle'
+ will still be reported as 'connected' if there is at least one bearer
+ in connected state. This situation will end as soon as the 'deferred
+ 3GPP unregistration' timeout expires, as that will force the bearer to
+ be disconnected.
+
+ (cherry picked from commit 16e3bb892d25e3cb7796889082943b073924a695)
+
+ src/mm-iface-modem.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit b7852f658775c903192f1065d5e938ec6319c27d
+Author: Giacinto Cifelli
+Date: Tue Aug 11 14:26:13 2020 +0200
+
+ cinterion: remove limitation to IPv4 only PDP contexts
+
+ There was a limitation in the past in the plugin, because one of
+ the steps
+ during the dial (CONNECT_3GPP_CONTEXT_STEP_PDP_CTX) was to
+ reconfigure a
+ specific CID hardcoding the IP type to IPv4.
+
+ That logic was removed in commit
+ af2d6c1c4b7f815862313bf0f84b1ff0e91ccd60,
+ but we didn't remove the IPv4 limitation at that point.
+
+ (cherry picked from commit 2f684ce92ea9cc772a36db2e7bd9d48e677d3935)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit 660e8612b3f77fd1074b91e9586a3a5c5d63fc67
+Author: Giacinto Cifelli
+Date: Tue Aug 11 07:10:36 2020 +0200
+
+ cinterion: clarify role of the AT ports for the ELS61/PLS62 family
+
+ (cherry picked from commit a36beb0a958f65bcaa5939e04bf340d98d4180a1)
+
+ plugins/cinterion/77-mm-cinterion-port-types.rules | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit e34d1fffa16cf931736425509559db6f156c4226
+Author: Giacinto Cifelli
+Date: Tue Aug 4 11:04:17 2020 +0200
+
+ cinterion: fixed cast from wrong object
+
+ MM_BROADBAND_MODEM_CINTERION shall be applied to a *MMBaseModem
+ (ctx->modem here)
+ and not to a *MMBaseBearer (self here)
+
+ (cherry picked from commit 422a9070c40c48847870cb2cf141fe102cd72cba)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e57e5ce93f39ad1cf8d18be6e3aaeee4c49cad0
+Author: Aleksander Morgado
+Date: Sat Aug 1 09:59:05 2020 +0200
+
+ broadband-modem: minor method rename
+
+ (cherry picked from commit 74dd28c4e31cca38d0b4c7ed034af4226566b404)
+
+ plugins/telit/mm-broadband-modem-telit.c | 2 +-
+ src/mm-broadband-modem-mbim.c | 2 +-
+ src/mm-broadband-modem.c | 4 ++--
+ src/mm-broadband-modem.h | 2 +-
+ 4 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 38151a0c8fe131ec3a23a9f8961ec97d2c6b3733
+Author: Aleksander Morgado
+Date: Sat Aug 1 09:59:01 2020 +0200
+
+ iface-modem: move sim hot swap ready to correct place in sequence
+
+ (cherry picked from commit 130ea74cc953e9029a9a1662a788048ac765a0b3)
+
+ src/mm-iface-modem.c | 53
+ +++++++++++++++++++++++++---------------------------
+ 1 file changed, 25 insertions(+), 28 deletions(-)
+
+commit 47074c17a2b0ff32b122069307a98173a6fcf8d3
+Author: Giacinto Cifelli
+Date: Mon Jul 27 12:27:26 2020 +0200
+
+ cinterion: IMT family SGAUTH
+
+ some ITM family modems require full parameters:
+ AT^SGAUTH=cid,type,user,pwd
+ even when type is AUTH_NONE.
+ Fortunately, all modules of the IMT family tolerate this syntax,
+ so it can be adopted for the entire family.
+
+ (cherry picked from commit 4f1da8797213fb79856a5e8e1c6e6dca7236c2e0)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6ad247f89840f5bc245a6c9e65f8ccf8fed1709a
+Author: Giacinto Cifelli
+Date: Mon Jul 27 12:24:17 2020 +0200
+
+ cinterion: ignore ^SYSSTART urc
+
+ (cherry picked from commit 07ac85e2f70706e377c2019b07ce29958c70668c)
+
+ plugins/cinterion/mm-broadband-modem-cinterion.c | 35
+ ++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+commit 8b3eac8323129565b007f5460972086170e67204
+Author: Giacinto Cifelli
+Date: Mon Jul 27 06:23:52 2020 +0200
+
+ cinterion: extend SGAUTH syntax
+
+ AT^SGAUTH syntax depends on the modem family:
+ AT^SGAUTH=cid,type,user,pwd for the IMT family
+ AT^SGAUTH=cid,type,pwd,user for the rest
+
+ (cherry picked from commit 408ec530e0442137194cf048de72183011fdc40b)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 19
+ +++++++++++++++++--
+ plugins/cinterion/mm-broadband-modem-cinterion.c | 8 ++++++++
+ plugins/cinterion/mm-broadband-modem-cinterion.h | 3 +++
+ 3 files changed, 28 insertions(+), 2 deletions(-)
+
+commit bd940922ed623d27b0266a411f6dfc808274b8c9
+Author: Giacinto Cifelli
+Date: Fri Jul 24 16:25:03 2020 +0200
+
+ cinterion: radio/band single scfg line: no variance
+
+ the AT^SCFG="Radio/Band" command does not return a different answer
+ for different charsets.
+ This code was working previously because the charset was left to
+ default (GSM)
+ at the time of this operation, and therefore the string was unchanged
+ anyway.
+
+ (cherry picked from commit cec6fe9cce4f7f49f941262d48d081e30f8ea444)
+
+ plugins/cinterion/mm-modem-helpers-cinterion.c | 13 ++-----------
+ plugins/cinterion/tests/test-modem-helpers-cinterion.c | 18
+ ------------------
+ 2 files changed, 2 insertions(+), 29 deletions(-)
+
+commit ddcac7fda32ed6da7781966ab5ed08c473b21ffe
+Author: Sven Schwermer
+Date: Fri Jul 3 15:16:26 2020 +0200
+
+ qmi: Network registration via SSSP if possible
+
+ Doing the network registration via Set System Selection Preference is
+ preferable because it doesn't override the currently set allowed mode,
+ i.e. access technology.
+
+ https://lists.freedesktop.org/archives/modemmanager-devel/2020-July/007972.html
+
+ Signed-off-by: Sven Schwermer
+
+ (cherry picked from commit c70b3557184fdf1472ff0cb36e9fd937cc7f9024)
+
+ src/mm-shared-qmi.c | 138
+ +++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 105 insertions(+), 33 deletions(-)
+
+commit 83f2717ea4794ef92f5dc93d8a93d3d92602372e
+Author: Justin Standring
+Date: Thu Jul 16 13:21:23 2020 +1200
+
+ broadband-modem-qmi: fix -Wempty-body warning
+
+ mm-broadband-modem-qmi.c: In function 'process_common_info':
+ mm-broadband-modem-qmi.c:2897:30: warning: suggest braces around
+ empty body in an 'if' statement [-Wempty-body]
+ /* both apply */ ;
+ ^
+
+ Signed-off-by: Justin Standring
+ (cherry picked from commit 47a28114baa2504c16bf2bca2325cefe426aea95)
+
+ src/mm-broadband-modem-qmi.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c4c840fca4fda4f24492c39e7145abeadd9e73ce
+Author: Aleksander Morgado
+Date: Wed Aug 19 14:55:41 2020 +0200
+
+ broadband-modem-qmi: avoid unused functions
+
+ Only applicable when building with WITH_NEWEST_QMI_COMMANDS.
+
+ mm-broadband-modem-qmi.c:4741:1: error:
+ ‘common_enable_disable_unsolicited_events_signal_strength’
+ defined but not used [-Werror=unused-function]
+ 4741 | common_enable_disable_unsolicited_events_signal_strength
+ (GTask *task)
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ mm-broadband-modem-qmi.c:4528:1: error:
+ ‘serving_system_indication_cb’ defined but not used
+ [-Werror=unused-function]
+ 4528 | serving_system_indication_cb (QmiClientNas *client,
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ mm-broadband-modem-qmi.c:3468:1: error:
+ ‘common_enable_disable_unsolicited_registration_events_serving_system’
+ defined but not used [-Werror=unused-function]
+ 3468 |
+ common_enable_disable_unsolicited_registration_events_serving_system
+ (GTask *task)
+ |
+ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ mm-broadband-modem-qmi.c:2812:1: error:
+ ‘get_serving_system_3gpp_ready’ defined but not used
+ [-Werror=unused-function]
+ 2812 | get_serving_system_3gpp_ready (QmiClientNas *client,
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ mm-broadband-modem-qmi.c:1652:1: error:
+ ‘get_signal_strength_ready’ defined but not used
+ [-Werror=unused-function]
+ 1652 | get_signal_strength_ready (QmiClientNas *client,
+
+ (cherry picked from commit 0f60b225a21cc69291b7783c58e8f957ff426ee4)
+
+ src/mm-broadband-modem-qmi.c | 23 ++++++++++++++++++-----
+ 1 file changed, 18 insertions(+), 5 deletions(-)
+
+commit 53a787a531215ccd46eb8f8709f87ecc02d8d60d
+Author: Aleksander Morgado
+Date: Wed Aug 19 14:48:12 2020 +0200
+
+ broadband-modem-qmi: fix type comparison
+
+ Only applicable when building with WITH_NEWEST_QMI_COMMANDS.
+
+ mm-broadband-modem-qmi.c: In function ‘process_common_info’:
+ mm-broadband-modem-qmi.c:2924:20: error: comparison is always
+ false due to limited range of data type [-Werror=type-limits]
+ 2924 | if (mnc[2] == 0xFF) {
+ | ^~
+
+ (cherry picked from commit 0a5ab352e137e9c18a0c59be0533fde0bd307f03)
+
+ src/mm-broadband-modem-qmi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1fca2c2b492a29488ae117c9f9f2b3be83d90b2e
+Author: Justin Standring
+Date: Thu Jul 16 12:55:31 2020 +1200
+
+ broadband-modem-qmi: fix object logging with WITH_NEWEST_QMI_COMMANDS
+
+ mm-broadband-modem-qmi.c: In function
+ 'common_signal_info_get_quality':
+ mm-broadband-modem-qmi.c:1469:21: error: 'self' undeclared (first
+ use in this function)
+ mm_obj_dbg (self, "RSSI (CDMA): %d dBm", cdma1x_rssi);
+ ^~~~
+ mm-broadband-modem-qmi.c:1469:21: note: each undeclared identifier
+ is reported only once for each function it appears in
+ mm_obj_dbg (self, "RSSI (CDMA): %d dBm", cdma1x_rssi);
+ ^~~~
+ mm-broadband-modem-qmi.c: In function 'process_gsm_info':
+ mm-broadband-modem-qmi.c:2992:25: error: 'self' undeclared (first
+ use in this function)
+ mm_obj_dbg (self, "no GSM service reported");
+ ^~~~
+ mm-broadband-modem-qmi.c: In function 'process_wcdma_info':
+ mm-broadband-modem-qmi.c:3100:25: error: 'self' undeclared (first
+ use in this function)
+ mm_obj_dbg (self, "no WCDMA service reported");
+ ^~~~
+ mm-broadband-modem-qmi.c: In function 'process_lte_info':
+ mm-broadband-modem-qmi.c:3209:25: error: 'self' undeclared (first
+ use in this function)
+ mm_obj_dbg (self, "no LTE service reported");
+ ^~~~
+ mm-broadband-modem-qmi.c: In function 'config_signal_info_ready':
+ mm-broadband-modem-qmi.c:4890:21: error: 'self' undeclared (first
+ use in this function)
+ mm_obj_dbg (self, "QMI operation failed: '%s'",
+ error->message);
+ ^~~~
+
+ Signed-off-by: Justin Standring
+ (cherry picked from commit 6ec12add1ba6625a8470ae3cf7b30cefcf28d503)
+
+ src/mm-broadband-modem-qmi.c | 26 +++++++++++++++++---------
+ 1 file changed, 17 insertions(+), 9 deletions(-)
+
+commit e519cac608c2e28a60dc9fc8d54d49c8def36b8d
+Author: Aleksander Morgado
+Date: Wed Jul 8 11:40:41 2020 +0200
+
+ broadband-modem-qmi: fix parsing of USSD indications with UTF-16 data
+
+ Fixes
+ https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/240
+
+ (cherry picked from commit e98bc7cc0803595db8eb498817fb0d5f99d25813)
+
+ src/mm-broadband-modem-qmi.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 864b8cdae76c7be976a3b61599318e44cb7ca5aa
+Author: Aleksander Morgado
+Date: Mon Jul 6 16:53:08 2020 +0200
+
+ cinterion: quote user/password strings in AT^SGAUTH calls
+
+ The ELS61 doesn't like authentication given without quotes:
+ [modem3/ttyACM1/at] --> 'AT^SGAUTH=8,1,tm,t-mobile'
+ [modem3/ttyACM1/at] <-- '+CME ERROR: 4'
+
+ Only when user/pass strings are quoted it works:
+ [modem6/ttyACM1/at] --> 'AT^SGAUTH=8,1,"t-mobile","tm"'
+ [modem6/ttyACM1/at] <-- 'OK'
+
+ (cherry picked from commit a131c6953a0a24a6ed8c365cb5e398fa5e52afcf)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit 44175db16c4ad83a35a0661a3758c90b3cf2ce8c
+Author: Aleksander Morgado
+Date: Mon Jul 6 16:23:57 2020 +0200
+
+ cinterion: if user OR password given, don't set the other as (null)
+
+ [modem2/ttyACM1/at] --> 'AT^SGAUTH=8,1,t-d1,(null)'
+ [modem2/ttyACM1/at] <-- '+CME ERROR: 4'
+
+ We should use an empty string instead.
+
+ (cherry picked from commit 0a89a9ae4ee62ba36b616fc444a866d61c203696)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit d544b93d484b315a7e04bd93343d30963ca04a92
+Author: Aleksander Morgado
+Date: Thu Jun 25 18:43:57 2020 +0200
+
+ cinterion: increase SWWAN connection attempt timeout
+
+ It's critical not to timeout early on devices with AT ports, or we may
+ end up flagging the modem as invalid.
+
+ ModemManager[26829]: [1593097973.552712] [modem1/ttyACM0/at]
+ --> 'AT^SWWAN=1,2,1'
+ ....
+ ModemManager[26829]: [1593098064.195217] [modem1] couldn't
+ connect bearer: Serial command timed out
+ ....
+ ModemManager[26829]: [1593098091.167987] [modem1] port
+ ttyACM0 timed out 10 consecutive times, marking modem as invalid
+
+ (cherry picked from commit e933fe14130b20785b6ddd2993a8fc982976c7af)
+
+ plugins/cinterion/mm-broadband-bearer-cinterion.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ca66500716d798a91a617ca6c4c502e2f75c25d7
+Author: Aleksander Morgado
+Date: Sat Jul 4 06:02:37 2020 +0200
+
+ iface-modem-signal: remove unneeded skeleton clear attempt
+
+ It won't do anything because clear_values() tries to get the skeleton
+ from the modem object, and the skeleton hasn't been set at that point.
+
+ (cherry picked from commit 3d138f9f80823d2caafbc5117329b43472fe7d45)
+
+ src/mm-iface-modem-signal.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4b4350e10197695742778949d8069b7d7f890838
+Author: Aleksander Morgado
+Date: Sat Jul 4 05:47:25 2020 +0200
+
+ cinterion,signal: ^SMONI=? support check may be cached
+
+ (cherry picked from commit c79dcf794041724b5504a9576b07c1e53ca0affb)
+
+ plugins/cinterion/mm-broadband-modem-cinterion.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ac79b07699ae4a2ece6771bd222e266839887217
+Author: Aleksander Morgado
+Date: Sat Jul 4 05:46:56 2020 +0200
+
+ cinterion,signal: report error from parent signal support check
+
+ (cherry picked from commit ee262a473dcfd5702f66c532d42285c2763bad11)
+
+ plugins/cinterion/mm-broadband-modem-cinterion.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 20c63bc0a354b32255526d25d8bc51456b99c762
+Author: Aleksander Morgado
+Date: Sat Jul 4 05:45:28 2020 +0200
+
+ cinterion,signal: minor coding style fixes
+
+ (cherry picked from commit 2cb8e5ef5d30330442af152fa7d65ec7cc612e89)
+
+ plugins/cinterion/mm-broadband-modem-cinterion.c | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit 71573a4ef93b5d3e828c16fba6b755411f5a1939
+Author: Aleksander Morgado
+Date: Sat Jul 4 05:37:59 2020 +0200
+
+ mbim,signal: make sure output pointers are always set
+
+ E.g. if 'gsm' pointer is given, make sure it's always set (either to a
+ MMSignal or to NULL).
+
+ (cherry picked from commit 10ee7f4cd9d8af46822959fc84055bac45f5c56b)
+
+ src/mm-broadband-modem-mbim.c | 20 ++++++--------------
+ 1 file changed, 6 insertions(+), 14 deletions(-)
+
+commit 1b78d254fa15150cd14057e5ade48fe5b5328243
+Author: Adrien Plazas
+Date: Fri Jul 3 08:26:57 2020 +0200
+
+ plugin: define an autofree value to NULL
+
+ This satisfies -Werror=maybe-uninitialized.
+
+ (cherry picked from commit 6df9cc084489a3aa8ab06b1e87f597b96dc79ffa)
+
+ src/mm-plugin.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5f8bf97021ec23f7a61a6d690cd8a7f819c54d70
+Author: Daniele Palmas
+Date: Thu Jul 2 13:09:19 2020 +0200
+
+ telit: added port type hints for default MEx10G1 composition
+
+ While at this change also the previous generic reference to ME910
+ in order to differentiate between ME910C1 (based on MDM9206) and
+ MEx10G1 (based on MDM9205).
+
+ (cherry picked from commit fff47478cc5887176830a5debe2c4204434c222f)
+
+ plugins/telit/77-mm-telit-port-types.rules | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit f5bd1807197696266fe492669a0d63cdef999096
+Author: Aleksander Morgado
+Date: Mon Jun 29 10:06:18 2020 +0200
+
+ libmm-glib,location: avoid warnings when no traces available
+
+ ModemManager[201411]:
+ [1593417744.011884] [modem0/ttyUSB1/gps] <--
+ '$GPVTG,,T,,M,,N,,K,N*2C$GPGSA,A,1,,,,,,,,,,,,,,,*1E$GPGGA,,,,,,0,,,,,,,,*66$GPRMC,,V,,,,,,,,,,N*53'
+
+ (ModemManager:201411): GLib-CRITICAL **: 10:02:24.054: g_strjoinv:
+ assertion 'str_array != NULL' failed
+
+ Thread 1 "ModemManager" received signal SIGTRAP, Trace/breakpoint
+ trap.
+ 0x00007ffff7832473 in g_logv () from /usr/lib/libglib-2.0.so.0
+ (gdb) bt
+ #0 0x00007ffff7832473 in g_logv () at /usr/lib/libglib-2.0.so.0
+ #1 0x00007ffff78326f0 in g_log () at /usr/lib/libglib-2.0.so.0
+ #2 0x00007ffff7846b5e in g_strjoinv () at
+ /usr/lib/libglib-2.0.so.0
+ #3 0x00007ffff7ee9663 in mm_location_gps_nmea_get_string_variant
+ (self=0x5555557dde50) at mm-location-gps-nmea.c:246
+ #4 0x00005555555e7c47 in build_location_dictionary (previous=0x0,
+ location_3gpp=0x55555573e660, location_gps_nmea=0x5555557dde50,
+ location_gps_raw=0x0, location_cdma_bs=0x0)
+ at mm-iface-modem-location.c:183
+ ...
+ (gdb) fr 3
+ #3 0x00007ffff7ee9663 in mm_location_gps_nmea_get_string_variant
+ (self=0x5555557dde50) at mm-location-gps-nmea.c:246
+ 246 built = g_strjoinv ("\r\n", traces);
+ (gdb) p traces
+ $1 = (GStrv) 0x0
+
+ (cherry picked from commit 619b054e5c874844a73594a724b4e5ce5ec18b6d)
+
+ libmm-glib/mm-location-gps-nmea.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 19416aa725131865c6af8ce76f35e0116f7d0de8
+Author: Aleksander Morgado
+Date: Tue Jun 23 14:22:04 2020 +0200
+
+ build: post-release version bump to 1.14.1
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
commit 5f20662aeb9b0f79865a9a9df151349a29b4a2bd
Author: Aleksander Morgado
Date: Tue Jun 23 14:06:03 2020 +0200
@@ -35262,7 +36731,7 @@ Date: Sat May 14 15:25:32 2016 +0800
31 files changed, 69 insertions(+), 60 deletions(-)
commit 55f3ab80835114342618083664c4fa585455b9e0
-Merge: 830b6ebc ba097f1a
+Merge: 830b6ebca ba097f1a4
Author: Dan Williams
Date: Fri May 27 12:39:56 2016 -0500
@@ -41350,7 +42819,7 @@ Date: Mon Jun 16 16:22:51 2014 +0200
1 file changed, 6 insertions(+), 4 deletions(-)
commit 6e490944d07061ca15837963552d023807958feb
-Merge: ff4e4579 02f9b926
+Merge: ff4e45791 02f9b926c
Author: Dan Williams
Date: Fri Jun 13 14:57:08 2014 -0500
@@ -86055,7 +87524,7 @@ Date: Thu Jun 30 15:51:53 2011 -0500
1 file changed, 4 insertions(+), 4 deletions(-)
commit 7762d401e8201efc05d643b9da32f3e60a42c470
-Merge: 881f928c 7e69d2cf
+Merge: 881f928c4 7e69d2cf3
Author: Aleksander Morgado
Date: Thu Jun 30 19:48:23 2011 +0200
@@ -87398,7 +88867,7 @@ Date: Mon Apr 18 17:38:39 2011 -0500
1 file changed, 15 insertions(+), 4 deletions(-)
commit 5dadfa4c214be79e704eb61c135893f93a705d3a
-Merge: 487972c1 765da63a
+Merge: 487972c1a 765da63ad
Author: Dan Williams
Date: Thu Apr 14 14:20:43 2011 -0500
@@ -88165,7 +89634,7 @@ Date: Mon Jan 24 13:57:22 2011 -0600
1 file changed, 2 insertions(+), 2 deletions(-)
commit 2b2ca316a1ef9c9b30e68b44446abfe76cb1bbce
-Merge: 12f1b351 f047ca66
+Merge: 12f1b351e f047ca66a
Author: Dan Williams
Date: Mon Jan 24 13:56:40 2011 -0600
@@ -90199,7 +91668,7 @@ Date: Tue Jun 29 22:24:00 2010 -0700
3 files changed, 108 insertions(+)
commit 6e79d153efc30fb2030536f7f795c19ad4a0661a
-Merge: 72a1a6ca 5fc9f259
+Merge: 72a1a6caf 5fc9f259e
Author: Dan Williams
Date: Thu Jun 24 11:09:33 2010 -0700
@@ -92353,7 +93822,7 @@ Date: Fri Mar 12 15:31:29 2010 -0800
1 file changed, 1 insertion(+), 1 deletion(-)
commit 936533cfcc34b1bba797688049316bb8994443bd
-Merge: 9d915013 3e760488
+Merge: 9d9150133 3e760488b
Author: Dan Williams
Date: Fri Mar 12 12:40:00 2010 -0800
@@ -92370,7 +93839,7 @@ Date: Fri Mar 12 12:38:53 2010 -0800
2 files changed, 2 insertions(+), 2 deletions(-)
commit 9d91501330514d8bbd83c8f729ec5231e862e226
-Merge: 4d1e00c4 7aa6d03d
+Merge: 4d1e00c49 7aa6d03d9
Author: Dan Williams
Date: Fri Mar 12 12:21:29 2010 -0800
@@ -92441,7 +93910,7 @@ Date: Thu Mar 11 16:02:12 2010 -0800
3 files changed, 6 insertions(+), 7 deletions(-)
commit 3ec7e89f112cb65a584de84b76e207d7a804bd6f
-Merge: 479937cb 749f9c0e
+Merge: 479937cbb 749f9c0eb
Author: Dan Williams
Date: Thu Mar 11 13:43:06 2010 -0800
@@ -92570,7 +94039,7 @@ Date: Wed Mar 10 15:45:50 2010 -0800
1 file changed, 10 insertions(+), 9 deletions(-)
commit 479937cbbba560c77ec37ebf6468fe0e568986bd
-Merge: 6a32d374 e3c87e4e
+Merge: 6a32d374c e3c87e4e1
Author: Dan Williams
Date: Wed Mar 10 15:04:49 2010 -0800
@@ -92588,7 +94057,7 @@ Date: Wed Mar 10 14:57:23 2010 -0800
1 file changed, 8 insertions(+), 7 deletions(-)
commit 1979512d8dfb6428353e6bf358f908973a318095
-Merge: 8dde6bb8 b7858ba2
+Merge: 8dde6bb8d b7858ba23
Author: Dan Williams
Date: Wed Mar 10 14:50:41 2010 -0800
@@ -92861,7 +94330,7 @@ Date: Mon Mar 8 20:01:42 2010 -0800
1 file changed, 2 insertions(+), 1 deletion(-)
commit f3721a5674ef7899d9a6ef0f4c5b356720bb9833
-Merge: f6c51489 9e231c3d
+Merge: f6c514897 9e231c3d4
Author: Dan Williams
Date: Mon Mar 8 20:01:22 2010 -0800
@@ -93408,7 +94877,7 @@ Date: Mon Mar 1 09:15:01 2010 -0800
5 files changed, 24 insertions(+), 14 deletions(-)
commit f6c514897e40e768b180963f2782ed60527ffaa6
-Merge: 7a0373af 9d7cb0dd
+Merge: 7a0373afe 9d7cb0ddc
Author: Dan Williams
Date: Mon Mar 1 09:07:05 2010 -0800
@@ -93791,7 +95260,7 @@ Date: Sun Feb 21 11:22:16 2010 -0800
2 files changed, 12 insertions(+), 4 deletions(-)
commit 2cdefeb6dafa9d8405ddd1247967ca6e3267b1a7
-Merge: a8c7bba1 b9958e6e
+Merge: a8c7bba19 b9958e6ec
Author: Dan Williams
Date: Sat Feb 20 14:58:04 2010 -0800
@@ -93858,7 +95327,7 @@ Date: Sat Feb 20 14:53:43 2010 -0800
1 file changed, 9 insertions(+), 3 deletions(-)
commit 9d8e892ffe602a123697a5f65393b5752129de09
-Merge: c916ea7b 9185ce98
+Merge: c916ea7b4 9185ce987
Author: Dan Williams
Date: Sat Feb 20 12:49:22 2010 -0800
@@ -94230,7 +95699,7 @@ Date: Fri Jan 22 14:11:24 2010 -0800
4 files changed, 16 deletions(-)
commit ed885b7595294115b5cde8755c754515294f27cc
-Merge: a919c835 e9840144
+Merge: a919c8358 e98401440
Author: Dan Williams
Date: Tue Jan 19 15:07:03 2010 -0800
@@ -94366,7 +95835,7 @@ Date: Tue Jan 19 11:53:45 2010 -0800
1 file changed, 13 insertions(+), 9 deletions(-)
commit 28eca600f7f1a0387a99c51d35179d81dc3fec59
-Merge: 50ad39b2 b1992f90
+Merge: 50ad39b28 b1992f903
Author: Dan Williams
Date: Tue Jan 19 00:21:10 2010 -0800
@@ -94833,7 +96302,7 @@ Date: Mon Dec 7 22:07:58 2009 -0800
1 file changed, 1 insertion(+), 1 deletion(-)
commit dd057d28e4ab3812eebd41a7df1c2f80d90d8600
-Merge: f715e0d4 a9e06244
+Merge: f715e0d49 a9e062442
Author: Dan Williams
Date: Mon Dec 7 22:04:28 2009 -0800
@@ -95066,7 +96535,7 @@ Date: Tue Dec 1 11:25:28 2009 -0800
1 file changed, 1 insertion(+), 1 deletion(-)
commit 881a725ea47e059023a268404368346d232dd15a
-Merge: 909b8b7c b46ac89f
+Merge: 909b8b7c8 b46ac89ff
Author: Dan Williams
Date: Tue Dec 1 11:22:00 2009 -0800
@@ -95108,7 +96577,7 @@ Date: Mon Nov 30 17:42:37 2009 -0800
1 file changed, 24 insertions(+)
commit 909b8b7c8dbe2de97d9550004641c70411d92c56
-Merge: c463b5a4 0f595adb
+Merge: c463b5a40 0f595adb7
Author: Dan Williams
Date: Mon Nov 30 15:44:20 2009 -0800
@@ -95368,7 +96837,7 @@ Date: Tue Nov 24 00:43:20 2009 -0800
1 file changed, 1 insertion(+), 1 deletion(-)
commit c463b5a4005b9e55d0faeb887debe327118ef230
-Merge: 3be4a151 9e92bceb
+Merge: 3be4a1518 9e92bceb0
Author: Dan Williams
Date: Tue Nov 24 00:20:52 2009 -0800
@@ -95388,7 +96857,7 @@ Date: Tue Nov 24 00:19:27 2009 -0800
1 file changed, 20 insertions(+), 32 deletions(-)
commit 3be4a15189aef361187b86df64f62ca70284dee3
-Merge: d8ff5f74 e5b5c833
+Merge: d8ff5f74e e5b5c8339
Author: Dan Williams
Date: Mon Nov 23 23:48:26 2009 -0800
@@ -95451,7 +96920,7 @@ Date: Tue Nov 17 14:16:24 2009 -0800
1 file changed, 1 insertion(+), 1 deletion(-)
commit 3c6e4056e7cded28e612a76d9321f54fb1b51ce2
-Merge: 9bbc6ab5 74f679ac
+Merge: 9bbc6ab53 74f679acd
Author: Dan Williams
Date: Fri Nov 6 15:11:01 2009 -0800
@@ -95979,7 +97448,7 @@ Date: Tue Oct 6 11:39:40 2009 -0700
3 files changed, 77 insertions(+), 13 deletions(-)
commit 912b98723b2965b9aaf1f0328781a2730d7cc178
-Merge: 3b19a857 aa78b5f5
+Merge: 3b19a8572 aa78b5f5e
Author: Dan Williams
Date: Mon Oct 5 09:52:01 2009 -0700
@@ -96565,7 +98034,7 @@ Date: Mon Jun 29 23:11:43 2009 -0400
2 files changed, 6 insertions(+), 1 deletion(-)
commit 5298be26ddf580681a4a506cf0379996d7eb9d4d
-Merge: 5a563d56 8e3da635
+Merge: 5a563d56d 8e3da6359
Author: Dan Williams
Date: Mon Jun 29 22:54:32 2009 -0400
@@ -96685,7 +98154,7 @@ Date: Mon Jun 29 14:24:43 2009 -0400
2 files changed, 25 insertions(+), 32 deletions(-)
commit c106368ce7c06e0ae5b64cc6146ad05c3b9fa819
-Merge: ff58936f c397247c
+Merge: ff58936f1 c397247c0
Author: Dan Williams
Date: Mon Jun 29 13:14:11 2009 -0400
@@ -96774,7 +98243,7 @@ Date: Mon Jun 29 09:00:25 2009 -0400
1 file changed, 9 insertions(+), 11 deletions(-)
commit 504b4991cd3aecd358d92a9c39233e6ca09036fa
-Merge: 6077763d ef0a604d
+Merge: 6077763d9 ef0a604dc
Author: Dan Williams
Date: Mon Jun 29 07:29:57 2009 -0400
@@ -97270,7 +98739,7 @@ Date: Thu May 14 13:14:45 2009 +0300
2 files changed, 8 insertions(+), 7 deletions(-)
commit 92041d5f750ab440d278c95c1f65483aa8ebf192
-Merge: 2a3acc7a 58a48405
+Merge: 2a3acc7a3 58a48405c
Author: Dan Williams
Date: Mon May 11 06:43:43 2009 -0400
@@ -97865,7 +99334,7 @@ Date: Tue Dec 9 15:41:51 2008 +0200
12 files changed, 199 insertions(+), 182 deletions(-)
commit a504fb408aa2ba3bb495a08d948ae97bdcb1cdd6
-Merge: 793044b5 1673c6c9
+Merge: 793044b57 1673c6c99
Author: Tambet Ingo
Date: Fri Dec 5 15:57:55 2008 +0200
diff --git a/NEWS b/NEWS
index a57854ba..45018127 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,81 @@
+ModemManager 1.14.6
+-------------------------------------------
+This is a new bugfix release of ModemManager.
+
+ * QMI:
+ ** Fix missing GError initialization.
+
+ * plugins:
+ ** xmm: fix missing GError initialization.
+ ** cinterion: fix missing GError initialization.
+ ** simtech: fix missing GError initialization.
+
+
+ModemManager 1.14.4
+-------------------------------------------
+This is a new bugfix release of ModemManager.
+
+ * Location interface:
+ ** Allow cell ID only updates.
+
+ * Messaging interface:
+ ** Fixed memory leak when SMS parts being processed but device goes away.
+ ** Fixed CDMA SMS UTF-8 translation.
+ ** Allow sending UTF-16 as if it were UCS-2.
+
+ * QMI:
+ ** Increased port probing timeout to 25s.
+ ** Return error in facility locks loading if PIN status check fails.
+ ** Return FIXED_DIALING lock status when checking PIN2.
+
+ * MBIM:
+ ** Don't fail IPv4 connection if IPv4v6 was requested.
+
+ * Plugins:
+ ** telit: new ID_MM_TELIT_PORT_DELAY tag to flag devices that require
+ extended AT probing.
+ ** telit: added FN980 and LM9x0 MBIM compositions rules.
+ ** telit: fixed LM9x0 udev rules.
+ ** cinterion: configure the PLAS9 to correctly send URCs.
+ ** simtech: add SIM7070/SIM7080/SIM7090 port type hints
+
+ * i18n:
+ ** Updated Swedish and Slovak translations.
+ ** Updated package bugreport to use the gitlab issues URL.
+
+ * Several other minor improvements and fixes.
+
+
+ModemManager 1.14.2
+-------------------------------------------
+This is a new bugfix release of ModemManager.
+
+ * Modem interface:
+ ** Avoid connection status flapping if briefly unregistered.
+
+ * QMI:
+ ** Fixed parsing of USSD indications with UTF-16 data.
+ ** Perform network registration using SSSP if possible, so that settings like
+ allowed modes are not silently modified.
+ ** Fixed connection sequence so that early attempt aborts end up correctly
+ releasing network handles that may have been allocated already.
+
+ * Plugins:
+ ** telit: added port type hints for the default MEx10G1 composition.
+ ** quectel: added port type hints for the Quectel 5G RM500.
+ ** quectel: added support for MBIM devices.
+ ** cinterion: increased SWWAN connection attempt timeout to 120s.
+ ** cinterion: if user OR password given, don't set the other as (null).
+ ** cinterion: quote user/password strings in AT^SGAUTH calls.
+ ** cinterion: support ^SGAUTH syntax in IMT family.
+ ** cinterion: ignore ^SYSSTART URC.
+ ** cinterion: simplify parsing of radio/band single SCFG line.
+ ** cinterion: remove limitation to IPv4 only PDP contexts.
+
+ * Several other minor improvements and fixes.
+
+
ModemManager 1.14.0
-------------------------------------------
This is a new stable release of ModemManager.
diff --git a/configure b/configure
index 7676771c..0ddc4e6c 100755
--- a/configure
+++ b/configure
@@ -1,8 +1,8 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for ModemManager 1.14.0.
+# Generated by GNU Autoconf 2.69 for ModemManager 1.14.6.
#
-# Report bugs to .
+# Report bugs to .
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -275,10 +275,11 @@ fi
$as_echo "$0: be upgraded to zsh 4.3.4 or later."
else
$as_echo "$0: Please tell bug-autoconf@gnu.org and
-$0: modemmanager-devel@lists.freedesktop.org about your
-$0: system, including any error possibly output before this
-$0: message. Then install a modern shell, or manually run
-$0: the script under such a shell if you do have one."
+$0: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues
+$0: about your system, including any error possibly output
+$0: before this message. Then install a modern shell, or
+$0: manually run the script under such a shell if you do
+$0: have one."
fi
exit 1
fi
@@ -590,9 +591,9 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='ModemManager'
PACKAGE_TARNAME='ModemManager'
-PACKAGE_VERSION='1.14.0'
-PACKAGE_STRING='ModemManager 1.14.0'
-PACKAGE_BUGREPORT='modemmanager-devel@lists.freedesktop.org'
+PACKAGE_VERSION='1.14.6'
+PACKAGE_STRING='ModemManager 1.14.6'
+PACKAGE_BUGREPORT='https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues'
PACKAGE_URL=''
# Factoring default headers for most tests.
@@ -1607,7 +1608,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures ModemManager 1.14.0 to adapt to many kinds of systems.
+\`configure' configures ModemManager 1.14.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1677,7 +1678,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of ModemManager 1.14.0:";;
+ short | recursive ) echo "Configuration of ModemManager 1.14.6:";;
esac
cat <<\_ACEOF
@@ -1850,7 +1851,7 @@ Some influential environment variables:
Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.
-Report bugs to .
+Report bugs to .
_ACEOF
ac_status=$?
fi
@@ -1913,7 +1914,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-ModemManager configure 1.14.0
+ModemManager configure 1.14.6
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2072,9 +2073,9 @@ $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
-( $as_echo "## ------------------------------------------------------- ##
-## Report this to modemmanager-devel@lists.freedesktop.org ##
-## ------------------------------------------------------- ##"
+( $as_echo "## ---------------------------------------------------------------------------------- ##
+## Report this to https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues ##
+## ---------------------------------------------------------------------------------- ##"
) | sed "s/^/$as_me: WARNING: /" >&2
;;
esac
@@ -2282,7 +2283,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by ModemManager $as_me 1.14.0, which was
+It was created by ModemManager $as_me 1.14.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3146,7 +3147,7 @@ fi
# Define the identity of the package.
PACKAGE='ModemManager'
- VERSION='1.14.0'
+ VERSION='1.14.6'
cat >>confdefs.h <<_ACEOF
@@ -15671,8 +15672,8 @@ fi
MM_MAJOR_VERSION=1
MM_MINOR_VERSION=14
-MM_MICRO_VERSION=0
-MM_VERSION=1.14.0
+MM_MICRO_VERSION=6
+MM_VERSION=1.14.6
@@ -21831,7 +21832,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by ModemManager $as_me 1.14.0, which was
+This file was extended by ModemManager $as_me 1.14.6, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -21891,13 +21892,13 @@ $config_headers
Configuration commands:
$config_commands
-Report bugs to ."
+Report bugs to ."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-ModemManager config.status 1.14.0
+ModemManager config.status 1.14.6
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 0d5033e5..82eaf1d8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -6,7 +6,7 @@ dnl
m4_define([mm_major_version], [1])
m4_define([mm_minor_version], [14])
-m4_define([mm_micro_version], [0])
+m4_define([mm_micro_version], [6])
m4_define([mm_version],
[mm_major_version.mm_minor_version.mm_micro_version])
@@ -25,7 +25,10 @@ m4_define([mm_glib_lt_age], [6])
dnl-----------------------------------------------------------------------------
dnl autoconf, automake, libtool initialization
dnl
-AC_INIT([ModemManager],[mm_version],[modemmanager-devel@lists.freedesktop.org],[ModemManager])
+AC_INIT([ModemManager],
+ [mm_version],
+ [https://gitlab.freedesktop.org/mobile-broadband/ModemManager/issues],
+ [ModemManager])
AM_INIT_AUTOMAKE([1.11.2 subdir-objects tar-ustar no-dist-gzip dist-xz -Wno-portability])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
diff --git a/data/org.freedesktop.ModemManager1.policy.in b/data/org.freedesktop.ModemManager1.policy.in
index a44875a2..262585cb 100644
--- a/data/org.freedesktop.ModemManager1.policy.in
+++ b/data/org.freedesktop.ModemManager1.policy.in
@@ -215,6 +215,8 @@
Query network time and timezone information
Надсилання запиту щодо часу і часового поясу мережі
Ağ zaman ve saat dilimi bilgisini sorgula
+ Fråga efter nätverkstid och tidzonsinformation
+ Požadovanie informácií o sieťovom čase a časovej zóne
Запрос информации о времени и часовых поясах в сети
Consultar informações de hora e fuso horário da rede
Odpytywanie informacji o czasie sieciowym i strefie czasowej
@@ -223,6 +225,8 @@
System policy prevents querying network time information.
Правила системи забороняють надсилання запитів щодо часу мережі.
Sistem ilkesi ağ zaman bilgisini sorgulamayı engelliyor.
+ En systempolicy förhindrar frågande av nätverkstidsinformation.
+ Politika systému zabraňuje požadovaniu informácií o sieťovom čase.
Системная политика запрещает запрашивать информацию о времени в сети.
A política de sistema impede de consultar informações de horário da rede.
Ustawienia systemu uniemożliwiają odpytywanie informacji o czasie sieciowym.
@@ -280,7 +284,7 @@
查询和利用网络信息和服务
Надіслати запит і використати дані щодо мережі і служби
Ağ bilgisi ve hizmetleri sorgula ve yararlan
- Fråga och nyttja nätverksinformation och tjänster
+ Fråga efter och nyttja nätverksinformation och tjänster
Požadovanie a spracovanie sieťových informácií a služieb
Запрос, использование сетевой информации и услуг
Consultar ou utilizar serviços e informações de rede.
@@ -322,7 +326,7 @@
在移动宽带设备上查询和管理固件
Опитування та керування мікропрограмою на пристрої мобільної широкосмугової мережі
Mobil geniş bant aygıtındaki donanım yazılımını sorgula ve yönet
- Fråga och hantera fast programvara för en mobil bredbandsenhet
+ Fråga efter och hantera fast programvara för en mobil bredbandsenhet
Požadovanie a správa firmvéru mobilného širokopásmového zariadenia
Запрос и управление прошивкой на мобильном широкополосном устройстве
Consultar e gerenciar firmware em um dispositivo de banda larga móvel
diff --git a/docs/reference/api/Makefile.in b/docs/reference/api/Makefile.in
index aea4d2bb..87162496 100644
--- a/docs/reference/api/Makefile.in
+++ b/docs/reference/api/Makefile.in
@@ -647,11 +647,11 @@ distclean-generic:
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-@ENABLE_GTK_DOC_FALSE@maintainer-clean-local:
-@ENABLE_GTK_DOC_FALSE@install-data-local:
-@ENABLE_GTK_DOC_FALSE@distclean-local:
@ENABLE_GTK_DOC_FALSE@clean-local:
@ENABLE_GTK_DOC_FALSE@uninstall-local:
+@ENABLE_GTK_DOC_FALSE@distclean-local:
+@ENABLE_GTK_DOC_FALSE@install-data-local:
+@ENABLE_GTK_DOC_FALSE@maintainer-clean-local:
clean: clean-am
clean-am: clean-generic clean-libtool clean-local mostlyclean-am
diff --git a/docs/reference/api/html/ModemManager-Version-checks.html b/docs/reference/api/html/ModemManager-Version-checks.html
index 60680c8b..47d5f545 100644
--- a/docs/reference/api/html/ModemManager-Version-checks.html
+++ b/docs/reference/api/html/ModemManager-Version-checks.html
@@ -136,7 +136,7 @@ is compiled against.
MM_MICRO_VERSION
-
#define MM_MICRO_VERSION (0)
+#define MM_MICRO_VERSION (6)
Evaluates to the micro version number of ModemManager which this source
compiled against.
diff --git a/docs/reference/api/html/index.html b/docs/reference/api/html/index.html
index d73fd7b6..6e686810 100644
--- a/docs/reference/api/html/index.html
+++ b/docs/reference/api/html/index.html
@@ -36,7 +36,7 @@
- For ModemManager version 1.14.0
+ For ModemManager version 1.14.6
Copyright © 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 The ModemManager Authors
diff --git a/docs/reference/libmm-glib/Makefile.in b/docs/reference/libmm-glib/Makefile.in
index 1ebdc6e5..fd085cdb 100644
--- a/docs/reference/libmm-glib/Makefile.in
+++ b/docs/reference/libmm-glib/Makefile.in
@@ -625,11 +625,11 @@ distclean-generic:
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-@ENABLE_GTK_DOC_FALSE@install-data-local:
-@ENABLE_GTK_DOC_FALSE@maintainer-clean-local:
@ENABLE_GTK_DOC_FALSE@uninstall-local:
-@ENABLE_GTK_DOC_FALSE@clean-local:
@ENABLE_GTK_DOC_FALSE@distclean-local:
+@ENABLE_GTK_DOC_FALSE@clean-local:
+@ENABLE_GTK_DOC_FALSE@maintainer-clean-local:
+@ENABLE_GTK_DOC_FALSE@install-data-local:
clean: clean-am
clean-am: clean-generic clean-libtool clean-local mostlyclean-am
diff --git a/docs/reference/libmm-glib/html/index.html b/docs/reference/libmm-glib/html/index.html
index fe31445b..3dfea9bf 100644
--- a/docs/reference/libmm-glib/html/index.html
+++ b/docs/reference/libmm-glib/html/index.html
@@ -26,7 +26,7 @@
- For libmm-glib version 1.14.0
+ For libmm-glib version 1.14.6
Copyright © 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 The ModemManager Authors
diff --git a/include/ModemManager-version.h b/include/ModemManager-version.h
index 4edda17e..1ecfa13b 100644
--- a/include/ModemManager-version.h
+++ b/include/ModemManager-version.h
@@ -56,7 +56,7 @@
*
* Since: 1.0
*/
-#define MM_MICRO_VERSION (0)
+#define MM_MICRO_VERSION (6)
/**
* MM_CHECK_VERSION:
diff --git a/libmm-glib/mm-location-gps-nmea.c b/libmm-glib/mm-location-gps-nmea.c
index fde811fe..22e7ab46 100644
--- a/libmm-glib/mm-location-gps-nmea.c
+++ b/libmm-glib/mm-location-gps-nmea.c
@@ -243,8 +243,9 @@ mm_location_gps_nmea_get_string_variant (MMLocationGpsNmea *self)
g_return_val_if_fail (MM_IS_LOCATION_GPS_NMEA (self), NULL);
traces = mm_location_gps_nmea_get_traces (self);
- built = g_strjoinv ("\r\n", traces);
- return g_variant_ref_sink (g_variant_new_string (built));
+ if (traces)
+ built = g_strjoinv ("\r\n", traces);
+ return g_variant_ref_sink (g_variant_new_string (built ? built : ""));
}
/*****************************************************************************/
diff --git a/plugins/Makefile.am b/plugins/Makefile.am
index 6f83ad61..59f79a4a 100644
--- a/plugins/Makefile.am
+++ b/plugins/Makefile.am
@@ -1155,8 +1155,6 @@ endif
if ENABLE_PLUGIN_QUECTEL
-dist_udevrules_DATA += quectel/77-mm-quectel-port-types.rules
-
pkglib_LTLIBRARIES += libmm-plugin-quectel.la
libmm_plugin_quectel_la_SOURCES = \
quectel/mm-plugin-quectel.c \
@@ -1178,6 +1176,9 @@ libmm_plugin_quectel_la_CPPFLAGS = \
$(NULL)
libmm_plugin_quectel_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
+dist_udevrules_DATA += quectel/77-mm-quectel-port-types.rules
+AM_CFLAGS += -DTESTUDEVRULESDIR_QUECTEL=\"${srcdir}/quectel\"
+
endif
################################################################################
@@ -1196,7 +1197,7 @@ libmm_plugin_samsung_la_SOURCES = \
libmm_plugin_samsung_la_CPPFLAGS = \
$(PLUGIN_COMMON_COMPILER_FLAGS) \
$(ICERA_COMMON_COMPILER_FLAGS) \
- -DMM_MODULE_NAME=\"samsumg\" \
+ -DMM_MODULE_NAME=\"samsung\" \
$(NULL)
libmm_plugin_samsung_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
diff --git a/plugins/Makefile.in b/plugins/Makefile.in
index 5b2554eb..d1558fb4 100644
--- a/plugins/Makefile.in
+++ b/plugins/Makefile.in
@@ -329,98 +329,99 @@ noinst_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
################################################################################
# plugin: quectel
################################################################################
-@ENABLE_PLUGIN_QUECTEL_TRUE@am__append_85 = quectel/77-mm-quectel-port-types.rules
-@ENABLE_PLUGIN_QUECTEL_TRUE@am__append_86 = libmm-plugin-quectel.la
-@ENABLE_PLUGIN_QUECTEL_TRUE@@WITH_QMI_TRUE@am__append_87 = \
+@ENABLE_PLUGIN_QUECTEL_TRUE@am__append_85 = libmm-plugin-quectel.la
+@ENABLE_PLUGIN_QUECTEL_TRUE@@WITH_QMI_TRUE@am__append_86 = \
@ENABLE_PLUGIN_QUECTEL_TRUE@@WITH_QMI_TRUE@ quectel/mm-broadband-modem-qmi-quectel.c \
@ENABLE_PLUGIN_QUECTEL_TRUE@@WITH_QMI_TRUE@ quectel/mm-broadband-modem-qmi-quectel.h \
@ENABLE_PLUGIN_QUECTEL_TRUE@@WITH_QMI_TRUE@ $(NULL)
+@ENABLE_PLUGIN_QUECTEL_TRUE@am__append_87 = quectel/77-mm-quectel-port-types.rules
+@ENABLE_PLUGIN_QUECTEL_TRUE@am__append_88 = -DTESTUDEVRULESDIR_QUECTEL=\"${srcdir}/quectel\"
################################################################################
# plugin: samsung
################################################################################
-@ENABLE_PLUGIN_SAMSUNG_TRUE@am__append_88 = libmm-plugin-samsung.la
+@ENABLE_PLUGIN_SAMSUNG_TRUE@am__append_89 = libmm-plugin-samsung.la
################################################################################
# plugin: sierra (legacy)
################################################################################
-@ENABLE_PLUGIN_SIERRA_LEGACY_TRUE@am__append_89 = libmm-plugin-sierra-legacy.la
+@ENABLE_PLUGIN_SIERRA_LEGACY_TRUE@am__append_90 = libmm-plugin-sierra-legacy.la
################################################################################
# plugin: sierra (new QMI or MBIM modems)
################################################################################
-@ENABLE_PLUGIN_SIERRA_TRUE@am__append_90 = sierra/77-mm-sierra.rules
-@ENABLE_PLUGIN_SIERRA_TRUE@am__append_91 = libmm-plugin-sierra.la
+@ENABLE_PLUGIN_SIERRA_TRUE@am__append_91 = sierra/77-mm-sierra.rules
+@ENABLE_PLUGIN_SIERRA_TRUE@am__append_92 = libmm-plugin-sierra.la
################################################################################
# plugin: simtech
################################################################################
-@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_92 = libhelpers-simtech.la
-@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_93 = test-modem-helpers-simtech
-@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_94 = libmm-plugin-simtech.la
-@ENABLE_PLUGIN_SIMTECH_TRUE@@WITH_QMI_TRUE@am__append_95 = \
+@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_93 = libhelpers-simtech.la
+@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_94 = test-modem-helpers-simtech
+@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_95 = libmm-plugin-simtech.la
+@ENABLE_PLUGIN_SIMTECH_TRUE@@WITH_QMI_TRUE@am__append_96 = \
@ENABLE_PLUGIN_SIMTECH_TRUE@@WITH_QMI_TRUE@ simtech/mm-broadband-modem-qmi-simtech.c \
@ENABLE_PLUGIN_SIMTECH_TRUE@@WITH_QMI_TRUE@ simtech/mm-broadband-modem-qmi-simtech.h \
@ENABLE_PLUGIN_SIMTECH_TRUE@@WITH_QMI_TRUE@ $(NULL)
-@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_96 = simtech/77-mm-simtech-port-types.rules
-@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_97 = -DTESTUDEVRULESDIR_SIMTECH=\"${srcdir}/simtech\"
+@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_97 = simtech/77-mm-simtech-port-types.rules
+@ENABLE_PLUGIN_SIMTECH_TRUE@am__append_98 = -DTESTUDEVRULESDIR_SIMTECH=\"${srcdir}/simtech\"
################################################################################
# plugin: telit
################################################################################
-@ENABLE_PLUGIN_TELIT_TRUE@am__append_98 = libmm-plugin-telit.la
-@ENABLE_PLUGIN_TELIT_TRUE@am__append_99 = telit/77-mm-telit-port-types.rules
-@ENABLE_PLUGIN_TELIT_TRUE@am__append_100 = -DTESTUDEVRULESDIR_TELIT=\"${srcdir}/telit\"
+@ENABLE_PLUGIN_TELIT_TRUE@am__append_99 = libmm-plugin-telit.la
+@ENABLE_PLUGIN_TELIT_TRUE@am__append_100 = telit/77-mm-telit-port-types.rules
+@ENABLE_PLUGIN_TELIT_TRUE@am__append_101 = -DTESTUDEVRULESDIR_TELIT=\"${srcdir}/telit\"
################################################################################
# plugin: thuraya xt
################################################################################
-@ENABLE_PLUGIN_THURAYA_TRUE@am__append_101 = libhelpers-thuraya.la
-@ENABLE_PLUGIN_THURAYA_TRUE@am__append_102 = test-modem-helpers-thuraya
-@ENABLE_PLUGIN_THURAYA_TRUE@am__append_103 = libmm-plugin-thuraya.la
+@ENABLE_PLUGIN_THURAYA_TRUE@am__append_102 = libhelpers-thuraya.la
+@ENABLE_PLUGIN_THURAYA_TRUE@am__append_103 = test-modem-helpers-thuraya
+@ENABLE_PLUGIN_THURAYA_TRUE@am__append_104 = libmm-plugin-thuraya.la
################################################################################
# plugin: tplink
################################################################################
-@ENABLE_PLUGIN_TPLINK_TRUE@am__append_104 = libmm-plugin-tplink.la
-@ENABLE_PLUGIN_TPLINK_TRUE@am__append_105 = tplink/77-mm-tplink-port-types.rules
-@ENABLE_PLUGIN_TPLINK_TRUE@am__append_106 = -DTESTUDEVRULESDIR_TPLINK=\"${srcdir}/tplink\"
+@ENABLE_PLUGIN_TPLINK_TRUE@am__append_105 = libmm-plugin-tplink.la
+@ENABLE_PLUGIN_TPLINK_TRUE@am__append_106 = tplink/77-mm-tplink-port-types.rules
+@ENABLE_PLUGIN_TPLINK_TRUE@am__append_107 = -DTESTUDEVRULESDIR_TPLINK=\"${srcdir}/tplink\"
################################################################################
# plugin: u-blox
################################################################################
-@ENABLE_PLUGIN_UBLOX_TRUE@am__append_107 = ublox/77-mm-ublox-port-types.rules
-@ENABLE_PLUGIN_UBLOX_TRUE@am__append_108 = libhelpers-ublox.la
-@ENABLE_PLUGIN_UBLOX_TRUE@am__append_109 = $(UBLOX_ENUMS_GENERATED)
+@ENABLE_PLUGIN_UBLOX_TRUE@am__append_108 = ublox/77-mm-ublox-port-types.rules
+@ENABLE_PLUGIN_UBLOX_TRUE@am__append_109 = libhelpers-ublox.la
@ENABLE_PLUGIN_UBLOX_TRUE@am__append_110 = $(UBLOX_ENUMS_GENERATED)
-@ENABLE_PLUGIN_UBLOX_TRUE@am__append_111 = test-modem-helpers-ublox
-@ENABLE_PLUGIN_UBLOX_TRUE@am__append_112 = libmm-plugin-ublox.la
+@ENABLE_PLUGIN_UBLOX_TRUE@am__append_111 = $(UBLOX_ENUMS_GENERATED)
+@ENABLE_PLUGIN_UBLOX_TRUE@am__append_112 = test-modem-helpers-ublox
+@ENABLE_PLUGIN_UBLOX_TRUE@am__append_113 = libmm-plugin-ublox.la
################################################################################
# plugin: via
################################################################################
-@ENABLE_PLUGIN_VIA_TRUE@am__append_113 = libmm-plugin-via.la
+@ENABLE_PLUGIN_VIA_TRUE@am__append_114 = libmm-plugin-via.la
################################################################################
# plugin: wavecom (now sierra airlink)
################################################################################
-@ENABLE_PLUGIN_WAVECOM_TRUE@am__append_114 = libmm-plugin-wavecom.la
+@ENABLE_PLUGIN_WAVECOM_TRUE@am__append_115 = libmm-plugin-wavecom.la
################################################################################
# plugin: alcatel/TCT/JRD x220D and possibly others
################################################################################
-@ENABLE_PLUGIN_X22X_TRUE@am__append_115 = libmm-plugin-x22x.la
-@ENABLE_PLUGIN_X22X_TRUE@am__append_116 = x22x/77-mm-x22x-port-types.rules
-@ENABLE_PLUGIN_X22X_TRUE@am__append_117 = -DTESTUDEVRULESDIR_X22X=\"${srcdir}/x22x\"
+@ENABLE_PLUGIN_X22X_TRUE@am__append_116 = libmm-plugin-x22x.la
+@ENABLE_PLUGIN_X22X_TRUE@am__append_117 = x22x/77-mm-x22x-port-types.rules
+@ENABLE_PLUGIN_X22X_TRUE@am__append_118 = -DTESTUDEVRULESDIR_X22X=\"${srcdir}/x22x\"
################################################################################
# plugin: zte
################################################################################
-@ENABLE_PLUGIN_ZTE_TRUE@am__append_118 = libmm-plugin-zte.la
-@ENABLE_PLUGIN_ZTE_TRUE@am__append_119 = zte/77-mm-zte-port-types.rules
-@ENABLE_PLUGIN_ZTE_TRUE@am__append_120 = -DTESTUDEVRULESDIR_ZTE=\"${srcdir}/zte\"
+@ENABLE_PLUGIN_ZTE_TRUE@am__append_119 = libmm-plugin-zte.la
+@ENABLE_PLUGIN_ZTE_TRUE@am__append_120 = zte/77-mm-zte-port-types.rules
+@ENABLE_PLUGIN_ZTE_TRUE@am__append_121 = -DTESTUDEVRULESDIR_ZTE=\"${srcdir}/zte\"
subdir = plugins
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_code_coverage.m4 \
@@ -1984,8 +1985,9 @@ AM_CFLAGS = $(WARN_CFLAGS) $(MM_CFLAGS) $(CODE_COVERAGE_CFLAGS) \
$(am__append_41) $(am__append_44) $(am__append_47) \
$(am__append_51) $(am__append_54) $(am__append_59) \
$(am__append_66) $(am__append_71) $(am__append_75) \
- $(am__append_79) $(am__append_97) $(am__append_100) \
- $(am__append_106) $(am__append_117) $(am__append_120)
+ $(am__append_79) $(am__append_88) $(am__append_98) \
+ $(am__append_101) $(am__append_107) $(am__append_118) \
+ $(am__append_121)
AM_LDFLAGS = $(WARN_LDFLAGS) $(MM_LIBS) $(CODE_COVERAGE_LDFLAGS) \
$(GUDEV_LIBS) $(NULL) $(am__append_2) $(am__append_4)
@@ -2016,9 +2018,9 @@ dist_udevrules_DATA = $(am__append_31) $(am__append_37) \
$(am__append_40) $(am__append_43) $(am__append_46) \
$(am__append_49) $(am__append_53) $(am__append_58) \
$(am__append_65) $(am__append_70) $(am__append_74) \
- $(am__append_78) $(am__append_85) $(am__append_90) \
- $(am__append_96) $(am__append_99) $(am__append_105) \
- $(am__append_107) $(am__append_116) $(am__append_119)
+ $(am__append_78) $(am__append_87) $(am__append_91) \
+ $(am__append_97) $(am__append_100) $(am__append_106) \
+ $(am__append_108) $(am__append_117) $(am__append_120)
# Helper libs
@@ -2028,8 +2030,8 @@ dist_udevrules_DATA = $(am__append_31) $(am__append_37) \
noinst_LTLIBRARIES = libmm-test-common.la $(am__append_5) \
$(am__append_8) $(am__append_13) $(am__append_19) \
$(am__append_26) $(am__append_33) $(am__append_55) \
- $(am__append_61) $(am__append_67) $(am__append_92) \
- $(am__append_101) $(am__append_108)
+ $(am__append_61) $(am__append_67) $(am__append_93) \
+ $(am__append_102) $(am__append_109)
# Plugins
pkglib_LTLIBRARIES = $(am__append_7) $(am__append_10) $(am__append_11) \
@@ -2042,17 +2044,17 @@ pkglib_LTLIBRARIES = $(am__append_7) $(am__append_10) $(am__append_11) \
$(am__append_69) $(am__append_72) $(am__append_73) \
$(am__append_76) $(am__append_77) $(am__append_80) \
$(am__append_81) $(am__append_82) $(am__append_83) \
- $(am__append_84) $(am__append_86) $(am__append_88) \
- $(am__append_89) $(am__append_91) $(am__append_94) \
- $(am__append_98) $(am__append_103) $(am__append_104) \
- $(am__append_112) $(am__append_113) $(am__append_114) \
- $(am__append_115) $(am__append_118)
+ $(am__append_84) $(am__append_85) $(am__append_89) \
+ $(am__append_90) $(am__append_92) $(am__append_95) \
+ $(am__append_99) $(am__append_104) $(am__append_105) \
+ $(am__append_113) $(am__append_114) $(am__append_115) \
+ $(am__append_116) $(am__append_119)
# Built sources
-BUILT_SOURCES = $(am__append_17) $(am__append_109)
+BUILT_SOURCES = $(am__append_17) $(am__append_110)
# Clean files
-CLEANFILES = $(am__append_18) $(am__append_110)
+CLEANFILES = $(am__append_18) $(am__append_111)
# Data files
dist_pkgdata_DATA = $(am__append_50)
@@ -2783,7 +2785,7 @@ TEST_COMMON_LIBADD_FLAGS = \
@ENABLE_PLUGIN_QUECTEL_TRUE@ quectel/mm-shared-quectel.h \
@ENABLE_PLUGIN_QUECTEL_TRUE@ quectel/mm-broadband-modem-quectel.c \
@ENABLE_PLUGIN_QUECTEL_TRUE@ quectel/mm-broadband-modem-quectel.h \
-@ENABLE_PLUGIN_QUECTEL_TRUE@ $(NULL) $(am__append_87)
+@ENABLE_PLUGIN_QUECTEL_TRUE@ $(NULL) $(am__append_86)
@ENABLE_PLUGIN_QUECTEL_TRUE@libmm_plugin_quectel_la_CPPFLAGS = \
@ENABLE_PLUGIN_QUECTEL_TRUE@ $(PLUGIN_COMMON_COMPILER_FLAGS) \
@ENABLE_PLUGIN_QUECTEL_TRUE@ -DMM_MODULE_NAME=\"quectel\" \
@@ -2800,7 +2802,7 @@ TEST_COMMON_LIBADD_FLAGS = \
@ENABLE_PLUGIN_SAMSUNG_TRUE@libmm_plugin_samsung_la_CPPFLAGS = \
@ENABLE_PLUGIN_SAMSUNG_TRUE@ $(PLUGIN_COMMON_COMPILER_FLAGS) \
@ENABLE_PLUGIN_SAMSUNG_TRUE@ $(ICERA_COMMON_COMPILER_FLAGS) \
-@ENABLE_PLUGIN_SAMSUNG_TRUE@ -DMM_MODULE_NAME=\"samsumg\" \
+@ENABLE_PLUGIN_SAMSUNG_TRUE@ -DMM_MODULE_NAME=\"samsung\" \
@ENABLE_PLUGIN_SAMSUNG_TRUE@ $(NULL)
@ENABLE_PLUGIN_SAMSUNG_TRUE@libmm_plugin_samsung_la_LDFLAGS = $(PLUGIN_COMMON_LINKER_FLAGS)
@@ -2860,7 +2862,7 @@ TEST_COMMON_LIBADD_FLAGS = \
@ENABLE_PLUGIN_SIMTECH_TRUE@ simtech/mm-shared-simtech.h \
@ENABLE_PLUGIN_SIMTECH_TRUE@ simtech/mm-broadband-modem-simtech.h \
@ENABLE_PLUGIN_SIMTECH_TRUE@ simtech/mm-broadband-modem-simtech.c \
-@ENABLE_PLUGIN_SIMTECH_TRUE@ $(NULL) $(am__append_95)
+@ENABLE_PLUGIN_SIMTECH_TRUE@ $(NULL) $(am__append_96)
@ENABLE_PLUGIN_SIMTECH_TRUE@libmm_plugin_simtech_la_CPPFLAGS = \
@ENABLE_PLUGIN_SIMTECH_TRUE@ $(PLUGIN_COMMON_COMPILER_FLAGS) \
@ENABLE_PLUGIN_SIMTECH_TRUE@ -DMM_MODULE_NAME=\"simtech\" \
diff --git a/plugins/cinterion/77-mm-cinterion-port-types.rules b/plugins/cinterion/77-mm-cinterion-port-types.rules
index f5ceee3a..51caf221 100644
--- a/plugins/cinterion/77-mm-cinterion-port-types.rules
+++ b/plugins/cinterion/77-mm-cinterion-port-types.rules
@@ -25,9 +25,11 @@ ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{ID_MM_CINTERION_MODEM_FAM
# PLS62 family non-mbim enumeration
# ttyACM0 (if #0): AT port
# ttyACM1 (if #2): AT port
-# ttyACM2 (if #4): unknown
+# ttyACM2 (if #4): can be AT or GNSS in some models, best left ignored
# ttyACM3 (if #6): unknown
# ttyACM4 (if #8): unknown
+ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{.MM_USBIFNUM}=="08", ENV{ID_MM_PORT_IGNORE}="1"
@@ -35,12 +37,12 @@ ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005b", ENV{.MM_USBIFNUM}=="08", ENV{
# PLS62 family mbim enumeration
# ttyACM0 (if #0): AT port
# ttyACM1 (if #2): AT port
-# ttyACM2 (if #4): AT port
+# ttyACM2 (if #4): can be AT or GNSS in some models, best left ignored
# ttyACM3 (if #6): unknown
# ttyACM4 (if #8): unknown
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005d", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005d", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
-ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005d", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005d", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005d", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="1e2d", ATTRS{idProduct}=="005d", ENV{.MM_USBIFNUM}=="08", ENV{ID_MM_PORT_IGNORE}="1"
diff --git a/plugins/cinterion/mm-broadband-bearer-cinterion.c b/plugins/cinterion/mm-broadband-bearer-cinterion.c
index e1a06135..f0beab4b 100644
--- a/plugins/cinterion/mm-broadband-bearer-cinterion.c
+++ b/plugins/cinterion/mm-broadband-bearer-cinterion.c
@@ -197,18 +197,24 @@ parse_auth_type (MMBearerAllowedAuth mm_auth)
}
}
-/* AT^SGAUTH=[, [, , ]] */
+/* Cinterion authentication is done with the command AT^SGAUTH,
+ whose syntax depends on the modem family, as follow:
+ - AT^SGAUTH=[, [, , ]] for the IMT family
+ - AT^SGAUTH=[, [, , ]] for the rest */
static gchar *
build_auth_string (MMBroadbandBearerCinterion *self,
+ MMCinterionModemFamily modem_family,
MMBearerProperties *config,
guint cid)
{
- const gchar *user;
- const gchar *passwd;
- gboolean has_user;
- gboolean has_passwd;
MMBearerAllowedAuth auth;
BearerCinterionAuthType encoded_auth = BEARER_CINTERION_AUTH_UNKNOWN;
+ gboolean has_user;
+ gboolean has_passwd;
+ const gchar *user;
+ const gchar *passwd;
+ g_autofree gchar *quoted_user = NULL;
+ g_autofree gchar *quoted_passwd = NULL;
user = mm_bearer_properties_get_user (config);
passwd = mm_bearer_properties_get_password (config);
@@ -222,6 +228,8 @@ build_auth_string (MMBroadbandBearerCinterion *self,
if (encoded_auth == BEARER_CINTERION_AUTH_NONE) {
if (has_user || has_passwd)
mm_obj_warn (self, "APN user/password given but 'none' authentication requested");
+ if (modem_family == MM_CINTERION_MODEM_FAMILY_IMT)
+ return g_strdup_printf ("^SGAUTH=%u,%d,\"\",\"\"", cid, encoded_auth);
return g_strdup_printf ("^SGAUTH=%u,%d", cid, encoded_auth);
}
@@ -236,7 +244,21 @@ build_auth_string (MMBroadbandBearerCinterion *self,
encoded_auth = BEARER_CINTERION_AUTH_PAP;
}
- return g_strdup_printf ("^SGAUTH=%u,%d,%s,%s", cid, encoded_auth, passwd, user);
+ quoted_user = mm_port_serial_at_quote_string (user ? user : "");
+ quoted_passwd = mm_port_serial_at_quote_string (passwd ? passwd : "");
+
+ if (modem_family == MM_CINTERION_MODEM_FAMILY_IMT)
+ return g_strdup_printf ("^SGAUTH=%u,%d,%s,%s",
+ cid,
+ encoded_auth,
+ quoted_user,
+ quoted_passwd);
+
+ return g_strdup_printf ("^SGAUTH=%u,%d,%s,%s",
+ cid,
+ encoded_auth,
+ quoted_passwd,
+ quoted_user);
}
/******************************************************************************/
@@ -376,7 +398,6 @@ dial_3gpp_context_step (GTask *task)
case DIAL_3GPP_CONTEXT_STEP_FIRST: {
MMBearerIpFamily ip_family;
- /* Only IPv4 supported by this bearer implementation for now */
ip_family = mm_bearer_properties_get_ip_type (mm_base_bearer_peek_config (MM_BASE_BEARER (ctx->self)));
if (ip_family == MM_BEARER_IP_FAMILY_NONE || ip_family == MM_BEARER_IP_FAMILY_ANY) {
gchar *ip_family_str;
@@ -387,20 +408,17 @@ dial_3gpp_context_step (GTask *task)
g_free (ip_family_str);
}
- if (ip_family != MM_BEARER_IP_FAMILY_IPV4) {
- g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
- "Only IPv4 is supported by this modem");
- g_object_unref (task);
- return;
- }
-
ctx->step++;
} /* fall through */
case DIAL_3GPP_CONTEXT_STEP_AUTH: {
gchar *command;
- command = build_auth_string (self, mm_base_bearer_peek_config (MM_BASE_BEARER (ctx->self)), ctx->cid);
+ command = build_auth_string (self,
+ mm_broadband_modem_cinterion_get_family (MM_BROADBAND_MODEM_CINTERION (ctx->modem)),
+ mm_base_bearer_peek_config (MM_BASE_BEARER (ctx->self)),
+ ctx->cid);
+
if (command) {
mm_obj_dbg (self, "dial step %u/%u: authenticating...", ctx->step, DIAL_3GPP_CONTEXT_STEP_LAST);
/* Send SGAUTH write, if User & Pass are provided.
@@ -433,7 +451,7 @@ dial_3gpp_context_step (GTask *task)
mm_base_modem_at_command_full (ctx->modem,
ctx->primary,
command,
- 90,
+ 180,
FALSE,
FALSE,
NULL,
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c
index 99875210..79e05cdb 100644
--- a/plugins/cinterion/mm-broadband-modem-cinterion.c
+++ b/plugins/cinterion/mm-broadband-modem-cinterion.c
@@ -88,6 +88,8 @@ struct _MMBroadbandModemCinterionPrivate {
GArray *cnmi_supported_ds;
GArray *cnmi_supported_bfr;
+ /* ignore regex */
+ GRegex *sysstart_regex;
/* +CIEV indications as configured via AT^SIND */
GRegex *ciev_regex;
@@ -105,6 +107,14 @@ struct _MMBroadbandModemCinterionPrivate {
MMBaseModemAtCommandAlloc *cmds;
};
+MMCinterionModemFamily
+mm_broadband_modem_cinterion_get_family (MMBroadbandModemCinterion * modem)
+{
+ g_assert_nonnull (modem);
+ return modem->priv->modem_family;
+}
+
+
/*****************************************************************************/
/* Enable unsolicited events (SMS indications) (Messaging interface) */
@@ -795,17 +805,17 @@ sind_psinfo_enable_ready (MMBaseModem *_self,
}
static void
-parent_enable_unsolicited_events_ready (MMIfaceModem3gpp *_self,
- GAsyncResult *res,
- GTask *task)
+set_urc_dest_port_ready (MMBaseModem *_self,
+ GAsyncResult *res,
+ GTask *task)
{
MMBroadbandModemCinterion *self;
g_autoptr(GError) error = NULL;
self = MM_BROADBAND_MODEM_CINTERION (_self);
- if (!iface_modem_3gpp_parent->enable_unsolicited_events_finish (_self, res, &error))
- mm_obj_warn (self, "couldn't enable parent 3GPP unsolicited events: %s", error->message);
+ if (!mm_base_modem_at_command_finish (MM_BASE_MODEM (_self), res, &error))
+ mm_obj_dbg (self, "couldn't guarantee unsolicited events are sent to the correct port: %s", error->message);
if (self->priv->sind_psinfo_support == FEATURE_SUPPORTED) {
/* Enable access technology update reporting */
@@ -822,6 +832,25 @@ parent_enable_unsolicited_events_ready (MMIfaceModem3gpp *_self,
g_object_unref (task);
}
+static void
+parent_enable_unsolicited_events_ready (MMIfaceModem3gpp *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ g_autoptr(GError) error = NULL;
+
+ if (!iface_modem_3gpp_parent->enable_unsolicited_events_finish (self, res, &error))
+ mm_obj_warn (self, "couldn't enable parent 3GPP unsolicited events: %s", error->message);
+
+ /* Make sure unsolicited events are sent to an AT port (PLS9 can default to DATA port) */
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ "^SCFG=\"URC/DstIfc\",\"app\"",
+ 5,
+ FALSE,
+ (GAsyncReadyCallback)set_urc_dest_port_ready,
+ task);
+}
+
static void
modem_3gpp_enable_unsolicited_events (MMIfaceModem3gpp *self,
GAsyncReadyCallback callback,
@@ -1946,6 +1975,8 @@ mm_broadband_modem_cinterion_init (MMBroadbandModemCinterion *self)
self->priv->ciev_regex = g_regex_new ("\\r\\n\\+CIEV:\\s*([a-z]+),(\\d+)\\r\\n",
G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
+ self->priv->sysstart_regex = g_regex_new ("\\r\\n\\^SYSSTART.*\\r\\n",
+ G_REGEX_RAW | G_REGEX_OPTIMIZE, 0, NULL);
}
static void
@@ -1967,6 +1998,7 @@ finalize (GObject *object)
g_array_unref (self->priv->cnmi_supported_bfr);
g_regex_unref (self->priv->ciev_regex);
+ g_regex_unref (self->priv->sysstart_regex);
G_OBJECT_CLASS (mm_broadband_modem_cinterion_parent_class)->finalize (object);
}
@@ -2098,15 +2130,45 @@ shared_cinterion_init (MMSharedCinterion *iface)
iface->peek_parent_time_interface = peek_parent_time_interface;
}
+static void
+setup_ports (MMBroadbandModem *_self)
+{
+ MMBroadbandModemCinterion *self = (MM_BROADBAND_MODEM_CINTERION (_self));
+ MMPortSerialAt *port;
+
+ /* Call parent's setup ports first always */
+ MM_BROADBAND_MODEM_CLASS (mm_broadband_modem_cinterion_parent_class)->setup_ports (_self);
+
+ /* Primary */
+ port = mm_base_modem_get_port_primary (MM_BASE_MODEM (self));
+ if (port) {
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ port,
+ self->priv->sysstart_regex,
+ NULL, NULL, NULL);
+ }
+
+ /* Secondary */
+ port = mm_base_modem_get_port_secondary (MM_BASE_MODEM (self));
+ if (port) {
+ mm_port_serial_at_add_unsolicited_msg_handler (
+ port,
+ self->priv->sysstart_regex,
+ NULL, NULL, NULL);
+ }
+}
+
static void
mm_broadband_modem_cinterion_class_init (MMBroadbandModemCinterionClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ MMBroadbandModemClass *broadband_modem_class = MM_BROADBAND_MODEM_CLASS (klass);
g_type_class_add_private (object_class, sizeof (MMBroadbandModemCinterionPrivate));
/* Virtual methods */
object_class->finalize = finalize;
+ broadband_modem_class->setup_ports = setup_ports;
}
/*****************************************************************************/
@@ -2125,10 +2187,12 @@ parent_signal_check_support_ready (MMIfaceModemSignal *self,
GAsyncResult *res,
GTask *task)
{
- gboolean parent_supported;
+ GError *error = NULL;
- parent_supported = iface_modem_signal_parent->check_support_finish (self, res, NULL);
- g_task_return_boolean (task, parent_supported);
+ if (!iface_modem_signal_parent->check_support_finish (self, res, &error))
+ g_task_return_error (task, error);
+ else
+ g_task_return_boolean (task, TRUE);
g_object_unref (task);
}
@@ -2143,7 +2207,7 @@ check_smoni_support (MMBaseModem *_self,
if (mm_base_modem_at_command_finish (_self, res, NULL)) {
mm_obj_dbg (self, "SMONI supported");
self->priv->smoni_support = FEATURE_SUPPORTED;
- g_task_return_boolean (task, TRUE); // otherwise the whole interface is not available
+ g_task_return_boolean (task, TRUE);
g_object_unref (task);
return;
}
@@ -2153,25 +2217,23 @@ check_smoni_support (MMBaseModem *_self,
/* Otherwise, check if the parent CESQ-based implementation works */
g_assert (iface_modem_signal_parent->check_support && iface_modem_signal_parent->check_support_finish);
- iface_modem_signal_parent->check_support (g_task_get_task_data (task),
- (GAsyncReadyCallback)parent_signal_check_support_ready,
+ iface_modem_signal_parent->check_support (MM_IFACE_MODEM_SIGNAL (self),
+ (GAsyncReadyCallback) parent_signal_check_support_ready,
task);
}
static void
-signal_check_support (MMIfaceModemSignal *_self,
+signal_check_support (MMIfaceModemSignal *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
-
- GTask *task = g_task_new (self, NULL, callback, user_data);
- g_task_set_task_data (task, _self, NULL);
+ GTask *task;
+ task = g_task_new (self, NULL, callback, user_data);
mm_base_modem_at_command (MM_BASE_MODEM (self),
"^SMONI=?",
3,
- FALSE,
+ TRUE,
(GAsyncReadyCallback) check_smoni_support,
task);
}
@@ -2214,8 +2276,9 @@ signal_load_values (MMIfaceModemSignal *_self,
gpointer user_data)
{
MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
+
if (self->priv->smoni_support == FEATURE_SUPPORTED) {
- mm_base_modem_at_command (MM_BASE_MODEM (_self),
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
"^SMONI",
3,
FALSE,
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.h b/plugins/cinterion/mm-broadband-modem-cinterion.h
index 47f0dcb4..555ee084 100644
--- a/plugins/cinterion/mm-broadband-modem-cinterion.h
+++ b/plugins/cinterion/mm-broadband-modem-cinterion.h
@@ -19,6 +19,7 @@
#define MM_BROADBAND_MODEM_CINTERION_H
#include "mm-broadband-modem.h"
+#include "mm-modem-helpers-cinterion.h"
#define MM_TYPE_BROADBAND_MODEM_CINTERION (mm_broadband_modem_cinterion_get_type ())
#define MM_BROADBAND_MODEM_CINTERION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_BROADBAND_MODEM_CINTERION, MMBroadbandModemCinterion))
@@ -48,4 +49,6 @@ MMBroadbandModemCinterion *mm_broadband_modem_cinterion_new (const gchar *device
guint16 vendor_id,
guint16 product_id);
+MMCinterionModemFamily mm_broadband_modem_cinterion_get_family (MMBroadbandModemCinterion * modem);
+
#endif /* MM_BROADBAND_MODEM_CINTERION_H */
diff --git a/plugins/cinterion/mm-modem-helpers-cinterion.c b/plugins/cinterion/mm-modem-helpers-cinterion.c
index 9041960f..095e396c 100644
--- a/plugins/cinterion/mm-modem-helpers-cinterion.c
+++ b/plugins/cinterion/mm-modem-helpers-cinterion.c
@@ -270,13 +270,8 @@ mm_cinterion_parse_scfg_test (const gchar *response,
*format = MM_CINTERION_RADIO_BAND_FORMAT_SINGLE;
maxbandstr = mm_get_string_unquoted_from_match_info (match_info1, 2);
- if (maxbandstr) {
- /* Handle charset conversion if the number is given in UCS2 */
- if (charset != MM_MODEM_CHARSET_UNKNOWN)
- maxbandstr = mm_charset_take_and_convert_to_utf8 (maxbandstr, charset);
-
+ if (maxbandstr)
mm_get_uint_from_str (maxbandstr, &maxband);
- }
if (maxband == 0) {
inner_error = g_error_new (MM_CORE_ERROR,
@@ -419,12 +414,8 @@ mm_cinterion_parse_scfg_response (const gchar *response,
guint current = 0;
currentstr = mm_get_string_unquoted_from_match_info (match_info, 1);
- if (currentstr) {
- /* Handle charset conversion if the number is given in UCS2 */
- if (charset != MM_MODEM_CHARSET_UNKNOWN)
- currentstr = mm_charset_take_and_convert_to_utf8 (currentstr, charset);
+ if (currentstr)
mm_get_uint_from_str (currentstr, ¤t);
- }
if (current == 0) {
inner_error = g_error_new (MM_CORE_ERROR,
diff --git a/plugins/cinterion/mm-shared-cinterion.c b/plugins/cinterion/mm-shared-cinterion.c
index 9ad03a75..5b7a360f 100644
--- a/plugins/cinterion/mm-shared-cinterion.c
+++ b/plugins/cinterion/mm-shared-cinterion.c
@@ -470,7 +470,7 @@ parent_disable_location_gathering_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
GTask *task)
{
- GError *error;
+ GError *error = NULL;
Private *priv;
priv = get_private (MM_SHARED_CINTERION (self));
@@ -727,7 +727,7 @@ parent_enable_location_gathering_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
GTask *task)
{
- GError *error;
+ GError *error = NULL;
Private *priv;
priv = get_private (MM_SHARED_CINTERION (self));
diff --git a/plugins/cinterion/tests/test-modem-helpers-cinterion.c b/plugins/cinterion/tests/test-modem-helpers-cinterion.c
index b23a356e..35123283 100644
--- a/plugins/cinterion/tests/test-modem-helpers-cinterion.c
+++ b/plugins/cinterion/tests/test-modem-helpers-cinterion.c
@@ -509,23 +509,6 @@ test_scfg_response_2g (void)
g_array_unref (expected_bands);
}
-static void
-test_scfg_response_2g_ucs2 (void)
-{
- GArray *expected_bands;
- MMModemBand single;
- const gchar *response =
- "^SCFG: \"Radio/Band\",\"0031\",\"0031\"\r\n"
- "\r\n";
-
- expected_bands = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 9);
- single = MM_MODEM_BAND_EGSM, g_array_append_val (expected_bands, single);
-
- common_test_scfg_response (response, MM_MODEM_CHARSET_UCS2, expected_bands, MM_CINTERION_MODEM_FAMILY_DEFAULT, MM_CINTERION_RADIO_BAND_FORMAT_SINGLE);
-
- g_array_unref (expected_bands);
-}
-
static void
test_scfg_response_3g (void)
{
@@ -1629,7 +1612,6 @@ int main (int argc, char **argv)
g_test_add_func ("/MM/cinterion/scfg/alas5", test_scfg_alas5);
g_test_add_func ("/MM/cinterion/scfg/response/3g", test_scfg_response_3g);
g_test_add_func ("/MM/cinterion/scfg/response/2g", test_scfg_response_2g);
- g_test_add_func ("/MM/cinterion/scfg/response/2g/ucs2", test_scfg_response_2g_ucs2);
g_test_add_func ("/MM/cinterion/scfg/response/pls62/gsm", test_scfg_response_pls62_gsm);
g_test_add_func ("/MM/cinterion/scfg/response/pls62/ucs2",test_scfg_response_pls62_ucs2);
g_test_add_func ("/MM/cinterion/scfg/response/alas5", test_scfg_response_alas5);
diff --git a/plugins/quectel/77-mm-quectel-port-types.rules b/plugins/quectel/77-mm-quectel-port-types.rules
index caa7b10e..54778d24 100644
--- a/plugins/quectel/77-mm-quectel-port-types.rules
+++ b/plugins/quectel/77-mm-quectel-port-types.rules
@@ -57,4 +57,14 @@ ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{.MM_USBIFNUM}=="01", ENV{
ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0125", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+# Quectel RM500
+# ttyUSB0 (if #0): QCDM/DIAG port
+# ttyUSB1 (if #1): GPS data port
+# ttyUSB2 (if #2): AT primary port
+# ttyUSB3 (if #3): AT secondary port
+ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0800", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_TYPE_QCDM}="1"
+ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0800", ENV{.MM_USBIFNUM}=="01", ENV{ID_MM_PORT_TYPE_GPS}="1"
+ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0800", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="2c7c", ATTRS{idProduct}=="0800", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+
LABEL="mm_quectel_port_types_end"
diff --git a/plugins/quectel/mm-plugin-quectel.c b/plugins/quectel/mm-plugin-quectel.c
index 12e4612e..7d0988b2 100644
--- a/plugins/quectel/mm-plugin-quectel.c
+++ b/plugins/quectel/mm-plugin-quectel.c
@@ -27,6 +27,10 @@
#include "mm-broadband-modem-qmi-quectel.h"
#endif
+#if defined WITH_MBIM
+#include "mm-broadband-modem-mbim.h"
+#endif
+
G_DEFINE_TYPE (MMPluginQuectel, mm_plugin_quectel, MM_TYPE_PLUGIN)
MM_PLUGIN_DEFINE_MAJOR_VERSION
@@ -54,6 +58,17 @@ create_modem (MMPlugin *self,
}
#endif
+#if defined WITH_MBIM
+ if (mm_port_probe_list_has_mbim_port (probes)) {
+ mm_obj_dbg (self, "MBIM-powered Quectel modem found...");
+ return MM_BASE_MODEM (mm_broadband_modem_mbim_new (uid,
+ drivers,
+ mm_plugin_get_name (self),
+ vendor,
+ product));
+ }
+#endif
+
return MM_BASE_MODEM (mm_broadband_modem_quectel_new (uid,
drivers,
mm_plugin_get_name (self),
@@ -79,6 +94,7 @@ mm_plugin_create (void)
MM_PLUGIN_ALLOWED_AT, TRUE,
MM_PLUGIN_ALLOWED_QCDM, TRUE,
MM_PLUGIN_ALLOWED_QMI, TRUE,
+ MM_PLUGIN_ALLOWED_MBIM, TRUE,
NULL));
}
diff --git a/plugins/simtech/77-mm-simtech-port-types.rules b/plugins/simtech/77-mm-simtech-port-types.rules
index c138ed96..9f9e21d1 100644
--- a/plugins/simtech/77-mm-simtech-port-types.rules
+++ b/plugins/simtech/77-mm-simtech-port-types.rules
@@ -37,4 +37,18 @@ ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9001", ENV{.MM_USBIFNUM}=="02", ENV{
ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9001", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9001", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_TYPE_AUDIO}="1"
+# SIM7070, SIM7080, SIM7090 (default layout)...
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9205", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_TYPE_QCDM}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9205", ENV{.MM_USBIFNUM}=="01", ENV{ID_MM_PORT_TYPE_GPS}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9205", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9205", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_TYPE_AT_PPP}="1"
+
+# SIM7070, SIM7080, SIM7090 (secondary layout)...
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9206", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_TYPE_QCDM}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9206", ENV{.MM_USBIFNUM}=="01", ENV{ID_MM_PORT_TYPE_GPS}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9206", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9206", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9206", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1e0e", ATTRS{idProduct}=="9206", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_PPP}="1"
+
LABEL="mm_simtech_port_types_end"
diff --git a/plugins/simtech/mm-shared-simtech.c b/plugins/simtech/mm-shared-simtech.c
index 0d3da877..f6921b61 100644
--- a/plugins/simtech/mm-shared-simtech.c
+++ b/plugins/simtech/mm-shared-simtech.c
@@ -304,7 +304,7 @@ parent_disable_location_gathering_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
GTask *task)
{
- GError *error;
+ GError *error = NULL;
Private *priv;
priv = get_private (MM_SHARED_SIMTECH (self));
@@ -436,7 +436,7 @@ parent_enable_location_gathering_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
GTask *task)
{
- GError *error;
+ GError *error = NULL;
Private *priv;
priv = get_private (MM_SHARED_SIMTECH (self));
diff --git a/plugins/telit/77-mm-telit-port-types.rules b/plugins/telit/77-mm-telit-port-types.rules
index edacd9e3..4132bd2a 100644
--- a/plugins/telit/77-mm-telit-port-types.rules
+++ b/plugins/telit/77-mm-telit-port-types.rules
@@ -33,12 +33,33 @@ ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1010", ENV{.MM_USBIFNUM}=="03", ENV{
# CE910-DUAL
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1011", ENV{.MM_USBIFNUM}=="01", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
-# LE922
+# LE922, LM9x0
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_IGNORE}="1"
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1"
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_IGNORE}="1"
+
+# LE922, LM9x0 (MBIM composition)
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{.MM_USBIFNUM}=="07", ENV{ID_MM_PORT_IGNORE}="1"
+
+# FN980
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{.MM_USBIFNUM}=="03", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_IGNORE}="1"
+
+# FN980 (MBIM composition)
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{.MM_USBIFNUM}=="04", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{.MM_USBIFNUM}=="07", ENV{ID_MM_PORT_IGNORE}="1"
# LE910C1 with default usb cfg
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1201", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
@@ -47,15 +68,34 @@ ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1201", ENV{.MM_USBIFNUM}=="04", ENV{
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1201", ENV{.MM_USBIFNUM}=="05", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1201", ENV{.MM_USBIFNUM}=="06", ENV{ID_MM_PORT_IGNORE}="1"
-# ME910
+# ME910C1
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1101", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1101", ENV{.MM_USBIFNUM}=="01", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1101", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+# MEx10G1
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="110a", ENV{.MM_USBIFNUM}=="00", ENV{ID_MM_PORT_IGNORE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="110a", ENV{.MM_USBIFNUM}=="01", ENV{ID_MM_PORT_TYPE_AT_PRIMARY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="110a", ENV{.MM_USBIFNUM}=="02", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1"
+
# LM940/960 use alternate settings for 3G band management
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="0x1040", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="0x1041", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="0x1042", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
-ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="0x1043", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1042", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1043", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+
+# FN980 use alternate settings for 3G band management
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{ID_MM_TELIT_BND_ALTERNATE}="1"
+
+# LM940/960 initial port delay
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1040", ENV{ID_MM_TELIT_PORT_DELAY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1041", ENV{ID_MM_TELIT_PORT_DELAY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1042", ENV{ID_MM_TELIT_PORT_DELAY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1043", ENV{ID_MM_TELIT_PORT_DELAY}="1"
+
+# FN980 initial port delay
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1050", ENV{ID_MM_TELIT_PORT_DELAY}="1"
+ATTRS{idVendor}=="1bc7", ATTRS{idProduct}=="1051", ENV{ID_MM_TELIT_PORT_DELAY}="1"
LABEL="mm_telit_port_types_end"
diff --git a/plugins/telit/mm-broadband-modem-telit.c b/plugins/telit/mm-broadband-modem-telit.c
index 48ae4de1..8fc869c1 100644
--- a/plugins/telit/mm-broadband-modem-telit.c
+++ b/plugins/telit/mm-broadband-modem-telit.c
@@ -507,7 +507,7 @@ telit_qss_unsolicited_handler (MMPortSerialAt *port,
if ((prev_qss_status == QSS_STATUS_SIM_REMOVED && cur_qss_status != QSS_STATUS_SIM_REMOVED) ||
(prev_qss_status > QSS_STATUS_SIM_REMOVED && cur_qss_status == QSS_STATUS_SIM_REMOVED)) {
mm_obj_info (self, "QSS handler: SIM swap detected");
- mm_broadband_modem_update_sim_hot_swap_detected (MM_BROADBAND_MODEM (self));
+ mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self));
}
}
diff --git a/plugins/telit/mm-common-telit.c b/plugins/telit/mm-common-telit.c
index 0493fd54..f53f5b75 100644
--- a/plugins/telit/mm-common-telit.c
+++ b/plugins/telit/mm-common-telit.c
@@ -17,6 +17,7 @@
#include "mm-common-telit.h"
#include "mm-log-object.h"
+#include "mm-serial-parsers.h"
/*****************************************************************************/
@@ -28,6 +29,11 @@
#define TELIT_GE910_FAMILY_PID 0x0022
+/* The following number of retries of the port responsiveness
+ * check allows having up to 30 seconds of wait, that should
+ * be fine for most of the modems */
+#define TELIT_PORT_CHECK_RETRIES 6
+
gboolean
telit_grab_port (MMPlugin *self,
MMBaseModem *modem,
@@ -88,6 +94,7 @@ typedef struct {
MMPortSerialAt *port;
gboolean getportcfg_done;
guint getportcfg_retries;
+ guint port_responsive_retries;
} TelitCustomInitContext;
gboolean
@@ -274,6 +281,67 @@ out:
g_object_unref (task);
}
+static void at_ready (MMPortSerialAt *port,
+ GAsyncResult *res,
+ GTask *task);
+
+static void
+wait_for_ready (GTask *task)
+{
+ TelitCustomInitContext *ctx;
+
+ ctx = g_task_get_task_data (task);
+
+ if (ctx->port_responsive_retries == 0) {
+ telit_custom_init_step (task);
+ return;
+ }
+ ctx->port_responsive_retries--;
+
+ mm_port_serial_at_command (
+ ctx->port,
+ "AT",
+ 5,
+ FALSE, /* raw */
+ FALSE, /* allow_cached */
+ g_task_get_cancellable (task),
+ (GAsyncReadyCallback)at_ready,
+ task);
+}
+
+static void
+at_ready (MMPortSerialAt *port,
+ GAsyncResult *res,
+ GTask *task)
+{
+ MMPortProbe *probe;
+ g_autoptr(GError) error = NULL;
+
+ probe = g_task_get_source_object (task);
+
+ mm_port_serial_at_command_finish (port, res, &error);
+ if (error) {
+ /* On a timeout or send error, wait */
+ if (g_error_matches (error, MM_SERIAL_ERROR, MM_SERIAL_ERROR_RESPONSE_TIMEOUT) ||
+ g_error_matches (error, MM_SERIAL_ERROR, MM_SERIAL_ERROR_SEND_FAILED)) {
+ wait_for_ready (task);
+ return;
+ }
+ /* On an unknown error, make it fatal */
+ if (!mm_serial_parser_v1_is_known_error (error)) {
+ mm_obj_warn (probe, "custom port initialization logic failed: %s", error->message);
+ g_task_return_boolean (task, TRUE);
+ g_object_unref (task);
+ return;
+ }
+ }
+
+ /* When successful mark the port as AT and continue checking #PORTCFG */
+ mm_obj_dbg (probe, "port is AT");
+ mm_port_probe_set_result_at (probe, TRUE);
+ telit_custom_init_step (task);
+}
+
void
telit_custom_init (MMPortProbe *probe,
MMPortSerialAt *port,
@@ -283,15 +351,27 @@ telit_custom_init (MMPortProbe *probe,
{
TelitCustomInitContext *ctx;
GTask *task;
+ gboolean wait_needed;
ctx = g_slice_new (TelitCustomInitContext);
ctx->port = g_object_ref (port);
ctx->getportcfg_done = FALSE;
ctx->getportcfg_retries = 3;
-
+ ctx->port_responsive_retries = TELIT_PORT_CHECK_RETRIES;
task = g_task_new (probe, cancellable, callback, user_data);
g_task_set_check_cancellable (task, FALSE);
g_task_set_task_data (task, ctx, (GDestroyNotify)telit_custom_init_context_free);
+ /* Some Telit modems require an initial delay for the ports to be responsive
+ * If no explicit tag is present, the modem does not need this step
+ * and can directly look for #PORTCFG support */
+ wait_needed = mm_kernel_device_get_global_property_as_boolean (mm_port_probe_peek_port (probe),
+ "ID_MM_TELIT_PORT_DELAY");
+ if (wait_needed) {
+ mm_obj_dbg (probe, "Start polling for port responsiveness");
+ wait_for_ready (task);
+ return;
+ }
+
telit_custom_init_step (task);
}
diff --git a/plugins/tests/test-udev-rules.c b/plugins/tests/test-udev-rules.c
index 36cc4120..651e02fa 100644
--- a/plugins/tests/test-udev-rules.c
+++ b/plugins/tests/test-udev-rules.c
@@ -160,6 +160,14 @@ test_fibocom (void)
}
#endif
+#if defined ENABLE_PLUGIN_QUECTEL
+static void
+test_quectel (void)
+{
+ common_test (TESTUDEVRULESDIR_QUECTEL);
+}
+#endif
+
/************************************************************/
int main (int argc, char **argv)
@@ -208,6 +216,9 @@ int main (int argc, char **argv)
#if defined ENABLE_PLUGIN_FIBOCOM
g_test_add_func ("/MM/test-udev-rules/fibocom", test_fibocom);
#endif
+#if defined ENABLE_PLUGIN_QUECTEL
+ g_test_add_func ("/MM/test-udev-rules/quectel", test_quectel);
+#endif
return g_test_run ();
}
diff --git a/plugins/xmm/mm-shared-xmm.c b/plugins/xmm/mm-shared-xmm.c
index 746aff36..8d4b0e02 100644
--- a/plugins/xmm/mm-shared-xmm.c
+++ b/plugins/xmm/mm-shared-xmm.c
@@ -1222,7 +1222,7 @@ parent_disable_location_gathering_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
GTask *task)
{
- GError *error;
+ GError *error = NULL;
Private *priv;
priv = get_private (MM_SHARED_XMM (self));
@@ -1321,7 +1321,7 @@ parent_enable_location_gathering_ready (MMIfaceModemLocation *self,
GAsyncResult *res,
GTask *task)
{
- GError *error;
+ GError *error = NULL;
Private *priv;
priv = get_private (MM_SHARED_XMM (self));
diff --git a/po/Makevars b/po/Makevars
index 9fb2d36f..a7d07754 100644
--- a/po/Makevars
+++ b/po/Makevars
@@ -41,7 +41,7 @@ PACKAGE_GNU = no
# It can be your email address, or a mailing list address where translators
# can write to without being subscribed, or the URL of a web page through
# which the translators can contact you.
-MSGID_BUGS_ADDRESS = modemmanager-devel@lists.freedesktop.org
+MSGID_BUGS_ADDRESS =
# This is the list of locale categories, beyond LC_MESSAGES, for which the
# message catalogs shall be used. It is usually empty.
diff --git a/po/ModemManager.pot b/po/ModemManager.pot
index d2f5a56d..d79f52b4 100644
--- a/po/ModemManager.pot
+++ b/po/ModemManager.pot
@@ -6,9 +6,10 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: ModemManager 1.14.0\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-06-23 14:06+0200\n"
+"Project-Id-Version: ModemManager 1.14.6\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-10-14 14:47+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
diff --git a/po/cs.gmo b/po/cs.gmo
index 676be295ef1b6d0793b1a5cf555b4baffc508e8c..a86b1be014997be9910ef91133f917139686310d 100644
GIT binary patch
delta 227
zcmWN_y-vbV9ES0?(JI))xfj4hVh=Gat%k+9h6HvwP5=D}&_m9tvlDS~aNr7@abn;q
zyZ{EBS-b)k-s$(``3aBV=l1Q_1Kxe$5rA9+5A=)n=pP-^iw-cLQ#zq*I-&6IElF65717)jbbu24YnEoH1Wk=D4bj{Y+T0sz_706+
zBIuod4^OEV`t5mnD?nBSrT`W-U_vw6r60PaB^^+!4y@>o&ghGd=#Q?c*#O4$PK6e9
zONUJ$rVr}Vwg$NLtf2*y@#U~+C%2Sqr58qygrR+~J&F5{oFteBev&4J8;dxS?9=FI
LM6s9G)s6ZGOy4Ee
diff --git a/po/cs.po b/po/cs.po
index 205d21f1..9f61993e 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,8 +7,9 @@
msgid ""
msgstr ""
"Project-Id-Version: ModemManager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2017-10-21 15:32+0200\n"
"Last-Translator: Marek Černocký \n"
"Language-Team: čeština \n"
diff --git a/po/da.gmo b/po/da.gmo
index 61d05f2f5239c7175df07be3ecef06a80a498c8a..59466cbffcf64e1200444661f240a9a2d4150689 100644
GIT binary patch
delta 228
zcmXBIu}Z^000!Vc#n@VhZdv*Q?U0-zA_l~YbWEpG=y)M#3?{iWcLg^`1wozN+`EN7
zh*KvYp$|~H^arO8zHe{seXU*=4)E#%V*tBj;DX+^fj%|#j(*ZJ`b%$Us{>ro5gpKH
zI;TJMlJ4n@o}T~{`bH()&?&v{{{Kf8Jq#It44<}7o6vbbx_`8`GNBM@W^)+_54BQ>
pGEY`lfv!_g=s3%jAJ$)oAP5?)CK(zGgFT11=Vb3;wP~=J{RZ36Wb#AA
zX7MAuU^;Ma?!`S{_n`qCO<)Y*WdR-9C<8S*qa&(mo8IYwerS(2ZNQ@oI;RKPrEeNi
zw*pM4q!E44DXlyIR}QLZF`f*cex0IkoJyX|Vj*R;i4u|fvDk@pn68vo!7>*j7HX}t
MZIIs-{#%Pia*;ojI7qHMXSSna}0z1!P
zXYT==f#G#C7yE9XPseKsm{`CFz^@8)s8a)`bWR8KMjiU4F74C-MVE9)Uvxvu4PZeN
zI-_s8r0piqr+dmfa0V@wdA3T2%6MHAnQ?^(qav1mZiW5s
afiKfQcsfvtCsP@!Ttvp~lzBd^kM##}k1LS?
delta 185
zcmWN~y$-=p90l-GZhfR{g4{
za87da+s=9TH@~=^FAgwKz!<>C1=_S#17>tcN3@`Q`lbWw)&Zd*4e6b3>5nexv;oZN
zlP+nc3H0cS@(!GV$1\n"
"Language-Team: German \n"
diff --git a/po/fr.gmo b/po/fr.gmo
index d1bbcc3cbf9f68cc275e3849ad22cf4590b5dd79..281892ec2c2c0410363bc9c85cedb1e6adcda29f 100644
GIT binary patch
delta 227
zcmXZSyAAE#o6tK$xV*sBl(5HhOP^Vkkrf1rrPwLWI9_Z1K{{9yl&=>8}Ndb`b
z`1eC2?r9NF^iCJlDWQxe<5U7h^l@vY_UYj~Ng~@8!Vi*As>UqV+S7KCn5bc5Uo4FZ
fLhY#7NKeU?CtTy{r7Ks`*Rcq!U2A)LW%AiC09Y{*
delta 200
zcmXZSy$XT=7=_^@m03bVOU*5{BsBIX1x-Oi&}|An
zf~My^aPsb_li#m91-R9KHGonDmb707deo&8n$anJ(G9I=fJwLX_s^+I-*irA4Zx!3
zza@>h%_gv?59-mjjuu9Yiw>;lvluH`br6KM1c7z59EpdvoWx)FZjvU(Ar`SE@zO9d
K!q_P^Ra3uuwIpu<
diff --git a/po/fr.po b/po/fr.po
index 928a7953..77f6922b 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,8 +7,9 @@
msgid ""
msgstr ""
"Project-Id-Version: ModemManager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2018-08-18 16:17+0200\n"
"Last-Translator: Claude Paroz \n"
"Language-Team: French \n"
diff --git a/po/fur.gmo b/po/fur.gmo
index 852c5790f5858b18085e5ebf022b90da17cd3693..36bfa492f7b4cf0dd4378298adfa172c3bc57172 100644
GIT binary patch
delta 227
zcmWm6F-yZh0LAeaFlr4rXLmNY6eKB#*r`gsfkW?dXA+v^LM}o#M;8&HgM(keE#T0x
zI63<@>IZNreNMkWZ+P$FXZZT@xb}c2AGif@eFRMC3q7OX^oIV@OBx>oGrFV~bVJAV
zk7iVifGfJ9hW^kynw$UyeWQvZ0OlkMaEh4m#o_;OH^koa!L;c6)+IvZWnW1Z-FL=l
p;}*SbBirSowyLbmx$3OcN;X=gR+~DNjm%9aO6MMo8@7IQxCgm;FtGpt
delta 200
zcmdlcF;S3=Hk83=G~33=Hb*3=Gylx)?|+1L^fZ+6zcu2GVvwT8@K(!4pWw
z0%>y~y&OoJ0O|WcIvGfda56AB0O<-KoeHFP0_hkaEziZkkO8D?fOHa&ehQ=$fV2lU
z10RDWkg<{*V&LP=mW(|t8oBu?skym{d5P(%MY<`eWvMw1Ihn;J#d>K)si`Tc#n~nK
O1$y~K>6\n"
"Language-Team: Friulian \n"
diff --git a/po/hu.gmo b/po/hu.gmo
index fd7f2c54747fc5f24f49ad69b9c43f26945beb6d..9a6459bd3d32bec1f67d30adc1c89be72b09ba3c 100644
GIT binary patch
delta 227
zcmaDR(I`1#O?@6C14BD21A{#S1H(5q1_mo2ZN|>PAP=Mqfpj2{o(QDvfb?S^?FOWk
zI2ahbfpjL2b^+2`fpim){sp8xfpje=14Ap2J`SXFfwV6d14A8<-VLPVfwUDj14BNL
zp2f|;2ey!lhk?NwDB!x;lCg)yIisYcpx8=ZKRvS~CoxGcttd4$CAB!aB)>o}zbIWl
tH$N#eCsjA8C_gbJDKRfa-#0%cHP<&WFEKr}NI$cj6mDrvI_9O#2CsA&K`O$?O&!!JXJp`NvrYpy1JM@VUJZC3;hN5sPGd+RU?tyLg|
QBf?GO?<_xXGhN-QKX(2k@&Et;
diff --git a/po/hu.po b/po/hu.po
index a07a5bde..294e7fe0 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -6,8 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: modemmanager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2017-09-26 22:02+0000\n"
"Last-Translator: Gabor Kelemen \n"
"Language-Team: Hungarian \n"
diff --git a/po/id.gmo b/po/id.gmo
index cfc76d5404a93e8e4abe8fd03439ab20202bc8c8..4b46a773e86545f3422a8134ee275570551f6a5d 100644
GIT binary patch
delta 243
zcmew>K0{){p8A=L3=F(%3=ED83=GTJ85p#I^h+SE1f)ed7#J*pv;~j`@r$7RsX*Eo
z$UhIH4S+N=Cj)~%kTwC*;XpbCNSgxbJwVzYNPhy-Aak6!7#Q4ubPbRW0MduK7~~j&
zfD93Ch(J1!)&lZ(0BI8-{djXE<0ls9jFOUqVk>?9^vsf+#3a46qSVxs)Z*-t`~toF
wqICV-{G`mBRNbVa{KS-`#Jm)J-~5!+T;IgJ#Prl6{mkOx($wP3#cW-y02CoGg#Z8m
delta 216
zcmbOs@mGApp87gQ1_oX>1_nn428JGX1_o^)eGW(~0qI{r+7d|1azOauKpMoa0@B7n
zdJB*?0Majjv_6oQ\n"
"Language-Team: Indonesian \n"
diff --git a/po/it.gmo b/po/it.gmo
index 43738ae5131b20aacb9ed6e406d7843f3cddd08d..99bde4f8934a7d61586f5f3c7e9d00370cdf525e 100644
GIT binary patch
delta 243
zcmeB|S|v4MPyJ3t1_oX>1_mnz28QG83=Gylnu&vfK?6wJ0cm$2oere6f%JMP|2B{|
z1M-zQ85nGUbQF*_2GY}kbOw+<4Wylbvs82
zLo$%@7ATMaqyu>v80>-cCLnDNq(5zrWcgUzDz&o1c`Kld79kl%JTAl$e*I@0*{Jn(LdGmzbVfq@P(_T$)1_mnz28K243=Gyl`Z\n"
"Language-Team: Italian \n"
diff --git a/po/lt.gmo b/po/lt.gmo
index ad79cb68ac4bb6276195c72a3c0ad768302c2213..9b2fd37f5a596de47bb2645b6c31f28bcc44e5c3 100644
GIT binary patch
delta 227
zcmeB@SSm4LP5o|028MQ428I|01_oz#1_nPMy#Pq70O|KY+7(EPa4;~a1L-IroeZR#
zfV2gWeg>o+fV4a(P!32Z0BMl;ZXg{9q`v^^6d>)!#lR2>q*nv!U?9!N&A<=`q(iwG
z_!#toj4eO`2O#}qvn69Ci*rUvNkOrdzJ7XUNls#tURqIVYD#Kxc1eDLUVc%!er|qJ
qW=^VZQc-?lN>XB8ioS1tN@}ieVqRi;YLR|sadByC@#b5s25bNqfiI8%
delta 200
zcmZ1~(IqiqP5lB!28MQ428I|01_ljw1_nPM-3p{tfb(1ZO_5LkPM{L
zfwTpXJ`JQDfHVsy149&$b_LQP@dZFS5J=wy(kVb%n~Q-V6i811(!oIb8IX87NXrRF%~WEPhc>!lT?rlzD8XP4v`
O=;arsZ~n?^zy<)S(k1Hv
diff --git a/po/lt.po b/po/lt.po
index 303cd50a..e51b74dc 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -6,8 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2019-04-13 22:08+0300\n"
"Last-Translator: \n"
"Language-Team: \n"
diff --git a/po/pl.gmo b/po/pl.gmo
index 36c25f2db6e21a8e65a4e2cfe3e5174625f2bf50..2c5954107c774075b47943a3d7b61ed02c6ab944 100644
GIT binary patch
delta 243
zcmWN@u}Z^000!VcAZcxzT>_R4uI7dgR*?=$p$MT)g>)!f$R$RTT*$@Qu|pkv245ko
zgRju3n;_!k12_~)|LOaF+`aqu@v^l5#|AC{{I-B8J#7O68q+yl(M$S8@9D`gFrq0P
z(|3A9ziCX*I>3ak=_B3H8NKcT1%0JUy6d73#VmS2KtHLVt^*9|T@zS;N4F1kU79N)
ylC;ib=*5*%kup!UEsq?VXG74o8313Gl_hlgyRf*J?XJwkq{dZi2cpBzkl7A@8
diff --git a/po/pl.po b/po/pl.po
index 63849e55..4f63ccec 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -7,8 +7,9 @@
msgid ""
msgstr ""
"Project-Id-Version: ModemManager\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2019-09-28 15:02+0200\n"
"Last-Translator: Piotr Drąg \n"
"Language-Team: Polish \n"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 4e2e21f4b0edbbac067bbf408383482a8743eea0..fc413c15d119ea7fe26fbd582e3dfb3a8f406207 100644
GIT binary patch
delta 243
zcmW;CF>As=0LAeaDAB6@06I8yuDMQCLJI{!2g%TG4z^s#HAZ7D3y9W{ivh;e>gBaF^n33N5AMT-IrtMc-EgO6Sip7#R#oSzI?A37HrqWxD}g-OnX=PIs4>tR_s}f){Wj*{v3v
zx1g*RPo__O`=0XO-0`}-NI*sgx&ZERph>d{phyR_M}4Z%8|~0Htx-J*RH;XGdZrWl
zqIKFz0VBGhefp$BT2cUmt`!vi!-HYWprrwo9%zH!B18Jb%C2V#*EJWWE&PflR>EmJ
XvmgxAsV{^jf_dmIRnNDhy}XluLsBRU
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 487d7e26..12617ce2 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -6,8 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: ModemManager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2019-11-25 00:17-0300\n"
"Last-Translator: Rafael Fontenelle \n"
"Language-Team: Brazilian Portuguese \n"
diff --git a/po/ru.gmo b/po/ru.gmo
index 18ebdcec7e010df6593fd7a76c8255573ec585f2..587d7c839bf8d3bbbefe47177bf4c22cb38914da 100644
GIT binary patch
delta 243
zcmWm5u}cC`0LSs45mKFA?TL%?`EU{&T3Wj;2pxp?xYv1j=R5A5LlH!COPh;BW1`@o
zlN7kQ_g_St;L_yJ>GNH_v)ZQi{`KM>0p%j_2B2~R4CyEJX!R5r(_4B+f9Wf|J_9;*
zO}q5c0aE%zr}U31Iw}E6`cDtvybOHMh6_ySkBcf+jOTOUn>H_id%B~K)L*m<+vA&F
zo~QOoh%m}ysp=1z)`7PD+@y7rg(5L3inXUQBLgJ|f$&YB6JHKws522+JJfbzi!Eml
Dz2r4V
delta 216
zcmWm5KMMhI0LJm>qRYQKCX+0;SWdCoya*)*I^EAD>$brDPTvj0THAY^Ri%Z8BTD
z2i}0k^!YB|yLQx8*XdUR6d9NUkRrg4E~rjJQD8$0v_c
zEjmd6C;F!UZ><1ZnpS~5J*&v#!Z4D+jb>6nmA>eh7K57f3FmCb6t->j4NJJXDMq4K
Z?sYuh%eP%2OyPBXXOMSXD_F{<_z!A`Ds2D&
diff --git a/po/ru.po b/po/ru.po
index ef98b678..6849f1cc 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -6,8 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: ModemManager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2020-04-04 21:26+0300\n"
"Last-Translator: Артемий Судаков \n"
"Language-Team: Russian \n"
diff --git a/po/sk.gmo b/po/sk.gmo
index 172d654033843bc5a8e5a37328e111bbaef7dba7..89b947397c7da7406d99e16a6bc10bca1e53c9b1 100644
GIT binary patch
delta 757
zcmZ|L&r1|x9LMqRw5GYPWhN2PkD)#4?Cfr8xQG>bNNUS6f#0fl)bC|^EIEppQ;%^*8D<(38cQB6+aRk5M6_Is`
zcZiJf;5J^uCwQ$s0hu7l{UTRUV-mNqzTh|9rK#Rd7N`EvB{G8(2b%Mq;w1G;Jd1yD
z3hi#@;3|%@zr1Qa_=WSl7>+j^+Q3=rk2r-xJtDWTiUs_D^O#CB>&IwQ|HKP;rdNdi
zgk>d04wA#9J?K{kF1M?ed?S5?J%t0x5psyod}DA}>2KZFVK3oFNl&z8EEt0~R+PVL
zdMdoH{Y5i$E6Q}dV&i5_d&+dZlJ+Z3=xQ%Y#7-HBy;GyVvG+!4Aq6)c8&Ii>xwUC{-1Nm&J7JH-NP+j(77mAvCQW#!v$5Ui*mK7HM~sj6(*YF+6-K^
rv!$!LV!nIi1RSWLuBv>s&0CEtO0Dy`t7>T{, 2017.
+# Dušan Kazik , 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: ModemManager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
-"PO-Revision-Date: 2017-09-16 08:51+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-05-26 15:30+0000\n"
+"PO-Revision-Date: 2020-09-17 15:00+0200\n"
"Last-Translator: Dušan Kazik \n"
"Language-Team: Slovak \n"
"Language: sk\n"
@@ -16,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
-"X-Generator: Poedit 2.0.3\n"
+"X-Generator: Poedit 2.4.1\n"
#: data/org.freedesktop.ModemManager1.policy.in.in:13
msgid "Control the Modem Manager daemon"
@@ -72,14 +73,11 @@ msgstr "Politika systému zabraňuje hlasovým hovorom."
#: data/org.freedesktop.ModemManager1.policy.in.in:58
msgid "Query network time and timezone information"
-msgstr ""
+msgstr "Požadovanie informácií o sieťovom čase a časovej zóne"
#: data/org.freedesktop.ModemManager1.policy.in.in:59
-#, fuzzy
msgid "System policy prevents querying network time information."
-msgstr ""
-"Politika systému zabraňuje požadovaniu, alebo spracovaniu sieťových "
-"informácií a službám."
+msgstr "Politika systému zabraňuje požadovaniu informácií o sieťovom čase."
#: data/org.freedesktop.ModemManager1.policy.in.in:67
msgid "Enable and view geographic location and positioning information"
@@ -116,4 +114,4 @@ msgstr ""
#: src/mm-sleep-monitor.c:125
msgid "ModemManager needs to reset devices"
-msgstr "Služba ModemManager vyžaduje obnovenie zariadení"
+msgstr "Služba ModemManager vyžaduje obnovenie zariadení"
\ No newline at end of file
diff --git a/po/sv.gmo b/po/sv.gmo
index a9b44245e487727c6a05afae2a2e44e5e3115f9c..935826aade07adfb4e1bbdf7c7130b9772116a71 100644
GIT binary patch
delta 824
zcmY+=O=uHA6bJCPrXOjV`caEetU3@-A>C{eZE1t3t+k3a)|R%S2r_Xe$u`MMnVCiu
zA-A4|;z1C-*ptV25lSxs#hXGeUc{3}uY!2+zcGb6@ba5CnVmOpejR%?-1s)w^_(z<
z5F?0f#0kWG2R|5}VGe$Q85lo6#Nb7E2|j=c_!^GG7R!CiQh
zs6nwVqDd^Qz$@?>ycKSM*g%PHqB*Ew0&c_b!0+$_E;Z0YbPf4#FVO@Xi4vWL%Ww)l
zg=gRnoP|GN*pS;tltz6jW8z}r1-t`4!myK5F`^~70;l0yxCnp3dvL0sXaT;2%i%ga
z3uoft!9+EP`w@;KG)o5&M-Y1h_obohds)W;co=~iga+v-;t&FtZVxm|gPnN@Y7icZ
z`kPx$*-0*}3;mc$VIL`7VK%4<#--n$JW*1xKo*s*aT_Svj7Ls7@%>wyeb%V5_{4DrzBoVJcRwrIaptHB|_z!YydU{Q}PR^2!&rJeRyAv=pDTrYGIZ1k0Ywjg2Rfr(<*6Sa(TtX{y{RonupS)EC;Y8%i3ZB)fnL
z$WyET^2<_bv#RR6S`{*7#O8d@*U0%)rkU(L?sSWy6?*e(bhoi{VDj{H3|{4ra8Cd4dxoP0~x
z$a#Z-*g_xQqldrH!V`N$+StZ99AXn+V;#TaS)4A3ETWI+@CjbSk9d*a#4L*}QCPxa
z;UzBMPn^T%-v1k|;v1Sj#w*nANs$(A;7NRkUHpot@bHvK2iw@dM`+^*yp7w~q`zFK
zh^$aZaT!13DjqdOZsG>sD(ZL|YgG{!FC*s}2bUSgfgKAt$M{uum1G|u`$<{|_mG)l
z!)cPkjAMfF;Lf~&9>PP2nSV0w8Tp-3&B(XPFN|T7^i&iDanM((-BX(??1TfIX=g1}
zs;Bh*EP3E0Y2UnY-CkCk13gG$`%;i8->SRbdE2YoZiA^`Z=G>H*EJUco!KjC5bH3=
zlGL}ZCR(jo-MFVxt&`ZA4?Q;yy;iIrs`YBn=|{mJbnYh6=+DHrlIt|`FO$cN(eJ75
Q$gep0^NM5SX7#D@4~>0a+5i9m
diff --git a/po/sv.po b/po/sv.po
index 059c998c..8317d606 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,22 +1,24 @@
# Swedish translation for ModemManager.
-# Copyright (C) 2017 ModemManager's COPYRIGHT HOLDER
+# Copyright (C) 2017, 2020 ModemManager's COPYRIGHT HOLDER
# This file is distributed under the same license as the ModemManager package.
# Josef Andersson , 2017.
+# Anders Jonsson , 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: ModemManager master\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
-"PO-Revision-Date: 2017-12-04 20:28+0100\n"
-"Last-Translator: Josef Andersson \n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 15:29+0000\n"
+"PO-Revision-Date: 2020-09-18 23:56+0200\n"
+"Last-Translator: Anders Jonsson \n"
"Language-Team: Swedish \n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.0.4\n"
+"X-Generator: Poedit 2.4.1\n"
#: data/org.freedesktop.ModemManager1.policy.in.in:13
msgid "Control the Modem Manager daemon"
@@ -69,14 +71,11 @@ msgstr "En systempolicy förhindrar röstsamtal."
#: data/org.freedesktop.ModemManager1.policy.in.in:58
msgid "Query network time and timezone information"
-msgstr ""
+msgstr "Fråga efter nätverkstid och tidzonsinformation"
#: data/org.freedesktop.ModemManager1.policy.in.in:59
-#, fuzzy
msgid "System policy prevents querying network time information."
-msgstr ""
-"En systempolicy förhindrar frågande och nyttjande av nätverksinformation och "
-"tjänster."
+msgstr "En systempolicy förhindrar frågande av nätverkstidsinformation."
#: data/org.freedesktop.ModemManager1.policy.in.in:67
msgid "Enable and view geographic location and positioning information"
@@ -91,7 +90,7 @@ msgstr ""
#: data/org.freedesktop.ModemManager1.policy.in.in:76
msgid "Query and utilize network information and services"
-msgstr "Fråga och nyttja nätverksinformation och tjänster"
+msgstr "Fråga efter och nyttja nätverksinformation och tjänster"
#: data/org.freedesktop.ModemManager1.policy.in.in:77
msgid ""
@@ -103,7 +102,7 @@ msgstr ""
#: data/org.freedesktop.ModemManager1.policy.in.in:85
msgid "Query and manage firmware on a mobile broadband device"
-msgstr "Fråga och hantera fast programvara för en mobil bredbandsenhet"
+msgstr "Fråga efter och hantera fast programvara för en mobil bredbandsenhet"
#: data/org.freedesktop.ModemManager1.policy.in.in:86
msgid "System policy prevents querying or managing this device's firmware."
diff --git a/po/tr.gmo b/po/tr.gmo
index 1777d3b7108d345ab729e3c097656f0fbb63e429..bdea42b02e05b8098e48bd566496924cfc529c89 100644
GIT binary patch
delta 243
zcmew-F;jBFp8DO43=F(%3=AF&3=AjP85j(Kv=9dagAR~(0n+wBx)4a40O^fD+7n1W
z1Jb%c+JKXRK?_L70cnu>P9Plyq_+WSGa${lR2*q+Nit6_B0|q@#iKB_JINr1iKN
z-MU\n"
"Language-Team: Türkçe \n"
diff --git a/po/uk.gmo b/po/uk.gmo
index 0fab59f4a4d181a1cede1c2a382d5f01fecf1948..2cb2ccad115f3975f8b13ce3868602e6b63926ff 100644
GIT binary patch
delta 243
zcmWN@zfQtH00-b-iK!rBZP*>u)!xp);*7f{gk0037TR9DI}*aepT)t&IN;(!!V^eh
z9GrLnU&F-*aP&8Q-_OPB^7(7-)qs`{JOT*nz?#0&E{z(%3oU3yaRj`P5gpRQCNQ8S
zozri+r#HvI9SvK+6V2(A{?QG6I03e_9pDV_%x3_6(D5nIr{^KCq>J6H_j_=C?_6a&
zLZq3?WgHESQi-x-r>jVtR1`YSa&;9OEt6Q5iRkG>6+KzXR2h+3J5hF5__O9eMK&_x
delta 216
zcmWN@JqrPG00-dTmCpNHb_;{WEq3_^-bzu@)&1`h=X57Y>SCcRGME^YPvFXA@;!`L
zjFQoBdY(o0mDya~rvyZ0UXC-`lcOP4+Ads=#3U4
zK#P9qnpUI0gx=|qHe$eu{$fbu%pBstg;o+koBET$oC>cgy?r^;(u8TM1Jw|AUK3-{
aFZH|5$We4#2u(P>ku_8-+wfNMH2eqt7A*q+
diff --git a/po/uk.po b/po/uk.po
index ba2d9e04..45fe05d7 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -6,8 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: Modem Manager\n"
-"Report-Msgid-Bugs-To: modemmanager-devel@lists.freedesktop.org\n"
-"POT-Creation-Date: 2020-04-08 16:23+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.freedesktop.org/mobile-broadband/"
+"ModemManager/issues\n"
+"POT-Creation-Date: 2020-09-18 10:30+0200\n"
"PO-Revision-Date: 2019-11-10 14:35+0200\n"
"Last-Translator: Yuri Chornoivan \n"
"Language-Team: Ukrainian \n"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 9b23cbdf0bd36c077f8eb2eb2393857b829f5f2a..83adbbd278d1f2e1e65dd113f7d63fd073b672e8 100644
GIT binary patch
delta 227
zcmca2@?K=Zn)->13=Hk83=B353=ER&3=FzJIt)l_0qGVfy&g*6g37aUFfgb9<&A+f
zNL>Vwb^_APK-w5c9|O|%K>8O{+=`Qd!4k-?1=1jUwgYK1ApM1tfsa8E$k66u0Movk
zEg5@QoHI&F3W}}t_0uy;auSpD(uz`3Q&NkwOY#f!@{7{-bMuojb5eDait-avk`nV$
e^nLSFQgeM1^Agiji}W*#i%V0BH@{^~X8`~;ZZ0SQ
delta 200
zcmaDaaz$jqn))(E28MQ41_m1j28MrZ3=FzJ+M1n#K?_J{Lg^_`dOwf`$-e^9DnMF-
z1ES6rNIL=f89>??NUsLc_CWeRR9v2ufx!~UPXf{)d*%RXGa!AFlYx&x5y%kWVgS=d
zn=Ki8STu6;Q&Mwt6Y~<&Q;T#{Qp-|v9C9*?ON#Z\n"
"Language-Team: Chinese (China) \n"
diff --git a/src/kerneldevice/mm-kernel-device-generic.h b/src/kerneldevice/mm-kernel-device-generic.h
index 0eb471fc..983a6271 100644
--- a/src/kerneldevice/mm-kernel-device-generic.h
+++ b/src/kerneldevice/mm-kernel-device-generic.h
@@ -44,7 +44,9 @@ struct _MMKernelDeviceGenericClass {
MMKernelDeviceClass parent;
};
-GType mm_kernel_device_generic_get_type (void);
+GType mm_kernel_device_generic_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMKernelDeviceGeneric, g_object_unref)
+
MMKernelDevice *mm_kernel_device_generic_new (MMKernelEventProperties *properties,
GError **error);
MMKernelDevice *mm_kernel_device_generic_new_with_rules (MMKernelEventProperties *properties,
diff --git a/src/kerneldevice/mm-kernel-device-udev.h b/src/kerneldevice/mm-kernel-device-udev.h
index 9096ca71..34445b24 100644
--- a/src/kerneldevice/mm-kernel-device-udev.h
+++ b/src/kerneldevice/mm-kernel-device-udev.h
@@ -45,7 +45,9 @@ struct _MMKernelDeviceUdevClass {
MMKernelDeviceClass parent;
};
-GType mm_kernel_device_udev_get_type (void);
+GType mm_kernel_device_udev_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMKernelDeviceUdev, g_object_unref)
+
MMKernelDevice *mm_kernel_device_udev_new (GUdevDevice *udev_device);
MMKernelDevice *mm_kernel_device_udev_new_from_properties (MMKernelEventProperties *properties,
GError **error);
diff --git a/src/kerneldevice/mm-kernel-device.h b/src/kerneldevice/mm-kernel-device.h
index c66b23dd..8ef04ed9 100644
--- a/src/kerneldevice/mm-kernel-device.h
+++ b/src/kerneldevice/mm-kernel-device.h
@@ -72,6 +72,7 @@ struct _MMKernelDeviceClass {
};
GType mm_kernel_device_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMKernelDevice, g_object_unref)
const gchar *mm_kernel_device_get_subsystem (MMKernelDevice *self);
const gchar *mm_kernel_device_get_name (MMKernelDevice *self);
diff --git a/src/mm-base-bearer.h b/src/mm-base-bearer.h
index 0a94dcb6..729fa6a8 100644
--- a/src/mm-base-bearer.h
+++ b/src/mm-base-bearer.h
@@ -128,6 +128,7 @@ struct _MMBaseBearerClass {
};
GType mm_base_bearer_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseBearer, g_object_unref)
void mm_base_bearer_export (MMBaseBearer *self);
diff --git a/src/mm-base-call.h b/src/mm-base-call.h
index 8d6944f5..1b262027 100644
--- a/src/mm-base-call.h
+++ b/src/mm-base-call.h
@@ -97,6 +97,7 @@ struct _MMBaseCallClass {
};
GType mm_base_call_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseCall, g_object_unref)
/* This one can be overriden by plugins */
MMBaseCall *mm_base_call_new (MMBaseModem *modem,
diff --git a/src/mm-base-manager.h b/src/mm-base-manager.h
index 9ad83115..d70fa08f 100644
--- a/src/mm-base-manager.h
+++ b/src/mm-base-manager.h
@@ -50,6 +50,7 @@ typedef struct {
} MMBaseManagerClass;
GType mm_base_manager_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseManager, g_object_unref)
MMBaseManager *mm_base_manager_new (GDBusConnection *bus,
const gchar *plugin_dir,
diff --git a/src/mm-base-modem.h b/src/mm-base-modem.h
index 0c4b95f2..91ff8a4a 100644
--- a/src/mm-base-modem.h
+++ b/src/mm-base-modem.h
@@ -104,6 +104,7 @@ struct _MMBaseModemClass {
};
GType mm_base_modem_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseModem, g_object_unref)
guint mm_base_modem_get_dbus_id (MMBaseModem *self);
diff --git a/src/mm-base-sim.h b/src/mm-base-sim.h
index afafa376..f61621bd 100644
--- a/src/mm-base-sim.h
+++ b/src/mm-base-sim.h
@@ -136,6 +136,7 @@ struct _MMBaseSimClass {
};
GType mm_base_sim_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseSim, g_object_unref)
void mm_base_sim_new (MMBaseModem *modem,
GCancellable *cancellable,
diff --git a/src/mm-base-sms.h b/src/mm-base-sms.h
index b1e4822e..b771b90b 100644
--- a/src/mm-base-sms.h
+++ b/src/mm-base-sms.h
@@ -80,6 +80,7 @@ struct _MMBaseSmsClass {
};
GType mm_base_sms_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBaseSms, g_object_unref)
/* This one can be overridden by plugins */
MMBaseSms *mm_base_sms_new (MMBaseModem *modem);
diff --git a/src/mm-bearer-list.h b/src/mm-bearer-list.h
index 73c1454f..0d220eee 100644
--- a/src/mm-bearer-list.h
+++ b/src/mm-bearer-list.h
@@ -48,6 +48,7 @@ struct _MMBearerListClass {
};
GType mm_bearer_list_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBearerList, g_object_unref)
MMBearerList *mm_bearer_list_new (guint max_bearers,
guint max_active_bearers);
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index 57f10cb7..c90a27e5 100644
--- a/src/mm-bearer-mbim.c
+++ b/src/mm-bearer-mbim.c
@@ -570,6 +570,7 @@ connect_set_ready (MbimDevice *device,
GError *error = NULL;
MbimMessage *response;
guint32 session_id;
+ MbimContextIpType ip_type;
MbimActivationState activation_state;
guint32 nw_error;
@@ -587,25 +588,36 @@ connect_set_ready (MbimDevice *device,
&session_id,
&activation_state,
NULL, /* voice_call_state */
- NULL, /* ip_type */
+ &ip_type,
NULL, /* context_type */
&nw_error,
&inner_error)) {
- if (nw_error) {
- if (error)
- g_error_free (error);
- error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error);
- } else {
- /* Report the ip_type we originally requested, since the ip_type
- * from the response is only relevant if the requested used
- * MBIM_CONTEXT_IP_TYPE_DEFAULT, which MM never does. Some
- * devices (K5160) report the wrong type in the response.
- */
- mm_obj_dbg (self, "session ID '%u': %s (IP type: %s)",
- session_id,
- mbim_activation_state_get_string (activation_state),
- mbim_context_ip_type_get_string (ctx->ip_type));
+ /* Report the IP type we asked for and the one returned by the modem */
+ mm_obj_dbg (self, "session ID '%u': %s (requested IP type: %s, received IP type: %s, nw error: %s)",
+ session_id,
+ mbim_activation_state_get_string (activation_state),
+ mbim_context_ip_type_get_string (ctx->ip_type),
+ mbim_context_ip_type_get_string (ip_type),
+ nw_error ? mbim_nw_error_get_string (nw_error) : "none");
+ /* If the response reports an ACTIVATED state, we're good even if
+ * there is a nw_error set (e.g. asking for IPv4v6 may return a
+ * 'pdp-type-ipv4-only-allowed' nw_error). */
+ if (activation_state != MBIM_ACTIVATION_STATE_ACTIVATED &&
+ activation_state != MBIM_ACTIVATION_STATE_ACTIVATING) {
+ if (nw_error) {
+ g_clear_error (&error);
+ error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error);
+ } else if (!error) {
+ error = g_error_new (MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_GPRS_UNKNOWN,
+ "Unknown error: context activation failed");
+ }
}
+ /* We're now connected, but we may have received an IP type different to the one
+ * requested (e.g. asking for IPv4v6 but received IPv4 only). Handle that, so that
+ * the next step getting IP details doesn't get confused. */
+ else if (ctx->ip_type != ip_type)
+ ctx->ip_type = ip_type;
} else {
/* Prefer the error from the result to the parsing error */
if (!error)
diff --git a/src/mm-bearer-mbim.h b/src/mm-bearer-mbim.h
index 67dea09a..0d97d8d9 100644
--- a/src/mm-bearer-mbim.h
+++ b/src/mm-bearer-mbim.h
@@ -48,6 +48,7 @@ struct _MMBearerMbimClass {
};
GType mm_bearer_mbim_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBearerMbim, g_object_unref)
/* MBIM bearer creation implementation.
* NOTE it is *not* a broadband bearer, so not async-initable */
diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c
index 7a6c2941..23f2be98 100644
--- a/src/mm-bearer-qmi.c
+++ b/src/mm-bearer-qmi.c
@@ -463,27 +463,48 @@ connect_context_free (ConnectContext *ctx)
g_free (ctx->user);
g_free (ctx->password);
- if (ctx->packet_service_status_ipv4_indication_id) {
- common_setup_cleanup_packet_service_status_unsolicited_events (ctx->self,
- ctx->client_ipv4,
- FALSE,
- &ctx->packet_service_status_ipv4_indication_id);
- }
- if (ctx->event_report_ipv4_indication_id) {
- cleanup_event_report_unsolicited_events (ctx->self,
- ctx->client_ipv4,
- &ctx->event_report_ipv4_indication_id);
- }
- if (ctx->packet_service_status_ipv6_indication_id) {
- common_setup_cleanup_packet_service_status_unsolicited_events (ctx->self,
- ctx->client_ipv6,
- FALSE,
- &ctx->packet_service_status_ipv6_indication_id);
+ if (ctx->client_ipv4) {
+ if (ctx->packet_service_status_ipv4_indication_id) {
+ common_setup_cleanup_packet_service_status_unsolicited_events (ctx->self,
+ ctx->client_ipv4,
+ FALSE,
+ &ctx->packet_service_status_ipv4_indication_id);
+ }
+ if (ctx->event_report_ipv4_indication_id) {
+ cleanup_event_report_unsolicited_events (ctx->self,
+ ctx->client_ipv4,
+ &ctx->event_report_ipv4_indication_id);
+ }
+ if (ctx->packet_data_handle_ipv4) {
+ g_autoptr(QmiMessageWdsStopNetworkInput) input = NULL;
+
+ input = qmi_message_wds_stop_network_input_new ();
+ qmi_message_wds_stop_network_input_set_packet_data_handle (input, ctx->packet_data_handle_ipv4, NULL);
+ qmi_client_wds_stop_network (ctx->client_ipv4, input, 30, NULL, NULL, NULL);
+ }
+ g_clear_object (&ctx->client_ipv4);
}
- if (ctx->event_report_ipv6_indication_id) {
- cleanup_event_report_unsolicited_events (ctx->self,
- ctx->client_ipv6,
- &ctx->event_report_ipv6_indication_id);
+
+ if (ctx->client_ipv6) {
+ if (ctx->packet_service_status_ipv6_indication_id) {
+ common_setup_cleanup_packet_service_status_unsolicited_events (ctx->self,
+ ctx->client_ipv6,
+ FALSE,
+ &ctx->packet_service_status_ipv6_indication_id);
+ }
+ if (ctx->event_report_ipv6_indication_id) {
+ cleanup_event_report_unsolicited_events (ctx->self,
+ ctx->client_ipv6,
+ &ctx->event_report_ipv6_indication_id);
+ }
+ if (ctx->packet_data_handle_ipv6) {
+ g_autoptr(QmiMessageWdsStopNetworkInput) input = NULL;
+
+ input = qmi_message_wds_stop_network_input_new ();
+ qmi_message_wds_stop_network_input_set_packet_data_handle (input, ctx->packet_data_handle_ipv6, NULL);
+ qmi_client_wds_stop_network (ctx->client_ipv6, input, 30, NULL, NULL, NULL);
+ }
+ g_clear_object (&ctx->client_ipv6);
}
if (ctx->explicit_qmi_open)
@@ -491,8 +512,6 @@ connect_context_free (ConnectContext *ctx)
g_clear_error (&ctx->error_ipv4);
g_clear_error (&ctx->error_ipv6);
- g_clear_object (&ctx->client_ipv4);
- g_clear_object (&ctx->client_ipv6);
g_clear_object (&ctx->ipv4_config);
g_clear_object (&ctx->ipv6_config);
g_object_unref (ctx->data);
@@ -1567,6 +1586,7 @@ connect_context_step (GTask *task)
g_assert (ctx->self->priv->client_ipv4 == NULL);
if (ctx->packet_data_handle_ipv4) {
ctx->self->priv->packet_data_handle_ipv4 = ctx->packet_data_handle_ipv4;
+ ctx->packet_data_handle_ipv4 = 0;
ctx->self->priv->packet_service_status_ipv4_indication_id = ctx->packet_service_status_ipv4_indication_id;
ctx->packet_service_status_ipv4_indication_id = 0;
ctx->self->priv->event_report_ipv4_indication_id = ctx->event_report_ipv4_indication_id;
@@ -1578,6 +1598,7 @@ connect_context_step (GTask *task)
g_assert (ctx->self->priv->client_ipv6 == NULL);
if (ctx->packet_data_handle_ipv6) {
ctx->self->priv->packet_data_handle_ipv6 = ctx->packet_data_handle_ipv6;
+ ctx->packet_data_handle_ipv6 = 0;
ctx->self->priv->packet_service_status_ipv6_indication_id = ctx->packet_service_status_ipv6_indication_id;
ctx->packet_service_status_ipv6_indication_id = 0;
ctx->self->priv->event_report_ipv6_indication_id = ctx->event_report_ipv6_indication_id;
diff --git a/src/mm-bearer-qmi.h b/src/mm-bearer-qmi.h
index b29fed37..d75773f5 100644
--- a/src/mm-bearer-qmi.h
+++ b/src/mm-bearer-qmi.h
@@ -48,6 +48,7 @@ struct _MMBearerQmiClass {
};
GType mm_bearer_qmi_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBearerQmi, g_object_unref)
/* QMI bearer creation implementation.
* NOTE it is *not* a broadband bearer, so not async-initable */
diff --git a/src/mm-broadband-bearer.h b/src/mm-broadband-bearer.h
index c317bb5f..3da4f462 100644
--- a/src/mm-broadband-bearer.h
+++ b/src/mm-broadband-bearer.h
@@ -141,6 +141,7 @@ struct _MMBroadbandBearerClass {
};
GType mm_broadband_bearer_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBroadbandBearer, g_object_unref)
/* Default 3GPP bearer creation implementation */
void mm_broadband_bearer_new (MMBroadbandModem *modem,
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 8954889b..2ff3a0b4 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -3123,7 +3123,7 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED)) {
/* SIM has been removed or reinserted, re-probe to ensure correct interfaces are exposed */
mm_obj_dbg (self, "SIM hot swap detected");
- mm_broadband_modem_update_sim_hot_swap_detected (MM_BROADBAND_MODEM (self));
+ mm_broadband_modem_sim_hot_swap_detected (MM_BROADBAND_MODEM (self));
}
self->priv->last_ready_state = ready_state;
@@ -4369,20 +4369,12 @@ modem_signal_load_values_finish (MMIfaceModemSignal *self,
if (!result)
return FALSE;
- if (gsm && result->gsm) {
- *gsm = result->gsm;
- result->gsm = NULL;
- }
-
- if (umts && result->umts) {
- *umts = result->umts;
- result->umts = NULL;
- }
-
- if (lte && result->lte) {
- *lte = result->lte;
- result->lte = NULL;
- }
+ if (gsm)
+ *gsm = g_steal_pointer (&result->gsm);
+ if (umts)
+ *umts = g_steal_pointer (&result->umts);
+ if (lte)
+ *lte = g_steal_pointer (&result->lte);
signal_load_values_result_free (result);
diff --git a/src/mm-broadband-modem-mbim.h b/src/mm-broadband-modem-mbim.h
index b8cf748c..711babc8 100644
--- a/src/mm-broadband-modem-mbim.h
+++ b/src/mm-broadband-modem-mbim.h
@@ -39,6 +39,7 @@ struct _MMBroadbandModemMbimClass{
};
GType mm_broadband_modem_mbim_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBroadbandModemMbim, g_object_unref)
MMBroadbandModemMbim *mm_broadband_modem_mbim_new (const gchar *device,
const gchar **drivers,
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 357a3fae..ccf85a94 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -1445,7 +1445,8 @@ load_signal_quality_finish (MMIfaceModem *self,
#if defined WITH_NEWEST_QMI_COMMANDS
static gboolean
-common_signal_info_get_quality (gint8 cdma1x_rssi,
+common_signal_info_get_quality (MMBroadbandModemQmi *self,
+ gint8 cdma1x_rssi,
gint8 evdo_rssi,
gint8 gsm_rssi,
gint8 wcdma_rssi,
@@ -1535,7 +1536,7 @@ signal_info_get_quality (MMBroadbandModemQmi *self,
qmi_message_nas_get_signal_info_output_get_wcdma_signal_strength (output, &wcdma_rssi, NULL, NULL);
qmi_message_nas_get_signal_info_output_get_lte_signal_strength (output, <e_rssi, NULL, NULL, NULL, NULL);
- return common_signal_info_get_quality (cdma1x_rssi, evdo_rssi, gsm_rssi, wcdma_rssi, lte_rssi, out_quality, out_act);
+ return common_signal_info_get_quality (self, cdma1x_rssi, evdo_rssi, gsm_rssi, wcdma_rssi, lte_rssi, out_quality, out_act);
}
static void
@@ -1588,7 +1589,7 @@ get_signal_info_ready (QmiClientNas *client,
qmi_message_nas_get_signal_info_output_unref (output);
}
-#endif /* WITH_NEWEST_QMI_COMMANDS */
+#else /* WITH_NEWEST_QMI_COMMANDS */
static gboolean
signal_strength_get_quality_and_access_tech (MMBroadbandModemQmi *self,
@@ -1697,6 +1698,8 @@ get_signal_strength_ready (QmiClientNas *client,
qmi_message_nas_get_signal_strength_output_unref (output);
}
+#endif /* WITH_NEWEST_QMI_COMMANDS */
+
static void
load_signal_quality (MMIfaceModem *self,
GAsyncReadyCallback callback,
@@ -2168,41 +2171,65 @@ get_sim_lock_status_via_pin_status_ready (QmiClientDms *client,
MMBroadbandModemQmi *self;
LoadEnabledFacilityLocksContext *ctx;
QmiMessageDmsUimGetPinStatusOutput *output;
- gboolean enabled;
+ QmiDmsUimPinStatus current_status;
+ GError *error = NULL;
+ gboolean pin1_enabled;
+ gboolean pin2_enabled;
self = g_task_get_source_object (task);
ctx = g_task_get_task_data (task);
- output = qmi_client_dms_uim_get_pin_status_finish (client, res, NULL);
+ output = qmi_client_dms_uim_get_pin_status_finish (client, res, &error);
if (!output ||
- !qmi_message_dms_uim_get_pin_status_output_get_result (output, NULL)) {
- mm_obj_dbg (self, "couldn't query PIN status, assuming SIM PIN is disabled");
- enabled = FALSE;
- } else {
- QmiDmsUimPinStatus current_status;
+ !qmi_message_dms_uim_get_pin_status_output_get_result (output, &error)) {
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ if (output)
+ qmi_message_dms_uim_get_pin_status_output_unref (output);
+ return;
+ }
- if (qmi_message_dms_uim_get_pin_status_output_get_pin1_status (
- output,
- ¤t_status,
- NULL, /* verify_retries_left */
- NULL, /* unblock_retries_left */
- NULL)) {
- enabled = mm_pin_enabled_from_qmi_uim_pin_status (current_status);
- mm_obj_dbg (self, "PIN is reported %s", (enabled ? "enabled" : "disabled"));
- } else {
- mm_obj_dbg (self, "couldn't find PIN1 status in the result, assuming SIM PIN is disabled");
- enabled = FALSE;
- }
+ if (qmi_message_dms_uim_get_pin_status_output_get_pin1_status (
+ output,
+ ¤t_status,
+ NULL, /* verify_retries_left */
+ NULL, /* unblock_retries_left */
+ &error)) {
+ pin1_enabled = mm_pin_enabled_from_qmi_uim_pin_status (current_status);
+ mm_obj_dbg (self, "PIN1 is reported %s", (pin1_enabled ? "enabled" : "disabled"));
+ } else {
+ qmi_message_dms_uim_get_pin_status_output_unref (output);
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
}
- if (output)
+ if (qmi_message_dms_uim_get_pin_status_output_get_pin2_status (
+ output,
+ ¤t_status,
+ NULL, /* verify_retries_left */
+ NULL, /* unblock_retries_left */
+ &error)) {
+ pin2_enabled = mm_pin_enabled_from_qmi_uim_pin_status (current_status);
+ mm_obj_dbg (self, "PIN2 is reported %s", (pin2_enabled ? "enabled" : "disabled"));
+ } else {
qmi_message_dms_uim_get_pin_status_output_unref (output);
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ qmi_message_dms_uim_get_pin_status_output_unref (output);
- if (enabled) {
+ if (pin1_enabled)
ctx->locks |= (MM_MODEM_3GPP_FACILITY_SIM);
- } else {
+ else
ctx->locks &= ~(MM_MODEM_3GPP_FACILITY_SIM);
- }
+
+ if (pin2_enabled)
+ ctx->locks |= (MM_MODEM_3GPP_FACILITY_FIXED_DIALING);
+ else
+ ctx->locks &= ~(MM_MODEM_3GPP_FACILITY_FIXED_DIALING);
/* No more facilities to query, all done */
g_task_return_int (task, ctx->locks);
@@ -2589,6 +2616,8 @@ modem_3gpp_run_registration_checks_finish (MMIfaceModem3gpp *self,
return g_task_propagate_boolean (G_TASK (res), error);
}
+#if !defined WITH_NEWEST_QMI_COMMANDS
+
static void
common_process_serving_system_3gpp (MMBroadbandModemQmi *self,
QmiMessageNasGetServingSystemOutput *response_output,
@@ -2799,7 +2828,7 @@ common_process_serving_system_3gpp (MMBroadbandModemQmi *self,
qmi_indication_nas_serving_system_output_get_cid_3gpp (indication_output, &cid, NULL);
}
/* Only update info in the interface if we get something */
- if (cid && (lac || tac))
+ if (cid || lac || tac)
mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), lac, tac, cid);
/* request to reload operator info explicitly, so that the new
@@ -2845,7 +2874,7 @@ get_serving_system_3gpp_ready (QmiClientNas *client,
qmi_message_nas_get_serving_system_output_unref (output);
}
-#if defined WITH_NEWEST_QMI_COMMANDS
+#else /* WITH_NEWEST_QMI_COMMANDS */
static gboolean
process_common_info (QmiNasServiceStatus service_status,
@@ -2893,8 +2922,9 @@ process_common_info (QmiNasServiceStatus service_status,
apply_ps = FALSE;
else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_PS)
apply_cs = FALSE;
- else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_CS_PS)
+ else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_CS_PS) {
/* both apply */ ;
+ }
/* Check if we really are roaming or forbidden */
if (forbidden_valid && forbidden)
@@ -2923,7 +2953,7 @@ process_common_info (QmiNasServiceStatus service_status,
if (network_id_valid) {
*mm_operator_id = g_malloc (7);
memcpy (*mm_operator_id, mcc, 3);
- if (mnc[2] == 0xFF) {
+ if ((guint8)mnc[2] == 0xFF) {
memcpy (&((*mm_operator_id)[3]), mnc, 2);
(*mm_operator_id)[5] = '\0';
} else {
@@ -2936,7 +2966,8 @@ process_common_info (QmiNasServiceStatus service_status,
}
static gboolean
-process_gsm_info (QmiMessageNasGetSystemInfoOutput *response_output,
+process_gsm_info (MMBroadbandModemQmi *self,
+ QmiMessageNasGetSystemInfoOutput *response_output,
QmiIndicationNasSystemInfoOutput *indication_output,
MMModem3gppRegistrationState *mm_cs_registration_state,
MMModem3gppRegistrationState *mm_ps_registration_state,
@@ -3041,7 +3072,8 @@ process_gsm_info (QmiMessageNasGetSystemInfoOutput *response_output,
}
static gboolean
-process_wcdma_info (QmiMessageNasGetSystemInfoOutput *response_output,
+process_wcdma_info (MMBroadbandModemQmi *self,
+ QmiMessageNasGetSystemInfoOutput *response_output,
QmiIndicationNasSystemInfoOutput *indication_output,
MMModem3gppRegistrationState *mm_cs_registration_state,
MMModem3gppRegistrationState *mm_ps_registration_state,
@@ -3150,7 +3182,8 @@ process_wcdma_info (QmiMessageNasGetSystemInfoOutput *response_output,
}
static gboolean
-process_lte_info (QmiMessageNasGetSystemInfoOutput *response_output,
+process_lte_info (MMBroadbandModemQmi *self,
+ QmiMessageNasGetSystemInfoOutput *response_output,
QmiIndicationNasSystemInfoOutput *indication_output,
MMModem3gppRegistrationState *mm_cs_registration_state,
MMModem3gppRegistrationState *mm_ps_registration_state,
@@ -3280,7 +3313,7 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self,
* LTE > WCDMA > GSM
* The first one giving results will be the one reported.
*/
- has_lte_info = process_lte_info (response_output, indication_output,
+ has_lte_info = process_lte_info (self, response_output, indication_output,
&cs_registration_state,
&ps_registration_state,
&lac,
@@ -3288,13 +3321,13 @@ common_process_system_info_3gpp (MMBroadbandModemQmi *self,
&cid,
&operator_id);
if (!has_lte_info &&
- !process_wcdma_info (response_output, indication_output,
+ !process_wcdma_info (self, response_output, indication_output,
&cs_registration_state,
&ps_registration_state,
&lac,
&cid,
&operator_id) &&
- !process_gsm_info (response_output, indication_output,
+ !process_gsm_info (self, response_output, indication_output,
&cs_registration_state,
&ps_registration_state,
&lac,
@@ -3467,6 +3500,8 @@ ri_serving_system_or_system_info_ready (QmiClientNas *client,
g_object_unref (task);
}
+#if !defined WITH_NEWEST_QMI_COMMANDS
+
static void
common_enable_disable_unsolicited_registration_events_serving_system (GTask *task)
{
@@ -3486,7 +3521,8 @@ common_enable_disable_unsolicited_registration_events_serving_system (GTask *tas
qmi_message_nas_register_indications_input_unref (input);
}
-#if defined WITH_NEWEST_QMI_COMMANDS
+#else /* WITH_NEWEST_QMI_COMMANDS */
+
static void
common_enable_disable_unsolicited_registration_events_system_info (GTask *task)
{
@@ -3505,6 +3541,7 @@ common_enable_disable_unsolicited_registration_events_system_info (GTask *task)
task);
qmi_message_nas_register_indications_input_unref (input);
}
+
#endif /* WITH_NEWEST_QMI_COMMANDS */
static void
@@ -4553,7 +4590,8 @@ system_info_indication_cb (QmiClientNas *client,
if (mm_iface_modem_is_3gpp (MM_IFACE_MODEM (self)))
common_process_system_info_3gpp (self, NULL, output);
}
-#endif
+
+#else /* WITH_NEWEST_QMI_COMMANDS */
static void
serving_system_indication_cb (QmiClientNas *client,
@@ -4566,6 +4604,8 @@ serving_system_indication_cb (QmiClientNas *client,
common_process_serving_system_cdma (self, NULL, output);
}
+#endif
+
static void
common_setup_cleanup_unsolicited_registration_events (MMBroadbandModemQmi *self,
gboolean enable,
@@ -4757,6 +4797,8 @@ common_enable_disable_unsolicited_events_finish (MMBroadbandModemQmi *self,
return g_task_propagate_boolean (G_TASK (res), error);
}
+#if !defined WITH_NEWEST_QMI_COMMANDS
+
static void
ser_signal_strength_ready (QmiClientNas *client,
GAsyncResult *res,
@@ -4825,7 +4867,7 @@ common_enable_disable_unsolicited_events_signal_strength (GTask *task)
qmi_message_nas_set_event_report_input_unref (input);
}
-#if defined WITH_NEWEST_QMI_COMMANDS
+#else /* WITH_NEWEST_QMI_COMMANDS */
static void
ri_signal_info_ready (QmiClientNas *client,
@@ -4882,9 +4924,12 @@ config_signal_info_ready (QmiClientNas *client,
GAsyncResult *res,
GTask *task)
{
+ MMBroadbandModemQmi *self;
QmiMessageNasConfigSignalInfoOutput *output = NULL;
GError *error = NULL;
+ self = g_task_get_source_object (task);
+
output = qmi_client_nas_config_signal_info_finish (client, res, &error);
if (!output) {
mm_obj_dbg (self, "QMI operation failed: '%s'", error->message);
@@ -5118,7 +5163,8 @@ signal_info_indication_cb (QmiClientNas *client,
qmi_indication_nas_signal_info_output_get_wcdma_signal_strength (output, &wcdma_rssi, NULL, NULL);
qmi_indication_nas_signal_info_output_get_lte_signal_strength (output, <e_rssi, NULL, NULL, NULL, NULL);
- if (common_signal_info_get_quality (cdma1x_rssi,
+ if (common_signal_info_get_quality (self,
+ cdma1x_rssi,
evdo_rssi,
gsm_rssi,
wcdma_rssi,
@@ -7321,7 +7367,7 @@ ussd_indication_cb (QmiClientVoice *client,
qmi_indication_voice_ussd_output_get_user_action (output, &user_action, NULL);
if (qmi_indication_voice_ussd_output_get_uss_data_utf16 (output, &uss_data, NULL) && uss_data)
- utf8 = g_convert ((const gchar *) uss_data->data, (2 * uss_data->len), "UTF-8", "UTF16-LE", NULL, NULL, &error);
+ utf8 = g_convert ((const gchar *) uss_data->data, (2 * uss_data->len), "UTF-8", "UTF-16LE", NULL, NULL, &error);
else if (qmi_indication_voice_ussd_output_get_uss_data (output, &scheme, &uss_data, NULL) && uss_data)
utf8 = ussd_decode(scheme, uss_data, &error);
diff --git a/src/mm-broadband-modem-qmi.h b/src/mm-broadband-modem-qmi.h
index 6c79e5eb..23825068 100644
--- a/src/mm-broadband-modem-qmi.h
+++ b/src/mm-broadband-modem-qmi.h
@@ -39,6 +39,7 @@ struct _MMBroadbandModemQmiClass{
};
GType mm_broadband_modem_qmi_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBroadbandModemQmi, g_object_unref)
MMBroadbandModemQmi *mm_broadband_modem_qmi_new (const gchar *device,
const gchar **drivers,
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index a56ae354..d2e782d5 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -4132,7 +4132,7 @@ load_sim_identifier_ready (MMBaseSim *sim,
if (g_strcmp0 (current_simid, cached_simid) != 0) {
mm_obj_info (self, "sim identifier has changed: possible SIM swap during power down/low");
- mm_broadband_modem_update_sim_hot_swap_detected (self);
+ mm_broadband_modem_sim_hot_swap_detected (self);
}
g_task_return_boolean (task, TRUE);
@@ -11837,7 +11837,7 @@ after_hotswap_event_disable_ready (MMBaseModem *self,
}
void
-mm_broadband_modem_update_sim_hot_swap_detected (MMBroadbandModem *self)
+mm_broadband_modem_sim_hot_swap_detected (MMBroadbandModem *self)
{
if (self->priv->sim_hot_swap_ports_ctx) {
mm_obj_dbg (self, "releasing SIM hot swap ports context");
diff --git a/src/mm-broadband-modem.h b/src/mm-broadband-modem.h
index 8042f509..eafca857 100644
--- a/src/mm-broadband-modem.h
+++ b/src/mm-broadband-modem.h
@@ -92,6 +92,7 @@ struct _MMBroadbandModemClass {
};
GType mm_broadband_modem_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMBroadbandModem, g_object_unref)
MMBroadbandModem *mm_broadband_modem_new (const gchar *device,
const gchar **drivers,
@@ -132,6 +133,6 @@ void mm_broadband_modem_unlock_sms_storages (MMBroadbandModem *self,
gboolean mem1,
gboolean mem2);
/* Helper to update SIM hot swap */
-void mm_broadband_modem_update_sim_hot_swap_detected (MMBroadbandModem *self);
+void mm_broadband_modem_sim_hot_swap_detected (MMBroadbandModem *self);
#endif /* MM_BROADBAND_MODEM_H */
diff --git a/src/mm-call-list.h b/src/mm-call-list.h
index 3f85d1d4..1183129e 100644
--- a/src/mm-call-list.h
+++ b/src/mm-call-list.h
@@ -55,6 +55,7 @@ struct _MMCallListClass {
};
GType mm_call_list_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMCallList, g_object_unref)
MMCallList *mm_call_list_new (MMBaseModem *modem);
diff --git a/src/mm-charsets.c b/src/mm-charsets.c
index e48cec3e..19d1874c 100644
--- a/src/mm-charsets.c
+++ b/src/mm-charsets.c
@@ -27,88 +27,80 @@
#include "mm-log.h"
typedef struct {
- const char *gsm_name;
- const char *other_name;
- const char *iconv_from_name;
- const char *iconv_to_name;
- MMModemCharset charset;
+ const gchar *gsm_name;
+ const gchar *other_name;
+ const gchar *iconv_from_name;
+ const gchar *iconv_to_name;
+ MMModemCharset charset;
} CharsetEntry;
-static CharsetEntry charset_map[] = {
- { "UTF-8", "UTF8", "UTF-8", "UTF-8//TRANSLIT", MM_MODEM_CHARSET_UTF8 },
- { "UCS2", NULL, "UCS-2BE", "UCS-2BE//TRANSLIT", MM_MODEM_CHARSET_UCS2 },
- { "IRA", "ASCII", "ASCII", "ASCII//TRANSLIT", MM_MODEM_CHARSET_IRA },
- { "GSM", NULL, NULL, NULL, MM_MODEM_CHARSET_GSM },
- { "8859-1", NULL, "ISO8859-1", "ISO8859-1//TRANSLIT", MM_MODEM_CHARSET_8859_1 },
+static const CharsetEntry charset_map[] = {
+ { "UTF-8", "UTF8", "UTF-8", "UTF-8//TRANSLIT", MM_MODEM_CHARSET_UTF8 },
+ { "UCS2", NULL, "UCS-2BE", "UCS-2BE//TRANSLIT", MM_MODEM_CHARSET_UCS2 },
+ { "IRA", "ASCII", "ASCII", "ASCII//TRANSLIT", MM_MODEM_CHARSET_IRA },
+ { "GSM", NULL, NULL, NULL, MM_MODEM_CHARSET_GSM },
+ { "8859-1", NULL, "ISO8859-1", "ISO8859-1//TRANSLIT", MM_MODEM_CHARSET_8859_1 },
{ "PCCP437", "CP437", "CP437", "CP437//TRANSLIT", MM_MODEM_CHARSET_PCCP437 },
- { "PCDN", "CP850", "CP850", "CP850//TRANSLIT", MM_MODEM_CHARSET_PCDN },
- { "HEX", NULL, NULL, NULL, MM_MODEM_CHARSET_HEX },
- { NULL, NULL, NULL, NULL, MM_MODEM_CHARSET_UNKNOWN }
+ { "PCDN", "CP850", "CP850", "CP850//TRANSLIT", MM_MODEM_CHARSET_PCDN },
+ { "HEX", NULL, NULL, NULL, MM_MODEM_CHARSET_HEX },
+ { "UTF-16", "UTF16", "UTF-16BE", "UTF-16BE//TRANSLIT", MM_MODEM_CHARSET_UTF16 },
};
-const char *
-mm_modem_charset_to_string (MMModemCharset charset)
-{
- CharsetEntry *iter = &charset_map[0];
-
- g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
-
- while (iter->gsm_name) {
- if (iter->charset == charset)
- return iter->gsm_name;
- iter++;
- }
- g_warn_if_reached ();
- return NULL;
-}
-
MMModemCharset
-mm_modem_charset_from_string (const char *string)
+mm_modem_charset_from_string (const gchar *string)
{
- CharsetEntry *iter = &charset_map[0];
+ guint i;
g_return_val_if_fail (string != NULL, MM_MODEM_CHARSET_UNKNOWN);
- while (iter->gsm_name) {
- if (strcasestr (string, iter->gsm_name))
- return iter->charset;
- if (iter->other_name && strcasestr (string, iter->other_name))
- return iter->charset;
- iter++;
+ for (i = 0; i < G_N_ELEMENTS (charset_map); i++) {
+ if (strcasestr (string, charset_map[i].gsm_name))
+ return charset_map[i].charset;
+ if (charset_map[i].other_name && strcasestr (string, charset_map[i].other_name))
+ return charset_map[i].charset;
}
return MM_MODEM_CHARSET_UNKNOWN;
}
-static const char *
-charset_iconv_to (MMModemCharset charset)
+static const CharsetEntry *
+lookup_charset_by_id (MMModemCharset charset)
{
- CharsetEntry *iter = &charset_map[0];
+ guint i;
g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
-
- while (iter->gsm_name) {
- if (iter->charset == charset)
- return iter->iconv_to_name;
- iter++;
+ for (i = 0; i < G_N_ELEMENTS (charset_map); i++) {
+ if (charset_map[i].charset == charset)
+ return &charset_map[i];
}
g_warn_if_reached ();
return NULL;
}
-static const char *
-charset_iconv_from (MMModemCharset charset)
+const gchar *
+mm_modem_charset_to_string (MMModemCharset charset)
{
- CharsetEntry *iter = &charset_map[0];
+ const CharsetEntry *entry;
- g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
+ entry = lookup_charset_by_id (charset);
+ return entry ? entry->gsm_name : NULL;
+}
- while (iter->gsm_name) {
- if (iter->charset == charset)
- return iter->iconv_from_name;
- iter++;
- }
- g_warn_if_reached ();
- return NULL;
+static const gchar *
+charset_iconv_to (MMModemCharset charset)
+{
+ const CharsetEntry *entry;
+
+ entry = lookup_charset_by_id (charset);
+ return entry ? entry->iconv_to_name : NULL;
+}
+
+static const gchar *
+charset_iconv_from (MMModemCharset charset)
+{
+ const CharsetEntry *entry;
+
+ entry = lookup_charset_by_id (charset);
+ return entry ? entry->iconv_from_name : NULL;
}
gboolean
@@ -148,9 +140,9 @@ gchar *
mm_modem_charset_byte_array_to_utf8 (GByteArray *array,
MMModemCharset charset)
{
- char *converted;
- const char *iconv_from;
- GError *error = NULL;
+ const gchar *iconv_from;
+ g_autofree gchar *converted = NULL;
+ g_autoptr(GError) error = NULL;
g_return_val_if_fail (array != NULL, NULL);
g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
@@ -161,21 +153,21 @@ mm_modem_charset_byte_array_to_utf8 (GByteArray *array,
converted = g_convert ((const gchar *)array->data, array->len,
"UTF-8//TRANSLIT", iconv_from,
NULL, NULL, &error);
- if (!converted || error) {
- g_clear_error (&error);
- converted = NULL;
- }
+ if (!converted || error)
+ return NULL;
- return converted;
+ return g_steal_pointer (&converted);
}
-char *
-mm_modem_charset_hex_to_utf8 (const char *src, MMModemCharset charset)
+gchar *
+mm_modem_charset_hex_to_utf8 (const gchar *src,
+ MMModemCharset charset)
{
- char *unconverted, *converted;
- const char *iconv_from;
- gsize unconverted_len = 0;
- GError *error = NULL;
+ const gchar *iconv_from;
+ g_autofree gchar *unconverted = NULL;
+ g_autofree gchar *converted = NULL;
+ g_autoptr(GError) error = NULL;
+ gsize unconverted_len = 0;
g_return_val_if_fail (src != NULL, NULL);
g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
@@ -188,29 +180,25 @@ mm_modem_charset_hex_to_utf8 (const char *src, MMModemCharset charset)
return NULL;
if (charset == MM_MODEM_CHARSET_UTF8 || charset == MM_MODEM_CHARSET_IRA)
- return unconverted;
+ return g_steal_pointer (&unconverted);
converted = g_convert (unconverted, unconverted_len,
"UTF-8//TRANSLIT", iconv_from,
NULL, NULL, &error);
- if (!converted || error) {
- g_clear_error (&error);
- converted = NULL;
- }
-
- g_free (unconverted);
+ if (!converted || error)
+ return NULL;
- return converted;
+ return g_steal_pointer (&converted);
}
-char *
-mm_modem_charset_utf8_to_hex (const char *src, MMModemCharset charset)
+gchar *
+mm_modem_charset_utf8_to_hex (const gchar *src,
+ MMModemCharset charset)
{
- gsize converted_len = 0;
- char *converted;
- const char *iconv_to;
- GError *error = NULL;
- gchar *hex;
+ const gchar *iconv_to;
+ g_autofree gchar *converted = NULL;
+ g_autoptr(GError) error = NULL;
+ gsize converted_len = 0;
g_return_val_if_fail (src != NULL, NULL);
g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, NULL);
@@ -224,16 +212,11 @@ mm_modem_charset_utf8_to_hex (const char *src, MMModemCharset charset)
converted = g_convert (src, strlen (src),
iconv_to, "UTF-8//TRANSLIT",
NULL, &converted_len, &error);
- if (!converted || error) {
- g_clear_error (&error);
- g_free (converted);
+ if (!converted || error)
return NULL;
- }
/* Get hex representation of the string */
- hex = mm_utils_bin2hexstr ((guint8 *)converted, converted_len);
- g_free (converted);
- return hex;
+ return mm_utils_bin2hexstr ((guint8 *)converted, converted_len);
}
/* GSM 03.38 encoding conversion stuff */
@@ -242,7 +225,7 @@ mm_modem_charset_utf8_to_hex (const char *src, MMModemCharset charset)
#define GSM_EXT_ALPHABET_SIZE 10
typedef struct GsmUtf8Mapping {
- gchar chars[3];
+ gchar chars[3];
guint8 len;
guint8 gsm; /* only used for extended GSM charset */
} GsmUtf8Mapping;
@@ -326,7 +309,8 @@ static const GsmUtf8Mapping gsm_def_utf8_alphabet[GSM_DEF_ALPHABET_SIZE] = {
};
static guint8
-gsm_def_char_to_utf8 (const guint8 gsm, guint8 out_utf8[2])
+gsm_def_char_to_utf8 (const guint8 gsm,
+ guint8 out_utf8[2])
{
g_return_val_if_fail (gsm < GSM_DEF_ALPHABET_SIZE, 0);
memcpy (&out_utf8[0], &gsm_def_utf8_alphabet[gsm].chars[0], gsm_def_utf8_alphabet[gsm].len);
@@ -334,9 +318,11 @@ gsm_def_char_to_utf8 (const guint8 gsm, guint8 out_utf8[2])
}
static gboolean
-utf8_to_gsm_def_char (const char *utf8, guint32 len, guint8 *out_gsm)
+utf8_to_gsm_def_char (const gchar *utf8,
+ guint32 len,
+ guint8 *out_gsm)
{
- int i;
+ gint i;
if (len > 0 && len < 4) {
for (i = 0; i < GSM_DEF_ALPHABET_SIZE; i++) {
@@ -373,7 +359,8 @@ static const GsmUtf8Mapping gsm_ext_utf8_alphabet[GSM_EXT_ALPHABET_SIZE] = {
#define GSM_ESCAPE_CHAR 0x1b
static guint8
-gsm_ext_char_to_utf8 (const guint8 gsm, guint8 out_utf8[3])
+gsm_ext_char_to_utf8 (const guint8 gsm,
+ guint8 out_utf8[3])
{
int i;
@@ -387,7 +374,9 @@ gsm_ext_char_to_utf8 (const guint8 gsm, guint8 out_utf8[3])
}
static gboolean
-utf8_to_gsm_ext_char (const char *utf8, guint32 len, guint8 *out_gsm)
+utf8_to_gsm_ext_char (const gchar *utf8,
+ guint32 len,
+ guint8 *out_gsm)
{
int i;
@@ -405,9 +394,10 @@ utf8_to_gsm_ext_char (const char *utf8, guint32 len, guint8 *out_gsm)
}
guint8 *
-mm_charset_gsm_unpacked_to_utf8 (const guint8 *gsm, guint32 len)
+mm_charset_gsm_unpacked_to_utf8 (const guint8 *gsm,
+ guint32 len)
{
- guint i;
+ guint i;
GByteArray *utf8;
g_return_val_if_fail (gsm != NULL, NULL);
@@ -464,12 +454,13 @@ mm_charset_gsm_unpacked_to_utf8 (const guint8 *gsm, guint32 len)
}
guint8 *
-mm_charset_utf8_to_unpacked_gsm (const char *utf8, guint32 *out_len)
+mm_charset_utf8_to_unpacked_gsm (const gchar *utf8,
+ guint32 *out_len)
{
- GByteArray *gsm;
- const char *c = utf8, *next = c;
- static const guint8 gesc = GSM_ESCAPE_CHAR;
- int i = 0;
+ GByteArray *gsm;
+ const gchar *c;
+ const gchar *next;
+ static const guint8 gesc = GSM_ESCAPE_CHAR;
g_return_val_if_fail (utf8 != NULL, NULL);
g_return_val_if_fail (g_utf8_validate (utf8, -1, NULL), NULL);
@@ -485,6 +476,8 @@ mm_charset_utf8_to_unpacked_gsm (const char *utf8, guint32 *out_len)
return g_byte_array_free (gsm, FALSE);
}
+ next = utf8;
+ c = utf8;
while (next && *next) {
guint8 gch = 0x3f; /* 0x3f == '?' */
@@ -499,7 +492,6 @@ mm_charset_utf8_to_unpacked_gsm (const char *utf8, guint32 *out_len)
g_byte_array_append (gsm, &gch, 1);
c = next;
- i++;
}
/* Output length doesn't consider terminating NUL byte */
@@ -512,7 +504,9 @@ mm_charset_utf8_to_unpacked_gsm (const char *utf8, guint32 *out_len)
}
static gboolean
-gsm_is_subset (gunichar c, const char *utf8, gsize ulen)
+gsm_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
{
guint8 gsm;
@@ -524,25 +518,41 @@ gsm_is_subset (gunichar c, const char *utf8, gsize ulen)
}
static gboolean
-ira_is_subset (gunichar c, const char *utf8, gsize ulen)
+ira_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
{
return (ulen == 1);
}
static gboolean
-ucs2_is_subset (gunichar c, const char *utf8, gsize ulen)
+ucs2_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
{
return (c <= 0xFFFF);
}
static gboolean
-iso88591_is_subset (gunichar c, const char *utf8, gsize ulen)
+utf16_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
+{
+ return TRUE;
+}
+
+static gboolean
+iso88591_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
{
return (c <= 0xFF);
}
static gboolean
-pccp437_is_subset (gunichar c, const char *utf8, gsize ulen)
+pccp437_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
{
static const gunichar t[] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea,
@@ -573,7 +583,9 @@ pccp437_is_subset (gunichar c, const char *utf8, gsize ulen)
}
static gboolean
-pcdn_is_subset (gunichar c, const char *utf8, gsize ulen)
+pcdn_is_subset (gunichar c,
+ const gchar *utf8,
+ gsize ulen)
{
static const gunichar t[] = {
0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0, 0x00e5, 0x00e7, 0x00ea,
@@ -605,18 +617,19 @@ pcdn_is_subset (gunichar c, const char *utf8, gsize ulen)
typedef struct {
MMModemCharset cs;
- gboolean (*func) (gunichar c, const char *utf8, gsize ulen);
- guint charsize;
+ gboolean (*func) (gunichar c,
+ const gchar *utf8,
+ gsize ulen);
} SubsetEntry;
-SubsetEntry subset_table[] = {
- { MM_MODEM_CHARSET_GSM, gsm_is_subset },
- { MM_MODEM_CHARSET_IRA, ira_is_subset },
- { MM_MODEM_CHARSET_UCS2, ucs2_is_subset },
+const SubsetEntry subset_table[] = {
+ { MM_MODEM_CHARSET_GSM, gsm_is_subset },
+ { MM_MODEM_CHARSET_IRA, ira_is_subset },
+ { MM_MODEM_CHARSET_UCS2, ucs2_is_subset },
+ { MM_MODEM_CHARSET_UTF16, utf16_is_subset },
{ MM_MODEM_CHARSET_8859_1, iso88591_is_subset },
- { MM_MODEM_CHARSET_PCCP437, pccp437_is_subset },
- { MM_MODEM_CHARSET_PCDN, pcdn_is_subset },
- { MM_MODEM_CHARSET_UNKNOWN, NULL },
+ { MM_MODEM_CHARSET_PCCP437, pccp437_is_subset },
+ { MM_MODEM_CHARSET_PCDN, pcdn_is_subset },
};
/**
@@ -627,11 +640,11 @@ SubsetEntry subset_table[] = {
* Returns: %TRUE if the conversion is possible without errors, %FALSE otherwise.
*/
gboolean
-mm_charset_can_convert_to (const char *utf8,
- MMModemCharset charset)
+mm_charset_can_convert_to (const gchar *utf8,
+ MMModemCharset charset)
{
- const char *p = utf8;
- SubsetEntry *e;
+ const gchar *p;
+ guint i;
g_return_val_if_fail (charset != MM_MODEM_CHARSET_UNKNOWN, FALSE);
g_return_val_if_fail (utf8 != NULL, FALSE);
@@ -640,11 +653,13 @@ mm_charset_can_convert_to (const char *utf8,
return TRUE;
/* Find the charset in our subset table */
- for (e = &subset_table[0];
- e->cs != charset && e->cs != MM_MODEM_CHARSET_UNKNOWN;
- e++);
- g_return_val_if_fail (e->cs != MM_MODEM_CHARSET_UNKNOWN, FALSE);
+ for (i = 0; i < G_N_ELEMENTS (subset_table); i++) {
+ if (subset_table[i].cs == charset)
+ break;
+ }
+ g_return_val_if_fail (i < G_N_ELEMENTS (subset_table), FALSE);
+ p = utf8;
while (*p) {
gunichar c;
const char *end;
@@ -658,7 +673,7 @@ mm_charset_can_convert_to (const char *utf8,
while (*++end);
}
- if (!e->func (c, p, (end - p)))
+ if (!subset_table[i].func (c, p, (end - p)))
return FALSE;
p = end;
@@ -669,9 +684,9 @@ mm_charset_can_convert_to (const char *utf8,
guint8 *
mm_charset_gsm_unpack (const guint8 *gsm,
- guint32 num_septets,
- guint8 start_offset, /* in _bits_ */
- guint32 *out_unpacked_len)
+ guint32 num_septets,
+ guint8 start_offset, /* in _bits_ */
+ guint32 *out_unpacked_len)
{
GByteArray *unpacked;
guint i;
@@ -705,9 +720,9 @@ mm_charset_gsm_unpack (const guint8 *gsm,
guint8 *
mm_charset_gsm_pack (const guint8 *src,
- guint32 src_len,
- guint8 start_offset,
- guint32 *out_packed_len)
+ guint32 src_len,
+ guint8 start_offset,
+ guint32 *out_packed_len)
{
guint8 *packed;
guint octet = 0, lshift, plen;
@@ -744,7 +759,8 @@ mm_charset_gsm_pack (const guint8 *src,
* the hex representation of the charset-encoded string, so we need to cope with
* that case. */
gchar *
-mm_charset_take_and_convert_to_utf8 (gchar *str, MMModemCharset charset)
+mm_charset_take_and_convert_to_utf8 (gchar *str,
+ MMModemCharset charset)
{
gchar *utf8 = NULL;
@@ -786,7 +802,8 @@ mm_charset_take_and_convert_to_utf8 (gchar *str, MMModemCharset charset)
break;
}
- case MM_MODEM_CHARSET_UCS2: {
+ case MM_MODEM_CHARSET_UCS2:
+ case MM_MODEM_CHARSET_UTF16: {
gsize len;
gboolean possibly_hex = TRUE;
gsize bread = 0, bwritten = 0;
@@ -865,8 +882,8 @@ mm_charset_take_and_convert_to_utf8 (gchar *str, MMModemCharset charset)
* representation of the charset-encoded string, so we need to cope with that
* case. */
gchar *
-mm_utf8_take_and_convert_to_charset (gchar *str,
- MMModemCharset charset)
+mm_utf8_take_and_convert_to_charset (gchar *str,
+ MMModemCharset charset)
{
gchar *encoded = NULL;
@@ -914,7 +931,8 @@ mm_utf8_take_and_convert_to_charset (gchar *str,
break;
}
- case MM_MODEM_CHARSET_UCS2: {
+ case MM_MODEM_CHARSET_UCS2:
+ case MM_MODEM_CHARSET_UTF16: {
const gchar *iconv_to;
gsize encoded_len = 0;
GError *error = NULL;
diff --git a/src/mm-charsets.h b/src/mm-charsets.h
index 9e9215d5..c064eef5 100644
--- a/src/mm-charsets.h
+++ b/src/mm-charsets.h
@@ -27,12 +27,12 @@ typedef enum {
MM_MODEM_CHARSET_UCS2 = 0x00000010,
MM_MODEM_CHARSET_PCCP437 = 0x00000020,
MM_MODEM_CHARSET_PCDN = 0x00000040,
- MM_MODEM_CHARSET_HEX = 0x00000080
+ MM_MODEM_CHARSET_HEX = 0x00000080,
+ MM_MODEM_CHARSET_UTF16 = 0x00000100,
} MMModemCharset;
-const char *mm_modem_charset_to_string (MMModemCharset charset);
-
-MMModemCharset mm_modem_charset_from_string (const char *string);
+const gchar *mm_modem_charset_to_string (MMModemCharset charset);
+MMModemCharset mm_modem_charset_from_string (const gchar *string);
/* Append the given string to the given byte array but re-encode it
* into the given charset first. The original string is assumed to be
@@ -52,34 +52,37 @@ gchar *mm_modem_charset_byte_array_to_utf8 (GByteArray *array,
/* Take a string in hex representation ("00430052" or "A4BE11" for example)
* and convert it from the given character set to UTF-8.
*/
-char *mm_modem_charset_hex_to_utf8 (const char *src, MMModemCharset charset);
+gchar *mm_modem_charset_hex_to_utf8 (const gchar *src,
+ MMModemCharset charset);
/* Take a string in UTF-8 and convert it to the given charset in hex
* representation.
*/
-char *mm_modem_charset_utf8_to_hex (const char *src, MMModemCharset charset);
-
-guint8 *mm_charset_utf8_to_unpacked_gsm (const char *utf8, guint32 *out_len);
+gchar *mm_modem_charset_utf8_to_hex (const gchar *src,
+ MMModemCharset charset);
-guint8 *mm_charset_gsm_unpacked_to_utf8 (const guint8 *gsm, guint32 len);
+guint8 *mm_charset_utf8_to_unpacked_gsm (const gchar *utf8,
+ guint32 *out_len);
+guint8 *mm_charset_gsm_unpacked_to_utf8 (const guint8 *gsm,
+ guint32 len);
/* Checks whether conversion to the given charset may be done without errors */
-gboolean mm_charset_can_convert_to (const char *utf8,
- MMModemCharset charset);
+gboolean mm_charset_can_convert_to (const gchar *utf8,
+ MMModemCharset charset);
guint8 *mm_charset_gsm_unpack (const guint8 *gsm,
- guint32 num_septets,
- guint8 start_offset, /* in bits */
- guint32 *out_unpacked_len);
+ guint32 num_septets,
+ guint8 start_offset, /* in bits */
+ guint32 *out_unpacked_len);
guint8 *mm_charset_gsm_pack (const guint8 *src,
- guint32 src_len,
- guint8 start_offset, /* in bits */
- guint32 *out_packed_len);
-
-gchar *mm_charset_take_and_convert_to_utf8 (gchar *str, MMModemCharset charset);
+ guint32 src_len,
+ guint8 start_offset, /* in bits */
+ guint32 *out_packed_len);
-gchar *mm_utf8_take_and_convert_to_charset (gchar *str,
- MMModemCharset charset);
+gchar *mm_charset_take_and_convert_to_utf8 (gchar *str,
+ MMModemCharset charset);
+gchar *mm_utf8_take_and_convert_to_charset (gchar *str,
+ MMModemCharset charset);
#endif /* MM_CHARSETS_H */
diff --git a/src/mm-device.h b/src/mm-device.h
index b7a3285c..d78a97c9 100644
--- a/src/mm-device.h
+++ b/src/mm-device.h
@@ -60,6 +60,7 @@ struct _MMDeviceClass {
};
GType mm_device_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMDevice, g_object_unref)
MMDevice *mm_device_new (const gchar *uid,
gboolean hotplugged,
diff --git a/src/mm-filter.h b/src/mm-filter.h
index c3579979..b680ef97 100644
--- a/src/mm-filter.h
+++ b/src/mm-filter.h
@@ -43,6 +43,7 @@ typedef struct {
} MMFilterClass;
GType mm_filter_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMFilter, g_object_unref)
typedef enum { /*< underscore_name=mm_filter_rule >*/
MM_FILTER_RULE_NONE = 0,
diff --git a/src/mm-iface-modem-3gpp-ussd.h b/src/mm-iface-modem-3gpp-ussd.h
index 37c60133..8a6d2f42 100644
--- a/src/mm-iface-modem-3gpp-ussd.h
+++ b/src/mm-iface-modem-3gpp-ussd.h
@@ -107,6 +107,7 @@ struct _MMIfaceModem3gppUssd {
};
GType mm_iface_modem_3gpp_ussd_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModem3gppUssd, g_object_unref)
/* Initialize USSD interface (async) */
void mm_iface_modem_3gpp_ussd_initialize (MMIfaceModem3gppUssd *self,
diff --git a/src/mm-iface-modem-3gpp.c b/src/mm-iface-modem-3gpp.c
index 662052fb..b933064e 100644
--- a/src/mm-iface-modem-3gpp.c
+++ b/src/mm-iface-modem-3gpp.c
@@ -132,8 +132,7 @@ mm_iface_modem_3gpp_bind_simple_status (MMIfaceModem3gpp *self,
static MMModem3gppRegistrationState
get_consolidated_reg_state (MMIfaceModem3gpp *self)
{
- Private *priv;
- MMModem3gppRegistrationState consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
+ Private *priv;
priv = get_private (self);
@@ -142,35 +141,21 @@ get_consolidated_reg_state (MMIfaceModem3gpp *self)
* So here we prefer the +CREG response, but if we never got a successful
* +CREG response, we'll take +CGREG instead.
*/
- if (priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
- consolidated = priv->state_cs;
- goto out;
- }
- if (priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
- consolidated = priv->state_ps;
- goto out;
- }
- if (priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
- consolidated = priv->state_eps;
- goto out;
- }
- if (priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
- priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
- consolidated = priv->state_5gs;
- goto out;
- }
+ if (priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)
+ return priv->state_cs;
+ if (priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)
+ return priv->state_ps;
+ if (priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)
+ return priv->state_eps;
+ if (priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING)
+ return priv->state_5gs;
/* Searching? */
if (priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING ||
priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING ||
priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING ||
- priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING) {
- consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
- goto out;
- }
+ priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
+ return MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
/* If at least one state is DENIED and the others are UNKNOWN or IDLE, use DENIED */
if ((priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED ||
@@ -180,19 +165,15 @@ get_consolidated_reg_state (MMIfaceModem3gpp *self)
REG_STATE_IS_UNKNOWN_IDLE_DENIED (priv->state_cs) &&
REG_STATE_IS_UNKNOWN_IDLE_DENIED (priv->state_ps) &&
REG_STATE_IS_UNKNOWN_IDLE_DENIED (priv->state_eps) &&
- REG_STATE_IS_UNKNOWN_IDLE_DENIED (priv->state_5gs)) {
- consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_DENIED;
- goto out;
- }
+ REG_STATE_IS_UNKNOWN_IDLE_DENIED (priv->state_5gs))
+ return MM_MODEM_3GPP_REGISTRATION_STATE_DENIED;
/* Emergency services? */
if (priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY ||
priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY ||
priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY ||
- priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY) {
- consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY;
- goto out;
- }
+ priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY)
+ return MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY;
/* Support for additional registration states reported when on LTE/5GNR.
*
@@ -212,28 +193,17 @@ get_consolidated_reg_state (MMIfaceModem3gpp *self)
priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING_CSFB_NOT_PREFERRED) {
mm_obj_warn (self, "3GPP CSFB registration state is consolidated: %s",
mm_modem_3gpp_registration_state_get_string (priv->state_cs));
- consolidated = priv->state_cs;
- goto out;
+ return priv->state_cs;
}
/* Idle? */
if (priv->state_cs == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE ||
priv->state_ps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE ||
priv->state_eps == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE ||
- priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE) {
- consolidated = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE;
- goto out;
- }
+ priv->state_5gs == MM_MODEM_3GPP_REGISTRATION_STATE_IDLE)
+ return MM_MODEM_3GPP_REGISTRATION_STATE_IDLE;
- out:
- mm_obj_dbg (self, "building consolidated registration state: cs '%s', ps '%s', eps '%s', 5gs '%s' --> '%s'",
- mm_modem_3gpp_registration_state_get_string (priv->state_cs),
- mm_modem_3gpp_registration_state_get_string (priv->state_ps),
- mm_modem_3gpp_registration_state_get_string (priv->state_eps),
- mm_modem_3gpp_registration_state_get_string (priv->state_5gs),
- mm_modem_3gpp_registration_state_get_string (consolidated));
-
- return consolidated;
+ return MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
}
/*****************************************************************************/
@@ -1389,9 +1359,9 @@ mm_iface_modem_3gpp_update_access_technologies (MMIfaceModem3gpp *self,
void
mm_iface_modem_3gpp_update_location (MMIfaceModem3gpp *self,
- gulong location_area_code,
- gulong tracking_area_code,
- gulong cell_id)
+ gulong location_area_code,
+ gulong tracking_area_code,
+ gulong cell_id)
{
Private *priv;
MMModem3gppRegistrationState state;
@@ -1410,7 +1380,7 @@ mm_iface_modem_3gpp_update_location (MMIfaceModem3gpp *self,
* where we're registering (loading current registration info after a state
* change to registered), we also allow LAC/CID updates. */
if (REG_STATE_IS_REGISTERED (state) || priv->reloading_registration_info) {
- if ((location_area_code > 0 || tracking_area_code > 0) && cell_id > 0)
+ if (location_area_code || tracking_area_code || cell_id)
mm_iface_modem_location_3gpp_update_lac_tac_ci (MM_IFACE_MODEM_LOCATION (self),
location_area_code,
tracking_area_code,
@@ -1433,8 +1403,14 @@ update_registration_reload_current_registration_info_ready (MMIfaceModem3gpp *se
new_state = GPOINTER_TO_UINT (user_data);
- mm_obj_info (self, "3GPP Registration state changed (registering -> %s)",
+ mm_obj_info (self, "3GPP registration state changed (registering -> %s)",
mm_modem_3gpp_registration_state_get_string (new_state));
+ mm_obj_dbg (self, "consolidated registration state: cs '%s', ps '%s', eps '%s', 5gs '%s' --> '%s'",
+ mm_modem_3gpp_registration_state_get_string (priv->state_cs),
+ mm_modem_3gpp_registration_state_get_string (priv->state_ps),
+ mm_modem_3gpp_registration_state_get_string (priv->state_eps),
+ mm_modem_3gpp_registration_state_get_string (priv->state_5gs),
+ mm_modem_3gpp_registration_state_get_string (new_state));
/* The property in the interface is bound to the property
* in the skeleton, so just updating here is enough */
@@ -1513,7 +1489,7 @@ update_registration_state (MMIfaceModem3gpp *self,
return;
}
- mm_obj_info (self, "3GPP Registration state changed (%s -> registering)",
+ mm_obj_info (self, "3GPP registration state changed (%s -> registering)",
mm_modem_3gpp_registration_state_get_string (old_state));
/* Reload current registration info. ONLY update the state to REGISTERED
@@ -1526,9 +1502,15 @@ update_registration_state (MMIfaceModem3gpp *self,
return;
}
- mm_obj_info (self, "3GPP Registration state changed (%s -> %s)",
+ mm_obj_info (self, "3GPP registration state changed (%s -> %s)",
mm_modem_3gpp_registration_state_get_string (old_state),
mm_modem_3gpp_registration_state_get_string (new_state));
+ mm_obj_dbg (self, "consolidated registration state: cs '%s', ps '%s', eps '%s', 5gs '%s' --> '%s'",
+ mm_modem_3gpp_registration_state_get_string (priv->state_cs),
+ mm_modem_3gpp_registration_state_get_string (priv->state_ps),
+ mm_modem_3gpp_registration_state_get_string (priv->state_eps),
+ mm_modem_3gpp_registration_state_get_string (priv->state_5gs),
+ mm_modem_3gpp_registration_state_get_string (new_state));
update_non_registered_state (self, old_state, new_state);
}
diff --git a/src/mm-iface-modem-3gpp.h b/src/mm-iface-modem-3gpp.h
index 321fec7d..2bff383e 100644
--- a/src/mm-iface-modem-3gpp.h
+++ b/src/mm-iface-modem-3gpp.h
@@ -237,6 +237,7 @@ struct _MMIfaceModem3gpp {
};
GType mm_iface_modem_3gpp_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModem3gpp, g_object_unref)
/* Initialize Modem 3GPP interface (async) */
void mm_iface_modem_3gpp_initialize (MMIfaceModem3gpp *self,
diff --git a/src/mm-iface-modem-cdma.h b/src/mm-iface-modem-cdma.h
index 9e817dde..7501d897 100644
--- a/src/mm-iface-modem-cdma.h
+++ b/src/mm-iface-modem-cdma.h
@@ -229,6 +229,7 @@ struct _MMIfaceModemCdma {
};
GType mm_iface_modem_cdma_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemCdma, g_object_unref)
/* Initialize CDMA interface (async) */
void mm_iface_modem_cdma_initialize (MMIfaceModemCdma *self,
diff --git a/src/mm-iface-modem-firmware.h b/src/mm-iface-modem-firmware.h
index 15052bce..6ce894a0 100644
--- a/src/mm-iface-modem-firmware.h
+++ b/src/mm-iface-modem-firmware.h
@@ -69,6 +69,7 @@ struct _MMIfaceModemFirmware {
};
GType mm_iface_modem_firmware_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemFirmware, g_object_unref)
/* Initialize Firmware interface (async) */
void mm_iface_modem_firmware_initialize (MMIfaceModemFirmware *self,
diff --git a/src/mm-iface-modem-location.c b/src/mm-iface-modem-location.c
index ce307ccb..b45a3405 100644
--- a/src/mm-iface-modem-location.c
+++ b/src/mm-iface-modem-location.c
@@ -396,32 +396,70 @@ mm_iface_modem_location_3gpp_update_mcc_mnc (MMIfaceModemLocation *self,
void
mm_iface_modem_location_3gpp_update_lac_tac_ci (MMIfaceModemLocation *self,
- gulong location_area_code,
- gulong tracking_area_code,
- gulong cell_id)
+ gulong location_area_code,
+ gulong tracking_area_code,
+ gulong cell_id)
{
- MmGdbusModemLocation *skeleton;
- LocationContext *ctx;
+ g_autoptr(MmGdbusModemLocationSkeleton) skeleton = NULL;
+ LocationContext *ctx;
+ guint changed = 0;
+ gulong old_location_area_code;
+ gulong old_tracking_area_code;
+ gulong old_cell_id;
- ctx = get_location_context (self);
g_object_get (self,
MM_IFACE_MODEM_LOCATION_DBUS_SKELETON, &skeleton,
NULL);
- if (!skeleton)
+ if (!skeleton || !(mm_gdbus_modem_location_get_enabled (MM_GDBUS_MODEM_LOCATION (skeleton)) & MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI))
return;
- if (mm_gdbus_modem_location_get_enabled (skeleton) & MM_MODEM_LOCATION_SOURCE_3GPP_LAC_CI) {
- guint changed = 0;
+ ctx = get_location_context (self);
+ g_assert (ctx->location_3gpp != NULL);
+
+ old_location_area_code = mm_location_3gpp_get_location_area_code (ctx->location_3gpp);
+ old_tracking_area_code = mm_location_3gpp_get_tracking_area_code (ctx->location_3gpp);
+ old_cell_id = mm_location_3gpp_get_cell_id (ctx->location_3gpp);
+
+ /* Update LAC if given, and clear TAC unless a TAC is also given */
+ if (location_area_code) {
+ if (old_location_area_code != location_area_code) {
+ mm_obj_dbg (self, "3GPP location area code updated: '%lX->%lX'", old_location_area_code, location_area_code);
+ mm_location_3gpp_set_location_area_code (ctx->location_3gpp, location_area_code);
+ changed++;
+ }
+ if (!tracking_area_code) {
+ if (old_tracking_area_code != 0) {
+ mm_obj_dbg (self, "3GPP tracking area code cleared: '%lX->%lX'", old_tracking_area_code, tracking_area_code);
+ mm_location_3gpp_set_tracking_area_code (ctx->location_3gpp, 0);
+ changed++;
+ }
+ }
+ }
+ /* Update TAC if given, and clear LAC unless a LAC is also given */
+ if (tracking_area_code) {
+ if (old_tracking_area_code != tracking_area_code) {
+ mm_obj_dbg (self, "3GPP tracking area code updated: '%lX->%lX'", old_tracking_area_code, tracking_area_code);
+ mm_location_3gpp_set_tracking_area_code (ctx->location_3gpp, tracking_area_code);
+ changed++;
+ }
+ if (!location_area_code) {
+ if (old_location_area_code != 0) {
+ mm_obj_dbg (self, "3GPP location area code cleared: '%lX->%lX'", old_location_area_code, location_area_code);
+ mm_location_3gpp_set_location_area_code (ctx->location_3gpp, 0);
+ changed++;
+ }
+ }
+ }
- g_assert (ctx->location_3gpp != NULL);
- changed += mm_location_3gpp_set_location_area_code (ctx->location_3gpp, location_area_code);
- changed += mm_location_3gpp_set_tracking_area_code (ctx->location_3gpp, tracking_area_code);
- changed += mm_location_3gpp_set_cell_id (ctx->location_3gpp, cell_id);
- if (changed)
- notify_3gpp_location_update (self, skeleton, ctx->location_3gpp);
+ /* Cell ID only updated if given. It is assumed that if LAC or TAC are given, CID is also given */
+ if (cell_id && (old_cell_id != cell_id)) {
+ mm_obj_dbg (self, "3GPP cell id updated: '%lX->%lX'", old_cell_id, cell_id);
+ mm_location_3gpp_set_cell_id (ctx->location_3gpp, cell_id);
+ changed++;
}
- g_object_unref (skeleton);
+ if (changed)
+ notify_3gpp_location_update (self, MM_GDBUS_MODEM_LOCATION (skeleton), ctx->location_3gpp);
}
void
diff --git a/src/mm-iface-modem-location.h b/src/mm-iface-modem-location.h
index c8b045af..d00ecc71 100644
--- a/src/mm-iface-modem-location.h
+++ b/src/mm-iface-modem-location.h
@@ -106,6 +106,7 @@ struct _MMIfaceModemLocation {
};
GType mm_iface_modem_location_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemLocation, g_object_unref)
/* Initialize Location interface (async) */
void mm_iface_modem_location_initialize (MMIfaceModemLocation *self,
diff --git a/src/mm-iface-modem-messaging.c b/src/mm-iface-modem-messaging.c
index a49ba778..f9c2c98b 100644
--- a/src/mm-iface-modem-messaging.c
+++ b/src/mm-iface-modem-messaging.c
@@ -410,29 +410,27 @@ handle_list (MmGdbusModemMessaging *skeleton,
gboolean
mm_iface_modem_messaging_take_part (MMIfaceModemMessaging *self,
- MMSmsPart *sms_part,
- MMSmsState state,
- MMSmsStorage storage)
+ MMSmsPart *sms_part,
+ MMSmsState state,
+ MMSmsStorage storage)
{
- MMSmsList *list = NULL;
- GError *error = NULL;
- gboolean added;
+ g_autoptr(MMSmsList) list = NULL;
+ g_autoptr(GError) error = NULL;
+ gboolean added = FALSE;
g_object_get (self,
MM_IFACE_MODEM_MESSAGING_SMS_LIST, &list,
NULL);
- if (!list)
- return FALSE;
- added = mm_sms_list_take_part (list, sms_part, state, storage, &error);
- if (!added) {
- mm_obj_dbg (self, "couldn't take part in SMS list: %s", error->message);
- g_error_free (error);
+ if (list) {
+ added = mm_sms_list_take_part (list, sms_part, state, storage, &error);
+ if (!added)
+ mm_obj_dbg (self, "couldn't take part in SMS list: %s", error->message);
+ }
- /* If part wasn't taken, we need to free the part ourselves */
+ /* If part wasn't taken, we need to free the part ourselves */
+ if (!added)
mm_sms_part_free (sms_part);
- }
- g_object_unref (list);
return added;
}
diff --git a/src/mm-iface-modem-messaging.h b/src/mm-iface-modem-messaging.h
index 57fa4521..64dfb2b1 100644
--- a/src/mm-iface-modem-messaging.h
+++ b/src/mm-iface-modem-messaging.h
@@ -134,6 +134,7 @@ struct _MMIfaceModemMessaging {
};
GType mm_iface_modem_messaging_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemMessaging, g_object_unref)
/* Initialize Messaging interface (async) */
void mm_iface_modem_messaging_initialize (MMIfaceModemMessaging *self,
diff --git a/src/mm-iface-modem-oma.h b/src/mm-iface-modem-oma.h
index 94b16e1d..8117ebe6 100644
--- a/src/mm-iface-modem-oma.h
+++ b/src/mm-iface-modem-oma.h
@@ -120,6 +120,7 @@ struct _MMIfaceModemOma {
};
GType mm_iface_modem_oma_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemOma, g_object_unref)
/* Initialize Oma interface (async) */
void mm_iface_modem_oma_initialize (MMIfaceModemOma *self,
diff --git a/src/mm-iface-modem-signal.c b/src/mm-iface-modem-signal.c
index 03e4ce1f..2c233935 100644
--- a/src/mm-iface-modem-signal.c
+++ b/src/mm-iface-modem-signal.c
@@ -524,7 +524,6 @@ mm_iface_modem_signal_initialize (MMIfaceModemSignal *self,
NULL);
if (!skeleton) {
skeleton = mm_gdbus_modem_signal_skeleton_new ();
- clear_values (self);
g_object_set (self,
MM_IFACE_MODEM_SIGNAL_DBUS_SKELETON, skeleton,
NULL);
diff --git a/src/mm-iface-modem-signal.h b/src/mm-iface-modem-signal.h
index 1d49e5f3..24e76e7d 100644
--- a/src/mm-iface-modem-signal.h
+++ b/src/mm-iface-modem-signal.h
@@ -58,6 +58,7 @@ struct _MMIfaceModemSignal {
};
GType mm_iface_modem_signal_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemSignal, g_object_unref)
/* Initialize Signal interface (async) */
void mm_iface_modem_signal_initialize (MMIfaceModemSignal *self,
diff --git a/src/mm-iface-modem-simple.h b/src/mm-iface-modem-simple.h
index 5b9b8af6..1aca5de1 100644
--- a/src/mm-iface-modem-simple.h
+++ b/src/mm-iface-modem-simple.h
@@ -34,6 +34,7 @@ struct _MMIfaceModemSimple {
};
GType mm_iface_modem_simple_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemSimple, g_object_unref)
/* Initialize Modem Simple interface */
void mm_iface_modem_simple_initialize (MMIfaceModemSimple *self);
diff --git a/src/mm-iface-modem-time.h b/src/mm-iface-modem-time.h
index 462d8b96..ca0640d6 100644
--- a/src/mm-iface-modem-time.h
+++ b/src/mm-iface-modem-time.h
@@ -94,6 +94,7 @@ struct _MMIfaceModemTime {
};
GType mm_iface_modem_time_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemTime, g_object_unref)
/* Initialize Time interface (async) */
void mm_iface_modem_time_initialize (MMIfaceModemTime *self,
diff --git a/src/mm-iface-modem-voice.h b/src/mm-iface-modem-voice.h
index 2a9e52e0..fe2ae243 100644
--- a/src/mm-iface-modem-voice.h
+++ b/src/mm-iface-modem-voice.h
@@ -196,6 +196,7 @@ struct _MMIfaceModemVoice {
};
GType mm_iface_modem_voice_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModemVoice, g_object_unref)
/* Initialize Voice interface (async) */
void mm_iface_modem_voice_initialize (MMIfaceModemVoice *self,
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 48105afe..8a4a00af 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -1509,7 +1509,8 @@ __iface_modem_update_state_internal (MMIfaceModem *self,
/* While connected we don't want registration status changes to change
* the modem's state away from CONNECTED. */
- if ((new_state == MM_MODEM_STATE_SEARCHING ||
+ if ((new_state == MM_MODEM_STATE_ENABLED ||
+ new_state == MM_MODEM_STATE_SEARCHING ||
new_state == MM_MODEM_STATE_REGISTERED) &&
bearer_list &&
old_state > MM_MODEM_STATE_REGISTERED) {
@@ -4374,6 +4375,31 @@ load_supported_ip_families_ready (MMIfaceModem *self,
UINT_REPLY_READY_FN (power_state, "power state")
+static void
+setup_sim_hot_swap_ready (MMIfaceModem *self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ InitializationContext *ctx;
+ g_autoptr(GError) error = NULL;
+
+ ctx = g_task_get_task_data (task);
+
+ MM_IFACE_MODEM_GET_INTERFACE (self)->setup_sim_hot_swap_finish (self, res, &error);
+ if (error)
+ mm_obj_warn (self, "SIM hot swap setup failed: %s", error->message);
+ else {
+ mm_obj_dbg (self, "SIM hot swap setup succeeded");
+ g_object_set (self,
+ MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED, TRUE,
+ NULL);
+ }
+
+ /* Go on to next step */
+ ctx->step++;
+ interface_initialization_step (task);
+}
+
static void
modem_update_lock_info_ready (MMIfaceModem *self,
GAsyncResult *res,
@@ -4617,34 +4643,6 @@ load_current_bands_ready (MMIfaceModem *self,
interface_initialization_step (task);
}
-/*****************************************************************************/
-/* Setup SIM hot swap (Modem interface) */
-static void
-setup_sim_hot_swap_ready (MMIfaceModem *self,
- GAsyncResult *res,
- GTask *task)
-{
- InitializationContext *ctx;
- GError *error = NULL;
-
- ctx = g_task_get_task_data (task);
-
- MM_IFACE_MODEM_GET_INTERFACE (self)->setup_sim_hot_swap_finish (self, res, &error);
- if (error) {
- mm_obj_warn (self, "SIM hot swap setup failed: %s", error->message);
- g_error_free (error);
- } else {
- mm_obj_dbg (self, "SIM hot swap setup succeeded");
- g_object_set (self,
- MM_IFACE_MODEM_SIM_HOT_SWAP_CONFIGURED, TRUE,
- NULL);
- }
-
- /* Go on to next step */
- ctx->step++;
- interface_initialization_step (task);
-}
-
static void
interface_initialization_step (GTask *task)
{
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index 2df3b59c..9bc6a479 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -382,6 +382,7 @@ struct _MMIfaceModem {
};
GType mm_iface_modem_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMIfaceModem, g_object_unref)
/* Helpers to query access technologies */
MMModemAccessTechnology mm_iface_modem_get_access_technologies (MMIfaceModem *self);
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
index f319a925..d080e010 100644
--- a/src/mm-modem-helpers.c
+++ b/src/mm-modem-helpers.c
@@ -2888,8 +2888,11 @@ mm_3gpp_parse_cpms_test_response (const gchar *reply,
#define N_EXPECTED_GROUPS 3
split = mm_split_string_groups (mm_strip_tag (reply, "+CPMS:"));
- if (!split)
+ if (!split) {
+ g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "Couldn't split +CPMS test response in groups");
return FALSE;
+ }
if (g_strv_length (split) != N_EXPECTED_GROUPS) {
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
diff --git a/src/mm-plugin-manager.h b/src/mm-plugin-manager.h
index 6a0f47eb..079fc54b 100644
--- a/src/mm-plugin-manager.h
+++ b/src/mm-plugin-manager.h
@@ -48,7 +48,9 @@ struct _MMPluginManagerClass {
GObjectClass parent;
};
-GType mm_plugin_manager_get_type (void);
+GType mm_plugin_manager_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPluginManager, g_object_unref)
+
MMPluginManager *mm_plugin_manager_new (const gchar *plugindir,
MMFilter *filter,
GError **error);
diff --git a/src/mm-plugin.c b/src/mm-plugin.c
index adfe4bf2..77bd6528 100644
--- a/src/mm-plugin.c
+++ b/src/mm-plugin.c
@@ -1089,7 +1089,7 @@ static gchar *
log_object_build_id (MMLogObject *_self)
{
MMPlugin *self;
- g_autofree gchar *plugin_name_lowercase;
+ g_autofree gchar *plugin_name_lowercase = NULL;
self = MM_PLUGIN (_self);
plugin_name_lowercase = g_ascii_strdown (self->priv->name, -1);
diff --git a/src/mm-plugin.h b/src/mm-plugin.h
index f5863522..7011f9c4 100644
--- a/src/mm-plugin.h
+++ b/src/mm-plugin.h
@@ -123,6 +123,7 @@ struct _MMPluginClass {
};
GType mm_plugin_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPlugin, g_object_unref)
const gchar *mm_plugin_get_name (MMPlugin *self);
const gchar **mm_plugin_get_allowed_udev_tags (MMPlugin *self);
diff --git a/src/mm-port-mbim.h b/src/mm-port-mbim.h
index 3bd20e48..c0bd7988 100644
--- a/src/mm-port-mbim.h
+++ b/src/mm-port-mbim.h
@@ -51,6 +51,7 @@ struct _MMPortMbimClass {
};
GType mm_port_mbim_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortMbim, g_object_unref)
MMPortMbim *mm_port_mbim_new (const gchar *name);
diff --git a/src/mm-port-probe.h b/src/mm-port-probe.h
index 8c2ead9a..9c2fd893 100644
--- a/src/mm-port-probe.h
+++ b/src/mm-port-probe.h
@@ -79,6 +79,7 @@ typedef gboolean (* MMPortProbeAtCustomInitFinish) (MMPortProbe *probe,
GError **error);
GType mm_port_probe_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortProbe, g_object_unref)
MMPortProbe *mm_port_probe_new (MMDevice *device,
MMKernelDevice *port);
diff --git a/src/mm-port-qmi.c b/src/mm-port-qmi.c
index 83d92b9d..571bb934 100644
--- a/src/mm-port-qmi.c
+++ b/src/mm-port-qmi.c
@@ -509,7 +509,7 @@ port_open_step (GTask *task)
qmi_device_open (ctx->device,
(QMI_DEVICE_OPEN_FLAGS_VERSION_INFO |
QMI_DEVICE_OPEN_FLAGS_PROXY),
- 20,
+ 25,
g_task_get_cancellable (task),
(GAsyncReadyCallback) qmi_device_open_first_ready,
task);
diff --git a/src/mm-port-qmi.h b/src/mm-port-qmi.h
index b4e8460c..dd7033dc 100644
--- a/src/mm-port-qmi.h
+++ b/src/mm-port-qmi.h
@@ -45,6 +45,7 @@ struct _MMPortQmiClass {
};
GType mm_port_qmi_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortQmi, g_object_unref)
MMPortQmi *mm_port_qmi_new (const gchar *name);
diff --git a/src/mm-port-serial-at.h b/src/mm-port-serial-at.h
index f447d144..0a4d2b7a 100644
--- a/src/mm-port-serial-at.h
+++ b/src/mm-port-serial-at.h
@@ -77,6 +77,7 @@ struct _MMPortSerialAtClass {
};
GType mm_port_serial_at_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortSerialAt, g_object_unref)
MMPortSerialAt *mm_port_serial_at_new (const char *name,
MMPortSubsys subsys);
diff --git a/src/mm-port-serial-gps.h b/src/mm-port-serial-gps.h
index 5655b5e3..ad5a97fc 100644
--- a/src/mm-port-serial-gps.h
+++ b/src/mm-port-serial-gps.h
@@ -46,6 +46,7 @@ struct _MMPortSerialGpsClass {
};
GType mm_port_serial_gps_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortSerialGps, g_object_unref)
MMPortSerialGps *mm_port_serial_gps_new (const char *name);
diff --git a/src/mm-port-serial-qcdm.h b/src/mm-port-serial-qcdm.h
index e7ba01fe..b7bca88e 100644
--- a/src/mm-port-serial-qcdm.h
+++ b/src/mm-port-serial-qcdm.h
@@ -43,6 +43,7 @@ struct _MMPortSerialQcdmClass {
};
GType mm_port_serial_qcdm_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortSerialQcdm, g_object_unref)
MMPortSerialQcdm *mm_port_serial_qcdm_new (const char *name);
MMPortSerialQcdm *mm_port_serial_qcdm_new_fd (int fd);
diff --git a/src/mm-port-serial.h b/src/mm-port-serial.h
index e643d147..5ad17c2e 100644
--- a/src/mm-port-serial.h
+++ b/src/mm-port-serial.h
@@ -107,6 +107,7 @@ struct _MMPortSerialClass {
};
GType mm_port_serial_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPortSerial, g_object_unref)
MMPortSerial *mm_port_serial_new (const char *name, MMPortType ptype);
diff --git a/src/mm-port.h b/src/mm-port.h
index 33b07d97..7bf85fb2 100644
--- a/src/mm-port.h
+++ b/src/mm-port.h
@@ -72,6 +72,7 @@ struct _MMPortClass {
};
GType mm_port_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMPort, g_object_unref)
const gchar *mm_port_get_device (MMPort *self);
MMPortSubsys mm_port_get_subsys (MMPort *self);
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index bbcc169b..fb4943f7 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -326,41 +326,14 @@ out:
qmi_message_nas_initiate_network_register_output_unref (output);
}
-void
-mm_shared_qmi_3gpp_register_in_network (MMIfaceModem3gpp *self,
- const gchar *operator_id,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data)
+static void
+register_in_network_inr (GTask *task,
+ QmiClient *client,
+ GCancellable *cancellable,
+ guint16 mcc,
+ guint16 mnc)
{
- GTask *task;
- RegisterInNetworkContext *ctx;
QmiMessageNasInitiateNetworkRegisterInput *input;
- guint16 mcc = 0;
- guint16 mnc;
- QmiClient *client = NULL;
- GError *error = NULL;
-
- /* Get NAS client */
- if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
- QMI_SERVICE_NAS, &client,
- callback, user_data))
- return;
-
- task = g_task_new (self, cancellable, callback, user_data);
-
- ctx = g_slice_new0 (RegisterInNetworkContext);
- ctx->client = g_object_ref (client);
- ctx->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
- g_task_set_task_data (task, ctx, (GDestroyNotify)register_in_network_context_free);
-
- /* Parse input MCC/MNC */
- if (operator_id && !mm_3gpp_parse_operator_id (operator_id, &mcc, &mnc, &error)) {
- g_assert (error != NULL);
- g_task_return_error (task, error);
- g_object_unref (task);
- return;
- }
input = qmi_message_nas_initiate_network_register_input_new ();
@@ -395,6 +368,105 @@ mm_shared_qmi_3gpp_register_in_network (MMIfaceModem3gpp *self,
qmi_message_nas_initiate_network_register_input_unref (input);
}
+static void
+set_system_selection_preference_ready (QmiClientNas *client,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+ QmiMessageNasSetSystemSelectionPreferenceOutput *output;
+
+ output = qmi_client_nas_set_system_selection_preference_finish (client, res, &error);
+ if (!output || !qmi_message_nas_set_system_selection_preference_output_get_result (output, &error)) {
+ if (!g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_NO_EFFECT)) {
+ g_prefix_error (&error, "Couldn't set network selection preference: ");
+ g_task_return_error (task, error);
+ goto out;
+ }
+ g_error_free (error);
+ }
+
+ g_task_return_boolean (task, TRUE);
+
+out:
+ g_object_unref (task);
+
+ if (output)
+ qmi_message_nas_set_system_selection_preference_output_unref (output);
+}
+
+static void
+register_in_network_sssp (GTask *task,
+ QmiClient *client,
+ GCancellable *cancellable,
+ guint16 mcc,
+ guint16 mnc)
+{
+ QmiMessageNasSetSystemSelectionPreferenceInput *input;
+
+ input = qmi_message_nas_set_system_selection_preference_input_new ();
+
+ qmi_message_nas_set_system_selection_preference_input_set_network_selection_preference (
+ input,
+ mcc ? QMI_NAS_NETWORK_SELECTION_PREFERENCE_MANUAL : QMI_NAS_NETWORK_SELECTION_PREFERENCE_AUTOMATIC,
+ mcc,
+ mnc,
+ NULL);
+
+ qmi_client_nas_set_system_selection_preference (
+ QMI_CLIENT_NAS (client),
+ input,
+ 120,
+ cancellable,
+ (GAsyncReadyCallback)set_system_selection_preference_ready,
+ task);
+
+ qmi_message_nas_set_system_selection_preference_input_unref (input);
+}
+
+void
+mm_shared_qmi_3gpp_register_in_network (MMIfaceModem3gpp *self,
+ const gchar *operator_id,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ RegisterInNetworkContext *ctx;
+ guint16 mcc = 0;
+ guint16 mnc;
+ QmiClient *client = NULL;
+ GError *error = NULL;
+ Private *priv = NULL;
+
+ /* Get NAS client */
+ if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
+ QMI_SERVICE_NAS, &client,
+ callback, user_data))
+ return;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+
+ ctx = g_slice_new0 (RegisterInNetworkContext);
+ ctx->client = g_object_ref (client);
+ ctx->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
+ g_task_set_task_data (task, ctx, (GDestroyNotify)register_in_network_context_free);
+
+ /* Parse input MCC/MNC */
+ if (operator_id && !mm_3gpp_parse_operator_id (operator_id, &mcc, &mnc, &error)) {
+ g_assert (error != NULL);
+ g_task_return_error (task, error);
+ g_object_unref (task);
+ return;
+ }
+
+ priv = get_private (MM_SHARED_QMI (self));
+ if (priv->feature_nas_system_selection_preference == FEATURE_SUPPORTED)
+ register_in_network_sssp (task, client, cancellable, mcc, mnc);
+ else
+ register_in_network_inr (task, client, cancellable, mcc, mnc);
+}
+
/*****************************************************************************/
/* Current capabilities setting (Modem interface) */
diff --git a/src/mm-shared-qmi.h b/src/mm-shared-qmi.h
index 093896e0..e0e57641 100644
--- a/src/mm-shared-qmi.h
+++ b/src/mm-shared-qmi.h
@@ -49,6 +49,7 @@ struct _MMSharedQmi {
};
GType mm_shared_qmi_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSharedQmi, g_object_unref)
QmiClient *mm_shared_qmi_peek_client (MMSharedQmi *self,
QmiService service,
diff --git a/src/mm-sim-mbim.h b/src/mm-sim-mbim.h
index f7bf6ab1..eb6b1e2e 100644
--- a/src/mm-sim-mbim.h
+++ b/src/mm-sim-mbim.h
@@ -40,6 +40,7 @@ struct _MMSimMbimClass {
};
GType mm_sim_mbim_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSimMbim, g_object_unref)
void mm_sim_mbim_new (MMBaseModem *modem,
GCancellable *cancellable,
diff --git a/src/mm-sim-qmi.h b/src/mm-sim-qmi.h
index 20954444..1c999d82 100644
--- a/src/mm-sim-qmi.h
+++ b/src/mm-sim-qmi.h
@@ -44,6 +44,7 @@ struct _MMSimQmiClass {
};
GType mm_sim_qmi_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSimQmi, g_object_unref)
void mm_sim_qmi_new (MMBaseModem *modem,
gboolean dms_uim_deprecated,
diff --git a/src/mm-sms-list.h b/src/mm-sms-list.h
index 29370657..8a77d6ca 100644
--- a/src/mm-sms-list.h
+++ b/src/mm-sms-list.h
@@ -55,6 +55,7 @@ struct _MMSmsListClass {
};
GType mm_sms_list_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsList, g_object_unref)
MMSmsList *mm_sms_list_new (MMBaseModem *modem);
diff --git a/src/mm-sms-mbim.h b/src/mm-sms-mbim.h
index f2f6f3ac..5743f262 100644
--- a/src/mm-sms-mbim.h
+++ b/src/mm-sms-mbim.h
@@ -43,6 +43,7 @@ struct _MMSmsMbimClass {
};
GType mm_sms_mbim_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsMbim, g_object_unref)
MMBaseSms *mm_sms_mbim_new (MMBaseModem *modem);
diff --git a/src/mm-sms-part-3gpp.c b/src/mm-sms-part-3gpp.c
index c4f6154f..c18aaa75 100644
--- a/src/mm-sms-part-3gpp.c
+++ b/src/mm-sms-part-3gpp.c
@@ -246,38 +246,25 @@ sms_decode_text (const guint8 *text,
int bit_offset,
gpointer log_object)
{
- char *utf8;
- guint8 *unpacked;
- guint32 unpacked_len;
+ gchar *utf8;
if (encoding == MM_SMS_ENCODING_GSM7) {
+ g_autofree guint8 *unpacked = NULL;
+ guint32 unpacked_len;
+
mm_obj_dbg (log_object, "converting SMS part text from GSM-7 to UTF-8...");
unpacked = mm_charset_gsm_unpack ((const guint8 *) text, len, bit_offset, &unpacked_len);
utf8 = (char *) mm_charset_gsm_unpacked_to_utf8 (unpacked, unpacked_len);
mm_obj_dbg (log_object, " got UTF-8 text: '%s'", utf8);
- g_free (unpacked);
} else if (encoding == MM_SMS_ENCODING_UCS2) {
- /* Despite 3GPP TS 23.038 specifies that Unicode SMS messages are
- * encoded in UCS-2, UTF-16 encoding is commonly used instead on many
- * modern platforms to allow encoding code points that fall outside the
- * Basic Multilingual Plane (BMP), such as Emoji. Most of the UCS-2
- * code points are identical to their equivalent UTF-16 code points.
- * In UTF-16, non-BMP code points are encoded in a pair of surrogate
- * code points (i.e. a high surrogate in 0xD800..0xDBFF, followed by a
- * low surrogate in 0xDC00..0xDFFF). An isolated surrogate code point
- * has no general interpretation in UTF-16, but could be a valid
- * (though unmapped) code point in UCS-2. Here we first try to decode
- * the SMS message in UTF-16BE, and if that fails, fall back to decode
- * in UCS-2BE.
- */
+ g_autoptr(GByteArray) bytearray = NULL;
+
mm_obj_dbg (log_object, "converting SMS part text from UTF-16BE to UTF-8...");
- utf8 = g_convert ((const gchar *) text, len, "UTF-8", "UTF-16BE", NULL, NULL, NULL);
- if (!utf8) {
- mm_obj_dbg (log_object, "converting SMS part text from UCS-2BE to UTF-8...");
- utf8 = g_convert ((const gchar *) text, len, "UTF-8", "UCS-2BE", NULL, NULL, NULL);
- }
+ bytearray = g_byte_array_append (g_byte_array_sized_new (len), (const guint8 *)text, len);
+ /* Always assume UTF-16 instead of UCS-2! */
+ utf8 = mm_modem_charset_byte_array_to_utf8 (bytearray, MM_MODEM_CHARSET_UTF16);
if (!utf8) {
- mm_obj_warn (log_object, "couldn't convert SMS part contents from UTF-16BE/UCS-2BE to UTF-8: not decoding any text");
+ mm_obj_warn (log_object, "couldn't convert SMS part contents from UTF-16BE to UTF-8: not decoding any text");
utf8 = g_strdup ("");
} else
mm_obj_dbg (log_object, " got UTF-8 text: '%s'", utf8);
@@ -625,9 +612,11 @@ mm_sms_part_3gpp_new_from_binary_pdu (guint index,
mm_obj_dbg (log_object, " user data encoding is 8bit");
break;
case MM_SMS_ENCODING_UNKNOWN:
- default:
mm_obj_dbg (log_object, " user data encoding is unknown");
break;
+ default:
+ g_assert_not_reached ();
+
}
mm_sms_part_set_encoding (sms_part, user_data_encoding);
@@ -829,6 +818,7 @@ mm_sms_part_3gpp_get_submit_pdu (MMSmsPart *part,
guint len, offset = 0;
guint shift = 0;
guint8 *udl_ptr;
+ MMSmsEncoding encoding;
g_return_val_if_fail (mm_sms_part_get_number (part) != NULL, NULL);
g_return_val_if_fail (mm_sms_part_get_text (part) != NULL || mm_sms_part_get_data (part) != NULL, NULL);
@@ -923,7 +913,9 @@ mm_sms_part_3gpp_get_submit_pdu (MMSmsPart *part,
pdu[offset] |= mm_sms_part_get_class (part);
}
- switch (mm_sms_part_get_encoding (part)) {
+ encoding = mm_sms_part_get_encoding (part);
+
+ switch (encoding) {
case MM_SMS_ENCODING_UCS2:
mm_obj_dbg (log_object, " using UCS2 encoding...");
pdu[offset] |= SMS_DCS_CODING_UCS2;
@@ -976,7 +968,7 @@ mm_sms_part_3gpp_get_submit_pdu (MMSmsPart *part,
shift = 1;
}
- if (mm_sms_part_get_encoding (part) == MM_SMS_ENCODING_GSM7) {
+ if (encoding == MM_SMS_ENCODING_GSM7) {
guint8 *unpacked, *packed;
guint32 unlen = 0, packlen = 0;
@@ -1012,17 +1004,19 @@ mm_sms_part_3gpp_get_submit_pdu (MMSmsPart *part,
memcpy (&pdu[offset], packed, packlen);
g_free (packed);
offset += packlen;
- } else if (mm_sms_part_get_encoding (part) == MM_SMS_ENCODING_UCS2) {
+ } else if (encoding == MM_SMS_ENCODING_UCS2) {
g_autoptr(GByteArray) array = NULL;
g_autoptr(GError) inner_error = NULL;
/* Try to guess a good value for the array */
array = g_byte_array_sized_new (strlen (mm_sms_part_get_text (part)) * 2);
- if (!mm_modem_charset_byte_array_append (array, mm_sms_part_get_text (part), FALSE, MM_MODEM_CHARSET_UCS2, &inner_error)) {
+ /* Always assume UTF-16 instead of UCS-2! */
+ if (!mm_modem_charset_byte_array_append (array, mm_sms_part_get_text (part), FALSE, MM_MODEM_CHARSET_UTF16, &inner_error)) {
g_set_error (error,
MM_MESSAGE_ERROR,
MM_MESSAGE_ERROR_INVALID_PDU_PARAMETER,
- "Failed to convert message text to UCS2: %s", inner_error->message);
+ "Failed to convert message text to UTF-16: %s",
+ inner_error->message);
goto error;
}
@@ -1063,22 +1057,109 @@ error:
return NULL;
}
+static gchar **
+util_split_text_gsm7 (const gchar *text,
+ gsize text_len,
+ gpointer log_object)
+{
+ gchar **out;
+ guint n_chunks;
+ guint i;
+ guint j;
+
+ /* No splitting needed? */
+ if (text_len <= 160) {
+ out = g_new0 (gchar *, 2);
+ out[0] = g_strdup (text);
+ return out;
+ }
+
+ /* Compute number of chunks needed */
+ n_chunks = text_len / 153;
+ if (text_len % 153 != 0)
+ n_chunks++;
+
+ /* Fill in all chunks */
+ out = g_new0 (gchar *, n_chunks + 1);
+ for (i = 0, j = 0; i < n_chunks; i++, j += 153)
+ out[i] = g_strndup (&text[j], 153);
+
+ return out;
+}
+
+static gchar **
+util_split_text_utf16_or_ucs2 (const gchar *text,
+ gsize text_len,
+ gpointer log_object)
+{
+ g_autoptr(GPtrArray) chunks = NULL;
+ const gchar *walker;
+ const gchar *chunk_start;
+ glong encoded_chunk_length;
+ glong total_encoded_chunk_length;
+
+ chunks = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
+
+ walker = text;
+ chunk_start = text;
+ encoded_chunk_length = 0;
+ total_encoded_chunk_length = 0;
+ while (walker && *walker) {
+ g_autofree gunichar2 *unichar2 = NULL;
+ glong unichar2_written = 0;
+ glong unichar2_written_bytes = 0;
+ gunichar single;
+
+ single = g_utf8_get_char (walker);
+ unichar2 = g_ucs4_to_utf16 (&single, 1, NULL, &unichar2_written, NULL);
+ g_assert (unichar2_written > 0);
+
+ /* When splitting for UCS-2 encoding, only one single unichar2 will be
+ * written, because all codepoints represented in UCS2 fit in the BMP.
+ * When splitting for UTF-16, though, we may end up writing one or two
+ * unichar2 (without or with surrogate pairs), because UTF-16 covers the
+ * whole Unicode spectrum. */
+ unichar2_written_bytes = (unichar2_written * sizeof (gunichar2));
+ if ((encoded_chunk_length + unichar2_written_bytes) > 134) {
+ g_ptr_array_add (chunks, g_strndup (chunk_start, walker - chunk_start));
+ chunk_start = walker;
+ encoded_chunk_length = unichar2_written_bytes;
+ } else
+ encoded_chunk_length += unichar2_written_bytes;
+
+ total_encoded_chunk_length += unichar2_written_bytes;
+ walker = g_utf8_next_char (walker);
+ }
+
+ /* We have split the original string in chunks, where each chunk
+ * does not require more than 134 bytes when encoded in UTF-16.
+ * As a special case now, we consider the case that no splitting
+ * is necessary, i.e. if the total amount of bytes after encoding
+ * in UTF-16 is less or equal than 140. */
+ if (total_encoded_chunk_length <= 140) {
+ gchar **out;
+
+ out = g_new0 (gchar *, 2);
+ out[0] = g_strdup (text);
+ return out;
+ }
+
+ /* Otherwise, we do need the splitted chunks. Add the last one
+ * with contents plus the last trailing NULL */
+ g_ptr_array_add (chunks, g_strndup (chunk_start, walker - chunk_start));
+ g_ptr_array_add (chunks, NULL);
+
+ return (gchar **) g_ptr_array_free (g_steal_pointer (&chunks), FALSE);
+}
+
gchar **
mm_sms_part_3gpp_util_split_text (const gchar *text,
MMSmsEncoding *encoding,
gpointer log_object)
{
- gchar **out;
- guint n_chunks;
- guint i;
- guint j;
- gsize in_len;
-
if (!text)
return NULL;
- in_len = strlen (text);
-
/* Some info about the rules for splitting.
*
* The User Data can be up to 140 bytes in the SMS part:
@@ -1093,80 +1174,25 @@ mm_sms_part_3gpp_util_split_text (const gchar *text,
* 134 * 8 = 1072; 1072/7=153.14
* 2) If we're using UCS2 encoding, we can pack up to 70 characters in
* 140 bytes (each with 2 bytes), or up to 67 characters in 134 bytes.
+ * 3) If we're using UTF-16 encoding (instead of UCS2), the amount of
+ * characters we can pack is variable, depends on how the characters
+ * are encoded in UTF-16 (e.g. if there are characters out of the BMP
+ * we'll need surrogate pairs and a single character will need 4 bytes
+ * instead of 2).
*
* This method does the split of the input string into N strings, so that
* each of the strings can be placed in a SMS part.
*/
/* Check if we can do GSM encoding */
- if (!mm_charset_can_convert_to (text, MM_MODEM_CHARSET_GSM)) {
- /* If cannot do it in GSM encoding, do it in UCS-2 */
- g_autoptr(GByteArray) array = NULL;
- g_autoptr(GError) error = NULL;
-
- *encoding = MM_SMS_ENCODING_UCS2;
-
- /* Guess more or less the size of the output array to avoid multiple
- * allocations */
- array = g_byte_array_sized_new (in_len * 2);
- if (!mm_modem_charset_byte_array_append (array,
- text,
- FALSE,
- MM_MODEM_CHARSET_UCS2,
- &error)) {
- mm_obj_warn (log_object, "failed to append UCS2: %s", error->message);
- return NULL;
- }
-
- /* Our bytearray has it in UCS-2 now.
- * UCS-2 is a fixed-size encoding, which means that the text has exactly
- * 2 bytes for each unicode point. We can now split this array into
- * chunks of 67 UCS-2 characters (134 bytes).
- *
- * Note that UCS-2 covers unicode points between U+0000 and U+FFFF, which
- * means that there is no direct relationship between the size of the
- * input text in UTF-8 and the size of the text in UCS-2. A 3-byte UTF-8
- * encoded character will still be represented with 2 bytes in UCS-2.
- */
- if (array->len <= 140) {
- out = g_new (gchar *, 2);
- out[0] = g_strdup (text);
- out[1] = NULL;
- } else {
- n_chunks = array->len / 134;
- if (array->len % 134 != 0)
- n_chunks++;
-
- out = g_new0 (gchar *, n_chunks + 1);
- for (i = 0, j = 0; i < n_chunks; i++, j += 134) {
- out[i] = sms_decode_text (&array->data[j],
- MIN (array->len - j, 134),
- MM_SMS_ENCODING_UCS2,
- 0,
- log_object);
- }
- }
- } else {
- /* Do it with GSM encoding */
+ if (mm_charset_can_convert_to (text, MM_MODEM_CHARSET_GSM)) {
*encoding = MM_SMS_ENCODING_GSM7;
-
- if (in_len <= 160) {
- out = g_new (gchar *, 2);
- out[0] = g_strdup (text);
- out[1] = NULL;
- } else {
- n_chunks = in_len / 153;
- if (in_len % 153 != 0)
- n_chunks++;
-
- out = g_new0 (gchar *, n_chunks + 1);
- for (i = 0, j = 0; i < n_chunks; i++, j += 153) {
- out[i] = g_strndup (&text[j], 153);
- }
- }
+ return util_split_text_gsm7 (text, strlen (text), log_object);
}
- return out;
+ /* Otherwise fallback to report UCS-2 and split supporting UTF-16 */
+ *encoding = MM_SMS_ENCODING_UCS2;
+ return util_split_text_utf16_or_ucs2 (text, strlen (text), log_object);
}
GByteArray **
diff --git a/src/mm-sms-part-cdma.c b/src/mm-sms-part-cdma.c
index 2903e846..6e3f1179 100644
--- a/src/mm-sms-part-cdma.c
+++ b/src/mm-sms-part-cdma.c
@@ -874,7 +874,7 @@ read_bearer_data_user_data (MMSmsPart *sms_part,
}
latin[i] = '\0';
- text = g_convert (latin, -1, "UTF-8", "ISO−8859−1", NULL, NULL, NULL);
+ text = g_convert (latin, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
if (!text) {
mm_obj_dbg (log_object, " text/data: ignored (latin to UTF-8 conversion error)");
} else {
diff --git a/src/mm-sms-part.h b/src/mm-sms-part.h
index 92f39b11..133d2e08 100644
--- a/src/mm-sms-part.h
+++ b/src/mm-sms-part.h
@@ -20,11 +20,27 @@
#include
#include
+/* Despite 3GPP TS 23.038 specifies that Unicode SMS messages are
+ * encoded in UCS-2, UTF-16 encoding is commonly used instead on many
+ * modern platforms to allow encoding code points that fall outside the
+ * Basic Multilingual Plane (BMP), such as Emoji. Most of the UCS-2
+ * code points are identical to their equivalent UTF-16 code points.
+ * In UTF-16, non-BMP code points are encoded in a pair of surrogate
+ * code points (i.e. a high surrogate in 0xD800..0xDBFF, followed by a
+ * low surrogate in 0xDC00..0xDFFF). An isolated surrogate code point
+ * has no general interpretation in UTF-16, but could be a valid
+ * (though unmapped) code point in UCS-2.
+ *
+ * The current implementation in ModemManager just assumes that whenever
+ * possible (i.e. when parsing received PDUs or when creating submit
+ * PDUs) UTF-16 will be used instead of plain UCS-2 (even if the PDUs
+ * report the encoding as UCS-2).
+ */
typedef enum { /*< underscore_name=mm_sms_encoding >*/
MM_SMS_ENCODING_UNKNOWN = 0x0,
MM_SMS_ENCODING_GSM7,
MM_SMS_ENCODING_8BIT,
- MM_SMS_ENCODING_UCS2
+ MM_SMS_ENCODING_UCS2,
} MMSmsEncoding;
typedef struct _MMSmsPart MMSmsPart;
@@ -43,6 +59,8 @@ MMSmsPart *mm_sms_part_new (guint index,
MMSmsPduType type);
void mm_sms_part_free (MMSmsPart *part);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsPart, mm_sms_part_free)
+
guint mm_sms_part_get_index (MMSmsPart *part);
void mm_sms_part_set_index (MMSmsPart *part,
guint index);
diff --git a/src/mm-sms-qmi.h b/src/mm-sms-qmi.h
index 64a2f300..af60a7f5 100644
--- a/src/mm-sms-qmi.h
+++ b/src/mm-sms-qmi.h
@@ -45,6 +45,7 @@ struct _MMSmsQmiClass {
};
GType mm_sms_qmi_get_type (void);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MMSmsQmi, g_object_unref)
MMBaseSms *mm_sms_qmi_new (MMBaseModem *modem);
diff --git a/src/tests/test-charsets.c b/src/tests/test-charsets.c
index 0931d7e8..a15e0332 100644
--- a/src/tests/test-charsets.c
+++ b/src/tests/test-charsets.c
@@ -369,6 +369,7 @@ struct charset_can_convert_to_test_s {
gboolean to_ira;
gboolean to_8859_1;
gboolean to_ucs2;
+ gboolean to_utf16;
gboolean to_pccp437;
gboolean to_pcdn;
};
@@ -379,35 +380,35 @@ test_charset_can_covert_to (void)
static const struct charset_can_convert_to_test_s charset_can_convert_to_test[] = {
{
.utf8 = "",
- .to_gsm = TRUE, .to_ira = TRUE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
+ .to_gsm = TRUE, .to_ira = TRUE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
},
{
.utf8 = " ",
- .to_gsm = TRUE, .to_ira = TRUE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
+ .to_gsm = TRUE, .to_ira = TRUE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
},
{
.utf8 = "some basic ascii",
- .to_gsm = TRUE, .to_ira = TRUE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
+ .to_gsm = TRUE, .to_ira = TRUE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
},
{
.utf8 = "ホモ・サピエンス 喂人类 katakana, chinese, english: UCS2 takes it all",
- .to_gsm = FALSE, .to_ira = FALSE, .to_8859_1 = FALSE, .to_ucs2 = TRUE, .to_pccp437 = FALSE, .to_pcdn = FALSE,
+ .to_gsm = FALSE, .to_ira = FALSE, .to_8859_1 = FALSE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = FALSE, .to_pcdn = FALSE,
},
{
.utf8 = "Some from the GSM7 basic set: a % Ψ Ω ñ ö è æ",
- .to_gsm = TRUE, .to_ira = FALSE, .to_8859_1 = FALSE, .to_ucs2 = TRUE, .to_pccp437 = FALSE, .to_pcdn = FALSE,
+ .to_gsm = TRUE, .to_ira = FALSE, .to_8859_1 = FALSE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = FALSE, .to_pcdn = FALSE,
},
{
.utf8 = "More from the GSM7 extended set: {} [] ~ € |",
- .to_gsm = TRUE, .to_ira = FALSE, .to_8859_1 = FALSE, .to_ucs2 = TRUE, .to_pccp437 = FALSE, .to_pcdn = FALSE,
+ .to_gsm = TRUE, .to_ira = FALSE, .to_8859_1 = FALSE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = FALSE, .to_pcdn = FALSE,
},
{
.utf8 = "patín cannot be encoded in GSM7 or IRA, but is valid UCS2, ISO-8859-1, CP437 and CP850",
- .to_gsm = FALSE, .to_ira = FALSE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
+ .to_gsm = FALSE, .to_ira = FALSE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
},
{
.utf8 = "ècole can be encoded in multiple ways, but not in IRA",
- .to_gsm = TRUE, .to_ira = FALSE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
+ .to_gsm = TRUE, .to_ira = FALSE, .to_8859_1 = TRUE, .to_ucs2 = TRUE, .to_utf16 = TRUE, .to_pccp437 = TRUE, .to_pcdn = TRUE,
},
};
guint i;
@@ -418,6 +419,7 @@ test_charset_can_covert_to (void)
g_assert (mm_charset_can_convert_to (charset_can_convert_to_test[i].utf8, MM_MODEM_CHARSET_IRA) == charset_can_convert_to_test[i].to_ira);
g_assert (mm_charset_can_convert_to (charset_can_convert_to_test[i].utf8, MM_MODEM_CHARSET_8859_1) == charset_can_convert_to_test[i].to_8859_1);
g_assert (mm_charset_can_convert_to (charset_can_convert_to_test[i].utf8, MM_MODEM_CHARSET_UCS2) == charset_can_convert_to_test[i].to_ucs2);
+ g_assert (mm_charset_can_convert_to (charset_can_convert_to_test[i].utf8, MM_MODEM_CHARSET_UTF16) == charset_can_convert_to_test[i].to_utf16);
g_assert (mm_charset_can_convert_to (charset_can_convert_to_test[i].utf8, MM_MODEM_CHARSET_PCCP437) == charset_can_convert_to_test[i].to_pccp437);
g_assert (mm_charset_can_convert_to (charset_can_convert_to_test[i].utf8, MM_MODEM_CHARSET_PCDN) == charset_can_convert_to_test[i].to_pcdn);
}
diff --git a/src/tests/test-sms-part-3gpp.c b/src/tests/test-sms-part-3gpp.c
index c3d59d87..db6aa7a0 100644
--- a/src/tests/test-sms-part-3gpp.c
+++ b/src/tests/test-sms-part-3gpp.c
@@ -553,8 +553,7 @@ common_test_create_pdu (const gchar *smsc,
g_assert_no_error (error);
g_assert (pdu != NULL);
- g_assert_cmpuint (len, ==, expected_size);
- g_assert_cmpint (memcmp (pdu, expected, len), ==, 0);
+ g_assert_cmpmem (pdu, len, expected, expected_size);
g_assert_cmpint (msgstart, ==, expected_msgstart);
g_free (pdu);
@@ -735,7 +734,7 @@ common_test_text_split (const gchar *text,
}
static void
-test_text_split_short (void)
+test_text_split_short_gsm7 (void)
{
const gchar *text = "Hello";
const gchar *expected [] = {
@@ -749,7 +748,7 @@ test_text_split_short (void)
static void
test_text_split_short_ucs2 (void)
{
- const gchar *text = "你好";
+ const gchar *text = "你好"; /* (UTF-8) e4 bd a0 e5 a5 bd */
const gchar *expected [] = {
"你好",
NULL
@@ -759,7 +758,19 @@ test_text_split_short_ucs2 (void)
}
static void
-test_text_split_max_single_pdu (void)
+test_text_split_short_utf16 (void)
+{
+ const gchar *text = "😉"; /* U+1F609, winking face */
+ const gchar *expected [] = {
+ "😉",
+ NULL
+ };
+
+ common_test_text_split (text, expected, MM_SMS_ENCODING_UCS2);
+}
+
+static void
+test_text_split_max_single_pdu_gsm7 (void)
{
const gchar *text =
"0123456789012345678901234567890123456789"
@@ -798,7 +809,23 @@ test_text_split_max_single_pdu_ucs2 (void)
}
static void
-test_text_split_two_pdu (void)
+test_text_split_max_single_pdu_utf16 (void)
+{
+ /* NOTE: this string contains 35 Bhaiksuki characters, each of
+ * them requiring 4 bytes both in UTF-8 and in UTF-16 (140 bytes
+ * in total). */
+ const gchar *text =
+ "𑰀𑰁𑰂𑰃𑰄𑰅𑰆𑰇𑰈𑰊𑰋𑰌𑰍𑰎𑰏𑰐𑰑𑰒𑰓𑰔𑰕𑰖𑰗𑰘𑰙𑰚𑰛𑰜𑰝𑰞𑰟𑰠𑰡𑰢𑰣";
+ const gchar *expected [] = {
+ "𑰀𑰁𑰂𑰃𑰄𑰅𑰆𑰇𑰈𑰊𑰋𑰌𑰍𑰎𑰏𑰐𑰑𑰒𑰓𑰔𑰕𑰖𑰗𑰘𑰙𑰚𑰛𑰜𑰝𑰞𑰟𑰠𑰡𑰢𑰣",
+ NULL
+ };
+
+ common_test_text_split (text, expected, MM_SMS_ENCODING_UCS2);
+}
+
+static void
+test_text_split_two_pdu_gsm7 (void)
{
const gchar *text =
"0123456789012345678901234567890123456789"
@@ -839,6 +866,30 @@ test_text_split_two_pdu_ucs2 (void)
common_test_text_split (text, expected, MM_SMS_ENCODING_UCS2);
}
+static void
+test_text_split_two_pdu_utf16 (void)
+{
+ /* NOTE: this string contains 35 Bhaiksuki characters, each of
+ * them requiring 4 bytes both in UTF-8 and in UTF-16 (140 bytes
+ * in total) plus one ASCII char (encoded with 1 byte in UTF-8 and
+ * 2 bytes in UTF-16), making it a total of 142 bytes when in
+ * UTF-16 (so not fitting in one single PDU)
+ *
+ * When split in chunks, the last chunk will hold 2 Bhaiksuki
+ * characters plus the last ASCII one (9 bytes in UTF-16) so that
+ * the first chunk contains the leading 33 Bhaiksuki characters
+ * (132 characters, less than 134) */
+ const gchar *text =
+ "𑰀𑰁𑰂𑰃𑰄𑰅𑰆𑰇𑰈𑰊𑰋𑰌𑰍𑰎𑰏𑰐𑰑𑰒𑰓𑰔𑰕𑰖𑰗𑰘𑰙𑰚𑰛𑰜𑰝𑰞𑰟𑰠𑰡𑰢𑰣a";
+ const gchar *expected [] = {
+ "𑰀𑰁𑰂𑰃𑰄𑰅𑰆𑰇𑰈𑰊𑰋𑰌𑰍𑰎𑰏𑰐𑰑𑰒𑰓𑰔𑰕𑰖𑰗𑰘𑰙𑰚𑰛𑰜𑰝𑰞𑰟𑰠𑰡",
+ "𑰢𑰣a",
+ NULL
+ };
+
+ common_test_text_split (text, expected, MM_SMS_ENCODING_UCS2);
+}
+
/************************************************************/
int main (int argc, char **argv)
@@ -874,12 +925,15 @@ int main (int argc, char **argv)
g_test_add_func ("/MM/SMS/3GPP/PDU-Creator/GSM-3", test_create_pdu_gsm_3);
g_test_add_func ("/MM/SMS/3GPP/PDU-Creator/GSM-no-validity", test_create_pdu_gsm_no_validity);
- g_test_add_func ("/MM/SMS/3GPP/Text-Split/short", test_text_split_short);
- g_test_add_func ("/MM/SMS/3GPP/Text-Split/short-UCS2", test_text_split_short_ucs2);
- g_test_add_func ("/MM/SMS/3GPP/Text-Split/max-single-pdu", test_text_split_max_single_pdu);
- g_test_add_func ("/MM/SMS/3GPP/Text-Split/max-single-pdu-UCS2", test_text_split_max_single_pdu_ucs2);
- g_test_add_func ("/MM/SMS/3GPP/Text-Split/two-pdu", test_text_split_two_pdu);
- g_test_add_func ("/MM/SMS/3GPP/Text-Split/two-pdu-UCS2", test_text_split_two_pdu_ucs2);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/gsm7/short", test_text_split_short_gsm7);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/ucs2/short", test_text_split_short_ucs2);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/utf16/short", test_text_split_short_utf16);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/gsm7/max-single-pdu", test_text_split_max_single_pdu_gsm7);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/ucs2/max-single-pdu", test_text_split_max_single_pdu_ucs2);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/utf16/max-single-pdu", test_text_split_max_single_pdu_utf16);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/gsm7/two-pdu", test_text_split_two_pdu_gsm7);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/ucs2/two-pdu", test_text_split_two_pdu_ucs2);
+ g_test_add_func ("/MM/SMS/3GPP/Text-Split/utf16/two-pdu", test_text_split_two_pdu_utf16);
return g_test_run ();
}
--
2.26.2