You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by pa...@apache.org on 2016/10/13 22:42:39 UTC
incubator-mynewt-core git commit: refactor oicmgr to use cbor
encoding without encapsulation
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 <pa...@yahoo.com>
Authored: Thu Oct 13 15:42:04 2016 -0700
Committer: Paul Dietrich <pa...@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