diff options
author | Dan Williams <dcbw@redhat.com> | 2012-01-11 14:24:43 -0600 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2012-01-11 14:24:43 -0600 |
commit | b22b2d99db57e4cec8e6c3074dd20acd6845cb62 (patch) | |
tree | 2cce028d24575736cea54d0bf59a24bfb100cd84 /libqcdm/src | |
parent | 1804ae2fe52acfee52f70aba5fb0acb9888a9c8b (diff) | |
download | ModemManager-b22b2d99db57e4cec8e6c3074dd20acd6845cb62.tar.gz |
qcdm: add u16 arrays to results
Diffstat (limited to 'libqcdm/src')
-rw-r--r-- | libqcdm/src/result-private.h | 5 | ||||
-rw-r--r-- | libqcdm/src/result.c | 79 | ||||
-rw-r--r-- | libqcdm/src/result.h | 5 |
3 files changed, 88 insertions, 1 deletions
diff --git a/libqcdm/src/result-private.h b/libqcdm/src/result-private.h index 009a451f3..382411c1a 100644 --- a/libqcdm/src/result-private.h +++ b/libqcdm/src/result-private.h @@ -40,6 +40,11 @@ int qcdm_result_get_u8_array (QcdmResult *result, const u_int8_t **out_val, size_t *out_len); +void qcdm_result_add_u16_array (QcdmResult *result, + const char *key, + const u_int16_t *array, + size_t array_len); + void qcdm_result_add_u32 (QcdmResult *result, const char *key, u_int32_t num); diff --git a/libqcdm/src/result.c b/libqcdm/src/result.c index d278f0194..d51a0502a 100644 --- a/libqcdm/src/result.c +++ b/libqcdm/src/result.c @@ -32,16 +32,18 @@ typedef enum { VAL_TYPE_U8 = 2, VAL_TYPE_U32 = 3, VAL_TYPE_U8_ARRAY = 4, + VAL_TYPE_U16_ARRAY = 5, } ValType; struct Val { char *key; - ValType type; + u_int8_t type; union { char *s; u_int8_t u8; u_int32_t u32; u_int8_t *u8_array; + u_int16_t *u16_array; } u; u_int32_t array_len; Val *next; @@ -56,6 +58,9 @@ val_free (Val *v) } else if (v->type == VAL_TYPE_U8_ARRAY) { if (v->u.u8_array); free (v->u.u8_array); + } else if (v->type == VAL_TYPE_U16_ARRAY) { + if (v->u.u16_array); + free (v->u.u16_array); } free (v->key); memset (v, 0, sizeof (*v)); @@ -144,6 +149,35 @@ val_new_u32 (const char *key, u_int32_t u) return v; } +static Val * +val_new_u16_array (const char *key, const u_int16_t *array, size_t array_len) +{ + Val *v; + size_t sz; + + qcdm_return_val_if_fail (key != NULL, NULL); + qcdm_return_val_if_fail (key[0] != '\0', NULL); + qcdm_return_val_if_fail (array != NULL, NULL); + qcdm_return_val_if_fail (array_len > 0, NULL); + + v = calloc (sizeof (Val), 1); + if (v == NULL) + return NULL; + + v->key = strdup (key); + v->type = VAL_TYPE_U16_ARRAY; + sz = sizeof (u_int16_t) * array_len; + v->u.u16_array = malloc (sz); + if (v->u.u16_array == NULL) { + val_free (v); + return NULL; + } + memcpy (v->u.u16_array, array, sz); + v->array_len = array_len; + + return v; +} + /*********************************************************/ struct QcdmResult { @@ -372,3 +406,46 @@ qcdm_result_get_u32 (QcdmResult *r, return 0; } +void +qcdm_result_add_u16_array (QcdmResult *r, + const char *key, + const u_int16_t *array, + size_t array_len) +{ + Val *v; + + qcdm_return_if_fail (r != NULL); + qcdm_return_if_fail (r->refcount > 0); + qcdm_return_if_fail (key != NULL); + qcdm_return_if_fail (array != NULL); + qcdm_return_if_fail (array_len >= 0); + + v = val_new_u16_array (key, array, array_len); + qcdm_return_if_fail (v != NULL); + v->next = r->first; + r->first = v; +} + +int +qcdm_result_get_u16_array (QcdmResult *r, + const char *key, + const u_int16_t **out_val, + size_t *out_len) +{ + Val *v; + + qcdm_return_val_if_fail (r != NULL, -QCDM_ERROR_INVALID_ARGUMENTS); + qcdm_return_val_if_fail (r->refcount > 0, -QCDM_ERROR_INVALID_ARGUMENTS); + qcdm_return_val_if_fail (key != NULL, -QCDM_ERROR_INVALID_ARGUMENTS); + qcdm_return_val_if_fail (out_val != NULL, -QCDM_ERROR_INVALID_ARGUMENTS); + qcdm_return_val_if_fail (out_len != NULL, -QCDM_ERROR_INVALID_ARGUMENTS); + + v = find_val (r, key, VAL_TYPE_U16_ARRAY); + if (v == NULL) + return -QCDM_ERROR_VALUE_NOT_FOUND; + + *out_val = v->u.u16_array; + *out_len = v->array_len; + return 0; +} + diff --git a/libqcdm/src/result.h b/libqcdm/src/result.h index 3ab2159a2..a71c0bf53 100644 --- a/libqcdm/src/result.h +++ b/libqcdm/src/result.h @@ -34,6 +34,11 @@ int qcdm_result_get_u32 (QcdmResult *r, const char *key, u_int32_t *out_val); +int qcdm_result_get_u16_array (QcdmResult *result, + const char *key, + const u_int16_t **out_val, + size_t *out_len); + QcdmResult *qcdm_result_ref (QcdmResult *r); void qcdm_result_unref (QcdmResult *r); |