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 *val = mm_attrs_get_double(attrs, idx, val);
424 return MM_ERROR_COMMON_INVALID_ATTRTYPE;
428 int mm_attrs_set_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
430 const char *name = NULL;
431 int ret = MM_ERROR_NONE;
433 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
434 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
435 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
438 *err_attr_name = NULL;
439 name = attribute_name;
444 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
447 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
450 *err_attr_name = strdup(name);
452 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
453 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
459 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
465 case MM_ATTRS_TYPE_INT:
467 int val = va_arg ((var_args), int);
468 mmf_debug(MMF_DEBUG_LOG, "(%s: %d)\n", name, val);
469 ret = mm_attrs_set_int(attrs, idx, val);
472 case MM_ATTRS_TYPE_DOUBLE:
474 double val = va_arg ((var_args), double);
475 mmf_debug(MMF_DEBUG_LOG, "(%s: %f)\n", name, val);
476 ret = mm_attrs_set_double(attrs, idx, val);
479 case MM_ATTRS_TYPE_STRING:
481 char * val = va_arg ((var_args), char*);
482 int size = va_arg ((var_args), int);
483 mmf_debug(MMF_DEBUG_LOG, "(%s: \'%s\', size: %d)\n", name, val, size);
484 ret = mm_attrs_set_string(attrs, idx, (const char*)val, size);
487 case MM_ATTRS_TYPE_DATA:
489 void * val = va_arg ((var_args), void*);
490 int size = va_arg ((var_args), int);
491 mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %d)\n", name, val, size);
492 ret = mm_attrs_set_data(attrs, idx, val, size);
495 case MM_ATTRS_TYPE_INVALID:
497 mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
499 *err_attr_name = strdup(name);
500 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
503 if (ret != MM_ERROR_NONE)
506 *err_attr_name = strdup(name);
507 mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
512 name = va_arg (var_args, char*);
515 if (mmf_attrs_commit_err(attrs, err_attr_name) == -1)
516 return MM_ERROR_CAMCORDER_INVALID_ARGUMENT;
518 return MM_ERROR_NONE;
524 int mm_attrs_get_valist (MMHandleType attrs, char **err_attr_name, const char *attribute_name, va_list var_args)
526 const char *name = NULL;
527 int ret = MM_ERROR_NONE;
529 return_val_if_fail(attrs, MM_ERROR_COMMON_INVALID_ARGUMENT);
530 // return_val_if_fail(err_attr_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
531 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
534 *err_attr_name = NULL;
535 name = attribute_name;
540 MMAttrsType attr_type = MM_ATTRS_TYPE_INVALID;
543 if ((ret = mm_attrs_get_index(attrs, name, &idx)) != MM_ERROR_NONE)
546 *err_attr_name = strdup(name);
548 if (ret == MM_ERROR_COMMON_OUT_OF_ARRAY) //to avoid confusing
549 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
555 if ((ret = mm_attrs_get_type(attrs, idx, &attr_type)) != MM_ERROR_NONE)
561 case MM_ATTRS_TYPE_INT:
563 int * val = va_arg ((var_args), int*);
564 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
565 ret = mm_attrs_get_int(attrs, idx, val);
568 case MM_ATTRS_TYPE_DOUBLE:
570 double * val = va_arg ((var_args), double*);
571 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p)\n", name, val);
572 ret = mm_attrs_get_double(attrs, idx, val);
575 case MM_ATTRS_TYPE_STRING:
577 char ** val = va_arg ((var_args), char**);
578 int * size = va_arg ((var_args), int*);
579 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
580 ret = mm_attrs_get_string(attrs, idx, (char**)val, size);
583 case MM_ATTRS_TYPE_DATA:
585 void ** val = va_arg ((var_args), void**);
586 int * size = va_arg ((var_args), int*);
587 // mmf_debug(MMF_DEBUG_LOG, "(%s: %p, size: %p)\n", name, val, size);
588 ret = mm_attrs_get_data(attrs, idx, val, size);
591 case MM_ATTRS_TYPE_INVALID:
593 // mmf_debug(MMF_DEBUG_ERROR, "This function doesn't support attribute type(%d, name:%s)\n", attr_type, name);
595 *err_attr_name = strdup(name);
596 ret = MM_ERROR_COMMON_INVALID_ARGUMENT;
599 if (ret != MM_ERROR_NONE)
602 *err_attr_name = strdup(name);
603 mmf_debug(MMF_DEBUG_ERROR, "Setting failure.(name:%s)\n", name);
608 name = va_arg (var_args, char*);
615 int mm_attrs_multiple_set(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
618 int ret = MM_ERROR_NONE;
620 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
622 va_start (var_args, attribute_name);
623 ret = mm_attrs_set_valist (handle, err_attr_name, attribute_name, var_args);
630 int mm_attrs_multiple_get(MMHandleType handle, char **err_attr_name, const char *attribute_name, ...)
633 int ret = MM_ERROR_NONE;
635 return_val_if_fail(attribute_name, MM_ERROR_COMMON_INVALID_ARGUMENT);
637 va_start (var_args, attribute_name);
638 ret = mm_attrs_get_valist (handle, err_attr_name, attribute_name, var_args);
645 int mm_attrs_get_info(MMHandleType h, int idx, MMAttrsInfo *info)
647 mmf_attrs_t *attrs = (mmf_attrs_t *) h;
649 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
650 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
651 return_val_if_fail( 0 <= idx && idx < attrs->count, MM_ERROR_COMMON_INVALID_ARGUMENT);
653 memset(info, 0x00, sizeof(MMAttrsInfo));
655 info->type = attrs->items[idx].value.type;
656 info->flag = attrs->items[idx].flags;
657 info->validity_type = attrs->items[idx].value_spec.type;
659 switch (info->validity_type)
661 case MM_ATTRS_VALID_TYPE_INT_ARRAY:
662 info->int_array.array = attrs->items[idx].value_spec.spec.int_spec.array.array;
663 info->int_array.count = attrs->items[idx].value_spec.spec.int_spec.array.count;
664 info->int_array.dval = attrs->items[idx].value_spec.spec.int_spec.array.dval;
666 case MM_ATTRS_VALID_TYPE_INT_RANGE:
667 info->int_range.min = attrs->items[idx].value_spec.spec.int_spec.range.min;
668 info->int_range.max = attrs->items[idx].value_spec.spec.int_spec.range.max;
669 info->int_range.dval = attrs->items[idx].value_spec.spec.int_spec.range.dval;
671 case MM_ATTRS_VALID_TYPE_DOUBLE_ARRAY:
672 info->double_array.array = attrs->items[idx].value_spec.spec.double_spec.array.array;
673 info->double_array.count = attrs->items[idx].value_spec.spec.double_spec.array.count;
674 info->double_array.dval = attrs->items[idx].value_spec.spec.double_spec.array.dval;
676 case MM_ATTRS_VALID_TYPE_DOUBLE_RANGE:
677 info->double_range.min = attrs->items[idx].value_spec.spec.double_spec.range.min;
678 info->double_range.max = attrs->items[idx].value_spec.spec.double_spec.range.max;
679 info->double_range.dval = attrs->items[idx].value_spec.spec.double_spec.range.dval;
681 case MM_ATTRS_VALID_TYPE_NONE:
682 mmf_debug(MMF_DEBUG_LOG, "Valid type none.\n");
684 case MM_ATTRS_VALID_TYPE_INVALID:
689 return MM_ERROR_NONE;
693 int mm_attrs_get_info_by_name(MMHandleType h, const char *attr_name, MMAttrsInfo *info)
696 int ret = MM_ERROR_NONE;
698 return_val_if_fail(h, MM_ERROR_COMMON_INVALID_ARGUMENT);
699 return_val_if_fail(info, MM_ERROR_COMMON_INVALID_ARGUMENT);
701 mmf_debug(MMF_DEBUG_LOG, "(attr_name:%s)\n", attr_name);
703 mm_attrs_get_index(h, attr_name, &idx);
705 return_val_if_fail(idx >= 0, MM_ERROR_COMMON_INVALID_ARGUMENT);
707 ret = mm_attrs_get_info(h, idx, info);