diff options
author | hattenberger | 2013-03-27 13:17:19 +0000 |
---|---|---|
committer | hattenberger | 2013-03-27 13:17:19 +0000 |
commit | a17272283c803e13258e5dc6b19533c672ceee18 (patch) | |
tree | 0fa7737e21fe1147c860a84b18676cd99a80fdb1 /trunk/civy.c | |
parent | 003d66dc1fabc063372e4f03265935d0ccaefd78 (diff) | |
download | ivy-ocaml-a17272283c803e13258e5dc6b19533c672ceee18.zip ivy-ocaml-a17272283c803e13258e5dc6b19533c672ceee18.tar.gz ivy-ocaml-a17272283c803e13258e5dc6b19533c672ceee18.tar.bz2 ivy-ocaml-a17272283c803e13258e5dc6b19533c672ceee18.tar.xz |
some fixes in ivy-ocaml tag 1.2
Diffstat (limited to 'trunk/civy.c')
-rw-r--r-- | trunk/civy.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/trunk/civy.c b/trunk/civy.c new file mode 100644 index 0000000..563f7ec --- /dev/null +++ b/trunk/civy.c @@ -0,0 +1,93 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <getopt.h> +#include <Ivy/ivy.h> +#include <Ivy/ivyloop.h> +#include <Ivy/timer.h> +#include <caml/mlvalues.h> +#include <caml/fail.h> +#include <caml/callback.h> +#include <caml/memory.h> +#include <caml/alloc.h> + +value ivy_sendMsg(value msg) +{ + IvySendMsg(String_val(msg)); + return Val_unit; +} + +value ivy_stop(value unit) +{ + IvyStop (); + return Val_unit; +} + + +void app_cb(IvyClientPtr app, void *user_data, IvyApplicationEvent event ) +{ + value closure = *(value*)user_data; + callback2(closure, Val_int(app), Val_int(event)); +} + +value ivy_init(value vappName, value vready, value closure_name) +{ + value * closure = caml_named_value(String_val(closure_name)); + char * appName = malloc(strlen(String_val(vappName))+1); /* Memory leak */ + strcpy(appName, String_val(vappName)); + char * ready = malloc(strlen(String_val(vready))+1); /* Memory leak */ + strcpy(ready, String_val(vready)); + IvyInit(appName, ready, app_cb, (void*)closure, 0, 0); /* When the "die callback" is called ??? */ + return Val_unit; +} + +value ivy_start(value bus) +{ + IvyStart(String_val(bus)); + return Val_unit; +} + +void ClosureCallback(IvyClientPtr app, void *closure, int argc, char **argv) +{ + char* t[argc+1]; + int i; + /* Copie de argv dans t avec ajout d'un pointeur nul a la fin */ + for(i=0; i < argc; i++) t[i] = argv[i]; + t[argc] = (char*)0L; + callback2(*(value*)closure, Val_long(app), copy_string_array((char const **)t)); +} + +value ivy_bindMsg(value cb_name, value regexp) +{ + value * closure = caml_named_value(String_val(cb_name)); + MsgRcvPtr id = IvyBindMsg(ClosureCallback, (void*)closure, String_val(regexp)); + return Val_long(id); +} + +value ivy_unbindMsg(value id) +{ + IvyUnbindMsg((MsgRcvPtr)Long_val(id)); + return Val_unit; +} + +value ivy_name_of_client(value c) +{ + return copy_string(IvyGetApplicationName((IvyClientPtr)Long_val(c))); +} +value ivy_host_of_client(value c) +{ + return copy_string(IvyGetApplicationHost((IvyClientPtr)Long_val(c))); +} + +void cb_delete_channel(void *delete_read) +{ +} + +void cb_write_channel(Channel ch, IVY_HANDLE fd, void *closure) +{ +} + +void cb_read_channel(Channel ch, IVY_HANDLE fd, void *closure) +{ + callback(*(value*)closure, Val_int(ch)); +} |