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_ATTR_ITEM_WRITE_LOCK(item);
236 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
239 ret = mmf_attribute_set_string(item, string, size);
241 MM_ATTR_ITEM_WRITE_UNLOCK(item);
244 return MM_ERROR_NONE;
246 return MM_ERROR_COMMON_INVALID_ARGUMENT;
249 MM_ATTR_ITEM_WRITE_UNLOCK(item);
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 mmf_attribute_t *item = NULL;
259 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && sval, MM_ERROR_COMMON_INVALID_ARGUMENT);
261 item = &attrs->items[idx];
263 MM_ATTR_ITEM_WRITE_LOCK(item);
265 if (!(item->flags & MM_ATTRS_FLAG_READABLE)) {
266 //mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
267 MM_ATTR_ITEM_WRITE_UNLOCK(item);
268 return MM_ERROR_COMMON_INVALID_PERMISSION;
271 *sval = mmf_value_get_string(&item->value, size);
273 MM_ATTR_ITEM_WRITE_UNLOCK(item);
275 return MM_ERROR_NONE;
279 int mm_attrs_set_data(MMHandleType h, int idx, void *data, int size)
281 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
282 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
284 mmf_attribute_t *item = &attrs->items[idx];
285 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
287 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
290 ret = mmf_attribute_set_data(item, data, size);
293 return MM_ERROR_NONE;
295 return MM_ERROR_COMMON_INVALID_ARGUMENT;
298 return MM_ERROR_COMMON_INVALID_ARGUMENT;
302 int mm_attrs_get_data(MMHandleType h, int idx,void **data, int *size)
304 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
305 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && data, MM_ERROR_COMMON_INVALID_ARGUMENT);
307 if (!(attrs->items[idx].flags & MM_ATTRS_FLAG_READABLE)) {
308 //mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
309 return MM_ERROR_COMMON_INVALID_PERMISSION;
311 *data=mmf_value_get_data(&attrs->items[idx].value,size);
312 return MM_ERROR_NONE;
316 int mm_attrs_set_int_by_name(MMHandleType attrs, const char *name, int val)
318 return_val_if_fail(attrs && name, -1);
320 mm_attrs_get_index(attrs, name, &idx);
322 return mm_attrs_set_int(attrs, idx, val);
328 int mm_attrs_get_int_by_name(MMHandleType attrs, const char *name, int *val)
331 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
332 mm_attrs_get_index(attrs, name, &idx);
334 return mm_attrs_get_int(attrs, idx, val);
336 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
340 int mm_attrs_set_string_by_name(MMHandleType attrs, const char *name, const char *string)
342 return_val_if_fail(attrs && name, -1);
346 mm_attrs_get_index(attrs, name, &idx);
349 size = strlen(string);
356 return mm_attrs_set_string(attrs, idx, string, size);
362 int mm_attrs_get_string_by_name(MMHandleType attrs, const char *name, char **string)
366 return_val_if_fail(attrs && name && string, MM_ERROR_COMMON_INVALID_ARGUMENT);
368 mm_attrs_get_index(attrs, name, &idx);
370 return mm_attrs_get_string(attrs, idx, string, &len);
372 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
376 int mm_attrs_set_data_by_name(MMHandleType attrs, const char *name, void *data, int size)
378 return_val_if_fail(attrs && name, -1);
380 mm_attrs_get_index(attrs, name, &idx);
383 return mm_attrs_set_data(attrs, idx, data, size);
389 int mm_attrs_get_data_by_name(MMHandleType attrs, const char *name, void **data)
394 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
396 mm_attrs_get_index(attrs, name, &idx);
398 return mm_attrs_get_data(attrs, idx, data, &len);
400 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
404 int mm_attrs_set_double_by_name(MMHandleType attrs, const char *name, double val)
407 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
409 mm_attrs_get_index(attrs, name, &idx);
411 return mm_attrs_set_double(attrs, idx, val);
413 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
417 int mm_attrs_get_double_by_name(MMHandleType attrs, const char *name, double *val)
420 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
422 mm_attrs_get_index(attrs, name, &idx);
424 *val = mm_attrs_get_double(attrs, idx, val);
427 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
431 int mm_attrs_set_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
433 const char *name = NULL;
434 unsigned int ret = MM_ERROR_NONE;
436 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
437 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
438 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
441 *err_attr_name = NULL;
442 name = attribute_name;
447 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
450 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
453 *err_attr_name = strdup(name);
455 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) { //to avoid confusing
456 //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);
457 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
459 //mmf_debug(MMF_DEBUG_ERROR, "result of mm_attrs_get_index is %x so return(name:%s)",ret, name);
465 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
471 case MM_ATTRS_TYPE_INT:
473 int val = va_arg ((var_args), int);
474 // mmf_debug(MMF_DEBUG_LOG, "(%s: %d)\n", name, val);
475 ret = mm_attrs_set_int(attrs, idx, val);
478 case MM_ATTRS_TYPE_DOUBLE:
480 double val = va_arg ((var_args), double);
481 // mmf_debug(MMF_DEBUG_LOG, "(%s: %f)\n", name, val);
482 ret = mm_attrs_set_double(attrs, idx, val);
485 case MM_ATTRS_TYPE_STRING:
487 char * val = va_arg ((var_args), char*);
488 int size = va_arg ((var_args), int);
489 // mmf_debug(MMF_DEBUG_LOG, "(%s: \'%s\', size: %d)\n", name, val, size);
490 ret = mm_attrs_set_string(attrs, idx, (const char*)val, size);
493 case MM_ATTRS_TYPE_DATA:
495 void * val = va_arg ((var_args), void*);
496 int size = va_arg ((var_args), int);
497 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %d)\n", name, val, size);
498 ret = mm_attrs_set_data(attrs, idx, val, size);
501 case MM_ATTRS_TYPE_INVALID:
503 //mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
504 return MM_ERROR_COMMON_INVALID_ARGUMENT;
508 if (ret != MM_ERROR_NONE)
511 *err_attr_name = strdup(name);
512 //mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
517 name = va_arg (var_args, char*);
520 if (mmf_attrs_commit_err(attrs, err_attr_name) == -1) {
521 //mmf_debug(MMF_DEBUG_ERROR, "result of mmf_attrs_commit_err is -1 (name:%s)", name);
522 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
525 return MM_ERROR_NONE;
531 int mm_attrs_get_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
533 const char *name = NULL;
534 unsigned int ret = MM_ERROR_NONE;
536 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
537 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
538 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
541 *err_attr_name = NULL;
542 name = attribute_name;
547 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
550 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
553 *err_attr_name = strdup(name);
555 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
556 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
562 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
568 case MM_ATTRS_TYPE_INT:
570 int * val = va_arg ((var_args), int*);
571 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
572 ret = mm_attrs_get_int(attrs, idx, val);
575 case MM_ATTRS_TYPE_DOUBLE:
577 double * val = va_arg ((var_args), double*);
578 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
579 ret = mm_attrs_get_double(attrs, idx, val);
582 case MM_ATTRS_TYPE_STRING:
584 char ** val = va_arg ((var_args), char**);
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_string(attrs, idx, (char**)val, size);
590 case MM_ATTRS_TYPE_DATA:
592 void ** val = va_arg ((var_args), void**);
593 int * size = va_arg ((var_args), int*);
594 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
595 ret = mm_attrs_get_data(attrs, idx, val, size);
598 case MM_ATTRS_TYPE_INVALID:
600 // mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
602 // *err_attr_name = strdup(name);
603 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
606 if (ret != MM_ERROR_NONE)
609 *err_attr_name = strdup(name);
610 //mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
615 name = va_arg (var_args, char*);
622 int mm_attrs_multiple_set(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
625 int ret = MM_ERROR_NONE;
627 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
629 va_start (var_args, attribute_name);
630 ret = mm_attrs_set_valist (handle, err_attr_name, attribute_name, var_args);
637 int mm_attrs_multiple_get(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
640 int ret = MM_ERROR_NONE;
642 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
644 va_start (var_args, attribute_name);
645 ret = mm_attrs_get_valist (handle, err_attr_name, attribute_name, var_args);
652 int mm_attrs_get_info(MMHandleType h, int idx, MMAttrsInfo *info)
654 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
656 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
657 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
658 return_val_if_fail( 0 <= idx && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
660 memset(info, 0x00, sizeof(MMAttrsInfo));
662 info->type = attrs->items[idx].value.type;
663 info->flag = attrs->items[idx].flags;
664 info->validity_type = attrs->items[idx].value_spec.type;
666 switch (info->validity_type)
668 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
669 info->int_array.array = attrs->items[idx].value_spec.spec.int_spec.array.array;
670 info->int_array.count = attrs->items[idx].value_spec.spec.int_spec.array.count;
671 info->int_array.dval = attrs->items[idx].value_spec.spec.int_spec.array.dval;
673 case MM_ATTRS_VALID_TYPE_INT_RANGE:
674 info->int_range.min = attrs->items[idx].value_spec.spec.int_spec.range.min;
675 info->int_range.max = attrs->items[idx].value_spec.spec.int_spec.range.max;
676 info->int_range.dval = attrs->items[idx].value_spec.spec.int_spec.range.dval;
678 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
679 info->double_array.array = attrs->items[idx].value_spec.spec.double_spec.array.array;
680 info->double_array.count = attrs->items[idx].value_spec.spec.double_spec.array.count;
681 info->double_array.dval = attrs->items[idx].value_spec.spec.double_spec.array.dval;
683 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
684 info->double_range.min = attrs->items[idx].value_spec.spec.double_spec.range.min;
685 info->double_range.max = attrs->items[idx].value_spec.spec.double_spec.range.max;
686 info->double_range.dval = attrs->items[idx].value_spec.spec.double_spec.range.dval;
688 case MM_ATTRS_VALID_TYPE_NONE:
689 //mmf_debug(MMF_DEBUG_LOG, "Valid type none.\n");
691 case MM_ATTRS_VALID_TYPE_INVALID:
696 return MM_ERROR_NONE;
700 int mm_attrs_get_info_by_name(MMHandleType h, const char *attr_name, MMAttrsInfo *info)
703 int ret = MM_ERROR_NONE;
705 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
706 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
708 //mmf_debug(MMF_DEBUG_LOG, "(attr_name:%s)\n", attr_name);
710 mm_attrs_get_index(h, attr_name, &idx);
712 return_val_if_fail(idx >= 0, MM_ERROR_COMMON_INVALID_ARGUMENT);
714 ret = mm_attrs_get_info(h, idx, info);