5 #include "eldbus_private.h"
6 #include "eldbus_private_types.h"
8 /* TODO: mempool of Eldbus_Proxy, Eldbus_Proxy_Context_Event_Cb and
9 * Eldbus_Proxy_Context_Event
12 typedef struct _Eldbus_Proxy_Context_Event_Cb
15 Eldbus_Proxy_Event_Cb cb;
17 Eina_Bool deleted : 1;
18 } Eldbus_Proxy_Context_Event_Cb;
20 typedef struct _Eldbus_Proxy_Context_Event
25 } Eldbus_Proxy_Context_Event;
32 const char *interface;
33 Eina_Inlist *pendings;
35 Eina_Inlist *cbs_free;
37 Eldbus_Proxy_Context_Event event_handlers[ELDBUS_PROXY_EVENT_LAST];
39 Eldbus_Signal_Handler *properties_changed;
40 Eina_Bool monitor_enabled:1;
43 #define ELDBUS_PROXY_CHECK(proxy) \
46 EINA_SAFETY_ON_NULL_RETURN(proxy); \
47 if (!EINA_MAGIC_CHECK(proxy, ELDBUS_PROXY_MAGIC)) \
49 EINA_MAGIC_FAIL(proxy, ELDBUS_PROXY_MAGIC); \
52 EINA_SAFETY_ON_TRUE_RETURN(proxy->refcount <= 0); \
56 #define ELDBUS_PROXY_CHECK_RETVAL(proxy, retval) \
59 EINA_SAFETY_ON_NULL_RETURN_VAL(proxy, retval); \
60 if (!EINA_MAGIC_CHECK(proxy, ELDBUS_PROXY_MAGIC)) \
62 EINA_MAGIC_FAIL(proxy, ELDBUS_PROXY_MAGIC); \
65 EINA_SAFETY_ON_TRUE_RETURN_VAL(proxy->refcount <= 0, retval); \
69 #define ELDBUS_PROXY_CHECK_GOTO(proxy, label) \
72 EINA_SAFETY_ON_NULL_GOTO(proxy, label); \
73 if (!EINA_MAGIC_CHECK(proxy, ELDBUS_PROXY_MAGIC)) \
75 EINA_MAGIC_FAIL(proxy, ELDBUS_PROXY_MAGIC); \
78 EINA_SAFETY_ON_TRUE_GOTO(proxy->refcount <= 0, label); \
83 eldbus_proxy_init(void)
89 eldbus_proxy_shutdown(void)
93 static void _eldbus_proxy_event_callback_call(Eldbus_Proxy *proxy, Eldbus_Proxy_Event_Type type, const void *event_info);
94 static void _eldbus_proxy_context_event_cb_del(Eldbus_Proxy_Context_Event *ce, Eldbus_Proxy_Context_Event_Cb *ctx);
95 static void _on_signal_handler_free(void *data, const void *dead_pointer);
98 _eldbus_proxy_call_del(Eldbus_Proxy *proxy)
100 Eldbus_Proxy_Context_Event *ce;
102 _eldbus_proxy_event_callback_call(proxy, ELDBUS_PROXY_EVENT_DEL, NULL);
104 /* clear all del callbacks so we don't call them twice at
105 * _eldbus_proxy_clear()
107 ce = proxy->event_handlers + ELDBUS_PROXY_EVENT_DEL;
110 Eldbus_Proxy_Context_Event_Cb *ctx;
112 ctx = EINA_INLIST_CONTAINER_GET(ce->list,
113 Eldbus_Proxy_Context_Event_Cb);
114 _eldbus_proxy_context_event_cb_del(ce, ctx);
119 _eldbus_proxy_clear(Eldbus_Proxy *proxy)
121 Eldbus_Signal_Handler *h;
123 Eina_List *iter, *iter_next;
125 DBG("proxy=%p, refcount=%d, interface=%s, obj=%p",
126 proxy, proxy->refcount, proxy->interface, proxy->obj);
128 eldbus_object_proxy_del(proxy->obj, proxy, proxy->interface);
129 _eldbus_proxy_call_del(proxy);
131 EINA_LIST_FOREACH_SAFE(proxy->handlers, iter, iter_next, h)
133 DBG("proxy=%p delete owned signal handler %p %s",
134 proxy, h, eldbus_signal_handler_match_get(h));
135 eldbus_signal_handler_del(h);
138 EINA_INLIST_FOREACH_SAFE(proxy->pendings, in_l, p)
140 DBG("proxy=%p delete owned pending call=%p dest=%s path=%s %s.%s()",
142 eldbus_pending_destination_get(p),
143 eldbus_pending_path_get(p),
144 eldbus_pending_interface_get(p),
145 eldbus_pending_method_get(p));
146 eldbus_pending_cancel(p);
149 eldbus_cbs_free_dispatch(&(proxy->cbs_free), proxy);
151 eina_hash_free(proxy->props);
156 _eldbus_proxy_free(Eldbus_Proxy *proxy)
159 Eldbus_Signal_Handler *h;
161 EINA_LIST_FREE(proxy->handlers, h)
164 eldbus_signal_handler_free_cb_del(h, _on_signal_handler_free, proxy);
166 ERR("proxy=%p alive handler=%p %s", proxy, h,
167 eldbus_signal_handler_match_get(h));
171 CRITICAL("Proxy %p released with live pending calls!", proxy);
173 for (i = 0; i < ELDBUS_PROXY_EVENT_LAST; i++)
175 Eldbus_Proxy_Context_Event *ce = proxy->event_handlers + i;
178 Eldbus_Proxy_Context_Event_Cb *ctx;
179 ctx = EINA_INLIST_CONTAINER_GET(ce->list,
180 Eldbus_Proxy_Context_Event_Cb);
181 _eldbus_proxy_context_event_cb_del(ce, ctx);
183 eina_list_free(ce->to_delete);
186 eina_stringshare_del(proxy->interface);
187 EINA_MAGIC_SET(proxy, EINA_MAGIC_NONE);
192 _on_object_free(void *data, const void *dead_pointer EINA_UNUSED)
194 Eldbus_Proxy *proxy = data;
195 ELDBUS_PROXY_CHECK(proxy);
196 DBG("proxy=%p, refcount=%d, interface=%s, obj=%p",
197 proxy, proxy->refcount, proxy->interface, proxy->obj);
198 eldbus_data_del_all(&(proxy->data));
199 _eldbus_proxy_clear(proxy);
200 _eldbus_proxy_free(proxy);
204 eldbus_proxy_get(Eldbus_Object *obj, const char *interface)
208 EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
209 EINA_SAFETY_ON_NULL_RETURN_VAL(interface, NULL);
211 proxy = eldbus_object_proxy_get(obj, interface);
213 return eldbus_proxy_ref(proxy);
215 proxy = calloc(1, sizeof(Eldbus_Proxy));
216 EINA_SAFETY_ON_NULL_RETURN_VAL(proxy, NULL);
220 proxy->interface = eina_stringshare_add(interface);
221 EINA_MAGIC_SET(proxy, ELDBUS_PROXY_MAGIC);
222 if (!eldbus_object_proxy_add(obj, proxy))
224 eldbus_object_free_cb_add(obj, _on_object_free, proxy);
229 eina_stringshare_del(proxy->interface);
234 static void _on_signal_handler_free(void *data, const void *dead_pointer);
237 _eldbus_proxy_unref(Eldbus_Proxy *proxy)
240 if (proxy->refcount > 0) return;
242 eldbus_object_free_cb_del(proxy->obj, _on_object_free, proxy);
243 eldbus_data_del_all(&(proxy->data));
244 _eldbus_proxy_clear(proxy);
245 _eldbus_proxy_free(proxy);
249 eldbus_proxy_ref(Eldbus_Proxy *proxy)
251 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
252 DBG("proxy=%p, pre-refcount=%d, interface=%s, obj=%p",
253 proxy, proxy->refcount, proxy->interface, proxy->obj);
259 eldbus_proxy_unref(Eldbus_Proxy *proxy)
261 ELDBUS_PROXY_CHECK(proxy);
262 DBG("proxy=%p, pre-refcount=%d, interface=%s, obj=%p",
263 proxy, proxy->refcount, proxy->interface, proxy->obj);
264 _eldbus_proxy_unref(proxy);
268 eldbus_proxy_free_cb_add(Eldbus_Proxy *proxy, Eldbus_Free_Cb cb, const void *data)
270 ELDBUS_PROXY_CHECK(proxy);
271 EINA_SAFETY_ON_NULL_RETURN(cb);
272 proxy->cbs_free = eldbus_cbs_free_add(proxy->cbs_free, cb, data);
276 eldbus_proxy_free_cb_del(Eldbus_Proxy *proxy, Eldbus_Free_Cb cb, const void *data)
278 ELDBUS_PROXY_CHECK(proxy);
279 EINA_SAFETY_ON_NULL_RETURN(cb);
280 proxy->cbs_free = eldbus_cbs_free_del(proxy->cbs_free, cb, data);
284 eldbus_proxy_data_set(Eldbus_Proxy *proxy, const char *key, const void *data)
286 ELDBUS_PROXY_CHECK(proxy);
287 EINA_SAFETY_ON_NULL_RETURN(key);
288 EINA_SAFETY_ON_NULL_RETURN(data);
289 eldbus_data_set(&(proxy->data), key, data);
293 eldbus_proxy_data_get(const Eldbus_Proxy *proxy, const char *key)
295 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
296 EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL);
297 return eldbus_data_get(&(((Eldbus_Proxy *)proxy)->data), key);
301 eldbus_proxy_data_del(Eldbus_Proxy *proxy, const char *key)
303 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
304 EINA_SAFETY_ON_NULL_RETURN_VAL(key, NULL);
305 return eldbus_data_del(&(((Eldbus_Proxy *)proxy)->data), key);
309 _property_changed_iter(void *data, const void *key, Eldbus_Message_Iter *var)
311 Eldbus_Proxy *proxy = data;
312 const char *skey = key;
313 Eina_Value *st_value, stack_value, *value;
314 Eldbus_Proxy_Event_Property_Changed event;
316 st_value = _message_iter_struct_to_eina_value(var);
317 eina_value_struct_value_get(st_value, "arg0", &stack_value);
319 value = eina_hash_find(proxy->props, skey);
322 eina_value_flush(value);
323 eina_value_copy(&stack_value, value);
327 value = calloc(1, sizeof(Eina_Value));
328 eina_value_copy(&stack_value, value);
329 eina_hash_add(proxy->props, skey, value);
335 _eldbus_proxy_event_callback_call(proxy, ELDBUS_PROXY_EVENT_PROPERTY_CHANGED,
337 eina_value_free(st_value);
338 eina_value_flush(&stack_value);
342 _properties_changed(void *data, const Eldbus_Message *msg)
344 Eldbus_Proxy *proxy = data;
345 Eldbus_Message_Iter *array, *invalidate;
347 const char *invalidate_prop;
349 if (!eldbus_message_arguments_get(msg, "sa{sv}as", &iface, &array, &invalidate))
351 ERR("Error getting data from properties changed signal.");
355 eldbus_message_iter_dict_iterate(array, "sv", _property_changed_iter,
358 while (eldbus_message_iter_get_and_next(invalidate, 's', &invalidate_prop))
360 Eldbus_Proxy_Event_Property_Removed event;
361 event.interface = proxy->interface;
362 event.name = invalidate_prop;
365 eina_hash_del(proxy->props, event.name, NULL);
366 _eldbus_proxy_event_callback_call(proxy, ELDBUS_PROXY_EVENT_PROPERTY_REMOVED,
372 _props_cache_free(void *data)
374 Eina_Value *value = data;
375 eina_value_free(value);
379 eldbus_proxy_event_callback_add(Eldbus_Proxy *proxy, Eldbus_Proxy_Event_Type type, Eldbus_Proxy_Event_Cb cb, const void *cb_data)
381 Eldbus_Proxy_Context_Event *ce;
382 Eldbus_Proxy_Context_Event_Cb *ctx;
384 ELDBUS_PROXY_CHECK(proxy);
385 EINA_SAFETY_ON_NULL_RETURN(cb);
386 EINA_SAFETY_ON_TRUE_RETURN(type >= ELDBUS_PROXY_EVENT_LAST);
388 ce = proxy->event_handlers + type;
390 ctx = calloc(1, sizeof(Eldbus_Proxy_Context_Event_Cb));
391 EINA_SAFETY_ON_NULL_RETURN(ctx);
393 ctx->cb_data = cb_data;
395 ce->list = eina_inlist_append(ce->list, EINA_INLIST_GET(ctx));
397 if (type == ELDBUS_PROXY_EVENT_PROPERTY_CHANGED)
399 if (proxy->properties_changed) return;
401 proxy->props = eina_hash_string_superfast_new(_props_cache_free);
402 proxy->properties_changed =
403 eldbus_proxy_properties_changed_callback_add(proxy,
407 else if (type == ELDBUS_PROXY_EVENT_PROPERTY_REMOVED)
409 if (proxy->properties_changed) return;
410 proxy->properties_changed =
411 eldbus_proxy_properties_changed_callback_add(proxy,
418 _eldbus_proxy_context_event_cb_del(Eldbus_Proxy_Context_Event *ce, Eldbus_Proxy_Context_Event_Cb *ctx)
420 ce->list = eina_inlist_remove(ce->list, EINA_INLIST_GET(ctx));
425 eldbus_proxy_event_callback_del(Eldbus_Proxy *proxy, Eldbus_Proxy_Event_Type type, Eldbus_Proxy_Event_Cb cb, const void *cb_data)
427 Eldbus_Proxy_Context_Event *ce;
428 Eldbus_Proxy_Context_Event_Cb *iter, *found = NULL;
430 ELDBUS_PROXY_CHECK(proxy);
431 EINA_SAFETY_ON_NULL_RETURN(cb);
432 EINA_SAFETY_ON_TRUE_RETURN(type >= ELDBUS_PROXY_EVENT_LAST);
434 ce = proxy->event_handlers + type;
436 EINA_INLIST_FOREACH(ce->list, iter)
438 if (cb != iter->cb) continue;
439 if ((cb_data) && (cb_data != iter->cb_data)) continue;
445 EINA_SAFETY_ON_NULL_RETURN(found);
446 EINA_SAFETY_ON_TRUE_RETURN(found->deleted);
450 found->deleted = EINA_TRUE;
451 ce->to_delete = eina_list_append(ce->to_delete, found);
455 _eldbus_proxy_context_event_cb_del(ce, found);
457 if (type == ELDBUS_PROXY_EVENT_PROPERTY_CHANGED)
459 Eldbus_Proxy_Context_Event *ce_prop_remove;
460 ce_prop_remove = proxy->event_handlers +
461 ELDBUS_PROXY_EVENT_PROPERTY_REMOVED;
462 if (!ce->list && !proxy->monitor_enabled)
464 eina_hash_free(proxy->props);
468 if (!ce_prop_remove->list && !ce->list && !proxy->monitor_enabled)
470 eldbus_signal_handler_unref(proxy->properties_changed);
471 proxy->properties_changed = NULL;
474 else if (type == ELDBUS_PROXY_EVENT_PROPERTY_REMOVED)
476 Eldbus_Proxy_Context_Event *ce_prop_changed;
477 ce_prop_changed = proxy->event_handlers +
478 ELDBUS_PROXY_EVENT_PROPERTY_CHANGED;
480 if (!ce_prop_changed->list && !ce->list && !proxy->monitor_enabled)
482 eldbus_signal_handler_unref(proxy->properties_changed);
483 proxy->properties_changed = NULL;
489 _eldbus_proxy_event_callback_call(Eldbus_Proxy *proxy, Eldbus_Proxy_Event_Type type, const void *event_info)
491 Eldbus_Proxy_Context_Event *ce;
492 Eldbus_Proxy_Context_Event_Cb *iter;
494 ce = proxy->event_handlers + type;
497 EINA_INLIST_FOREACH(ce->list, iter)
499 if (iter->deleted) continue;
500 iter->cb((void *)iter->cb_data, proxy, (void *)event_info);
503 if (ce->walking > 0) return;
505 EINA_LIST_FREE(ce->to_delete, iter)
506 _eldbus_proxy_context_event_cb_del(ce, iter);
510 eldbus_proxy_object_get(const Eldbus_Proxy *proxy)
512 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
517 eldbus_proxy_interface_get(const Eldbus_Proxy *proxy)
519 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
520 return proxy->interface;
524 _on_pending_free(void *data, const void *dead_pointer)
526 Eldbus_Proxy *proxy = data;
527 Eldbus_Pending *pending = (Eldbus_Pending *)dead_pointer;
528 ELDBUS_PROXY_CHECK(proxy);
529 proxy->pendings = eina_inlist_remove(proxy->pendings,
530 EINA_INLIST_GET(pending));
533 static Eldbus_Pending *
534 _eldbus_proxy_send(Eldbus_Proxy *proxy, Eldbus_Message *msg, Eldbus_Message_Cb cb, const void *cb_data, double timeout)
536 Eldbus_Pending *pending;
538 pending = _eldbus_connection_send(proxy->obj->conn, msg, cb, cb_data, timeout);
539 if (!cb) return NULL;
540 EINA_SAFETY_ON_NULL_RETURN_VAL(pending, NULL);
542 eldbus_pending_free_cb_add(pending, _on_pending_free, proxy);
543 proxy->pendings = eina_inlist_append(proxy->pendings,
544 EINA_INLIST_GET(pending));
549 EAPI Eldbus_Pending *
550 eldbus_proxy_send(Eldbus_Proxy *proxy, Eldbus_Message *msg, Eldbus_Message_Cb cb, const void *cb_data, double timeout)
552 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
553 EINA_SAFETY_ON_NULL_RETURN_VAL(msg, NULL);
555 return _eldbus_proxy_send(proxy, msg, cb, cb_data, timeout);
558 EAPI Eldbus_Message *
559 eldbus_proxy_method_call_new(Eldbus_Proxy *proxy, const char *member)
562 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
564 msg = eldbus_message_method_call_new(
565 eldbus_object_bus_name_get(proxy->obj),
566 eldbus_object_path_get(proxy->obj),
567 proxy->interface, member);
571 static Eldbus_Pending *
572 _eldbus_proxy_vcall(Eldbus_Proxy *proxy, const char *member, Eldbus_Message_Cb cb, const void *cb_data, double timeout, const char *signature, va_list ap)
574 Eldbus_Message *msg = eldbus_proxy_method_call_new(proxy, member);
575 EINA_SAFETY_ON_NULL_RETURN_VAL(msg, NULL);
577 if (!eldbus_message_arguments_vappend(msg, signature, ap))
579 eldbus_message_unref(msg);
580 ERR("Error setting arguments");
584 return _eldbus_proxy_send(proxy, msg, cb, cb_data, timeout);
587 EAPI Eldbus_Pending *
588 eldbus_proxy_call(Eldbus_Proxy *proxy, const char *member, Eldbus_Message_Cb cb, const void *cb_data, double timeout, const char *signature, ...)
590 Eldbus_Pending *pending;
593 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
594 EINA_SAFETY_ON_NULL_RETURN_VAL(member, NULL);
595 EINA_SAFETY_ON_NULL_RETURN_VAL(signature, NULL);
597 va_start(ap, signature);
598 pending = _eldbus_proxy_vcall(proxy, member, cb, cb_data, timeout,
605 EAPI Eldbus_Pending *
606 eldbus_proxy_vcall(Eldbus_Proxy *proxy, const char *member, Eldbus_Message_Cb cb, const void *cb_data, double timeout, const char *signature, va_list ap)
608 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
609 EINA_SAFETY_ON_NULL_RETURN_VAL(member, NULL);
610 EINA_SAFETY_ON_NULL_RETURN_VAL(signature, NULL);
612 return _eldbus_proxy_vcall(proxy, member, cb, cb_data, timeout,
617 _on_signal_handler_free(void *data, const void *dead_pointer)
619 Eldbus_Proxy *proxy = data;
620 ELDBUS_PROXY_CHECK(proxy);
621 proxy->handlers = eina_list_remove(proxy->handlers, dead_pointer);
624 EAPI Eldbus_Signal_Handler *
625 eldbus_proxy_signal_handler_add(Eldbus_Proxy *proxy, const char *member, Eldbus_Signal_Cb cb, const void *cb_data)
627 Eldbus_Signal_Handler *handler;
628 const char *name, *path;
630 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
631 EINA_SAFETY_ON_NULL_RETURN_VAL(cb, NULL);
633 name = eldbus_object_bus_name_get(proxy->obj);
634 path = eldbus_object_path_get(proxy->obj);
636 handler = _eldbus_signal_handler_add(proxy->obj->conn, name, path,
637 proxy->interface, member, cb, cb_data);
638 EINA_SAFETY_ON_NULL_RETURN_VAL(handler, NULL);
640 eldbus_signal_handler_free_cb_add(handler, _on_signal_handler_free, proxy);
641 proxy->handlers = eina_list_append(proxy->handlers, handler);
646 EAPI Eldbus_Pending *
647 eldbus_proxy_property_get(Eldbus_Proxy *proxy, const char *name, Eldbus_Message_Cb cb, const void *data)
649 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
650 EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
651 return eldbus_proxy_call(proxy->obj->properties, "Get", cb, data, -1,
652 "ss", proxy->interface, name);
655 EAPI Eldbus_Pending *
656 eldbus_proxy_property_set(Eldbus_Proxy *proxy, const char *name, const char *sig, const void *value, Eldbus_Message_Cb cb, const void *data)
659 Eldbus_Message_Iter *iter, *variant;
661 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
662 EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
663 EINA_SAFETY_ON_NULL_RETURN_VAL(sig, NULL);
664 EINA_SAFETY_ON_FALSE_RETURN_VAL(dbus_signature_validate_single(sig, NULL), NULL);
665 EINA_SAFETY_ON_NULL_RETURN_VAL(value, NULL);
667 msg = eldbus_proxy_method_call_new(proxy->obj->properties, "Set");
668 iter = eldbus_message_iter_get(msg);
669 eldbus_message_iter_basic_append(iter, 's', proxy->interface);
670 eldbus_message_iter_basic_append(iter, 's', name);
671 variant = eldbus_message_iter_container_new(iter, 'v', sig);
672 if (dbus_type_is_basic(sig[0]))
673 dbus_message_iter_append_basic(&variant->dbus_iterator, sig[0], &value);
676 if (!_message_iter_from_eina_value_struct(sig, variant, value))
678 eldbus_message_unref(msg);
682 eldbus_message_iter_container_close(iter, variant);
684 return eldbus_proxy_send(proxy->obj->properties, msg, cb, data, -1);
687 EAPI Eldbus_Pending *
688 eldbus_proxy_property_get_all(Eldbus_Proxy *proxy, Eldbus_Message_Cb cb, const void *data)
690 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
691 return eldbus_proxy_call(proxy->obj->properties, "GetAll", cb, data, -1,
692 "s", proxy->interface);
695 EAPI Eldbus_Signal_Handler *
696 eldbus_proxy_properties_changed_callback_add(Eldbus_Proxy *proxy, Eldbus_Signal_Cb cb, const void *data)
698 Eldbus_Signal_Handler *sh;
699 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
700 sh = eldbus_proxy_signal_handler_add(proxy->obj->properties,
701 "PropertiesChanged", cb, data);
702 EINA_SAFETY_ON_NULL_RETURN_VAL(sh, NULL);
703 eldbus_signal_handler_match_extra_set(sh, "arg0", proxy->interface, NULL);
708 _property_iter(void *data, const void *key, Eldbus_Message_Iter *var)
710 Eldbus_Proxy *proxy = data;
711 const char *skey = key;
712 Eina_Value *st_value, stack_value, *value;
714 st_value = _message_iter_struct_to_eina_value(var);
715 eina_value_struct_value_get(st_value, "arg0", &stack_value);
717 value = eina_hash_find(proxy->props, skey);
720 value = eina_value_new(eina_value_type_get(&stack_value));
721 eina_hash_add(proxy->props, skey, value);
723 eina_value_flush(value);
724 eina_value_copy(&stack_value, value);
726 eina_value_free(st_value);
727 eina_value_flush(&stack_value);
731 _props_get_all(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
733 Eldbus_Proxy *proxy = data;
734 Eldbus_Message_Iter *dict;
735 const char *name, *error_msg;
737 if (eldbus_message_error_get(msg, &name, &error_msg))
739 ERR("Error getting all properties of %s %s, error message: %s %s",
740 proxy->obj->name, proxy->obj->path, name, error_msg);
744 if (!eldbus_message_arguments_get(msg, "a{sv}", &dict))
748 if (eldbus_message_arguments_get(msg, "s", &txt))
749 ERR("Error getting data from properties getAll: %s", txt);
752 eldbus_message_iter_dict_iterate(dict, "sv", _property_iter, proxy);
756 eldbus_proxy_properties_monitor(Eldbus_Proxy *proxy, Eina_Bool enable)
758 ELDBUS_PROXY_CHECK(proxy);
759 if (proxy->monitor_enabled == enable)
762 proxy->monitor_enabled = enable;
766 proxy->props = eina_hash_string_superfast_new(_props_cache_free);
767 eldbus_proxy_property_get_all(proxy, _props_get_all, proxy);
769 if (proxy->properties_changed)
771 proxy->properties_changed =
772 eldbus_proxy_properties_changed_callback_add(proxy,
778 Eldbus_Proxy_Context_Event *ce_prop_changed, *ce_prop_removed;
779 ce_prop_changed = proxy->event_handlers + ELDBUS_PROXY_EVENT_PROPERTY_CHANGED;
780 ce_prop_removed = proxy->event_handlers + ELDBUS_PROXY_EVENT_PROPERTY_REMOVED;
782 if (!ce_prop_changed->list)
784 eina_hash_free(proxy->props);
787 if (!ce_prop_changed->list && !ce_prop_removed->list)
789 eldbus_signal_handler_unref(proxy->properties_changed);
790 proxy->properties_changed = NULL;
796 eldbus_proxy_property_local_get(Eldbus_Proxy *proxy, const char *name)
798 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
799 EINA_SAFETY_ON_NULL_RETURN_VAL(name, NULL);
800 EINA_SAFETY_ON_NULL_RETURN_VAL(proxy->props, NULL);
801 return eina_hash_find(proxy->props, name);
804 EAPI const Eina_Hash *
805 eldbus_proxy_property_local_get_all(Eldbus_Proxy *proxy)
807 ELDBUS_PROXY_CHECK_RETVAL(proxy, NULL);
808 EINA_SAFETY_ON_NULL_RETURN_VAL(proxy->props, NULL);