broadband-modem: implement default USSD encode/decode
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
#include <ModemManager.h>
|
#include <ModemManager.h>
|
||||||
#include <libmm-common.h>
|
#include <libmm-common.h>
|
||||||
@@ -37,6 +38,7 @@
|
|||||||
#include "mm-bearer-list.h"
|
#include "mm-bearer-list.h"
|
||||||
#include "mm-sim.h"
|
#include "mm-sim.h"
|
||||||
#include "mm-log.h"
|
#include "mm-log.h"
|
||||||
|
#include "mm-utils.h"
|
||||||
#include "mm-modem-helpers.h"
|
#include "mm-modem-helpers.h"
|
||||||
#include "mm-error-helpers.h"
|
#include "mm-error-helpers.h"
|
||||||
#include "mm-qcdm-serial-port.h"
|
#include "mm-qcdm-serial-port.h"
|
||||||
@@ -2809,6 +2811,45 @@ modem_3gpp_setup_ps_registration (MMIfaceModem3gpp *self,
|
|||||||
ctx);
|
ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* USSD Encode/Decode (3GPP/USSD interface) */
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
modem_3gpp_ussd_encode (MMIfaceModem3gppUssd *self,
|
||||||
|
const gchar *command,
|
||||||
|
guint *scheme)
|
||||||
|
{
|
||||||
|
MMBroadbandModem *broadband = MM_BROADBAND_MODEM (self);
|
||||||
|
GByteArray *ussd_command;
|
||||||
|
gchar *hex = NULL;
|
||||||
|
|
||||||
|
ussd_command = g_byte_array_new ();
|
||||||
|
|
||||||
|
/* encode to the current charset */
|
||||||
|
if (mm_modem_charset_byte_array_append (ussd_command,
|
||||||
|
command,
|
||||||
|
FALSE,
|
||||||
|
broadband->priv->modem_current_charset)) {
|
||||||
|
*scheme = MM_MODEM_GSM_USSD_SCHEME_7BIT;
|
||||||
|
/* convert to hex representation */
|
||||||
|
hex = utils_bin2hexstr (ussd_command->data, ussd_command->len);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_byte_array_free (ussd_command, TRUE);
|
||||||
|
|
||||||
|
return hex;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gchar *
|
||||||
|
modem_3gpp_ussd_decode (MMIfaceModem3gppUssd *self,
|
||||||
|
const gchar *reply)
|
||||||
|
{
|
||||||
|
MMBroadbandModem *broadband = MM_BROADBAND_MODEM (self);
|
||||||
|
|
||||||
|
return mm_modem_charset_hex_to_utf8 (reply,
|
||||||
|
broadband->priv->modem_current_charset);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* Setup/Cleanup unsolicited result codes (3GPP/USSD interface) */
|
/* Setup/Cleanup unsolicited result codes (3GPP/USSD interface) */
|
||||||
|
|
||||||
@@ -5272,6 +5313,8 @@ iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface)
|
|||||||
iface->enable_unsolicited_result_codes_finish = modem_3gpp_ussd_enable_disable_unsolicited_result_codes_finish;
|
iface->enable_unsolicited_result_codes_finish = modem_3gpp_ussd_enable_disable_unsolicited_result_codes_finish;
|
||||||
iface->disable_unsolicited_result_codes = modem_3gpp_ussd_disable_unsolicited_result_codes;
|
iface->disable_unsolicited_result_codes = modem_3gpp_ussd_disable_unsolicited_result_codes;
|
||||||
iface->disable_unsolicited_result_codes_finish = modem_3gpp_ussd_enable_disable_unsolicited_result_codes_finish;
|
iface->disable_unsolicited_result_codes_finish = modem_3gpp_ussd_enable_disable_unsolicited_result_codes_finish;
|
||||||
|
iface->encode = modem_3gpp_ussd_encode;
|
||||||
|
iface->decode = modem_3gpp_ussd_decode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -28,6 +28,10 @@
|
|||||||
#define MM_IS_IFACE_MODEM_3GPP_USSD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_IFACE_MODEM_3GPP_USSD))
|
#define MM_IS_IFACE_MODEM_3GPP_USSD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_IFACE_MODEM_3GPP_USSD))
|
||||||
#define MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MM_TYPE_IFACE_MODEM_3GPP_USSD, MMIfaceModem3gppUssd))
|
#define MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MM_TYPE_IFACE_MODEM_3GPP_USSD, MMIfaceModem3gppUssd))
|
||||||
|
|
||||||
|
/* CBS data coding scheme - 3GPP TS 23.038 */
|
||||||
|
#define MM_MODEM_GSM_USSD_SCHEME_7BIT 0b00001111
|
||||||
|
#define MM_MODEM_GSM_USSD_SCHEME_UCS2 0b01001000
|
||||||
|
|
||||||
#define MM_IFACE_MODEM_3GPP_USSD_DBUS_SKELETON "iface-modem-3gpp-ussd-dbus-skeleton"
|
#define MM_IFACE_MODEM_3GPP_USSD_DBUS_SKELETON "iface-modem-3gpp-ussd-dbus-skeleton"
|
||||||
|
|
||||||
typedef struct _MMIfaceModem3gppUssd MMIfaceModem3gppUssd;
|
typedef struct _MMIfaceModem3gppUssd MMIfaceModem3gppUssd;
|
||||||
|
Reference in New Issue
Block a user