static void _efl_net_control_technology_property_set(Eo *o, Efl_Net_Control_Technology_Data *pd, const char *name, const char *signature, ...) { Eldbus_Message *msg; Eldbus_Message_Iter *msg_itr, *var; Eldbus_Pending *p; va_list ap; msg = eldbus_proxy_method_call_new(pd->proxy, "SetProperty"); EINA_SAFETY_ON_NULL_RETURN(msg); msg_itr = eldbus_message_iter_get(msg); EINA_SAFETY_ON_NULL_GOTO(msg_itr, error_send); eldbus_message_iter_basic_append(msg_itr, 's', name); var = eldbus_message_iter_container_new(msg_itr, 'v', signature); va_start(ap, signature); eldbus_message_iter_arguments_vappend(var, signature, ap); va_end(ap); eldbus_message_iter_container_close(msg_itr, var); p = eldbus_proxy_send(pd->proxy, msg, _efl_net_control_technology_property_set_cb, o, DEFAULT_TIMEOUT); EINA_SAFETY_ON_NULL_GOTO(p, error_send); pd->pending = eina_list_append(pd->pending, p); DBG("Setting property %s", name); return; error_send: eldbus_message_unref(msg); }
static Eina_Bool _eldbus_message_arguments_vappend(Eldbus_Message *msg, const char *signature, va_list *aq) { DBusSignatureIter signature_iter; Eldbus_Message_Iter *iter; int type; Eina_Bool r = EINA_TRUE; if (!signature[0]) return EINA_TRUE; EINA_SAFETY_ON_FALSE_RETURN_VAL(dbus_signature_validate(signature, NULL), EINA_FALSE); iter = eldbus_message_iter_get(msg); EINA_SAFETY_ON_FALSE_RETURN_VAL(iter->writable, EINA_FALSE); dbus_signature_iter_init(&signature_iter, signature); while ((type = dbus_signature_iter_get_current_type(&signature_iter))) { if (dbus_type_is_basic(type)) r = append_basic(type, aq, &iter->dbus_iterator); else { ERR("sig = %s | eldbus_message_arguments_append() and \ eldbus_message_arguments_vappend() only support basic types, \ to complex types use eldbus_message_iter_* functions", signature); r = EINA_FALSE; } if (!r || !dbus_signature_iter_next(&signature_iter)) break; } return r; }
static Eina_Bool _eldbus_message_arguments_vget(Eldbus_Message *msg, const char *signature, va_list ap) { Eldbus_Message_Iter *iter; iter = eldbus_message_iter_get(msg); ELDBUS_MESSAGE_ITERATOR_CHECK_RETVAL(iter, EINA_FALSE); return eldbus_message_iter_arguments_vget(iter, signature, ap); }
static void _efl_net_control_technology_property_changed(void *data, const Eldbus_Message *msg) { Eo *o = data; Efl_Net_Control_Technology_Data *pd = efl_data_scope_get(o, MY_CLASS); Eldbus_Message_Iter *itr; itr = eldbus_message_iter_get(msg); _efl_net_control_technology_property_changed_internal(o, pd, itr); }
static Eldbus_Message * _cb_property_get(const Eldbus_Service_Interface *piface, const Eldbus_Message *msg) { const char *propname, *iface_name; Eldbus_Service_Object *obj = piface->obj; Eldbus_Service_Interface *iface; Property *prop; Eldbus_Message *reply, *error_reply = NULL; Eldbus_Message_Iter *main_iter, *variant; Eina_Bool ret; Eldbus_Property_Get_Cb getter = NULL; if (!eldbus_message_arguments_get(msg, "ss", &iface_name, &propname)) return NULL; iface = eina_hash_find(obj->interfaces, iface_name); if (!iface) return eldbus_message_error_new(msg, DBUS_ERROR_UNKNOWN_INTERFACE, "Interface not found."); prop = eina_hash_find(iface->properties, propname); if (!prop || prop->is_invalidate) goto not_found; if (prop->property->get_func) getter = prop->property->get_func; else if (iface->get_func) getter = iface->get_func; if (!getter) goto not_found; reply = eldbus_message_method_return_new(msg); EINA_SAFETY_ON_NULL_RETURN_VAL(reply, NULL); main_iter = eldbus_message_iter_get(reply); variant = eldbus_message_iter_container_new(main_iter, 'v', prop->property->type); ret = getter(iface, propname, variant, msg, &error_reply); if (ret) { eldbus_message_iter_container_close(main_iter, variant); return reply; } eldbus_message_unref(reply); return error_reply; not_found: return eldbus_message_error_new(msg, DBUS_ERROR_UNKNOWN_PROPERTY, "Property not found."); }
EAPI Eina_Bool eldbus_message_from_eina_value(const char *signature, Eldbus_Message *msg, const Eina_Value *value) { Eldbus_Message_Iter *iter; EINA_SAFETY_ON_NULL_RETURN_VAL(signature, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(msg, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(value, EINA_FALSE); iter = eldbus_message_iter_get(msg); EINA_SAFETY_ON_NULL_RETURN_VAL(iter, EINA_FALSE); EINA_SAFETY_ON_FALSE_RETURN_VAL(iter->writable, EINA_FALSE); return _message_iter_from_eina_value_struct(signature, iter, value); }
void wkb_ibus_input_context_set_surrounding_text(const char *text, unsigned int cursor, unsigned int anchor) { Eldbus_Message *msg; Eldbus_Message_Iter *iter; struct wkb_ibus_text *txt; if (!wkb_ibus || !wkb_ibus->input_ctx || !wkb_ibus->input_ctx->ibus_ctx) return; txt = wkb_ibus_text_from_string(text); msg = eldbus_proxy_method_call_new(wkb_ibus->input_ctx->ibus_ctx, "SetSurroundingText"); iter = eldbus_message_iter_get(msg); wkb_ibus_iter_append_text(iter, txt); eldbus_message_iter_basic_append(iter, 'u', cursor); eldbus_message_iter_basic_append(iter, 'u', anchor); eldbus_proxy_send(wkb_ibus->input_ctx->ibus_ctx, msg, _ibus_input_ctx_set_surrounding_text, txt, -1); }