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);
235 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
238 ret = mmf_attribute_set_string(item, string, size);
241 return MM_ERROR_NONE;
243 return MM_ERROR_COMMON_INVALID_ARGUMENT;
246 return MM_ERROR_COMMON_INVALID_PERMISSION;
250 int mm_attrs_get_string(MMHandleType h, int idx,char **sval, int *size)
252 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
253 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && sval, MM_ERROR_COMMON_INVALID_ARGUMENT);
255 if (!(attrs->items[idx].flags & MM_ATTRS_FLAG_READABLE)) {
256 mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
257 return MM_ERROR_COMMON_INVALID_PERMISSION;
260 *sval = mmf_value_get_string(&attrs->items[idx].value,size);
261 return MM_ERROR_NONE;
265 int mm_attrs_set_data(MMHandleType h, int idx, void *data, int size)
267 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
268 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
270 mmf_attribute_t *item = &attrs->items[idx];
271 return_val_if_fail(item, MM_ERROR_COMMON_INVALID_ARGUMENT);
273 if (mmf_attribute_check_flags(item, MM_ATTRS_FLAG_WRITABLE))
276 ret = mmf_attribute_set_data(item, data, size);
279 return MM_ERROR_NONE;
281 return MM_ERROR_COMMON_INVALID_ARGUMENT;
284 return MM_ERROR_COMMON_INVALID_ARGUMENT;
288 int mm_attrs_get_data(MMHandleType h, int idx,void **data, int *size)
290 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
291 return_val_if_fail(attrs && idx >= 0 && idx < attrs->count && data, MM_ERROR_COMMON_INVALID_ARGUMENT);
293 if (!(attrs->items[idx].flags & MM_ATTRS_FLAG_READABLE)) {
294 mmf_debug(MMF_DEBUG_LOG, "Access denied.\n");
295 return MM_ERROR_COMMON_INVALID_PERMISSION;
297 *data=mmf_value_get_data(&attrs->items[idx].value,size);
298 return MM_ERROR_NONE;
302 int mm_attrs_set_int_by_name(MMHandleType attrs, const char *name, int val)
304 return_val_if_fail(attrs && name, -1);
306 mm_attrs_get_index(attrs, name, &idx);
308 return mm_attrs_set_int(attrs, idx, val);
314 int mm_attrs_get_int_by_name(MMHandleType attrs, const char *name, int *val)
317 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
318 mm_attrs_get_index(attrs, name, &idx);
320 return mm_attrs_get_int(attrs, idx, val);
322 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
326 int mm_attrs_set_string_by_name(MMHandleType attrs, const char *name, const char *string)
328 return_val_if_fail(attrs && name, -1);
332 mm_attrs_get_index(attrs, name, &idx);
335 size = strlen(string);
342 return mm_attrs_set_string(attrs, idx, string, size);
348 int mm_attrs_get_string_by_name(MMHandleType attrs, const char *name, char **string)
352 return_val_if_fail(attrs && name && string, MM_ERROR_COMMON_INVALID_ARGUMENT);
354 mm_attrs_get_index(attrs, name, &idx);
356 return mm_attrs_get_string(attrs, idx, string, &len);
358 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
362 int mm_attrs_set_data_by_name(MMHandleType attrs, const char *name, void *data, int size)
364 return_val_if_fail(attrs && name, -1);
366 mm_attrs_get_index(attrs, name, &idx);
369 return mm_attrs_set_data(attrs, idx, data, size);
375 int mm_attrs_get_data_by_name(MMHandleType attrs, const char *name, void **data)
380 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
382 mm_attrs_get_index(attrs, name, &idx);
384 return mm_attrs_get_data(attrs, idx, data, &len);
386 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
390 int mm_attrs_set_double_by_name(MMHandleType attrs, const char *name, double val)
393 return_val_if_fail(attrs && name, MM_ERROR_COMMON_INVALID_ARGUMENT);
395 mm_attrs_get_index(attrs, name, &idx);
397 return mm_attrs_set_double(attrs, idx, val);
399 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
403 int mm_attrs_get_double_by_name(MMHandleType attrs, const char *name, double *val)
406 return_val_if_fail(attrs && name && val, MM_ERROR_COMMON_INVALID_ARGUMENT);
408 mm_attrs_get_index(attrs, name, &idx);
410 *val = mm_attrs_get_double(attrs, idx, val);
413 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
417 int mm_attrs_set_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
419 const char *name = NULL;
420 int ret = MM_ERROR_NONE;
422 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
423 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
424 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
427 *err_attr_name = NULL;
428 name = attribute_name;
433 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
436 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
439 *err_attr_name = strdup(name);
441 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
442 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
448 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
454 case MM_ATTRS_TYPE_INT:
456 int val = va_arg ((var_args), int);
457 mmf_debug(MMF_DEBUG_LOG, "(%s: %d)\n", name, val);
458 ret = mm_attrs_set_int(attrs, idx, val);
461 case MM_ATTRS_TYPE_DOUBLE:
463 double val = va_arg ((var_args), double);
464 mmf_debug(MMF_DEBUG_LOG, "(%s: %f)\n", name, val);
465 ret = mm_attrs_set_double(attrs, idx, val);
468 case MM_ATTRS_TYPE_STRING:
470 char * val = va_arg ((var_args), char*);
471 int size = va_arg ((var_args), int);
472 mmf_debug(MMF_DEBUG_LOG, "(%s: \'%s\', size: %d)\n", name, val, size);
473 ret = mm_attrs_set_string(attrs, idx, (const char*)val, size);
476 case MM_ATTRS_TYPE_DATA:
478 void * val = va_arg ((var_args), void*);
479 int size = va_arg ((var_args), int);
480 mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %d)\n", name, val, size);
481 ret = mm_attrs_set_data(attrs, idx, val, size);
484 case MM_ATTRS_TYPE_INVALID:
486 mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
488 *err_attr_name = strdup(name);
489 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
492 if (ret != MM_ERROR_NONE)
495 *err_attr_name = strdup(name);
496 mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
501 name = va_arg (var_args, char*);
504 if (mmf_attrs_commit_err(attrs, err_attr_name) == -1)
505 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
507 return MM_ERROR_NONE;
513 int mm_attrs_get_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
515 const char *name = NULL;
516 int ret = MM_ERROR_NONE;
518 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
519 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
520 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
523 *err_attr_name = NULL;
524 name = attribute_name;
529 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
532 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
535 *err_attr_name = strdup(name);
537 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
538 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
544 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
550 case MM_ATTRS_TYPE_INT:
552 int * val = va_arg ((var_args), int*);
553 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
554 ret = mm_attrs_get_int(attrs, idx, val);
557 case MM_ATTRS_TYPE_DOUBLE:
559 double * val = va_arg ((var_args), double*);
560 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
561 ret = mm_attrs_get_double(attrs, idx, val);
564 case MM_ATTRS_TYPE_STRING:
566 char ** val = va_arg ((var_args), char**);
567 int * size = va_arg ((var_args), int*);
568 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
569 ret = mm_attrs_get_string(attrs, idx, (char**)val, size);
572 case MM_ATTRS_TYPE_DATA:
574 void ** val = va_arg ((var_args), void**);
575 int * size = va_arg ((var_args), int*);
576 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
577 ret = mm_attrs_get_data(attrs, idx, val, size);
580 case MM_ATTRS_TYPE_INVALID:
582 // mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
584 *err_attr_name = strdup(name);
585 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
588 if (ret != MM_ERROR_NONE)
591 *err_attr_name = strdup(name);
592 mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
597 name = va_arg (var_args, char*);
604 int mm_attrs_multiple_set(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
607 int ret = MM_ERROR_NONE;
609 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
611 va_start (var_args, attribute_name);
612 ret = mm_attrs_set_valist (handle, err_attr_name, attribute_name, var_args);
619 int mm_attrs_multiple_get(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
622 int ret = MM_ERROR_NONE;
624 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
626 va_start (var_args, attribute_name);
627 ret = mm_attrs_get_valist (handle, err_attr_name, attribute_name, var_args);
634 int mm_attrs_get_info(MMHandleType h, int idx, MMAttrsInfo *info)
636 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
638 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
639 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
640 return_val_if_fail( 0 <= idx && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
642 memset(info, 0x00, sizeof(MMAttrsInfo));
644 info->type = attrs->items[idx].value.type;
645 info->flag = attrs->items[idx].flags;
646 info->validity_type = attrs->items[idx].value_spec.type;
648 switch (info->validity_type)
650 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
651 info->int_array.array = attrs->items[idx].value_spec.spec.int_spec.array.array;
652 info->int_array.count = attrs->items[idx].value_spec.spec.int_spec.array.count;
653 info->int_array.dval = attrs->items[idx].value_spec.spec.int_spec.array.dval;
655 case MM_ATTRS_VALID_TYPE_INT_RANGE:
656 info->int_range.min = attrs->items[idx].value_spec.spec.int_spec.range.min;
657 info->int_range.max = attrs->items[idx].value_spec.spec.int_spec.range.max;
658 info->int_range.dval = attrs->items[idx].value_spec.spec.int_spec.range.dval;
660 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
661 info->double_array.array = attrs->items[idx].value_spec.spec.double_spec.array.array;
662 info->double_array.count = attrs->items[idx].value_spec.spec.double_spec.array.count;
663 info->double_array.dval = attrs->items[idx].value_spec.spec.double_spec.array.dval;
665 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
666 info->double_range.min = attrs->items[idx].value_spec.spec.double_spec.range.min;
667 info->double_range.max = attrs->items[idx].value_spec.spec.double_spec.range.max;
668 info->double_range.dval = attrs->items[idx].value_spec.spec.double_spec.range.dval;
670 case MM_ATTRS_VALID_TYPE_NONE:
671 mmf_debug(MMF_DEBUG_LOG, "Valid type none.\n");
673 case MM_ATTRS_VALID_TYPE_INVALID:
678 return MM_ERROR_NONE;
682 int mm_attrs_get_info_by_name(MMHandleType h, const char *attr_name, MMAttrsInfo *info)
685 int ret = MM_ERROR_NONE;
687 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
688 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
690 mmf_debug(MMF_DEBUG_LOG, "(attr_name:%s)\n", attr_name);
692 mm_attrs_get_index(h, attr_name, &idx);
694 return_val_if_fail(idx >= 0, MM_ERROR_COMMON_INVALID_ARGUMENT);
696 ret = mm_attrs_get_info(h, idx, info);