charsets: use new str_from_utf8() instead of take_and_convert_to_current_charset()
This commit is contained in:
@@ -2154,22 +2154,59 @@ set_bands_3g (GTask *task,
|
||||
FALSE,
|
||||
(GAsyncReadyCallback)scfg_set_ready,
|
||||
task);
|
||||
} else { /* self->priv->rb_format == MM_CINTERION_RADIO_BAND_FORMAT_MULTIPLE */
|
||||
return;
|
||||
}
|
||||
|
||||
if (self->priv->rb_format == MM_CINTERION_RADIO_BAND_FORMAT_MULTIPLE) {
|
||||
if (self->priv->modem_family == MM_CINTERION_MODEM_FAMILY_IMT) {
|
||||
g_autofree gchar *bandstr2G = NULL;
|
||||
g_autofree gchar *bandstr3G = NULL;
|
||||
g_autofree gchar *bandstr4G = NULL;
|
||||
g_autofree gchar *bandstr2G_enc = NULL;
|
||||
g_autofree gchar *bandstr3G_enc = NULL;
|
||||
g_autofree gchar *bandstr4G_enc = NULL;
|
||||
|
||||
bandstr2G = g_strdup_printf ("0x%08X", band[MM_CINTERION_RB_BLOCK_GSM]);
|
||||
bandstr3G = g_strdup_printf ("0x%08X", band[MM_CINTERION_RB_BLOCK_UMTS]);
|
||||
bandstr4G = g_strdup_printf ("0x%08X", band[MM_CINTERION_RB_BLOCK_LTE_LOW]);
|
||||
bandstr2G = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr2G);
|
||||
bandstr3G = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr3G);
|
||||
bandstr4G = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr4G);
|
||||
|
||||
bandstr2G_enc = mm_modem_charset_str_from_utf8 (bandstr2G,
|
||||
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (self)),
|
||||
FALSE,
|
||||
&error);
|
||||
if (!bandstr2G_enc) {
|
||||
g_prefix_error (&error, "Couldn't convert 2G band string to current charset: ");
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
bandstr3G_enc = mm_modem_charset_str_from_utf8 (bandstr3G,
|
||||
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (self)),
|
||||
FALSE,
|
||||
&error);
|
||||
if (!bandstr3G_enc) {
|
||||
g_prefix_error (&error, "Couldn't convert 3G band string to current charset: ");
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
bandstr4G_enc = mm_modem_charset_str_from_utf8 (bandstr4G,
|
||||
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (self)),
|
||||
FALSE,
|
||||
&error);
|
||||
if (!bandstr4G_enc) {
|
||||
g_prefix_error (&error, "Couldn't convert 4G band string to current charset: ");
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
self->priv->cmds = g_new0 (MMBaseModemAtCommandAlloc, 3 + 1);
|
||||
self->priv->cmds[0].command = g_strdup_printf ("^SCFG=\"Radio/Band/2G\",\"%s\"", bandstr2G);
|
||||
self->priv->cmds[1].command = g_strdup_printf ("^SCFG=\"Radio/Band/3G\",\"%s\"", bandstr3G);
|
||||
self->priv->cmds[2].command = g_strdup_printf ("^SCFG=\"Radio/Band/4G\",\"%s\"", bandstr4G);
|
||||
self->priv->cmds[0].command = g_strdup_printf ("^SCFG=\"Radio/Band/2G\",\"%s\"", bandstr2G_enc);
|
||||
self->priv->cmds[1].command = g_strdup_printf ("^SCFG=\"Radio/Band/3G\",\"%s\"", bandstr3G_enc);
|
||||
self->priv->cmds[2].command = g_strdup_printf ("^SCFG=\"Radio/Band/4G\",\"%s\"", bandstr4G_enc);
|
||||
self->priv->cmds[0].timeout = self->priv->cmds[1].timeout = self->priv->cmds[2].timeout = 60;
|
||||
} else {
|
||||
self->priv->cmds = g_new0 (MMBaseModemAtCommandAlloc, 3 + 1);
|
||||
@@ -2185,8 +2222,10 @@ set_bands_3g (GTask *task,
|
||||
NULL,
|
||||
(GAsyncReadyCallback)scfg_set_ready_sequence,
|
||||
task);
|
||||
return;
|
||||
}
|
||||
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2196,8 +2235,9 @@ set_bands_2g (GTask *task,
|
||||
MMBroadbandModemCinterion *self;
|
||||
GError *error = NULL;
|
||||
guint band[MM_CINTERION_RB_BLOCK_N] = { 0 };
|
||||
gchar *cmd;
|
||||
gchar *bandstr;
|
||||
g_autofree gchar *cmd = NULL;
|
||||
g_autofree gchar *bandstr = NULL;
|
||||
g_autofree gchar *bandstr_enc = NULL;
|
||||
|
||||
self = g_task_get_source_object (task);
|
||||
|
||||
@@ -2215,12 +2255,13 @@ set_bands_2g (GTask *task,
|
||||
|
||||
/* Build string with the value, in the proper charset */
|
||||
bandstr = g_strdup_printf ("%u", band[MM_CINTERION_RB_BLOCK_LEGACY]);
|
||||
bandstr = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr);
|
||||
if (!bandstr) {
|
||||
g_task_return_new_error (task,
|
||||
MM_CORE_ERROR,
|
||||
MM_CORE_ERROR_UNSUPPORTED,
|
||||
"Couldn't convert band set to current charset");
|
||||
bandstr_enc = mm_modem_charset_str_from_utf8 (bandstr,
|
||||
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (self)),
|
||||
FALSE,
|
||||
&error);
|
||||
if (!bandstr_enc) {
|
||||
g_prefix_error (&error, "Couldn't convert band string to current charset: ");
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
@@ -2231,17 +2272,13 @@ set_bands_2g (GTask *task,
|
||||
* the modem to connect at that specific frequency only. Note that we will be
|
||||
* passing double-quote enclosed strings here!
|
||||
*/
|
||||
cmd = g_strdup_printf ("^SCFG=\"Radio/Band\",\"%s\",\"%s\"", bandstr, bandstr);
|
||||
|
||||
cmd = g_strdup_printf ("^SCFG=\"Radio/Band\",\"%s\",\"%s\"", bandstr_enc, bandstr_enc);
|
||||
mm_base_modem_at_command (MM_BASE_MODEM (self),
|
||||
cmd,
|
||||
15,
|
||||
FALSE,
|
||||
(GAsyncReadyCallback)scfg_set_ready,
|
||||
task);
|
||||
|
||||
g_free (cmd);
|
||||
g_free (bandstr);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -359,22 +359,35 @@ authenticate (GTask *task)
|
||||
|
||||
/* Both user and password are required; otherwise firmware returns an error */
|
||||
if (user || password) {
|
||||
gchar *command;
|
||||
gchar *encoded_user;
|
||||
gchar *encoded_password;
|
||||
g_autofree gchar *command = NULL;
|
||||
g_autofree gchar *user_enc = NULL;
|
||||
g_autofree gchar *password_enc = NULL;
|
||||
GError *error = NULL;
|
||||
|
||||
encoded_user = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (ctx->modem),
|
||||
g_strdup (user));
|
||||
encoded_password = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (ctx->modem),
|
||||
g_strdup (password));
|
||||
user_enc = mm_modem_charset_str_from_utf8 (user,
|
||||
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (ctx->modem)),
|
||||
FALSE,
|
||||
&error);
|
||||
if (!user_enc) {
|
||||
g_prefix_error (&error, "Couldn't convert user to current charset: ");
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
password_enc = mm_modem_charset_str_from_utf8 (password,
|
||||
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (ctx->modem)),
|
||||
FALSE,
|
||||
&error);
|
||||
if (!password_enc) {
|
||||
g_prefix_error (&error, "Couldn't convert password to current charset: ");
|
||||
g_task_return_error (task, error);
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
command = g_strdup_printf ("AT*EIAAUW=%d,1,\"%s\",\"%s\"",
|
||||
ctx->cid,
|
||||
encoded_user ? encoded_user : "",
|
||||
encoded_password ? encoded_password : "");
|
||||
g_free (encoded_user);
|
||||
g_free (encoded_password);
|
||||
|
||||
ctx->cid, user_enc, password_enc);
|
||||
mm_base_modem_at_command_full (ctx->modem,
|
||||
ctx->primary,
|
||||
command,
|
||||
@@ -384,7 +397,6 @@ authenticate (GTask *task)
|
||||
g_task_get_cancellable (task),
|
||||
(GAsyncReadyCallback) authenticate_ready,
|
||||
task);
|
||||
g_free (command);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+59
-67
@@ -4800,27 +4800,37 @@ cops_set_ready (MMBaseModem *self,
|
||||
}
|
||||
|
||||
static void
|
||||
cops_ascii_set_ready (MMBaseModem *self,
|
||||
cops_ascii_set_ready (MMBaseModem *_self,
|
||||
GAsyncResult *res,
|
||||
GTask *task)
|
||||
{
|
||||
GError *error = NULL;
|
||||
MMBroadbandModem *self = MM_BROADBAND_MODEM (_self);
|
||||
g_autoptr(GError) error = NULL;
|
||||
|
||||
if (!mm_base_modem_at_command_full_finish (MM_BASE_MODEM (self), res, &error)) {
|
||||
if (!mm_base_modem_at_command_full_finish (_self, res, &error)) {
|
||||
/* If it failed with an unsupported error, retry with current modem charset */
|
||||
if (g_error_matches (error, MM_MOBILE_EQUIPMENT_ERROR, MM_MOBILE_EQUIPMENT_ERROR_NOT_SUPPORTED)) {
|
||||
gchar *operator_id;
|
||||
gchar *operator_id_current_charset;
|
||||
g_autoptr(GError) enc_error = NULL;
|
||||
g_autofree gchar *operator_id_enc = NULL;
|
||||
gchar *operator_id;
|
||||
|
||||
/* try to encode to current charset */
|
||||
operator_id = g_task_get_task_data (task);
|
||||
operator_id_current_charset = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), g_strdup (operator_id));
|
||||
operator_id_enc = mm_modem_charset_str_from_utf8 (operator_id, self->priv->modem_current_charset, FALSE, &enc_error);
|
||||
if (!operator_id_enc) {
|
||||
mm_obj_dbg (self, "couldn't convert operator id to current charset: %s", enc_error->message);
|
||||
g_task_return_error (task, g_steal_pointer (&error));
|
||||
g_object_unref (task);
|
||||
return;
|
||||
}
|
||||
|
||||
if (g_strcmp0 (operator_id, operator_id_current_charset) != 0) {
|
||||
gchar *command;
|
||||
/* retry only if encoded string is different to the non-encoded one */
|
||||
if (g_strcmp0 (operator_id, operator_id_enc) != 0) {
|
||||
g_autofree gchar *command = NULL;
|
||||
|
||||
command = g_strdup_printf ("+COPS=1,2,\"%s\"", operator_id_current_charset);
|
||||
mm_base_modem_at_command_full (MM_BASE_MODEM (self),
|
||||
mm_base_modem_peek_best_at_port (MM_BASE_MODEM (self), NULL),
|
||||
command = g_strdup_printf ("+COPS=1,2,\"%s\"", operator_id_enc);
|
||||
mm_base_modem_at_command_full (_self,
|
||||
mm_base_modem_peek_best_at_port (_self, NULL),
|
||||
command,
|
||||
120,
|
||||
FALSE,
|
||||
@@ -4828,16 +4838,10 @@ cops_ascii_set_ready (MMBaseModem *self,
|
||||
g_task_get_cancellable (task),
|
||||
(GAsyncReadyCallback)cops_set_ready,
|
||||
task);
|
||||
g_error_free (error);
|
||||
g_free (operator_id_current_charset);
|
||||
g_free (command);
|
||||
return;
|
||||
}
|
||||
/* operator id string would be the same on the current charset,
|
||||
* so fallback and return the not supported error */
|
||||
g_free (operator_id_current_charset);
|
||||
}
|
||||
g_task_return_error (task, error);
|
||||
g_task_return_error (task, g_steal_pointer (&error));
|
||||
} else
|
||||
g_task_return_boolean (task, TRUE);
|
||||
g_object_unref (task);
|
||||
@@ -7311,11 +7315,17 @@ sms_text_part_list_ready (MMBroadbandModem *self,
|
||||
ctx = g_task_get_task_data (task);
|
||||
|
||||
while (g_match_info_matches (match_info)) {
|
||||
MMSmsPart *part;
|
||||
guint matches, idx;
|
||||
gchar *number, *timestamp, *text, *ucs2_text, *stat;
|
||||
gsize ucs2_len = 0;
|
||||
GByteArray *raw;
|
||||
MMSmsPart *part;
|
||||
guint matches;
|
||||
guint idx;
|
||||
g_autofree gchar *number_enc = NULL;
|
||||
g_autofree gchar *number = NULL;
|
||||
g_autofree gchar *timestamp = NULL;
|
||||
g_autofree gchar *text_enc = NULL;
|
||||
g_autofree gchar *text = NULL;
|
||||
g_autofree gchar *stat = NULL;
|
||||
g_autoptr(GByteArray) raw = NULL;
|
||||
g_autoptr(GError) inner_error = NULL;
|
||||
|
||||
matches = g_match_info_get_match_count (match_info);
|
||||
if (matches != 7) {
|
||||
@@ -7336,39 +7346,44 @@ sms_text_part_list_ready (MMBroadbandModem *self,
|
||||
}
|
||||
|
||||
/* Get and parse number */
|
||||
number = mm_get_string_unquoted_from_match_info (match_info, 3);
|
||||
if (!number) {
|
||||
number_enc = mm_get_string_unquoted_from_match_info (match_info, 3);
|
||||
if (!number_enc) {
|
||||
mm_obj_dbg (self, "failed to get message sender number");
|
||||
g_free (stat);
|
||||
goto next;
|
||||
}
|
||||
number = mm_modem_charset_str_to_utf8 (number_enc, -1, self->priv->modem_current_charset, FALSE, &inner_error);
|
||||
if (!number) {
|
||||
mm_obj_dbg (self, "failed to convert message sender number to UTF-8: %s", inner_error->message);
|
||||
goto next;
|
||||
}
|
||||
|
||||
number = mm_broadband_modem_take_and_convert_to_utf8 (MM_BROADBAND_MODEM (self),
|
||||
number);
|
||||
|
||||
/* Get and parse timestamp (always expected in ASCII) */
|
||||
timestamp = mm_get_string_unquoted_from_match_info (match_info, 5);
|
||||
if (timestamp && !g_str_is_ascii (timestamp)) {
|
||||
mm_obj_dbg (self, "failed to parse input timestamp as ASCII");
|
||||
goto next;
|
||||
}
|
||||
|
||||
/* Get and parse text */
|
||||
text = mm_broadband_modem_take_and_convert_to_utf8 (MM_BROADBAND_MODEM (self),
|
||||
g_match_info_fetch (match_info, 6));
|
||||
text_enc = g_match_info_fetch (match_info, 6);
|
||||
text = mm_modem_charset_str_to_utf8 (text_enc, -1, self->priv->modem_current_charset, FALSE, &inner_error);
|
||||
if (!text) {
|
||||
mm_obj_dbg (self, "failed to convert message text to UTF-8: %s", inner_error->message);
|
||||
goto next;
|
||||
}
|
||||
|
||||
/* The raw SMS data can only be GSM, UCS2, or unknown (8-bit), so we
|
||||
* need to convert to UCS2 here.
|
||||
*/
|
||||
ucs2_text = g_convert (text, -1, "UCS-2BE//TRANSLIT", "UTF-8", NULL, &ucs2_len, NULL);
|
||||
g_assert (ucs2_text);
|
||||
raw = g_byte_array_sized_new (ucs2_len);
|
||||
g_byte_array_append (raw, (const guint8 *) ucs2_text, ucs2_len);
|
||||
g_free (ucs2_text);
|
||||
raw = mm_modem_charset_bytearray_from_utf8 (text, MM_MODEM_CHARSET_UCS2, FALSE, NULL);
|
||||
g_assert (raw);
|
||||
|
||||
/* all take() methods pass ownership of the value as well */
|
||||
part = mm_sms_part_new (idx,
|
||||
sms_pdu_type_from_str (stat));
|
||||
mm_sms_part_take_number (part, number);
|
||||
mm_sms_part_take_timestamp (part, timestamp);
|
||||
mm_sms_part_take_text (part, text);
|
||||
mm_sms_part_take_data (part, raw);
|
||||
part = mm_sms_part_new (idx, sms_pdu_type_from_str (stat));
|
||||
mm_sms_part_take_number (part, g_steal_pointer (&number));
|
||||
mm_sms_part_take_timestamp (part, g_steal_pointer (×tamp));
|
||||
mm_sms_part_take_text (part, g_steal_pointer (&text));
|
||||
mm_sms_part_take_data (part, g_steal_pointer (&raw));
|
||||
mm_sms_part_set_class (part, -1);
|
||||
|
||||
mm_obj_dbg (self, "correctly parsed SMS list entry (%d)", idx);
|
||||
@@ -7376,7 +7391,6 @@ sms_text_part_list_ready (MMBroadbandModem *self,
|
||||
part,
|
||||
sms_state_from_str (stat),
|
||||
ctx->list_storage);
|
||||
g_free (stat);
|
||||
next:
|
||||
g_match_info_next (match_info, NULL);
|
||||
}
|
||||
@@ -11890,35 +11904,14 @@ initialize (MMBaseModem *self,
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
gchar *
|
||||
mm_broadband_modem_take_and_convert_to_utf8 (MMBroadbandModem *self,
|
||||
gchar *str)
|
||||
{
|
||||
/* should only be used AFTER current charset is set */
|
||||
if (self->priv->modem_current_charset == MM_MODEM_CHARSET_UNKNOWN)
|
||||
return str;
|
||||
|
||||
return mm_charset_take_and_convert_to_utf8 (str,
|
||||
self->priv->modem_current_charset);
|
||||
}
|
||||
|
||||
gchar *
|
||||
mm_broadband_modem_take_and_convert_to_current_charset (MMBroadbandModem *self,
|
||||
gchar *str)
|
||||
{
|
||||
/* should only be used AFTER current charset is set */
|
||||
if (self->priv->modem_current_charset == MM_MODEM_CHARSET_UNKNOWN)
|
||||
return str;
|
||||
|
||||
return mm_utf8_take_and_convert_to_charset (str, self->priv->modem_current_charset);
|
||||
}
|
||||
|
||||
MMModemCharset
|
||||
mm_broadband_modem_get_current_charset (MMBroadbandModem *self)
|
||||
{
|
||||
return self->priv->modem_current_charset;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
gchar *
|
||||
mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,
|
||||
const gchar *ati,
|
||||
@@ -11940,7 +11933,6 @@ mm_broadband_modem_create_device_identifier (MMBroadbandModem *self,
|
||||
MM_GDBUS_MODEM (self->priv->modem_dbus_skeleton))));
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void
|
||||
|
||||
@@ -100,18 +100,6 @@ MMBroadbandModem *mm_broadband_modem_new (const gchar *device,
|
||||
guint16 vendor_id,
|
||||
guint16 product_id);
|
||||
|
||||
/* Convert the given string, which comes in the charset currently set in the
|
||||
* modem, to UTF-8. Given in the API so that subclasses can also use it directly.
|
||||
*/
|
||||
gchar *mm_broadband_modem_take_and_convert_to_utf8 (MMBroadbandModem *self,
|
||||
gchar *str);
|
||||
|
||||
/* Convert the given string, which comes in UTF-8, to the charset currently set
|
||||
* in the modem. Given in the API so that subclasses can also use it directly.
|
||||
*/
|
||||
gchar *mm_broadband_modem_take_and_convert_to_current_charset (MMBroadbandModem *self,
|
||||
gchar *str);
|
||||
|
||||
MMModemCharset mm_broadband_modem_get_current_charset (MMBroadbandModem *self);
|
||||
|
||||
/* Create a unique device identifier string using the ATI and ATI1 replies and some
|
||||
|
||||
Reference in New Issue
Block a user