4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jonghyuk Choi <jhchoi.choi@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
31 #include "mm_attrs_private.h"
34 int mm_attrs_get_type(MMHandleType h, int idx, MMAttrsType *attrtype)
36 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
37 return_val_if_fail(h && idx >= 0 && idx < attrs->count && attrtype, MM_ERROR_COMMON_INVALID_ARGUMENT);
38 *attrtype=attrs->items[idx].value.type;
43 int mm_attrs_get_flags(MMHandleType h, int idx, int *flags)
45 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
46 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && flags, MM_ERROR_COMMON_INVALID_ARGUMENT);
48 *flags=attrs->items[idx].flags;
53 int mm_attrs_get_valid_type(MMHandleType h, int idx, int *type)
55 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
56 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && type, MM_ERROR_COMMON_INVALID_ARGUMENT);
57 *type=attrs->items[idx].value_spec.type;
62 int mm_attrs_get_valid_range(MMHandleType h, int idx, int *min, int *max)
64 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
65 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && min && max, MM_ERROR_COMMON_INVALID_ARGUMENT);
68 *min = attrs->items[idx].value_spec.spec.int_spec.range.min;
71 *max = attrs->items[idx].value_spec.spec.int_spec.range.max;
77 int mm_attrs_get_valid_array(MMHandleType h, int idx, int *count, int **array)
79 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
82 return_val_if_fail(attrs && count && idx >= 0 && idx < attrs->count && array, MM_ERROR_COMMON_INVALID_ARGUMENT);
84 *count = attrs->items[idx].value_spec.spec.int_spec.array.count;
85 *array=attrs->items[idx].value_spec.spec.int_spec.array.array;
90 int mm_attrs_get_size(MMHandleType h, int *size)
92 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
93 return_val_if_fail(h && size, MM_ERROR_COMMON_INVALID_ARGUMENT);
99 int mm_attrs_get_name(MMHandleType h, int idx, char **name)
101 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
102 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
103 *name = attrs->items[idx].name;
104 return MM_ERROR_NONE;
108 int mm_attrs_get_index(MMHandleType h, const char *attrname, int *index)
110 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
113 return_val_if_fail(h && attrname && index, MM_ERROR_COMMON_INVALID_ARGUMENT);
115 for (i = 0; i < attrs->count; i++) {
116 if (0 == strcmp(attrs->items[i].name, attrname)) {
118 return MM_ERROR_NONE;
121 return MM_ERROR_COMMON_OUT_OF_ARRAY;
125 int mm_attrs_set_int(MMHandleType h, int idx, int val)
127 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
128 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
130 mmf_attribute_t *item = &attrs->items[idx];
131 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
133 if (!mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
135 return MM_ERROR_COMMON_INVALID_PERMISSION;
138 if (mmf_attribute_validate_int(item, val))
141 ret = mmf_attribute_set_int(item, val);
144 return MM_ERROR_NONE;
146 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
149 if (item->value_spec.type == MMF_VALUE_SPEC_INT_RANGE)
150 return MM_ERROR_COMMON_OUT_OF_RANGE;
151 else if (item->value_spec.type == MMF_VALUE_SPEC_INT_ARRAY)
152 return MM_ERROR_COMMON_OUT_OF_ARRAY;
154 return MM_ERROR_COMMON_INVALID_ARGUMENT;
158 int mm_attrs_get_int(MMHandleType h, int idx, int *val)
160 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
161 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
162 mmf_attribute_t *item = &attrs->items[idx];
163 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
165 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_READABLE))
167 *val=mmf_value_get_int(&attrs->items[idx].value);
168 return MM_ERROR_NONE;
171 return MM_ERROR_COMMON_INVALID_PERMISSION;
175 int mm_attrs_set_double(MMHandleType h, int idx, double val)
177 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
178 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
180 mmf_attribute_t *item = &attrs->items[idx];
181 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
183 if (!mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
185 return MM_ERROR_COMMON_INVALID_PERMISSION;
188 if (mmf_attribute_validate_double(item, val))
191 ret = mmf_attribute_set_double(item, val);
194 return MM_ERROR_NONE;
196 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
199 if (item->value_spec.type == MMF_VALUE_SPEC_DOUBLE_RANGE)
200 return MM_ERROR_COMMON_OUT_OF_RANGE;
201 else if (item->value_spec.type == MMF_VALUE_SPEC_DOUBLE_ARRAY)
202 return MM_ERROR_COMMON_OUT_OF_ARRAY;
204 return MM_ERROR_COMMON_INVALID_ARGUMENT;
208 int mm_attrs_get_double(MMHandleType h, int idx, double *val)
210 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
211 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
212 mmf_attribute_t *item = &attrs->items[idx];
213 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
215 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_READABLE))
217 *val=mmf_value_get_double(&attrs->items[idx].value);
218 return MM_ERROR_NONE;
221 return MM_ERROR_COMMON_INVALID_PERMISSION;
225 int mm_attrs_set_string(MMHandleType h, int idx, const char *string, int size)
227 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
228 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
230 mmf_attribute_t *item = &attrs->items[idx];
232 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
234 MM_ATTRS_WRITE_LOCK(attrs);
236 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
239 ret = mmf_attribute_set_string(item, string, size);
241 MM_ATTRS_WRITE_UNLOCK(attrs);
244 return MM_ERROR_NONE;
246 return MM_ERROR_COMMON_INVALID_ARGUMENT;
249 MM_ATTRS_WRITE_UNLOCK(attrs);
251 return MM_ERROR_COMMON_INVALID_PERMISSION;
255 int mm_attrs_get_string(MMHandleType h, int idx,char **sval, int *size)
257 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
258 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && sval, MM_ERROR_COMMON_INVALID_ARGUMENT);
260 MM_ATTRS_WRITE_LOCK(attrs);
262 if (!(attrs->items[idx].flags & MM_ATTRS_FLAG_READABLE)) {
263 mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
264 MM_ATTRS_WRITE_UNLOCK(attrs);
265 return MM_ERROR_COMMON_INVALID_PERMISSION;
268 *sval = mmf_value_get_string(&attrs->items[idx].value,size);
270 MM_ATTRS_WRITE_UNLOCK(attrs);
272 return MM_ERROR_NONE;
276 int mm_attrs_set_data(MMHandleType h, int idx, void *data, int size)
278 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
279 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
281 mmf_attribute_t *item = &attrs->items[idx];
282 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
284 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
287 ret = mmf_attribute_set_data(item, data, size);
290 return MM_ERROR_NONE;
292 return MM_ERROR_COMMON_INVALID_ARGUMENT;
295 return MM_ERROR_COMMON_INVALID_ARGUMENT;
299 int mm_attrs_get_data(MMHandleType h, int idx,void **data, int *size)
301 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
302 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && data, MM_ERROR_COMMON_INVALID_ARGUMENT);
304 if (!(attrs->items[idx].flags & MM_ATTRS_FLAG_READABLE)) {
305 mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
306 return MM_ERROR_COMMON_INVALID_PERMISSION;
308 *data=mmf_value_get_data(&attrs->items[idx].value,size);
309 return MM_ERROR_NONE;
313 int mm_attrs_set_int_by_name(MMHandleType attrs, const char *name, int val)
315 return_val_if_fail(attrs && name, -1);
317 mm_attrs_get_index(attrs, name, &idx);
319 return mm_attrs_set_int(attrs, idx, val);
325 int mm_attrs_get_int_by_name(MMHandleType attrs, const char *name, int *val)
328 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
329 mm_attrs_get_index(attrs, name, &idx);
331 return mm_attrs_get_int(attrs, idx, val);
333 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
337 int mm_attrs_set_string_by_name(MMHandleType attrs, const char *name, const char *string)
339 return_val_if_fail(attrs && name, -1);
343 mm_attrs_get_index(attrs, name, &idx);
346 size = strlen(string);
353 return mm_attrs_set_string(attrs, idx, string, size);
359 int mm_attrs_get_string_by_name(MMHandleType attrs, const char *name, char **string)
363 return_val_if_fail(attrs && name && string, MM_ERROR_COMMON_INVALID_ARGUMENT);
365 mm_attrs_get_index(attrs, name, &idx);
367 return mm_attrs_get_string(attrs, idx, string, &len);
369 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
373 int mm_attrs_set_data_by_name(MMHandleType attrs, const char *name, void *data, int size)
375 return_val_if_fail(attrs && name, -1);
377 mm_attrs_get_index(attrs, name, &idx);
380 return mm_attrs_set_data(attrs, idx, data, size);
386 int mm_attrs_get_data_by_name(MMHandleType attrs, const char *name, void **data)
391 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
393 mm_attrs_get_index(attrs, name, &idx);
395 return mm_attrs_get_data(attrs, idx, data, &len);
397 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
401 int mm_attrs_set_double_by_name(MMHandleType attrs, const char *name, double val)
404 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
406 mm_attrs_get_index(attrs, name, &idx);
408 return mm_attrs_set_double(attrs, idx, val);
410 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
414 int mm_attrs_get_double_by_name(MMHandleType attrs, const char *name, double *val)
417 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
419 mm_attrs_get_index(attrs, name, &idx);
421 return mm_attrs_get_double(attrs, idx, val);
423 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
427 int mm_attrs_set_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
429 const char *name = NULL;
430 int ret = MM_ERROR_NONE;
432 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
433 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
434 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
437 *err_attr_name = NULL;
438 name = attribute_name;
443 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
446 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
449 *err_attr_name = strdup(name);
451 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
452 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
458 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
464 case MM_ATTRS_TYPE_INT:
466 int val = va_arg ((var_args), int);
467 mmf_debug(MMF_DEBUG_LOG, "(%s: %d)\n", name, val);
468 ret = mm_attrs_set_int(attrs, idx, val);
471 case MM_ATTRS_TYPE_DOUBLE:
473 double val = va_arg ((var_args), double);
474 mmf_debug(MMF_DEBUG_LOG, "(%s: %f)\n", name, val);
475 ret = mm_attrs_set_double(attrs, idx, val);
478 case MM_ATTRS_TYPE_STRING:
480 char * val = va_arg ((var_args), char*);
481 int size = va_arg ((var_args), int);
482 mmf_debug(MMF_DEBUG_LOG, "(%s: \'%s\', size: %d)\n", name, val, size);
483 ret = mm_attrs_set_string(attrs, idx, (const char*)val, size);
486 case MM_ATTRS_TYPE_DATA:
488 void * val = va_arg ((var_args), void*);
489 int size = va_arg ((var_args), int);
490 mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %d)\n", name, val, size);
491 ret = mm_attrs_set_data(attrs, idx, val, size);
494 case MM_ATTRS_TYPE_INVALID:
496 mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
498 *err_attr_name = strdup(name);
499 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
502 if (ret != MM_ERROR_NONE)
505 *err_attr_name = strdup(name);
506 mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
511 name = va_arg (var_args, char*);
514 if (mmf_attrs_commit_err(attrs, err_attr_name) == -1)
515 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
517 return MM_ERROR_NONE;
523 int mm_attrs_get_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
525 const char *name = NULL;
526 int ret = MM_ERROR_NONE;
528 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
529 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
530 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
533 *err_attr_name = NULL;
534 name = attribute_name;
539 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
542 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
545 *err_attr_name = strdup(name);
547 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
548 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
554 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
560 case MM_ATTRS_TYPE_INT:
562 int * val = va_arg ((var_args), int*);
563 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
564 ret = mm_attrs_get_int(attrs, idx, val);
567 case MM_ATTRS_TYPE_DOUBLE:
569 double * val = va_arg ((var_args), double*);
570 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
571 ret = mm_attrs_get_double(attrs, idx, val);
574 case MM_ATTRS_TYPE_STRING:
576 char ** val = va_arg ((var_args), char**);
577 int * size = va_arg ((var_args), int*);
578 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
579 ret = mm_attrs_get_string(attrs, idx, (char**)val, size);
582 case MM_ATTRS_TYPE_DATA:
584 void ** val = va_arg ((var_args), void**);
585 int * size = va_arg ((var_args), int*);
586 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
587 ret = mm_attrs_get_data(attrs, idx, val, size);
590 case MM_ATTRS_TYPE_INVALID:
592 // mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
594 *err_attr_name = strdup(name);
595 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
598 if (ret != MM_ERROR_NONE)
601 *err_attr_name = strdup(name);
602 mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
607 name = va_arg (var_args, char*);
614 int mm_attrs_multiple_set(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
617 int ret = MM_ERROR_NONE;
619 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
621 va_start (var_args, attribute_name);
622 ret = mm_attrs_set_valist (handle, err_attr_name, attribute_name, var_args);
629 int mm_attrs_multiple_get(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
632 int ret = MM_ERROR_NONE;
634 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
636 va_start (var_args, attribute_name);
637 ret = mm_attrs_get_valist (handle, err_attr_name, attribute_name, var_args);
644 int mm_attrs_get_info(MMHandleType h, int idx, MMAttrsInfo *info)
646 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
648 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
649 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
650 return_val_if_fail( 0 <= idx && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
652 memset(info, 0x00, sizeof(MMAttrsInfo));
654 info->type = attrs->items[idx].value.type;
655 info->flag = attrs->items[idx].flags;
656 info->validity_type = attrs->items[idx].value_spec.type;
658 switch (info->validity_type)
660 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
661 info->int_array.array = attrs->items[idx].value_spec.spec.int_spec.array.array;
662 info->int_array.count = attrs->items[idx].value_spec.spec.int_spec.array.count;
663 info->int_array.dval = attrs->items[idx].value_spec.spec.int_spec.array.dval;
665 case MM_ATTRS_VALID_TYPE_INT_RANGE:
666 info->int_range.min = attrs->items[idx].value_spec.spec.int_spec.range.min;
667 info->int_range.max = attrs->items[idx].value_spec.spec.int_spec.range.max;
668 info->int_range.dval = attrs->items[idx].value_spec.spec.int_spec.range.dval;
670 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
671 info->double_array.array = attrs->items[idx].value_spec.spec.double_spec.array.array;
672 info->double_array.count = attrs->items[idx].value_spec.spec.double_spec.array.count;
673 info->double_array.dval = attrs->items[idx].value_spec.spec.double_spec.array.dval;
675 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
676 info->double_range.min = attrs->items[idx].value_spec.spec.double_spec.range.min;
677 info->double_range.max = attrs->items[idx].value_spec.spec.double_spec.range.max;
678 info->double_range.dval = attrs->items[idx].value_spec.spec.double_spec.range.dval;
680 case MM_ATTRS_VALID_TYPE_NONE:
681 mmf_debug(MMF_DEBUG_LOG, "Valid type none.\n");
683 case MM_ATTRS_VALID_TYPE_INVALID:
688 return MM_ERROR_NONE;
692 int mm_attrs_get_info_by_name(MMHandleType h, const char *attr_name, MMAttrsInfo *info)
695 int ret = MM_ERROR_NONE;
697 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
698 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
700 mmf_debug(MMF_DEBUG_LOG, "(attr_name:%s)\n", attr_name);
702 mm_attrs_get_index(h, attr_name, &idx);
704 return_val_if_fail(idx >= 0, MM_ERROR_COMMON_INVALID_ARGUMENT);
706 ret = mm_attrs_get_info(h, idx, info);