diff options
author | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2017-12-08 11:56:24 +0100 |
---|---|---|
committer | Matthias Vogelgesang <matthias.vogelgesang@kit.edu> | 2017-12-08 11:56:24 +0100 |
commit | d0b168ed218194f239799a5f6785be506c793215 (patch) | |
tree | b76b42d90936c2b3b55ec50245bf69e5acaee9f5 | |
parent | e2ac3b32fc40161411feb7668b88a9dd28b71e4e (diff) | |
download | uca-d0b168ed218194f239799a5f6785be506c793215.tar.gz uca-d0b168ed218194f239799a5f6785be506c793215.tar.bz2 uca-d0b168ed218194f239799a5f6785be506c793215.tar.xz uca-d0b168ed218194f239799a5f6785be506c793215.zip |
Parse enum properties properly
-rw-r--r-- | src/uca-camera.c | 61 |
1 files changed, 58 insertions, 3 deletions
diff --git a/src/uca-camera.c b/src/uca-camera.c index 31e5de5..a4545f2 100644 --- a/src/uca-camera.c +++ b/src/uca-camera.c @@ -620,6 +620,35 @@ buffer_thread (UcaCamera *camera) return error; } +static GEnumValue * +find_enum_value (GParamSpecEnum *pspec, const gchar *name) +{ + GEnumValue *result; + GEnumClass *enum_class; + + result = NULL; + enum_class = pspec->enum_class; + + for (guint i = 0; i < enum_class->n_values; i++) + if (!g_strcmp0 (enum_class->values[i].value_name, name)) + result = &enum_class->values[i]; + + return result; +} + +static gboolean +is_a_number (const gchar *s) +{ + g_return_val_if_fail (s != NULL, FALSE); + + for (; *s != '\0'; s++) { + if (!g_ascii_isdigit (*s)) + return FALSE; + } + + return TRUE; +} + /** * uca_camera_parse_arg_props: * @camera: A #UcaCamera object @@ -666,17 +695,43 @@ uca_camera_parse_arg_props (UcaCamera *camera, gchar **argv, guint argc, GError gchar *prop = g_match_info_fetch (match, 1); gchar *string_value = g_match_info_fetch (match, 2); - g_value_init (&value, G_TYPE_STRING); - g_value_set_string (&value, string_value); - pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (camera), prop); if (pspec != NULL) { GValue target_value = {0}; + if (g_type_is_a (pspec->value_type, G_TYPE_ENUM)) { + g_value_init (&value, G_TYPE_INT); + + if (!is_a_number (string_value)) { + GEnumValue *enum_value; + + enum_value = find_enum_value ((GParamSpecEnum *) pspec, string_value); + + if (enum_value) { + g_value_set_int (&value, enum_value->value); + } + else { + g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_FOUND, + "Enum value `%s' does not exist for `%s'", + string_value, prop); + success = FALSE; + } + } + else { + g_value_set_int (&value, atoi (string_value)); + } + } + else { + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, string_value); + } + g_value_init (&target_value, pspec->value_type); g_value_transform (&value, &target_value); g_object_set_property (G_OBJECT (camera), prop, &target_value); + g_value_unset (&value); + g_value_unset (&target_value); } else { g_set_error (error, UCA_CAMERA_ERROR, UCA_CAMERA_ERROR_NOT_IMPLEMENTED, |