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

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

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