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;
122 debug_error("failed to get index for [%s]", attrname);
124 return MM_ERROR_COMMON_OUT_OF_ARRAY;
128 int mm_attrs_set_int(MMHandleType h, int idx, int val)
130 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
131 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
133 mmf_attribute_t *item = &attrs->items[idx];
134 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
136 if (!mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
138 return MM_ERROR_COMMON_INVALID_PERMISSION;
141 if (mmf_attribute_validate_int(item, val))
144 ret = mmf_attribute_set_int(item, val);
147 return MM_ERROR_NONE;
149 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
152 if (item->value_spec.type == MMF_VALUE_SPEC_INT_RANGE)
153 return MM_ERROR_COMMON_OUT_OF_RANGE;
154 else if (item->value_spec.type == MMF_VALUE_SPEC_INT_ARRAY)
155 return MM_ERROR_COMMON_OUT_OF_ARRAY;
157 return MM_ERROR_COMMON_INVALID_ARGUMENT;
161 int mm_attrs_get_int(MMHandleType h, int idx, int *val)
163 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
164 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
165 mmf_attribute_t *item = &attrs->items[idx];
166 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
168 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_READABLE))
170 *val=mmf_value_get_int(&attrs->items[idx].value);
171 return MM_ERROR_NONE;
174 return MM_ERROR_COMMON_INVALID_PERMISSION;
178 int mm_attrs_set_double(MMHandleType h, int idx, double val)
180 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
181 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
183 mmf_attribute_t *item = &attrs->items[idx];
184 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
186 if (!mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
188 return MM_ERROR_COMMON_INVALID_PERMISSION;
191 if (mmf_attribute_validate_double(item, val))
194 ret = mmf_attribute_set_double(item, val);
197 return MM_ERROR_NONE;
199 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
202 if (item->value_spec.type == MMF_VALUE_SPEC_DOUBLE_RANGE)
203 return MM_ERROR_COMMON_OUT_OF_RANGE;
204 else if (item->value_spec.type == MMF_VALUE_SPEC_DOUBLE_ARRAY)
205 return MM_ERROR_COMMON_OUT_OF_ARRAY;
207 return MM_ERROR_COMMON_INVALID_ARGUMENT;
211 int mm_attrs_get_double(MMHandleType h, int idx, double *val)
213 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
214 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
215 mmf_attribute_t *item = &attrs->items[idx];
216 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
218 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_READABLE))
220 *val=mmf_value_get_double(&attrs->items[idx].value);
221 return MM_ERROR_NONE;
224 return MM_ERROR_COMMON_INVALID_PERMISSION;
228 int mm_attrs_set_string(MMHandleType h, int idx, const char *string, int size)
230 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
231 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
233 mmf_attribute_t *item = &attrs->items[idx];
235 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
237 MM_ATTR_ITEM_WRITE_LOCK(item);
239 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
242 ret = mmf_attribute_set_string(item, string, size);
244 MM_ATTR_ITEM_WRITE_UNLOCK(item);
247 return MM_ERROR_NONE;
249 return MM_ERROR_COMMON_INVALID_ARGUMENT;
252 MM_ATTR_ITEM_WRITE_UNLOCK(item);
254 return MM_ERROR_COMMON_INVALID_PERMISSION;
258 int mm_attrs_get_string(MMHandleType h, int idx, char **sval, int *size)
260 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
261 mmf_attribute_t *item = NULL;
262 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && sval, MM_ERROR_COMMON_INVALID_ARGUMENT);
264 item = &attrs->items[idx];
266 MM_ATTR_ITEM_WRITE_LOCK(item);
268 if (!(item->flags & MM_ATTRS_FLAG_READABLE)) {
269 //mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
270 MM_ATTR_ITEM_WRITE_UNLOCK(item);
271 return MM_ERROR_COMMON_INVALID_PERMISSION;
274 *sval = mmf_value_get_string(&item->value, size);
276 MM_ATTR_ITEM_WRITE_UNLOCK(item);
278 return MM_ERROR_NONE;
282 int mm_attrs_set_data(MMHandleType h, int idx, void *data, int size)
284 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
285 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
287 mmf_attribute_t *item = &attrs->items[idx];
288 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
290 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
293 ret = mmf_attribute_set_data(item, data, size);
296 return MM_ERROR_NONE;
298 return MM_ERROR_COMMON_INVALID_ARGUMENT;
301 return MM_ERROR_COMMON_INVALID_ARGUMENT;
305 int mm_attrs_get_data(MMHandleType h, int idx,void **data, int *size)
307 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
308 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && data, MM_ERROR_COMMON_INVALID_ARGUMENT);
310 if (!(attrs->items[idx].flags & MM_ATTRS_FLAG_READABLE)) {
311 //mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
312 return MM_ERROR_COMMON_INVALID_PERMISSION;
314 *data=mmf_value_get_data(&attrs->items[idx].value,size);
315 return MM_ERROR_NONE;
319 int mm_attrs_set_int_by_name(MMHandleType attrs, const char *name, int val)
321 return_val_if_fail(attrs && name, -1);
323 mm_attrs_get_index(attrs, name, &idx);
325 return mm_attrs_set_int(attrs, idx, val);
331 int mm_attrs_get_int_by_name(MMHandleType attrs, const char *name, int *val)
334 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
335 mm_attrs_get_index(attrs, name, &idx);
337 return mm_attrs_get_int(attrs, idx, val);
339 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
343 int mm_attrs_set_string_by_name(MMHandleType attrs, const char *name, const char *string)
345 return_val_if_fail(attrs && name, -1);
349 mm_attrs_get_index(attrs, name, &idx);
352 size = strlen(string);
359 return mm_attrs_set_string(attrs, idx, string, size);
365 int mm_attrs_get_string_by_name(MMHandleType attrs, const char *name, char **string)
369 return_val_if_fail(attrs && name && string, MM_ERROR_COMMON_INVALID_ARGUMENT);
371 mm_attrs_get_index(attrs, name, &idx);
373 return mm_attrs_get_string(attrs, idx, string, &len);
375 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
379 int mm_attrs_set_data_by_name(MMHandleType attrs, const char *name, void *data, int size)
381 return_val_if_fail(attrs && name, -1);
383 mm_attrs_get_index(attrs, name, &idx);
386 return mm_attrs_set_data(attrs, idx, data, size);
392 int mm_attrs_get_data_by_name(MMHandleType attrs, const char *name, void **data)
397 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
399 mm_attrs_get_index(attrs, name, &idx);
401 return mm_attrs_get_data(attrs, idx, data, &len);
403 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
407 int mm_attrs_set_double_by_name(MMHandleType attrs, const char *name, double val)
410 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
412 mm_attrs_get_index(attrs, name, &idx);
414 return mm_attrs_set_double(attrs, idx, val);
416 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
420 int mm_attrs_get_double_by_name(MMHandleType attrs, const char *name, double *val)
423 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
425 mm_attrs_get_index(attrs, name, &idx);
427 *val = mm_attrs_get_double(attrs, idx, val);
430 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
434 int mm_attrs_set_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
436 const char *name = NULL;
437 int ret = MM_ERROR_NONE;
439 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
440 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
441 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
444 *err_attr_name = NULL;
445 name = attribute_name;
450 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
453 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
456 *err_attr_name = strdup(name);
458 if (ret == (int)MM_ERROR_COMMON_OUT_OF_ARRAY) { //to avoid confusing
459 //mmf_debug(MMF_DEBUG_ERROR, "result of mm_attrs_get_index is MM_ERROR_COMMON_OUT_OF_ARRAY so return(ret = %x, name:%s)",ret, name);
460 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
462 //mmf_debug(MMF_DEBUG_ERROR, "result of mm_attrs_get_index is %x so return(name:%s)",ret, name);
468 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
474 case MM_ATTRS_TYPE_INT:
476 int val = va_arg ((var_args), int);
477 // mmf_debug(MMF_DEBUG_LOG, "(%s: %d)\n", name, val);
478 ret = mm_attrs_set_int(attrs, idx, val);
481 case MM_ATTRS_TYPE_DOUBLE:
483 double val = va_arg ((var_args), double);
484 // mmf_debug(MMF_DEBUG_LOG, "(%s: %f)\n", name, val);
485 ret = mm_attrs_set_double(attrs, idx, val);
488 case MM_ATTRS_TYPE_STRING:
490 char * val = va_arg ((var_args), char*);
491 int size = va_arg ((var_args), int);
492 // mmf_debug(MMF_DEBUG_LOG, "(%s: \'%s\', size: %d)\n", name, val, size);
493 ret = mm_attrs_set_string(attrs, idx, (const char*)val, size);
496 case MM_ATTRS_TYPE_DATA:
498 void * val = va_arg ((var_args), void*);
499 int size = va_arg ((var_args), int);
500 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %d)\n", name, val, size);
501 ret = mm_attrs_set_data(attrs, idx, val, size);
504 case MM_ATTRS_TYPE_INVALID:
506 //mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
507 return MM_ERROR_COMMON_INVALID_ARGUMENT;
511 if (ret != MM_ERROR_NONE)
514 *err_attr_name = strdup(name);
515 //mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
520 name = va_arg (var_args, char*);
523 if (mmf_attrs_commit_err(attrs, err_attr_name) == -1) {
524 //mmf_debug(MMF_DEBUG_ERROR, "result of mmf_attrs_commit_err is -1 (name:%s)", name);
525 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
528 return MM_ERROR_NONE;
534 int mm_attrs_get_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
536 const char *name = NULL;
537 int ret = MM_ERROR_NONE;
539 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
540 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
541 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
544 *err_attr_name = NULL;
545 name = attribute_name;
550 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
553 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
556 *err_attr_name = strdup(name);
558 if (ret == (int)MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
559 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
565 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
571 case MM_ATTRS_TYPE_INT:
573 int * val = va_arg ((var_args), int*);
574 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
575 ret = mm_attrs_get_int(attrs, idx, val);
578 case MM_ATTRS_TYPE_DOUBLE:
580 double * val = va_arg ((var_args), double*);
581 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
582 ret = mm_attrs_get_double(attrs, idx, val);
585 case MM_ATTRS_TYPE_STRING:
587 char ** val = va_arg ((var_args), char**);
588 int * size = va_arg ((var_args), int*);
589 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
590 ret = mm_attrs_get_string(attrs, idx, (char**)val, size);
593 case MM_ATTRS_TYPE_DATA:
595 void ** val = va_arg ((var_args), void**);
596 int * size = va_arg ((var_args), int*);
597 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
598 ret = mm_attrs_get_data(attrs, idx, val, size);
601 case MM_ATTRS_TYPE_INVALID:
603 // mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
605 // *err_attr_name = strdup(name);
606 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
610 if (ret != MM_ERROR_NONE)
613 *err_attr_name = strdup(name);
614 //mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
619 name = va_arg (var_args, char*);
626 int mm_attrs_multiple_set(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
629 int ret = MM_ERROR_NONE;
631 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
633 va_start (var_args, attribute_name);
634 ret = mm_attrs_set_valist (handle, err_attr_name, attribute_name, var_args);
641 int mm_attrs_multiple_get(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
644 int ret = MM_ERROR_NONE;
646 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
648 va_start (var_args, attribute_name);
649 ret = mm_attrs_get_valist (handle, err_attr_name, attribute_name, var_args);
656 int mm_attrs_get_info(MMHandleType h, int idx, MMAttrsInfo *info)
658 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
660 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
661 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
662 return_val_if_fail( 0 <= idx && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
664 memset(info, 0x00, sizeof(MMAttrsInfo));
666 info->type = attrs->items[idx].value.type;
667 info->flag = attrs->items[idx].flags;
668 info->validity_type = attrs->items[idx].value_spec.type;
670 switch (info->validity_type)
672 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
673 info->int_array.array = attrs->items[idx].value_spec.spec.int_spec.array.array;
674 info->int_array.count = attrs->items[idx].value_spec.spec.int_spec.array.count;
675 info->int_array.dval = attrs->items[idx].value_spec.spec.int_spec.array.dval;
677 case MM_ATTRS_VALID_TYPE_INT_RANGE:
678 info->int_range.min = attrs->items[idx].value_spec.spec.int_spec.range.min;
679 info->int_range.max = attrs->items[idx].value_spec.spec.int_spec.range.max;
680 info->int_range.dval = attrs->items[idx].value_spec.spec.int_spec.range.dval;
682 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
683 info->double_array.array = attrs->items[idx].value_spec.spec.double_spec.array.array;
684 info->double_array.count = attrs->items[idx].value_spec.spec.double_spec.array.count;
685 info->double_array.dval = attrs->items[idx].value_spec.spec.double_spec.array.dval;
687 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
688 info->double_range.min = attrs->items[idx].value_spec.spec.double_spec.range.min;
689 info->double_range.max = attrs->items[idx].value_spec.spec.double_spec.range.max;
690 info->double_range.dval = attrs->items[idx].value_spec.spec.double_spec.range.dval;
692 case MM_ATTRS_VALID_TYPE_NONE:
693 //mmf_debug(MMF_DEBUG_LOG, "Valid type none.\n");
695 case MM_ATTRS_VALID_TYPE_INVALID:
700 return MM_ERROR_NONE;
704 int mm_attrs_get_info_by_name(MMHandleType h, const char *attr_name, MMAttrsInfo *info)
707 int ret = MM_ERROR_NONE;
709 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
710 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
712 //mmf_debug(MMF_DEBUG_LOG, "(attr_name:%s)\n", attr_name);
714 mm_attrs_get_index(h, attr_name, &idx);
716 return_val_if_fail(idx >= 0, MM_ERROR_COMMON_INVALID_ARGUMENT);
718 ret = mm_attrs_get_info(h, idx, info);