Repository: incubator-mynewt-core Updated Branches: refs/heads/develop 566a80030 -> 53a2ce067
refactor oicmgr to use cbor encoding without encapsulation Project: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/commit/53a2ce06 Tree: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/tree/53a2ce06 Diff: http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/diff/53a2ce06 Branch: refs/heads/develop Commit: 53a2ce067cd2ed5e40cc7ccfe580f3c2d0306236 Parents: 566a800 Author: Paul Dietrich <paulfdietr...@yahoo.com> Authored: Thu Oct 13 15:42:04 2016 -0700 Committer: Paul Dietrich <paulfdietr...@yahoo.com> Committed: Thu Oct 13 15:42:27 2016 -0700 ---------------------------------------------------------------------- .../tinycbor/include/tinycbor/cbor_cnt_writer.h | 4 +- mgmt/imgmgr/src/imgmgr_priv.h | 1 - mgmt/newtmgr/src/newtmgr.c | 30 +-- mgmt/oicmgr/src/oicmgr.c | 189 +++++-------------- net/oic/src/api/oc_rep.c | 2 +- 5 files changed, 46 insertions(+), 180 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/53a2ce06/encoding/tinycbor/include/tinycbor/cbor_cnt_writer.h ---------------------------------------------------------------------- diff --git a/encoding/tinycbor/include/tinycbor/cbor_cnt_writer.h b/encoding/tinycbor/include/tinycbor/cbor_cnt_writer.h index deb8f89..9c84eb4 100644 --- a/encoding/tinycbor/include/tinycbor/cbor_cnt_writer.h +++ b/encoding/tinycbor/include/tinycbor/cbor_cnt_writer.h @@ -37,14 +37,14 @@ struct CborCntWriter { struct cbor_encoder_writer enc; }; -inline int +static inline int cbor_cnt_writer(struct cbor_encoder_writer *arg, const char *data, int len) { struct CborCntWriter *cb = (struct CborCntWriter *) arg; cb->enc.bytes_written += len; return CborNoError; } -inline void +static inline void cbor_cnt_writer_init(struct CborCntWriter *cb) { cb->enc.bytes_written = 0; cb->enc.write = &cbor_cnt_writer; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/53a2ce06/mgmt/imgmgr/src/imgmgr_priv.h ---------------------------------------------------------------------- diff --git a/mgmt/imgmgr/src/imgmgr_priv.h b/mgmt/imgmgr/src/imgmgr_priv.h index 1c31ad5..d7f39ff 100644 --- a/mgmt/imgmgr/src/imgmgr_priv.h +++ b/mgmt/imgmgr/src/imgmgr_priv.h @@ -83,7 +83,6 @@ struct imgmgr_upload_cmd { * } */ -struct mgmt_jbuf; struct nmgr_hdr; struct os_mbuf; struct fs_file; http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/53a2ce06/mgmt/newtmgr/src/newtmgr.c ---------------------------------------------------------------------- diff --git a/mgmt/newtmgr/src/newtmgr.c b/mgmt/newtmgr/src/newtmgr.c index ffecd4f..c248c77 100644 --- a/mgmt/newtmgr/src/newtmgr.c +++ b/mgmt/newtmgr/src/newtmgr.c @@ -48,34 +48,8 @@ static struct nmgr_cbuf { struct CborMbufWriter writer; struct CborMbufReader reader; struct os_mbuf *n_out_m; - -#if 0 - struct os_mbuf *n_in_m; - struct nmgr_hdr *n_hdr; - uint16_t n_off; - uint16_t n_end; -#endif } nmgr_task_cbuf; -#if 0 -static int -nmgr_rsp_extend(struct nmgr_hdr *hdr, struct os_mbuf *rsp, void *data, - uint16_t len) -{ - int rc; - - rc = os_mbuf_append(rsp, data, len); - if (rc != 0) { - goto err; - } - hdr->nh_len += len; - - return (0); -err: - return (rc); -} -#endif - static int nmgr_cbuf_init(struct nmgr_cbuf *njb) { @@ -116,9 +90,7 @@ nmgr_send_err_rsp(struct nmgr_transport *nt, struct os_mbuf *m, if (!hdr) { return; } -#if 0 - mgmt_jbuf_setoerr(&nmgr_task_jbuf.n_b, rc); -#endif + mgmt_cbuf_setoerr(&nmgr_task_cbuf.n_b, rc); hdr->nh_len = htons(hdr->nh_len); hdr->nh_flags = NMGR_F_CBOR_RSP_COMPLETE; nt->nt_output(nt, nmgr_task_cbuf.n_out_m); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/53a2ce06/mgmt/oicmgr/src/oicmgr.c ---------------------------------------------------------------------- diff --git a/mgmt/oicmgr/src/oicmgr.c b/mgmt/oicmgr/src/oicmgr.c index 4fde423..8d10ce1 100644 --- a/mgmt/oicmgr/src/oicmgr.c +++ b/mgmt/oicmgr/src/oicmgr.c @@ -29,20 +29,19 @@ #include <mgmt/mgmt.h> #include <nmgr_os/nmgr_os.h> +#include <cborattr/cborattr.h> +#include <tinycbor/cbor.h> +#include <tinycbor/cbor_buf_writer.h> +#include <tinycbor/cbor_buf_reader.h> #include <oic/oc_api.h> #define OMGR_OC_EVENT (OS_EVENT_T_PERUSER) #define OMGR_OC_TIMER (OS_EVENT_T_PERUSER + 1) #define OICMGR_STACK_SZ OS_STACK_ALIGN(MYNEWT_VAL(OICMGR_STACK_SIZE)) -struct omgr_jbuf { - struct mgmt_jbuf ob_mj; - char *ob_in; - uint16_t ob_in_off; - uint16_t ob_in_end; - char *ob_out; - uint16_t ob_out_off; - uint16_t ob_out_end; +struct omgr_cbuf { + struct mgmt_cbuf ob_mj; + struct cbor_buf_reader ob_reader; }; struct omgr_state { @@ -50,8 +49,7 @@ struct omgr_state { struct os_event os_oc_event; struct os_callout os_oc_timer; struct os_task os_task; - struct omgr_jbuf os_jbuf; /* JSON buffer for NMGR task */ - char os_rsp[MGMT_MAX_MTU]; + struct omgr_cbuf os_cbuf; /* CBOR buffer for NMGR task */ }; static struct omgr_state omgr_state = { @@ -66,113 +64,6 @@ static os_stack_t oicmgr_stack[OICMGR_STACK_SZ]; static void omgr_oic_get(oc_request_t *request, oc_interface_mask_t interface); static void omgr_oic_put(oc_request_t *request, oc_interface_mask_t interface); -static char -omgr_jbuf_read_next(struct json_buffer *jb) -{ - struct omgr_jbuf *njb; - char c; - - njb = (struct omgr_jbuf *) jb; - - if (njb->ob_in_off + 1 > njb->ob_in_end) { - return '\0'; - } - - c = njb->ob_in[njb->ob_in_off]; - ++njb->ob_in_off; - - return (c); -} - -static char -omgr_jbuf_read_prev(struct json_buffer *jb) -{ - struct omgr_jbuf *njb; - char c; - - njb = (struct omgr_jbuf *) jb; - - if (njb->ob_in_off == 0) { - return '\0'; - } - - --njb->ob_in_off; - c = njb->ob_in[njb->ob_in_off]; - - return (c); -} - -static int -omgr_jbuf_readn(struct json_buffer *jb, char *buf, int size) -{ - struct omgr_jbuf *njb; - int read; - int left; - - njb = (struct omgr_jbuf *)jb; - - left = njb->ob_in_end - njb->ob_in_off; - read = size > left ? left : size; - - memcpy(buf, njb->ob_in + njb->ob_in_off, read); - - return (read); -} - -static int -omgr_jbuf_write(void *arg, char *data, int len) -{ - struct omgr_jbuf *njb; - int rc; - - njb = (struct omgr_jbuf *)arg; - - if (njb->ob_out_off + len >= njb->ob_out_end) { - rc = -1; - goto err; - } - memcpy(njb->ob_out + njb->ob_out_off, data, len); - njb->ob_out_off += len; - njb->ob_out[njb->ob_out_off] = '\0'; - - return (0); -err: - return (rc); -} - -static void -omgr_jbuf_init(struct omgr_jbuf *ob) -{ - struct mgmt_jbuf *mjb; - - memset(ob, 0, sizeof(*ob)); - - mjb = &ob->ob_mj; - mjb->mjb_buf.jb_read_next = omgr_jbuf_read_next; - mjb->mjb_buf.jb_read_prev = omgr_jbuf_read_prev; - mjb->mjb_buf.jb_readn = omgr_jbuf_readn; - mjb->mjb_enc.je_write = omgr_jbuf_write; - mjb->mjb_enc.je_arg = ob; -} - -static void -omgr_jbuf_setibuf(struct omgr_jbuf *ob, char *ptr, uint16_t len) -{ - ob->ob_in_off = 0; - ob->ob_in_end = len; - ob->ob_in = ptr; -} - -static void -omgr_jbuf_setobuf(struct omgr_jbuf *ob, char *ptr, uint16_t maxlen) -{ - ob->ob_out = ptr; - ob->ob_out_off = 0; - ob->ob_out_end = maxlen; - ob->ob_out[0] = '\0'; - ob->ob_mj.mjb_enc.je_wr_commas = 0; -} - static const struct mgmt_handler * omgr_oic_find_handler(const char *q, int qlen) { @@ -211,6 +102,7 @@ omgr_oic_op(oc_request_t *req, oc_interface_mask_t mask, int isset) const struct mgmt_handler *handler; oc_rep_t *data; int rc; + extern CborEncoder g_encoder; if (!req->query_len) { goto bad_req; @@ -221,50 +113,55 @@ omgr_oic_op(oc_request_t *req, oc_interface_mask_t mask, int isset) goto bad_req; } - /* - * Setup state for JSON encoding. - */ - omgr_jbuf_setobuf(&o->os_jbuf, o->os_rsp, sizeof(o->os_rsp)); - data = req->request_payload; if (data) { - if (data->type != STRING) { + if (data->type != BYTE_STRING) { goto bad_req; } - omgr_jbuf_setibuf(&o->os_jbuf, oc_string(data->value_string), - oc_string_len(data->value_string)); - } else { - omgr_jbuf_setibuf(&o->os_jbuf, NULL, 0); - } - if (!isset) { - if (handler->mh_read) { - rc = handler->mh_read(&o->os_jbuf.ob_mj); - } else { - goto bad_req; - } + cbor_buf_reader_init(&o->os_cbuf.ob_reader, + (uint8_t *) oc_string(data->value_string), + oc_string_len(data->value_string)); } else { - if (handler->mh_write) { - rc = handler->mh_write(&o->os_jbuf.ob_mj); - } else { - goto bad_req; - } - } - if (rc) { - goto bad_req; + cbor_buf_reader_init(&o->os_cbuf.ob_reader, NULL, 0); } - oc_rep_start_root_object(); + cbor_parser_init(&o->os_cbuf.ob_reader.r, 0, &o->os_cbuf.ob_mj.parser, &o->os_cbuf.ob_mj.it); + + /* start generating the CBOR OUTPUT */ + /* this is worth a quick note. We are encoding CBOR within CBOR, so we need + * to use the same encoder as ocf stack. We are using their global encoder + * g_encoder which they intialized before this function is called. Byt we can't + * call their macros here as it won't use the right mape encoder (ob_mj) */ + cbor_encoder_create_map(&g_encoder, &o->os_cbuf.ob_mj.encoder, CborIndefiniteLength); + switch (mask) { case OC_IF_BASELINE: oc_process_baseline_interface(req->resource); case OC_IF_RW: - oc_rep_set_text_string(root, "key", o->os_rsp); + cbor_encode_text_string(&root_map, "key", strlen("key")); + if (!isset) { + if (handler->mh_read) { + rc = handler->mh_read(&o->os_cbuf.ob_mj); + } else { + goto bad_req; + } + } else { + if (handler->mh_write) { + rc = handler->mh_write(&o->os_cbuf.ob_mj); + } else { + goto bad_req; + } + } + if (rc) { + goto bad_req; + } break; default: break; } - oc_rep_end_root_object(); + + cbor_encoder_close_container(&g_encoder, &o->os_cbuf.ob_mj.encoder); oc_send_response(req, OC_STATUS_OK); return; @@ -332,8 +229,6 @@ omgr_oic_task(void *arg) struct os_callout_func *ocf; os_time_t next_event; - omgr_jbuf_init(&o->os_jbuf); - oc_main_init((oc_handler_t *)&omgr_oc_handler); while (1) { ev = os_eventq_get(&o->os_evq); http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/53a2ce06/net/oic/src/api/oc_rep.c ---------------------------------------------------------------------- diff --git a/net/oic/src/api/oc_rep.c b/net/oic/src/api/oc_rep.c index a490840..0bff401 100644 --- a/net/oic/src/api/oc_rep.c +++ b/net/oic/src/api/oc_rep.c @@ -35,7 +35,7 @@ oc_rep_new(uint8_t *out_payload, int size) g_err = CborNoError; g_buf = out_payload; cbor_buf_writer_init(&g_buf_writer, out_payload, size); - cbor_encoder_init(&g_encoder, &cbor_buf_writer, &g_buf_writer, 0); + cbor_encoder_init(&g_encoder, &g_buf_writer.enc, 0); } int