diff options
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 4 | ||||
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 4 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 4 | ||||
-rw-r--r-- | src/mm-iface-modem-3gpp-ussd.c | 103 | ||||
-rw-r--r-- | src/mm-iface-modem-3gpp-ussd.h | 15 | ||||
-rw-r--r-- | src/plugins/altair/mm-broadband-modem-altair-lte.c | 10 | ||||
-rw-r--r-- | src/plugins/huawei/mm-broadband-modem-huawei.c | 18 |
7 files changed, 65 insertions, 93 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index b77bffcb..64666eb8 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -54,7 +54,7 @@ static void iface_modem_init (MMIfaceModemInterface *iface); static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); static void iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface *iface); -static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface); +static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface); static void iface_modem_location_init (MMIfaceModemLocation *iface); static void iface_modem_messaging_init (MMIfaceModemMessaging *iface); static void iface_modem_signal_init (MMIfaceModemSignal *iface); @@ -10239,7 +10239,7 @@ iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface * } static void -iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface) +iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface) { /* Initialization steps */ iface->check_support = modem_3gpp_ussd_check_support; diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index 8140e7c8..dbfd643a 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -56,7 +56,7 @@ static void iface_modem_init (MMIfaceModemInterface *iface); static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); static void iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface *iface); -static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface); +static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface); static void iface_modem_voice_init (MMIfaceModemVoice *iface); static void iface_modem_cdma_init (MMIfaceModemCdma *iface); static void iface_modem_messaging_init (MMIfaceModemMessaging *iface); @@ -13986,7 +13986,7 @@ iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface * } static void -iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface) +iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface) { iface->check_support = modem_3gpp_ussd_check_support; iface->check_support_finish = modem_3gpp_ussd_check_support_finish; diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 4bf00b39..af1b4cda 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -64,7 +64,7 @@ static void iface_modem_init (MMIfaceModemInterface *iface); static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); static void iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface *iface); -static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface); +static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface); static void iface_modem_cdma_init (MMIfaceModemCdma *iface); static void iface_modem_simple_init (MMIfaceModemSimple *iface); static void iface_modem_location_init (MMIfaceModemLocation *iface); @@ -13605,7 +13605,7 @@ iface_modem_3gpp_profile_manager_init (MMIfaceModem3gppProfileManagerInterface * } static void -iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface) +iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface) { /* Initialization steps */ iface->check_support = modem_3gpp_ussd_check_support; diff --git a/src/mm-iface-modem-3gpp-ussd.c b/src/mm-iface-modem-3gpp-ussd.c index e2f22f67..7a1be95c 100644 --- a/src/mm-iface-modem-3gpp-ussd.c +++ b/src/mm-iface-modem-3gpp-ussd.c @@ -35,6 +35,8 @@ static GQuark support_checked_quark; static GQuark supported_quark; +G_DEFINE_INTERFACE (MMIfaceModem3gppUssd, mm_iface_modem_3gpp_ussd, MM_TYPE_IFACE_MODEM_3GPP) + /*****************************************************************************/ void @@ -68,7 +70,7 @@ handle_cancel_ready (MMIfaceModem3gppUssd *self, { GError *error = NULL; - if (!MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel_finish (self, res, &error)) + if (!MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->cancel_finish (self, res, &error)) mm_dbus_method_invocation_take_error (ctx->invocation, error); else mm_gdbus_modem3gpp_ussd_complete_cancel (ctx->skeleton, ctx->invocation); @@ -96,11 +98,11 @@ handle_cancel_auth_ready (MMBaseModem *self, return; } - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel != NULL); - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel_finish != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->cancel != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->cancel_finish != NULL); mm_obj_info (self, "processing user request to cancel USSD..."); - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cancel ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->cancel ( MM_IFACE_MODEM_3GPP_USSD (self), (GAsyncReadyCallback)handle_cancel_ready, ctx); @@ -153,7 +155,7 @@ handle_respond_ready (MMIfaceModem3gppUssd *self, GError *error = NULL; gchar *reply; - reply = MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish (self, res, &error); + reply = MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send_finish (self, res, &error); if (!reply) mm_dbus_method_invocation_take_error (ctx->invocation, error); else { @@ -185,8 +187,8 @@ handle_respond_auth_ready (MMBaseModem *self, return; } - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send != NULL); - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send_finish != NULL); switch (mm_gdbus_modem3gpp_ussd_get_state (ctx->skeleton)) { case MM_MODEM_3GPP_USSD_SESSION_STATE_ACTIVE: @@ -197,7 +199,7 @@ handle_respond_auth_ready (MMBaseModem *self, case MM_MODEM_3GPP_USSD_SESSION_STATE_USER_RESPONSE: mm_obj_info (self, "processing user request to respond USSD..."); - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send ( MM_IFACE_MODEM_3GPP_USSD (self), ctx->command, (GAsyncReadyCallback)handle_respond_ready, @@ -263,7 +265,7 @@ handle_initiate_ready (MMIfaceModem3gppUssd *self, GError *error = NULL; gchar *reply; - reply = MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish (self, res, &error); + reply = MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send_finish (self, res, &error); if (!reply) mm_dbus_method_invocation_take_error (ctx->invocation, error); else { @@ -295,8 +297,8 @@ handle_initiate_auth_ready (MMBaseModem *self, return; } - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send != NULL); - g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send_finish != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send != NULL); + g_assert (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send_finish != NULL); switch (mm_gdbus_modem3gpp_ussd_get_state (ctx->skeleton)) { case MM_MODEM_3GPP_USSD_SESSION_STATE_ACTIVE: @@ -307,7 +309,7 @@ handle_initiate_auth_ready (MMBaseModem *self, case MM_MODEM_3GPP_USSD_SESSION_STATE_IDLE: mm_obj_info (self, "processing user request to initiate USSD..."); - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->send ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->send ( MM_IFACE_MODEM_3GPP_USSD (self), ctx->command, (GAsyncReadyCallback)handle_initiate_ready, @@ -354,7 +356,7 @@ mm_iface_modem_3gpp_ussd_encode (MMIfaceModem3gppUssd *self, guint *scheme, GError **error) { - return MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->encode (self, command, scheme, error); + return MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->encode (self, command, scheme, error); } gchar * @@ -362,7 +364,7 @@ mm_iface_modem_3gpp_ussd_decode (MMIfaceModem3gppUssd *self, const gchar *reply, GError **error) { - return MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->decode (self, reply, error); + return MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->decode (self, reply, error); } /*****************************************************************************/ @@ -484,7 +486,7 @@ disable_unsolicited_events_ready (MMIfaceModem3gppUssd *self, DisablingContext *ctx; GError *error = NULL; - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->disable_unsolicited_events_finish (self, res, &error); + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->disable_unsolicited_events_finish (self, res, &error); if (error) { /* This error shouldn't be treated as critical */ mm_obj_dbg (self, "couldn't disable unsolicited USSD events: %s", error->message); @@ -505,7 +507,7 @@ cleanup_unsolicited_events_ready (MMIfaceModem3gppUssd *self, DisablingContext *ctx; GError *error = NULL; - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cleanup_unsolicited_events_finish (self, res, &error); + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->cleanup_unsolicited_events_finish (self, res, &error); if (error) { /* This error shouldn't be treated as critical */ mm_obj_dbg (self, "couldn't cleanup unsolicited USSD events: %s", error->message); @@ -533,14 +535,14 @@ interface_disabling_step (GTask *task) /* fall through */ case DISABLING_STEP_DISABLE_UNSOLICITED_EVENTS: - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->disable_unsolicited_events ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->disable_unsolicited_events ( self, (GAsyncReadyCallback)disable_unsolicited_events_ready, task); return; case DISABLING_STEP_CLEANUP_UNSOLICITED_EVENTS: - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->cleanup_unsolicited_events ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->cleanup_unsolicited_events ( self, (GAsyncReadyCallback)cleanup_unsolicited_events_ready, task); @@ -631,7 +633,7 @@ setup_unsolicited_events_ready (MMIfaceModem3gppUssd *self, EnablingContext *ctx; GError *error = NULL; - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->setup_unsolicited_events_finish (self, res, &error); + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->setup_unsolicited_events_finish (self, res, &error); if (error) { /* This error shouldn't be treated as critical */ mm_obj_dbg (self, "couldn't setup unsolicited USSD events: %s", error->message); @@ -652,7 +654,7 @@ enable_unsolicited_events_ready (MMIfaceModem3gppUssd *self, EnablingContext *ctx; GError *error = NULL; - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->enable_unsolicited_events_finish (self, res, &error); + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->enable_unsolicited_events_finish (self, res, &error); if (error) { /* This error shouldn't be treated as critical */ mm_obj_dbg (self, "couldn't enable unsolicited USSD events: %s", error->message); @@ -680,14 +682,14 @@ interface_enabling_step (GTask *task) /* fall through */ case ENABLING_STEP_SETUP_UNSOLICITED_EVENTS: - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->setup_unsolicited_events ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->setup_unsolicited_events ( self, (GAsyncReadyCallback)setup_unsolicited_events_ready, task); return; case ENABLING_STEP_ENABLE_UNSOLICITED_EVENTS: - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->enable_unsolicited_events ( + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->enable_unsolicited_events ( self, (GAsyncReadyCallback)enable_unsolicited_events_ready, task); @@ -769,9 +771,7 @@ check_support_ready (MMIfaceModem3gppUssd *self, InitializationContext *ctx; GError *error = NULL; - if (!MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->check_support_finish (self, - res, - &error)) { + if (!MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->check_support_finish (self, res, &error)) { if (error) { /* This error shouldn't be treated as critical */ mm_obj_dbg (self, "USSD support check failed: %s", error->message); @@ -824,9 +824,9 @@ interface_initialization_step (GTask *task) supported_quark, GUINT_TO_POINTER (FALSE)); - if (MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->check_support && - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->check_support_finish) { - MM_IFACE_MODEM_3GPP_USSD_GET_INTERFACE (self)->check_support ( + if (MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->check_support && + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->check_support_finish) { + MM_IFACE_MODEM_3GPP_USSD_GET_IFACE (self)->check_support ( self, (GAsyncReadyCallback)check_support_ready, task); @@ -945,44 +945,21 @@ mm_iface_modem_3gpp_ussd_shutdown (MMIfaceModem3gppUssd *self) /*****************************************************************************/ static void -iface_modem_3gpp_ussd_init (gpointer g_iface) +mm_iface_modem_3gpp_ussd_default_init (MMIfaceModem3gppUssdInterface *iface) { - static gboolean initialized = FALSE; + static gsize initialized = 0; - if (initialized) + if (!g_once_init_enter (&initialized)) return; /* Properties */ - g_object_interface_install_property - (g_iface, - g_param_spec_object (MM_IFACE_MODEM_3GPP_USSD_DBUS_SKELETON, - "3GPP DBus skeleton", - "DBus skeleton for the 3GPP interface", - MM_GDBUS_TYPE_MODEM3GPP_USSD_SKELETON, - G_PARAM_READWRITE)); - - initialized = TRUE; -} - -GType -mm_iface_modem_3gpp_ussd_get_type (void) -{ - static GType iface_modem_3gpp_ussd_type = 0; - - if (!G_UNLIKELY (iface_modem_3gpp_ussd_type)) { - static const GTypeInfo info = { - sizeof (MMIfaceModem3gppUssd), /* class_size */ - iface_modem_3gpp_ussd_init, /* base_init */ - NULL, /* base_finalize */ - }; - - iface_modem_3gpp_ussd_type = g_type_register_static (G_TYPE_INTERFACE, - "MMIfaceModem3gppUssd", - &info, - 0); - - g_type_interface_add_prerequisite (iface_modem_3gpp_ussd_type, MM_TYPE_IFACE_MODEM_3GPP); - } - - return iface_modem_3gpp_ussd_type; + g_object_interface_install_property ( + iface, + g_param_spec_object (MM_IFACE_MODEM_3GPP_USSD_DBUS_SKELETON, + "3GPP DBus skeleton", + "DBus skeleton for the 3GPP interface", + MM_GDBUS_TYPE_MODEM3GPP_USSD_SKELETON, + G_PARAM_READWRITE)); + + g_once_init_leave (&initialized, 1); } diff --git a/src/mm-iface-modem-3gpp-ussd.h b/src/mm-iface-modem-3gpp-ussd.h index 8a6d2f42..591f1b03 100644 --- a/src/mm-iface-modem-3gpp-ussd.h +++ b/src/mm-iface-modem-3gpp-ussd.h @@ -23,10 +23,10 @@ #define _LIBMM_INSIDE_MM #include <libmm-glib.h> -#define MM_TYPE_IFACE_MODEM_3GPP_USSD (mm_iface_modem_3gpp_ussd_get_type ()) -#define MM_IFACE_MODEM_3GPP_USSD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_IFACE_MODEM_3GPP_USSD, MMIfaceModem3gppUssd)) -#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)) +#include "mm-iface-modem-3gpp.h" + +#define MM_TYPE_IFACE_MODEM_3GPP_USSD mm_iface_modem_3gpp_ussd_get_type () +G_DECLARE_INTERFACE (MMIfaceModem3gppUssd, mm_iface_modem_3gpp_ussd, MM, IFACE_MODEM_3GPP_USSD, MMIfaceModem3gpp) /* CBS data coding scheme - 3GPP TS 23.038 */ #define MM_MODEM_GSM_USSD_SCHEME_7BIT 0b00001111 @@ -34,9 +34,7 @@ #define MM_IFACE_MODEM_3GPP_USSD_DBUS_SKELETON "iface-modem-3gpp-ussd-dbus-skeleton" -typedef struct _MMIfaceModem3gppUssd MMIfaceModem3gppUssd; - -struct _MMIfaceModem3gppUssd { +struct _MMIfaceModem3gppUssdInterface { GTypeInterface g_iface; /* Check for USSD support (async) */ @@ -106,9 +104,6 @@ struct _MMIfaceModem3gppUssd { GError **error); }; -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, GAsyncReadyCallback callback, diff --git a/src/plugins/altair/mm-broadband-modem-altair-lte.c b/src/plugins/altair/mm-broadband-modem-altair-lte.c index dd4d410f..ea6fa8be 100644 --- a/src/plugins/altair/mm-broadband-modem-altair-lte.c +++ b/src/plugins/altair/mm-broadband-modem-altair-lte.c @@ -41,10 +41,10 @@ #include "mm-serial-parsers.h" #include "mm-bearer-list.h" -static void iface_modem_init (MMIfaceModemInterface *iface); -static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); -static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface); -static void iface_modem_messaging_init (MMIfaceModemMessaging *iface); +static void iface_modem_init (MMIfaceModemInterface *iface); +static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); +static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface); +static void iface_modem_messaging_init (MMIfaceModemMessaging *iface); static MMIfaceModem3gppInterface *iface_modem_3gpp_parent; @@ -1249,7 +1249,7 @@ iface_modem_init (MMIfaceModemInterface *iface) } static void -iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface) +iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface) { /* we don't have USSD support */ iface->check_support = NULL; diff --git a/src/plugins/huawei/mm-broadband-modem-huawei.c b/src/plugins/huawei/mm-broadband-modem-huawei.c index 81b1168f..294bef30 100644 --- a/src/plugins/huawei/mm-broadband-modem-huawei.c +++ b/src/plugins/huawei/mm-broadband-modem-huawei.c @@ -50,14 +50,14 @@ #include "mm-bearer-list.h" #include "mm-sim-huawei.h" -static void iface_modem_init (MMIfaceModemInterface *iface); -static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); -static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface); -static void iface_modem_location_init (MMIfaceModemLocation *iface); -static void iface_modem_cdma_init (MMIfaceModemCdma *iface); -static void iface_modem_time_init (MMIfaceModemTime *iface); -static void iface_modem_voice_init (MMIfaceModemVoice *iface); -static void iface_modem_signal_init (MMIfaceModemSignal *iface); +static void iface_modem_init (MMIfaceModemInterface *iface); +static void iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface); +static void iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface); +static void iface_modem_location_init (MMIfaceModemLocation *iface); +static void iface_modem_cdma_init (MMIfaceModemCdma *iface); +static void iface_modem_time_init (MMIfaceModemTime *iface); +static void iface_modem_voice_init (MMIfaceModemVoice *iface); +static void iface_modem_signal_init (MMIfaceModemSignal *iface); static MMIfaceModemInterface *iface_modem_parent; static MMIfaceModem3gppInterface *iface_modem_3gpp_parent; @@ -5039,7 +5039,7 @@ iface_modem_3gpp_init (MMIfaceModem3gppInterface *iface) } static void -iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssd *iface) +iface_modem_3gpp_ussd_init (MMIfaceModem3gppUssdInterface *iface) { iface->encode = encode; iface->decode = decode; |