+/*
+ * 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_eventid_itf : &afb_evt_event_x2_itf;
+ }
+ pthread_rwlock_unlock(&events_rwlock);
+}
+
+inline struct afb_evtid *afb_evt_event_x2_to_evtid(struct afb_event_x2 *eventid)
+{
+ return (struct afb_evtid*)eventid;
+}
+
+inline struct afb_event_x2 *afb_evt_event_x2_from_evtid(struct afb_evtid *evtid)
+{
+ return &evtid->eventid;
+}
+
+/*
+ * Creates an event of 'fullname' and returns it.
+ * Returns an event with closure==NULL in case of error.
+ */
+struct afb_event_x2 *afb_evt_event_x2_create(const char *fullname)
+{
+ return afb_evt_event_x2_from_evtid(afb_evt_evtid_create(fullname));
+}
+
+/*
+ * Creates an event of name 'prefix'/'name' and returns it.
+ * Returns an event with closure==NULL in case of error.
+ */
+struct afb_event_x2 *afb_evt_event_x2_create2(const char *prefix, const char *name)
+{
+ return afb_evt_event_x2_from_evtid(afb_evt_evtid_create2(prefix, name));
+}
+
+/*
+ * Returns the fullname of the 'eventid'
+ */
+const char *afb_evt_event_x2_fullname(struct afb_event_x2 *eventid)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+ return evtid ? evtid->fullname : NULL;
+}
+
+/*
+ * Returns the id of the 'eventid'
+ */
+int afb_evt_event_x2_id(struct afb_event_x2 *eventid)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+ return evtid ? evtid->id : 0;
+}
+
+/*
+ * Makes the 'listener' watching 'eventid'
+ * Returns 0 in case of success or else -1.
+ */
+int afb_evt_event_x2_add_watch(struct afb_evt_listener *listener, struct afb_event_x2 *eventid)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+
+ /* check parameter */
+ if (!evtid) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* search the existing watch for the listener */
+ return afb_evt_watch_add_evtid(listener, evtid);
+}
+
+/*
+ * Avoids the 'listener' to watch 'eventid'
+ * Returns 0 in case of success or else -1.
+ */
+int afb_evt_event_x2_remove_watch(struct afb_evt_listener *listener, struct afb_event_x2 *eventid)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+
+ /* check parameter */
+ if (!evtid) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* search the existing watch */
+ return afb_evt_watch_sub_evtid(listener, evtid);
+}
+
+int afb_evt_event_x2_push(struct afb_event_x2 *eventid, struct json_object *object)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+ if (evtid)
+ return afb_evt_evtid_hooked_push(evtid, object);
+ json_object_put(object);
+ return 0;
+}
+
+int afb_evt_event_x2_unhooked_push(struct afb_event_x2 *eventid, struct json_object *object)
+{
+ struct afb_evtid *evtid = afb_evt_event_x2_to_evtid(eventid);
+ if (evtid)
+ return afb_evt_evtid_push(evtid, object);
+ json_object_put(object);
+ return 0;
+}
+
+struct afb_event_x1 afb_evt_event_from_evtid(struct afb_evtid *evtid)
+{
+ return evtid
+ ? (struct afb_event_x1){ .itf = &afb_evt_hooked_eventid_itf, .closure = &evtid->eventid }
+ : (struct afb_event_x1){ .itf = NULL, .closure = NULL };
+}
+
+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;
+}
+