Files
ModemManager/src/mm-charsets.h
T
Aleksander Morgado 0ff3eb7ee0 charsets: remove take_and_convert methods
These methods worked in a very strict way for some encodings, and in a
very very loose way for others. E.g. when converting from hex-encoded
UCS-2, we would attempt to convert as much text as we could even if
the input string was truly not even close to UCS-2. This kind of "do
our best" could make sense when processing e.g. the operator name
reported by the modem, as that is some string to show to the user and
there may be no strict requirement to have it perfectly fine. But the
kind of loose comparison done for UCS-2 doesn't make sense e.g. when
converting USSD responses or SMS messages.
2021-02-23 11:35:11 +00:00

118 lines
4.7 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details:
*
* Copyright (C) 2010 Red Hat, Inc.
*/
#ifndef MM_CHARSETS_H
#define MM_CHARSETS_H
#include <glib.h>
/*****************************************************************************************/
typedef enum {
MM_MODEM_CHARSET_UNKNOWN = 0,
MM_MODEM_CHARSET_GSM = 1 << 0,
MM_MODEM_CHARSET_IRA = 1 << 1,
MM_MODEM_CHARSET_8859_1 = 1 << 2,
MM_MODEM_CHARSET_UTF8 = 1 << 3,
MM_MODEM_CHARSET_UCS2 = 1 << 4,
MM_MODEM_CHARSET_PCCP437 = 1 << 5,
MM_MODEM_CHARSET_PCDN = 1 << 6,
MM_MODEM_CHARSET_UTF16 = 1 << 7,
} MMModemCharset;
const gchar *mm_modem_charset_to_string (MMModemCharset charset);
MMModemCharset mm_modem_charset_from_string (const gchar *string);
/*****************************************************************************************/
/* Take a string in hex representation ("00430052" or "A4BE11" for example)
* and convert it from the given character set to UTF-8.
*/
gchar *mm_modem_charset_hex_to_utf8 (const gchar *src,
MMModemCharset charset);
/* Checks whether conversion to the given charset may be done without errors */
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);
guint8 *mm_charset_gsm_pack (const guint8 *src,
guint32 src_len,
guint8 start_offset, /* in bits */
guint32 *out_packed_len);
/*****************************************************************************************/
/*
* Convert the given UTF-8 encoded string into the given charset.
*
* The output is given as a bytearray, because the target charset may allow
* embedded NUL bytes (e.g. UTF-16).
*
* The output encoded string is not guaranteed to be NUL-terminated, instead
* the bytearray length itself gives the correct string length.
*/
GByteArray *mm_modem_charset_bytearray_from_utf8 (const gchar *utf8,
MMModemCharset charset,
gboolean translit,
GError **error);
/*
* Convert the given UTF-8 encoded string into the given charset.
*
* The output is given as a C string, and those charsets that allow
* embedded NUL bytes (e.g. UTF-16) will be hex-encoded.
*
* The output encoded string is guaranteed to be NUL-terminated, and so no
* explicit output length is returned.
*/
gchar *mm_modem_charset_str_from_utf8 (const gchar *utf8,
MMModemCharset charset,
gboolean translit,
GError **error);
/*
* Convert into an UTF-8 encoded string the input byte array, which is
* encoded in the given charset.
*
* The output string is guaranteed to be valid UTF-8 and NUL-terminated.
*/
gchar *mm_modem_charset_bytearray_to_utf8 (GByteArray *bytearray,
MMModemCharset charset,
gboolean translit,
GError **error);
/*
* Convert into an UTF-8 encoded string the input string, which is
* encoded in the given charset. Those charsets that allow embedded NUL
* bytes (e.g. UTF-16) need to be hex-encoded.
*
* If the input string is NUL-terminated, len may be given as -1; otherwise
* len needs to specify the number of valid bytes in the input string.
*
* The output string is guaranteed to be valid UTF-8 and NUL-terminated.
*/
gchar *mm_modem_charset_str_to_utf8 (const gchar *str,
gssize len,
MMModemCharset charset,
gboolean translit,
GError **error);
#endif /* MM_CHARSETS_H */