summaryrefslogtreecommitdiffstats
path: root/src/afb-xreq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/afb-xreq.c')
-rw-r--r--src/afb-xreq.c220
1 files changed, 164 insertions, 56 deletions
diff --git a/src/afb-xreq.c b/src/afb-xreq.c
index 87e01559..95d089ab 100644
--- a/src/afb-xreq.c
+++ b/src/afb-xreq.c
@@ -30,64 +30,10 @@
#include "afb-evt.h"
#include "afb-msg-json.h"
#include "afb-subcall.h"
+#include "afb-hook.h"
#include "verbose.h"
-static struct json_object *xreq_json_cb(void *closure);
-static struct afb_arg xreq_get_cb(void *closure, const char *name);
-
-static void xreq_success_cb(void *closure, struct json_object *obj, const char *info);
-static void xreq_fail_cb(void *closure, const char *status, const char *info);
-
-static const char *xreq_raw_cb(void *closure, size_t *size);
-static void xreq_send_cb(void *closure, const char *buffer, size_t size);
-
-static void *xreq_context_get_cb(void *closure);
-static void xreq_context_set_cb(void *closure, void *value, void (*free_value)(void*));
-
-static void xreq_addref_cb(void *closure);
-static void xreq_unref_cb(void *closure);
-
-static void xreq_session_close_cb(void *closure);
-static int xreq_session_set_LOA_cb(void *closure, unsigned level);
-
-static int xreq_subscribe_cb(void *closure, struct afb_event event);
-static int xreq_unsubscribe_cb(void *closure, struct afb_event event);
-
-static void xreq_subcall_cb(
- void *closure,
- const char *api,
- const char *verb,
- struct json_object *args,
- void (*callback)(void*, int, struct json_object*),
- void *cb_closure);
-
-static int xreq_subcallsync_cb(
- void *closure,
- const char *api,
- const char *verb,
- struct json_object *args,
- struct json_object **result);
-
-const struct afb_req_itf xreq_itf = {
- .json = xreq_json_cb,
- .get = xreq_get_cb,
- .success = xreq_success_cb,
- .fail = xreq_fail_cb,
- .raw = xreq_raw_cb,
- .send = xreq_send_cb,
- .context_get = xreq_context_get_cb,
- .context_set = xreq_context_set_cb,
- .addref = xreq_addref_cb,
- .unref = xreq_unref_cb,
- .session_close = xreq_session_close_cb,
- .session_set_LOA = xreq_session_set_LOA_cb,
- .subscribe = xreq_subscribe_cb,
- .unsubscribe = xreq_unsubscribe_cb,
- .subcall = xreq_subcall_cb,
- .subcallsync = xreq_subcallsync_cb
-};
-
static struct json_object *xreq_json_cb(void *closure)
{
struct afb_xreq *xreq = closure;
@@ -268,6 +214,160 @@ static int xreq_subcallsync_cb(void *closure, const char *api, const char *verb,
return afb_subcall_sync(xreq, api, verb, args, result);
}
+static struct json_object *xreq_hooked_json_cb(void *closure)
+{
+ struct json_object *r = xreq_json_cb(closure);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_json(xreq, r);
+}
+
+static struct afb_arg xreq_hooked_get_cb(void *closure, const char *name)
+{
+ struct afb_arg r = xreq_get_cb(closure, name);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_get(xreq, name, r);
+}
+
+static void xreq_hooked_success_cb(void *closure, struct json_object *obj, const char *info)
+{
+ struct afb_xreq *xreq = closure;
+ afb_hook_xreq_success(xreq, obj, info);
+ xreq_success_cb(closure, obj, info);
+}
+
+static void xreq_hooked_fail_cb(void *closure, const char *status, const char *info)
+{
+ struct afb_xreq *xreq = closure;
+ afb_hook_xreq_fail(xreq, status, info);
+ xreq_fail_cb(closure, status, info);
+}
+
+static const char *xreq_hooked_raw_cb(void *closure, size_t *size)
+{
+ size_t s;
+ const char *r = xreq_raw_cb(closure, size ? : &s);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_raw(xreq, r, *(size ? : &s));
+}
+
+static void xreq_hooked_send_cb(void *closure, const char *buffer, size_t size)
+{
+ struct afb_xreq *xreq = closure;
+ afb_hook_xreq_send(xreq, buffer, size);
+ xreq_send_cb(closure, buffer, size);
+}
+
+static void *xreq_hooked_context_get_cb(void *closure)
+{
+ void *r = xreq_context_get_cb(closure);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_context_get(xreq, r);
+}
+
+static void xreq_hooked_context_set_cb(void *closure, void *value, void (*free_value)(void*))
+{
+ struct afb_xreq *xreq = closure;
+ afb_hook_xreq_context_set(xreq, value, free_value);
+ xreq_context_set_cb(closure, value, free_value);
+}
+
+static void xreq_hooked_addref_cb(void *closure)
+{
+ struct afb_xreq *xreq = closure;
+ afb_hook_xreq_addref(xreq);
+ xreq_addref_cb(closure);
+}
+/*
+static void xreq_hooked_unref_cb(void *closure)
+{
+ TODO
+}
+*/
+static void xreq_hooked_session_close_cb(void *closure)
+{
+ struct afb_xreq *xreq = closure;
+ afb_hook_xreq_session_close(xreq);
+ xreq_session_close_cb(closure);
+}
+
+static int xreq_hooked_session_set_LOA_cb(void *closure, unsigned level)
+{
+ int r = xreq_session_set_LOA_cb(closure, level);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_session_set_LOA(xreq, level, r);
+}
+
+static int xreq_hooked_subscribe_cb(void *closure, struct afb_event event)
+{
+ int r = xreq_subscribe_cb(closure, event);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_subscribe(xreq, event, r);
+}
+
+static int xreq_hooked_unsubscribe_cb(void *closure, struct afb_event event)
+{
+ int r = xreq_unsubscribe_cb(closure, event);
+ struct afb_xreq *xreq = closure;
+ return afb_hook_xreq_unsubscribe(xreq, event, r);
+}
+
+/*
+static void xreq_hooked_subcall_cb(void *closure, const char *api, const char *verb, struct json_object *args, void (*callback)(void*, int, struct json_object*), void *cb_closure)
+{
+ struct afb_xreq *xreq = closure;
+
+ afb_xreq_subcall(xreq, api, verb, args, callback, cb_closure);
+}
+
+static int xreq_hooked_subcallsync_cb(void *closure, const char *api, const char *verb, struct json_object *args, struct json_object **result)
+{
+ struct afb_xreq *xreq = closure;
+ return afb_subcall_sync(xreq, api, verb, args, result);
+}
+*/
+const struct afb_req_itf xreq_itf = {
+ .json = xreq_json_cb,
+ .get = xreq_get_cb,
+ .success = xreq_success_cb,
+ .fail = xreq_fail_cb,
+ .raw = xreq_raw_cb,
+ .send = xreq_send_cb,
+ .context_get = xreq_context_get_cb,
+ .context_set = xreq_context_set_cb,
+ .addref = xreq_addref_cb,
+ .unref = xreq_unref_cb,
+ .session_close = xreq_session_close_cb,
+ .session_set_LOA = xreq_session_set_LOA_cb,
+ .subscribe = xreq_subscribe_cb,
+ .unsubscribe = xreq_unsubscribe_cb,
+ .subcall = xreq_subcall_cb,
+ .subcallsync = xreq_subcallsync_cb
+};
+
+const struct afb_req_itf xreq_hooked_itf = {
+ .json = xreq_hooked_json_cb,
+ .get = xreq_hooked_get_cb,
+ .success = xreq_hooked_success_cb,
+ .fail = xreq_hooked_fail_cb,
+ .raw = xreq_hooked_raw_cb,
+ .send = xreq_hooked_send_cb,
+ .context_get = xreq_hooked_context_get_cb,
+ .context_set = xreq_hooked_context_set_cb,
+ .addref = xreq_hooked_addref_cb,
+.unref = xreq_unref_cb,
+ .session_close = xreq_hooked_session_close_cb,
+ .session_set_LOA = xreq_hooked_session_set_LOA_cb,
+ .subscribe = xreq_hooked_subscribe_cb,
+ .unsubscribe = xreq_hooked_unsubscribe_cb,
+.subcall = xreq_subcall_cb,
+.subcallsync = xreq_subcallsync_cb
+};
+
+static inline struct afb_req to_req(struct afb_xreq *xreq)
+{
+ return (struct afb_req){ .itf = xreq->hookflags ? &xreq_hooked_itf : &xreq_itf, .closure = xreq };
+}
+
void afb_xreq_success_f(struct afb_xreq *xreq, struct json_object *obj, const char *info, ...)
{
char *message;
@@ -340,6 +440,14 @@ static int xcheck(struct afb_xreq *xreq, int sessionflags)
void afb_xreq_call(struct afb_xreq *xreq, int sessionflags, void (*method)(struct afb_req req))
{
if (xcheck(xreq, sessionflags))
- method((struct afb_req){ .itf = &xreq_itf, .closure = xreq });
+ method(to_req(xreq));
}
+void afb_xreq_begin(struct afb_xreq *xreq)
+{
+ afb_hook_init_xreq(xreq);
+ if (xreq->hookflags)
+ afb_hook_xreq_begin(xreq);
+}
+
+