diff options
author | Thomas Haller <thaller@redhat.com> | 2018-10-04 09:30:42 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2018-10-04 09:43:15 +0200 |
commit | 8bde29c9e2484d32d3a85b51b2c59d164b22d9f0 (patch) | |
tree | a3f2450469c2b102ea3723db1734935ada45d577 | |
parent | d83f50794dd3525c0c3aedf565066a6ba8fd6d73 (diff) | |
download | ModemManager-8bde29c9e2484d32d3a85b51b2c59d164b22d9f0.tar.gz |
libmm-glib: use helper function to convert enum/flags from string
-rw-r--r-- | libmm-glib/mm-common-helpers.c | 284 |
1 files changed, 92 insertions, 192 deletions
diff --git a/libmm-glib/mm-common-helpers.c b/libmm-glib/mm-common-helpers.c index ed459c5af..67a310f32 100644 --- a/libmm-glib/mm-common-helpers.c +++ b/libmm-glib/mm-common-helpers.c @@ -25,24 +25,64 @@ #include "mm-errors-types.h" #include "mm-common-helpers.h" -static int -_enum_class_return_value (GEnumClass *enum_class, guint i) +static gint +_enum_from_string (GType type, + const gchar *str, + gint error_value, + GError **error) { - int value; + GEnumClass *enum_class; + gint value; + guint i; - value = enum_class->values[i].value; - g_type_class_unref (enum_class); - return value; + enum_class = G_ENUM_CLASS (g_type_class_ref (type)); + + for (i = 0; enum_class->values[i].value_nick; i++) { + if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) { + value = enum_class->values[i].value; + g_type_class_unref (enum_class); + return value; + } + } + + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Couldn't match '%s' with a valid %s value", + str, + g_type_name (type)); + g_type_class_unref (enum_class); + return error_value; } -static int -_flags_class_return_value (GFlagsClass *flags_class, guint i) +static guint +_flags_from_string (GType type, + const gchar *str, + guint error_value, + GError **error) { - guint value; + GFlagsClass *flags_class; + guint value; + guint i; + + flags_class = G_FLAGS_CLASS (g_type_class_ref (type)); + + for (i = 0; flags_class->values[i].value_nick; i++) { + if (!g_ascii_strcasecmp (str, flags_class->values[i].value_nick)) { + value = flags_class->values[i].value; + g_type_class_unref (flags_class); + return value; + } + } - value = flags_class->values[i].value; - g_type_class_unref (flags_class); - return value; + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Couldn't match '%s' with a valid %s value", + str, + g_type_name (type)); + g_type_class_unref (flags_class); + return error_value; } gchar * @@ -808,24 +848,10 @@ MMModem3gppEpsUeModeOperation mm_common_get_eps_ue_mode_operation_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_MODEM_3GPP_EPS_UE_MODE_OPERATION)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMModem3gppEpsUeModeOperation value", - str); - return MM_MODEM_3GPP_EPS_UE_MODE_OPERATION_UNKNOWN; + return _enum_from_string (MM_TYPE_MODEM_3GPP_EPS_UE_MODE_OPERATION, + str, + MM_MODEM_3GPP_EPS_UE_MODE_OPERATION_UNKNOWN, + error); } GArray * @@ -929,48 +955,20 @@ MMModemCdmaRmProtocol mm_common_get_rm_protocol_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_MODEM_CDMA_RM_PROTOCOL)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMModemCdmaRmProtocol value", - str); - return MM_MODEM_CDMA_RM_PROTOCOL_UNKNOWN; + return _enum_from_string (MM_TYPE_MODEM_CDMA_RM_PROTOCOL, + str, + MM_MODEM_CDMA_RM_PROTOCOL_UNKNOWN, + error); } MMBearerIpFamily mm_common_get_ip_type_from_string (const gchar *str, GError **error) { - GFlagsClass *flags_class; - guint i; - - flags_class = G_FLAGS_CLASS (g_type_class_ref (MM_TYPE_BEARER_IP_FAMILY)); - - for (i = 0; flags_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, flags_class->values[i].value_nick)) - return _flags_class_return_value (flags_class, i); - } - - g_type_class_unref (flags_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMBearerIpFamily value", - str); - return MM_BEARER_IP_FAMILY_NONE; + return _flags_from_string (MM_TYPE_BEARER_IP_FAMILY, + str, + MM_BEARER_IP_FAMILY_NONE, + error); } MMBearerAllowedAuth @@ -1027,144 +1025,60 @@ MMSmsStorage mm_common_get_sms_storage_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_SMS_STORAGE)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMSmsStorage value", - str); - return MM_SMS_STORAGE_UNKNOWN; + return _enum_from_string (MM_TYPE_SMS_STORAGE, + str, + MM_SMS_STORAGE_UNKNOWN, + error); } MMSmsCdmaTeleserviceId mm_common_get_sms_cdma_teleservice_id_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_SMS_CDMA_TELESERVICE_ID)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMSmsCdmaTeleserviceId value", - str); - return MM_SMS_CDMA_TELESERVICE_ID_UNKNOWN; + return _enum_from_string (MM_TYPE_SMS_CDMA_TELESERVICE_ID, + str, + MM_SMS_CDMA_TELESERVICE_ID_UNKNOWN, + error); } MMSmsCdmaServiceCategory mm_common_get_sms_cdma_service_category_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_SMS_CDMA_SERVICE_CATEGORY)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMSmsCdmaServiceCategory value", - str); - return MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN; + return _enum_from_string (MM_TYPE_SMS_CDMA_SERVICE_CATEGORY, + str, + MM_SMS_CDMA_SERVICE_CATEGORY_UNKNOWN, + error); } MMCallDirection mm_common_get_call_direction_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_CALL_DIRECTION)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMCallDirection value", - str); - return MM_CALL_DIRECTION_UNKNOWN; + return _enum_from_string (MM_TYPE_CALL_DIRECTION, + str, + MM_CALL_DIRECTION_UNKNOWN, + error); } MMCallState mm_common_get_call_state_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_CALL_STATE)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMCallState value", - str); - return MM_CALL_STATE_UNKNOWN; + return _enum_from_string (MM_TYPE_CALL_STATE, + str, + MM_CALL_STATE_UNKNOWN, + error); } MMCallStateReason mm_common_get_call_state_reason_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_CALL_STATE_REASON)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMCallStateReason value", - str); - return MM_CALL_STATE_REASON_UNKNOWN; + return _enum_from_string (MM_TYPE_CALL_STATE_REASON, + str, + MM_CALL_STATE_REASON_UNKNOWN, + error); } MMOmaFeature @@ -1221,24 +1135,10 @@ MMOmaSessionType mm_common_get_oma_session_type_from_string (const gchar *str, GError **error) { - GEnumClass *enum_class; - guint i; - - enum_class = G_ENUM_CLASS (g_type_class_ref (MM_TYPE_OMA_SESSION_TYPE)); - - for (i = 0; enum_class->values[i].value_nick; i++) { - if (!g_ascii_strcasecmp (str, enum_class->values[i].value_nick)) - return _enum_class_return_value (enum_class, i); - } - - g_type_class_unref (enum_class); - - g_set_error (error, - MM_CORE_ERROR, - MM_CORE_ERROR_INVALID_ARGS, - "Couldn't match '%s' with a valid MMOmaSessionType value", - str); - return MM_OMA_SESSION_TYPE_UNKNOWN; + return _enum_from_string (MM_TYPE_OMA_SESSION_TYPE, + str, + MM_OMA_SESSION_TYPE_UNKNOWN, + error); } GVariant * |