static Eina_Value * _value_clone(const Eina_Value *value) { Eina_Value *copy = eina_value_new(eina_value_type_get(value)); eina_value_copy(value, copy); return copy; }
static cJSON * azy_value_serialize_json(const Eina_Value *val) { const Eina_Value_Type *type; EINA_SAFETY_ON_NULL_RETURN_VAL(val, NULL); type = eina_value_type_get(val); if (type == EINA_VALUE_TYPE_ARRAY) return azy_value_serialize_array_json(val); if (type == EINA_VALUE_TYPE_STRUCT) return azy_value_serialize_struct_json(val); else if (type) return azy_value_serialize_basic_json(val); return cJSON_CreateNull(); }
Eina_Bool _message_iter_from_eina_value_struct(const char *signature, Eldbus_Message_Iter *iter, const Eina_Value *value) { unsigned i; DBusSignatureIter signature_iter; Eina_Bool r = EINA_TRUE; char *type; Eina_Value_Struct st; EINA_SAFETY_ON_FALSE_RETURN_VAL( eina_value_type_get(value) == EINA_VALUE_TYPE_STRUCT, EINA_FALSE); EINA_SAFETY_ON_FALSE_RETURN_VAL( eina_value_pget(value, &st), EINA_FALSE); dbus_signature_iter_init(&signature_iter, signature); i = 0; while ((type = dbus_signature_iter_get_signature(&signature_iter))) { DBG("type: %s", type); if (type[0] != 'v' && !type[1]) r = _basic_append(type[0], value, st.desc, i, iter); else if (type[0] == 'a') { Eina_Value value_array; EINA_SAFETY_ON_FALSE_RETURN_VAL( _compatible_type(type[0], st.desc->members[i].type), EINA_FALSE); eina_value_struct_value_get(value, st.desc->members[i].name, &value_array); r = _array_append(type, &value_array, iter); eina_value_flush(&value_array); } else if (type[0] == '(') { Eina_Value inner_st; Eldbus_Message_Iter *sub_iter; char *sub_sig; unsigned len = strlen(type+1) -1; sub_sig = alloca(sizeof(char) * len); memcpy(sub_sig, type+1, len); sub_sig[len-1] = 0; EINA_SAFETY_ON_FALSE_RETURN_VAL( _compatible_type(type[0], st.desc->members[i].type), EINA_FALSE); eina_value_struct_value_get(value, st.desc->members[i].name, &inner_st); eldbus_message_iter_arguments_append(iter, type, &sub_iter); r = _message_iter_from_eina_value_struct(sub_sig, sub_iter, &inner_st); eldbus_message_iter_container_close(iter, sub_iter); } else if (type[0] == 'v') { ERR("Variant not supported"); r = EINA_FALSE; } else { ERR("Unknown type %c", type[0]); r = EINA_FALSE; } i++; dbus_free(type); if (!r || !dbus_signature_iter_next(&signature_iter)) break; } return r; }