diff --git a/lib/c/labcomm.h b/lib/c/labcomm.h index b543e9861527e3a3263883dd28f48b3d19f9e194..d3e177fb23a5fb669b401a20fc7398d2eaa10bd9 100644 --- a/lib/c/labcomm.h +++ b/lib/c/labcomm.h @@ -117,7 +117,7 @@ void labcomm_decoder_free( struct labcomm_decoder *decoder); int labcomm_decoder_decode_one( struct labcomm_decoder *decoder); -void labcomm_decoder_run( +int labcomm_decoder_run( struct labcomm_decoder *decoder); /* See labcomm_ioctl.h for predefined ioctl_action values */ @@ -137,12 +137,12 @@ struct labcomm_pragma_handler { int foo; }; -typedef int (*labcomm_handle_pragma_callback)( +typedef int (*labcomm_pragma_handler_callback)( struct labcomm_decoder *decoder, char *pragma_type); void labcomm_decoder_register_pragma_handler(struct labcomm_decoder *d, - labcomm_handle_pragma_callback pragma_dispatcher); + labcomm_pragma_handler_callback pragma_dispatcher); /* * Encoder diff --git a/lib/c/labcomm_decoder.c b/lib/c/labcomm_decoder.c index c6ae216f698d296f16c7ccee1e55188f466131ab..38fb6bf7ed90a22763caacb63e832c709e9f6763 100644 --- a/lib/c/labcomm_decoder.c +++ b/lib/c/labcomm_decoder.c @@ -35,6 +35,17 @@ struct sample_entry { void *context; }; +//XXX move to pragma.ch +//int default_pragma_handler(struct labcomm_decoder *d, char *pragma_type); +int default_pragma_handler(struct labcomm_decoder *d, char *pragma_type) +{ + printf("Default pragma handler got pragma: %s\n", pragma_type); + int res = labcomm_decoder_run(d); + printf("... %d:%s\n",res,strerror(-res)); + return LABCOMM_PRAGMA; +} + + struct labcomm_decoder { struct labcomm_reader *reader; int reader_allocated; @@ -46,6 +57,7 @@ struct labcomm_decoder { labcomm_handle_new_datatype_callback on_new_datatype; LABCOMM_SIGNATURE_ARRAY_DEF(local, struct sample_entry); LABCOMM_SIGNATURE_ARRAY_DEF(remote_to_local, int); + labcomm_pragma_handler_callback pragma_handler; }; struct labcomm_decoder *labcomm_decoder_new( @@ -73,6 +85,7 @@ struct labcomm_decoder *labcomm_decoder_new( result->on_error = on_error_fprintf; LABCOMM_SIGNATURE_ARRAY_INIT(result->local, struct sample_entry); LABCOMM_SIGNATURE_ARRAY_INIT(result->remote_to_local, int); + result->pragma_handler = default_pragma_handler; } return result; } @@ -253,8 +266,7 @@ static int decode_pragma(struct labcomm_decoder *d, int len) } int bytes = labcomm_size_string(pragma_type); int psize = len-bytes; - printf("got pragma: %s\n", pragma_type); - if(0 /*d->pragma_handler*/) { + if(d->pragma_handler) { //read the entire packet to a buffer and then run // decode on that through a bytearray_reader. // (to easily handle multiple labcomm packets in one metadata packet) @@ -267,18 +279,19 @@ static int decode_pragma(struct labcomm_decoder *d, int len) goto out; } } - printf("read %d bytes\n", psize); + //printf("read %d bytes\n", psize); //TODO: add wrapped decoders, and create pragma decoder that does not // expect a version packet struct labcomm_reader *pr = labcomm_bytearray_reader_new( d->reader->memory, pragma_data, psize); struct labcomm_decoder *pd = labcomm_decoder_new( pr, d->error, d->memory, d->scheduler); - /* d->prama_handler(pd, ptype, plen); */ - labcomm_decoder_run(pd); + pd->version_ok = 1; + printf("calling pragma_handler\n"); + result = d->pragma_handler(pd, pragma_type); + printf("returned from pragma_handler\n"); internal_labcomm_decoder_free(pd); - result = 0; } else { result = decoder_skip(d, psize, LABCOMM_PRAGMA); } @@ -356,10 +369,12 @@ out: return result; } -void labcomm_decoder_run(struct labcomm_decoder *d) +int labcomm_decoder_run(struct labcomm_decoder *d) { - while (labcomm_decoder_decode_one(d) > 0) { + int res; + while ( (res=labcomm_decoder_decode_one(d)) > 0) { } + return res; } int labcomm_decoder_ioctl(struct labcomm_decoder *d,