+#if WITH_LEGACY_BINDING_V1 || WITH_LEGACY_BINDING_V2
+struct afb_event_x1 afb_evt_event_from_evtid(struct afb_evtid *evtid)
+{
+ return evtid
+#if WITH_AFB_HOOK
+ ? (struct afb_event_x1){ .itf = &afb_evt_hooked_event_x2_itf, .closure = &evtid->eventid }
+#else
+ ? (struct afb_event_x1){ .itf = &afb_evt_event_x2_itf, .closure = &evtid->eventid }
+#endif
+ : (struct afb_event_x1){ .itf = NULL, .closure = NULL };
+}
+#endif
+
+void afb_evt_event_x2_unref(struct afb_event_x2 *eventid)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+ if (evtid)
+ afb_evt_evtid_unref(evtid);
+}
+
+struct afb_event_x2 *afb_evt_event_x2_addref(struct afb_event_x2 *eventid)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+ if (evtid)
+ afb_evt_evtid_addref(evtid);
+ return eventid;
+}
+
+#if WITH_AFB_HOOK
+/*
+ * Pushes the event 'evtid' with 'obj' to its listeners
+ * 'obj' is released (like json_object_put)
+ * Emits calls to hooks.
+ * Returns the count of listener taht received the event.
+ */
+int afb_evt_evtid_hooked_push(struct afb_evtid *evtid, struct json_object *obj)
+{
+
+ int result;
+
+ /* lease the object */
+ json_object_get(obj);
+
+ /* hook before push */
+ if (evtid->hookflags & afb_hook_flag_evt_push_before)
+ afb_hook_evt_push_before(evtid->fullname, evtid->id, obj);
+
+ /* push */
+ result = afb_evt_evtid_push(evtid, obj);
+
+ /* hook after push */
+ if (evtid->hookflags & afb_hook_flag_evt_push_after)
+ afb_hook_evt_push_after(evtid->fullname, evtid->id, obj, result);
+
+ /* release the object */
+ json_object_put(obj);
+ return result;
+}
+
+/*
+ * increment the reference count of the event 'evtid'
+ */
+struct afb_evtid *afb_evt_evtid_hooked_addref(struct afb_evtid *evtid)
+{
+ if (evtid->hookflags & afb_hook_flag_evt_addref)
+ afb_hook_evt_addref(evtid->fullname, evtid->id);
+ return afb_evt_evtid_addref(evtid);
+}
+
+/*
+ * decrement the reference count of the event 'evtid'
+ * and destroy it when the count reachs zero
+ */
+void afb_evt_evtid_hooked_unref(struct afb_evtid *evtid)
+{
+ if (evtid->hookflags & afb_hook_flag_evt_unref)
+ afb_hook_evt_unref(evtid->fullname, evtid->id);
+ afb_evt_evtid_unref(evtid);
+}
+
+/*
+ * Returns the name associated to the event 'evtid'.
+ */
+const char *afb_evt_evtid_hooked_name(struct afb_evtid *evtid)
+{
+ const char *result = afb_evt_evtid_name(evtid);
+ if (evtid->hookflags & afb_hook_flag_evt_name)
+ afb_hook_evt_name(evtid->fullname, evtid->id, result);
+ return result;
+}
+
+/*
+ * update the hooks for events
+ */
+void afb_evt_update_hooks()
+{
+ struct afb_evtid *evtid;
+
+ pthread_rwlock_rdlock(&events_rwlock);
+ for (evtid = evtids ; evtid ; evtid = evtid->next) {
+ evtid->hookflags = afb_hook_flags_evt(evtid->fullname);
+ evtid->eventid.itf = evtid->hookflags ? &afb_evt_hooked_event_x2_itf : &afb_evt_event_x2_itf;
+ }
+ pthread_rwlock_unlock(&events_rwlock);
+}
+#endif