You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mynewt.apache.org by ma...@apache.org on 2016/10/04 19:03:59 UTC
[07/13] incubator-mynewt-core git commit: move libs/iotivity ->
net/oic.
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/libs/iotivity/src/util/pt/pt-sem.h
----------------------------------------------------------------------
diff --git a/libs/iotivity/src/util/pt/pt-sem.h b/libs/iotivity/src/util/pt/pt-sem.h
deleted file mode 100644
index ad87c0d..0000000
--- a/libs/iotivity/src/util/pt/pt-sem.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (c) 2004, Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is part of the Contiki operating system.
- *
- * Author: Adam Dunkels <ad...@sics.se>
- *
- */
-
-/**
- * \addtogroup pt
- * @{
- */
-
-/**
- * \defgroup ptsem Protothread semaphores
- * @{
- *
- * This module implements counting semaphores on top of
- * protothreads. Semaphores are a synchronization primitive that
- * provide two operations: "wait" and "signal". The "wait" operation
- * checks the semaphore counter and blocks the thread if the counter
- * is zero. The "signal" operation increases the semaphore counter but
- * does not block. If another thread has blocked waiting for the
- * semaphore that is signaled, the blocked thread will become
- * runnable again.
- *
- * Semaphores can be used to implement other, more structured,
- * synchronization primitives such as monitors and message
- * queues/bounded buffers (see below).
- *
- * The following example shows how the producer-consumer problem, also
- * known as the bounded buffer problem, can be solved using
- * protothreads and semaphores. Notes on the program follow after the
- * example.
- *
- \code
-#include "pt-sem.h"
-
-#define NUM_ITEMS 32
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define BUFSIZE 8
-
-static struct pt_sem mutex, full, empty;
-
-PT_THREAD(producer(struct pt *pt))
-{
- static int produced;
-
- PT_BEGIN(pt);
-
- for(produced = 0; produced < NUM_ITEMS; ++produced) {
-
- PT_SEM_WAIT(pt, &full);
-
- PT_SEM_WAIT(pt, &mutex);
- add_to_buffer(produce_item());
- PT_SEM_SIGNAL(pt, &mutex);
-
- PT_SEM_SIGNAL(pt, &empty);
- }
-
- PT_END(pt);
-}
-
-PT_THREAD(consumer(struct pt *pt))
-{
- static int consumed;
-
- PT_BEGIN(pt);
-
- for(consumed = 0; consumed < NUM_ITEMS; ++consumed) {
-
- PT_SEM_WAIT(pt, &empty);
-
- PT_SEM_WAIT(pt, &mutex);
- consume_item(get_from_buffer());
- PT_SEM_SIGNAL(pt, &mutex);
-
- PT_SEM_SIGNAL(pt, &full);
- }
-
- PT_END(pt);
-}
-
-PT_THREAD(driver_thread(struct pt *pt))
-{
- static struct pt pt_producer, pt_consumer;
-
- PT_BEGIN(pt);
-
- PT_SEM_INIT(&empty, 0);
- PT_SEM_INIT(&full, BUFSIZE);
- PT_SEM_INIT(&mutex, 1);
-
- PT_INIT(&pt_producer);
- PT_INIT(&pt_consumer);
-
- PT_WAIT_THREAD(pt, producer(&pt_producer) &
- consumer(&pt_consumer));
-
- PT_END(pt);
-}
- \endcode
- *
- * The program uses three protothreads: one protothread that
- * implements the consumer, one thread that implements the producer,
- * and one protothread that drives the two other protothreads. The
- * program uses three semaphores: "full", "empty" and "mutex". The
- * "mutex" semaphore is used to provide mutual exclusion for the
- * buffer, the "empty" semaphore is used to block the consumer is the
- * buffer is empty, and the "full" semaphore is used to block the
- * producer is the buffer is full.
- *
- * The "driver_thread" holds two protothread state variables,
- * "pt_producer" and "pt_consumer". It is important to note that both
- * these variables are declared as <i>static</i>. If the static
- * keyword is not used, both variables are stored on the stack. Since
- * protothreads do not store the stack, these variables may be
- * overwritten during a protothread wait operation. Similarly, both
- * the "consumer" and "producer" protothreads declare their local
- * variables as static, to avoid them being stored on the stack.
- *
- *
- */
-
-/**
- * \file
- * Counting semaphores implemented on protothreads
- * \author
- * Adam Dunkels <ad...@sics.se>
- *
- */
-
-#ifndef PT_SEM_H_
-#define PT_SEM_H_
-
-#include "pt.h"
-
-struct pt_sem
-{
- unsigned int head, tail;
-};
-
-#define PT_SEM_COUNT(s) ((s)->head - (s)->tail)
-
-/**
- * Initialize a semaphore
- *
- * This macro initializes a semaphore with a value for the
- * counter. Internally, the semaphores use an "unsigned int" to
- * represent the counter, and therefore the "count" argument should be
- * within range of an unsigned int.
- *
- * \param s (struct pt_sem *) A pointer to the pt_sem struct
- * representing the semaphore
- *
- * \param c (unsigned int) The initial count of the semaphore.
- * \hideinitializer
- */
-#define PT_SEM_INIT(s, c) \
- do { \
- (s)->tail = 0; \
- (s)->head = (c); \
- } while (0)
-
-/**
- * Wait for a semaphore
- *
- * This macro carries out the "wait" operation on the semaphore. The
- * wait operation causes the protothread to block while the counter is
- * zero. When the counter reaches a value larger than zero, the
- * protothread will continue.
- *
- * \param pt (struct pt *) A pointer to the protothread (struct pt) in
- * which the operation is executed.
- *
- * \param s (struct pt_sem *) A pointer to the pt_sem struct
- * representing the semaphore
- *
- * \hideinitializer
- */
-#define PT_SEM_WAIT(pt, s) \
- do { \
- PT_WAIT_UNTIL(pt, PT_SEM_COUNT(s) > 0); \
- ++(s)->tail; \
- } while (0)
-
-/**
- * Signal a semaphore
- *
- * This macro carries out the "signal" operation on the semaphore. The
- * signal operation increments the counter inside the semaphore, which
- * eventually will cause waiting protothreads to continue executing.
- *
- * \param pt (struct pt *) A pointer to the protothread (struct pt) in
- * which the operation is executed.
- *
- * \param s (struct pt_sem *) A pointer to the pt_sem struct
- * representing the semaphore
- *
- * \hideinitializer
- */
-#define PT_SEM_SIGNAL(pt, s) (++(s)->head)
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* PT_SEM_H_ */
-
-/** @} */
-/** @} */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/libs/iotivity/src/util/pt/pt.h
----------------------------------------------------------------------
diff --git a/libs/iotivity/src/util/pt/pt.h b/libs/iotivity/src/util/pt/pt.h
deleted file mode 100644
index 43d1ab7..0000000
--- a/libs/iotivity/src/util/pt/pt.h
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (c) 2004-2005, Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is part of the Contiki operating system.
- *
- * Author: Adam Dunkels <ad...@sics.se>
- *
- */
-
-/**
- * \addtogroup pt
- * @{
- */
-
-/**
- * \file
- * Protothreads implementation.
- * \author
- * Adam Dunkels <ad...@sics.se>
- *
- */
-
-#ifndef PT_H_
-#define PT_H_
-
-#include "lc.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct pt
-{
- lc_t lc;
-};
-
-#define PT_WAITING 0
-#define PT_YIELDED 1
-#define PT_EXITED 2
-#define PT_ENDED 3
-
-/**
- * \name Initialization
- * @{
- */
-
-/**
- * Initialize a protothread.
- *
- * Initializes a protothread. Initialization must be done prior to
- * starting to execute the protothread.
- *
- * \param pt A pointer to the protothread control structure.
- *
- * \sa PT_SPAWN()
- *
- * \hideinitializer
- */
-#define PT_INIT(pt) LC_INIT((pt)->lc)
-
-/** @} */
-
-/**
- * \name Declaration and definition
- * @{
- */
-
-/**
- * Declaration of a protothread.
- *
- * This macro is used to declare a protothread. All protothreads must
- * be declared with this macro.
- *
- * \param name_args The name and arguments of the C function
- * implementing the protothread.
- *
- * \hideinitializer
- */
-#define PT_THREAD(name_args) char name_args
-
-/**
- * Declare the start of a protothread inside the C function
- * implementing the protothread.
- *
- * This macro is used to declare the starting point of a
- * protothread. It should be placed at the start of the function in
- * which the protothread runs. All C statements above the PT_BEGIN()
- * invokation will be executed each time the protothread is scheduled.
- *
- * \param pt A pointer to the protothread control structure.
- *
- * \hideinitializer
- */
-#define PT_BEGIN(pt) \
- { \
- char PT_YIELD_FLAG = 1; \
- if (PT_YIELD_FLAG) { \
- ; \
- } \
- LC_RESUME((pt)->lc)
-
-/**
- * Declare the end of a protothread.
- *
- * This macro is used for declaring that a protothread ends. It must
- * always be used together with a matching PT_BEGIN() macro.
- *
- * \param pt A pointer to the protothread control structure.
- *
- * \hideinitializer
- */
-#define PT_END(pt) \
- LC_END((pt)->lc); \
- PT_YIELD_FLAG = 0; \
- PT_INIT(pt); \
- return PT_ENDED; \
- }
-
-/** @} */
-
-/**
- * \name Blocked wait
- * @{
- */
-
-/**
- * Block and wait until condition is true.
- *
- * This macro blocks the protothread until the specified condition is
- * true.
- *
- * \param pt A pointer to the protothread control structure.
- * \param condition The condition.
- *
- * \hideinitializer
- */
-#define PT_WAIT_UNTIL(pt, condition) \
- do { \
- LC_SET((pt)->lc); \
- if (!(condition)) { \
- return PT_WAITING; \
- } \
- } while (0)
-
-/**
- * Block and wait while condition is true.
- *
- * This function blocks and waits while condition is true. See
- * PT_WAIT_UNTIL().
- *
- * \param pt A pointer to the protothread control structure.
- * \param cond The condition.
- *
- * \hideinitializer
- */
-#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond))
-
-/** @} */
-
-/**
- * \name Hierarchical protothreads
- * @{
- */
-
-/**
- * Block and wait until a child protothread completes.
- *
- * This macro schedules a child protothread. The current protothread
- * will block until the child protothread completes.
- *
- * \note The child protothread must be manually initialized with the
- * PT_INIT() function before this function is used.
- *
- * \param pt A pointer to the protothread control structure.
- * \param thread The child protothread with arguments
- *
- * \sa PT_SPAWN()
- *
- * \hideinitializer
- */
-#define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread))
-
-/**
- * Spawn a child protothread and wait until it exits.
- *
- * This macro spawns a child protothread and waits until it exits. The
- * macro can only be used within a protothread.
- *
- * \param pt A pointer to the protothread control structure.
- * \param child A pointer to the child protothread's control structure.
- * \param thread The child protothread with arguments
- *
- * \hideinitializer
- */
-#define PT_SPAWN(pt, child, thread) \
- do { \
- PT_INIT((child)); \
- PT_WAIT_THREAD((pt), (thread)); \
- } while (0)
-
-/** @} */
-
-/**
- * \name Exiting and restarting
- * @{
- */
-
-/**
- * Restart the protothread.
- *
- * This macro will block and cause the running protothread to restart
- * its execution at the place of the PT_BEGIN() call.
- *
- * \param pt A pointer to the protothread control structure.
- *
- * \hideinitializer
- */
-#define PT_RESTART(pt) \
- do { \
- PT_INIT(pt); \
- return PT_WAITING; \
- } while (0)
-
-/**
- * Exit the protothread.
- *
- * This macro causes the protothread to exit. If the protothread was
- * spawned by another protothread, the parent protothread will become
- * unblocked and can continue to run.
- *
- * \param pt A pointer to the protothread control structure.
- *
- * \hideinitializer
- */
-#define PT_EXIT(pt) \
- do { \
- PT_INIT(pt); \
- return PT_EXITED; \
- } while (0)
-
-/** @} */
-
-/**
- * \name Calling a protothread
- * @{
- */
-
-/**
- * Schedule a protothread.
- *
- * This function schedules a protothread. The return value of the
- * function is non-zero if the protothread is running or zero if the
- * protothread has exited.
- *
- * \param f The call to the C function implementing the protothread to
- * be scheduled
- *
- * \hideinitializer
- */
-#define PT_SCHEDULE(f) ((f) < PT_EXITED)
-
-/** @} */
-
-/**
- * \name Yielding from a protothread
- * @{
- */
-
-/**
- * Yield from the current protothread.
- *
- * This function will yield the protothread, thereby allowing other
- * processing to take place in the system.
- *
- * \param pt A pointer to the protothread control structure.
- *
- * \hideinitializer
- */
-#define PT_YIELD(pt) \
- do { \
- PT_YIELD_FLAG = 0; \
- LC_SET((pt)->lc); \
- if (PT_YIELD_FLAG == 0) { \
- return PT_YIELDED; \
- } \
- } while (0)
-
-/**
- * \brief Yield from the protothread until a condition occurs.
- * \param pt A pointer to the protothread control structure.
- * \param cond The condition.
- *
- * This function will yield the protothread, until the
- * specified condition evaluates to true.
- *
- *
- * \hideinitializer
- */
-#define PT_YIELD_UNTIL(pt, cond) \
- do { \
- PT_YIELD_FLAG = 0; \
- LC_SET((pt)->lc); \
- if ((PT_YIELD_FLAG == 0) || !(cond)) { \
- return PT_YIELDED; \
- } \
- } while (0)
-
-/** @} */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* PT_H_ */
-
-/** @} */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/libs/iotivity/syscfg.yml
----------------------------------------------------------------------
diff --git a/libs/iotivity/syscfg.yml b/libs/iotivity/syscfg.yml
deleted file mode 100644
index 418aaa2..0000000
--- a/libs/iotivity/syscfg.yml
+++ /dev/null
@@ -1,27 +0,0 @@
-# Package: libs/iotivity
-
-syscfg.defs:
- OC_TRANSPORT_SERIAL:
- description: 'Enables OIC transport over nlip serial'
- value: '0'
- OC_TRANSPORT_GATT:
- description: 'Enables OIC transport over BLE GATT'
- value: '0'
- OC_TRANSPORT_IP:
- description: 'Enables OIC transport over IP UDP'
- value: '0'
- OC_CLIENT:
- description: 'Enables OIC client support'
- value: '0'
- OC_SERVER:
- description: 'Enables OIC server support'
- value: '0'
- OC_DEBUG:
- description: 'Enables OIC debug logs'
- value: '0'
- OC_TASK_PRIORITY:
- description: 'The task priority for an internal tasks that runs the OCF stack'
- value: '4'
- OC_TASK_STACK_SIZE:
- description: 'The stack size of the OC task in words'
- value: '300'
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/libs/newtmgr_oic/pkg.yml
----------------------------------------------------------------------
diff --git a/libs/newtmgr_oic/pkg.yml b/libs/newtmgr_oic/pkg.yml
index 10465f1..d2e4357 100644
--- a/libs/newtmgr_oic/pkg.yml
+++ b/libs/newtmgr_oic/pkg.yml
@@ -25,7 +25,7 @@ pkg.keywords:
pkg.deps:
- kernel/os
- - libs/iotivity
+ - net/oic
- encoding/json
- libs/newtmgr/nmgr_os
- libs/util
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/libs/newtmgr_oic/src/newtmgr.c
----------------------------------------------------------------------
diff --git a/libs/newtmgr_oic/src/newtmgr.c b/libs/newtmgr_oic/src/newtmgr.c
index 29a07de..136545f 100644
--- a/libs/newtmgr_oic/src/newtmgr.c
+++ b/libs/newtmgr_oic/src/newtmgr.c
@@ -26,7 +26,7 @@
#include <newtmgr/newtmgr.h>
#include <nmgr_os/nmgr_os.h>
-#include <iotivity/oc_api.h>
+#include <oic/oc_api.h>
#define NMGR_OC_EVENT (OS_EVENT_T_PERUSER)
#define NMGR_OC_TIMER (OS_EVENT_T_PERUSER + 1)
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_api.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_api.h b/net/oic/include/oic/oc_api.h
new file mode 100644
index 0000000..83e91f7
--- /dev/null
+++ b/net/oic/include/oic/oc_api.h
@@ -0,0 +1,174 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_API_H
+#define OC_API_H
+
+#include "../src/port/mynewt/config.h"
+#include "../src/messaging/coap/oc_coap.h"
+#include "oc_ri.h"
+#include "../src/port/oc_signal_main_loop.h"
+#include "../src/port/oc_storage.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ void (*init)(void);
+
+#ifdef OC_SECURITY
+ void (*get_credentials)(void);
+#endif /* OC_SECURITY */
+
+#ifdef OC_SERVER
+ void (*register_resources)(void);
+#endif /* OC_SERVER */
+
+#ifdef OC_CLIENT
+ void (*requests_entry)(void);
+#endif /* OC_CLIENT */
+} oc_handler_t;
+
+typedef void (*oc_init_platform_cb_t)(void *data);
+typedef void (*oc_add_device_cb_t)(void *data);
+
+int oc_main_init(oc_handler_t *handler);
+
+oc_clock_time_t oc_main_poll(void);
+
+void oc_main_shutdown(void);
+
+void oc_add_device(const char *uri, const char *rt, const char *name,
+ const char *spec_version, const char *data_model_version,
+ oc_add_device_cb_t add_device_cb, void *data);
+
+#define oc_set_custom_device_property(prop, value) \
+ oc_rep_set_text_string(root, prop, value)
+
+void oc_init_platform(const char *mfg_name,
+ oc_init_platform_cb_t init_platform_cb, void *data);
+
+#define oc_set_custom_platform_property(prop, value) \
+ oc_rep_set_text_string(root, prop, value)
+
+/** Server side */
+oc_resource_t *oc_new_resource(const char *uri, uint8_t num_resource_types,
+ int device);
+void oc_resource_bind_resource_interface(oc_resource_t *resource,
+ uint8_t interface);
+void oc_resource_set_default_interface(oc_resource_t *resource,
+ oc_interface_mask_t interface);
+void oc_resource_bind_resource_type(oc_resource_t *resource, const char *type);
+
+void oc_process_baseline_interface(oc_resource_t *resource);
+
+#ifdef OC_SECURITY
+void oc_resource_make_secure(oc_resource_t *resource);
+#endif /* OC_SECURITY */
+
+void oc_resource_set_discoverable(oc_resource_t *resource);
+void oc_resource_set_observable(oc_resource_t *resource);
+void oc_resource_set_periodic_observable(oc_resource_t *resource,
+ uint16_t seconds);
+void oc_resource_set_request_handler(oc_resource_t *resource,
+ oc_method_t method,
+ oc_request_handler_t handler);
+bool oc_add_resource(oc_resource_t *resource);
+void oc_delete_resource(oc_resource_t *resource);
+void oc_deactivate_resource(oc_resource_t *resource);
+
+void oc_init_query_iterator(oc_request_t *request);
+int oc_interate_query(oc_request_t *request, char **key, int *key_len,
+ char **value, int *value_len);
+int oc_get_query_value(oc_request_t *request, const char *key, char **value);
+
+void oc_send_response(oc_request_t *request, oc_status_t response_code);
+void oc_ignore_request(oc_request_t *request);
+
+void oc_indicate_separate_response(oc_request_t *request,
+ oc_separate_response_t *response);
+void oc_set_separate_response_buffer(oc_separate_response_t *handle);
+void oc_send_separate_response(oc_separate_response_t *handle,
+ oc_status_t response_code);
+
+int oc_notify_observers(oc_resource_t *resource);
+
+/** Client side */
+#include "oc_client_state.h"
+
+bool oc_do_ip_discovery(const char *rt, oc_discovery_cb_t handler);
+
+bool oc_do_get(const char *uri, oc_server_handle_t *server, const char *query,
+ oc_response_handler_t handler, oc_qos_t qos);
+
+bool oc_do_delete(const char *uri, oc_server_handle_t *server,
+ oc_response_handler_t handler, oc_qos_t qos);
+
+bool oc_init_put(const char *uri, oc_server_handle_t *server, const char *query,
+ oc_response_handler_t handler, oc_qos_t qos);
+
+bool oc_do_put(void);
+
+bool oc_init_post(const char *uri, oc_server_handle_t *server,
+ const char *query, oc_response_handler_t handler,
+ oc_qos_t qos);
+
+bool oc_do_post(void);
+
+bool oc_do_observe(const char *uri, oc_server_handle_t *server,
+ const char *query, oc_response_handler_t handler,
+ oc_qos_t qos);
+
+bool oc_stop_observe(const char *uri, oc_server_handle_t *server);
+
+/** Common operations */
+
+void oc_set_delayed_callback(void *cb_data, oc_trigger_t callback,
+ uint16_t seconds);
+void oc_remove_delayed_callback(void *cb_data, oc_trigger_t callback);
+
+/** API for setting handlers for interrupts */
+
+#define oc_signal_interrupt_handler(name) \
+ do { \
+ oc_process_poll(&(name##_interrupt_x)); \
+ oc_signal_main_loop(); \
+ } while (0)
+
+#define oc_activate_interrupt_handler(name) \
+ (oc_process_start(&(name##_interrupt_x), 0))
+
+#define oc_define_interrupt_handler(name) \
+ void name##_interrupt_x_handler(void); \
+ OC_PROCESS(name##_interrupt_x, ""); \
+ OC_PROCESS_THREAD(name##_interrupt_x, ev, data) \
+ { \
+ OC_PROCESS_POLLHANDLER(name##_interrupt_x_handler()); \
+ OC_PROCESS_BEGIN(); \
+ while (oc_process_is_running(&(name##_interrupt_x))) { \
+ OC_PROCESS_YIELD(); \
+ } \
+ OC_PROCESS_END(); \
+ } \
+ void name##_interrupt_x_handler(void)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_API_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_buffer.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_buffer.h b/net/oic/include/oic/oc_buffer.h
new file mode 100644
index 0000000..0bbf8a7
--- /dev/null
+++ b/net/oic/include/oic/oc_buffer.h
@@ -0,0 +1,40 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_BUFFER_H
+#define OC_BUFFER_H
+
+#include "../../src/port/oc_connectivity.h"
+#include "../../src/util/oc_process.h"
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OC_PROCESS_NAME(message_buffer_handler);
+oc_message_t *oc_allocate_message(void);
+void oc_message_add_ref(oc_message_t *message);
+void oc_message_unref(oc_message_t *message);
+
+void oc_recv_message(oc_message_t *message);
+void oc_send_message(oc_message_t *message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_BUFFER_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_client_state.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_client_state.h b/net/oic/include/oic/oc_client_state.h
new file mode 100644
index 0000000..43c25ac
--- /dev/null
+++ b/net/oic/include/oic/oc_client_state.h
@@ -0,0 +1,96 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_CLIENT_STATE_H
+#define OC_CLIENT_STATE_H
+
+#include "../../src/messaging/coap/constants.h"
+#include "oc_ri.h"
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum { HIGH_QOS = 0, LOW_QOS } oc_qos_t;
+
+typedef struct
+{
+ oc_rep_t *payload;
+ oc_status_t code;
+ int observe_option;
+} oc_client_response_t;
+
+typedef struct
+{
+ oc_endpoint_t endpoint;
+} oc_server_handle_t;
+
+typedef enum {
+ OC_STOP_DISCOVERY = 0,
+ OC_CONTINUE_DISCOVERY
+} oc_discovery_flags_t;
+
+typedef oc_discovery_flags_t(oc_discovery_cb_t)(const char *, const char *,
+ oc_string_array_t,
+ oc_interface_mask_t,
+ oc_server_handle_t *);
+
+typedef void (*oc_response_handler_t)(oc_client_response_t *);
+
+typedef struct oc_client_cb_s
+{
+ struct oc_client_cb_s *next;
+ oc_string_t uri;
+ uint8_t token[COAP_TOKEN_LEN];
+ uint8_t token_len;
+ uint16_t mid;
+
+ oc_server_handle_t server;
+
+ void *handler;
+
+ bool discovery;
+ int32_t observe_seq;
+ oc_clock_time_t timestamp;
+ oc_qos_t qos;
+ oc_method_t method;
+} oc_client_cb_t;
+
+bool oc_ri_invoke_client_cb(void *response, oc_endpoint_t *endpoint);
+
+oc_client_cb_t *oc_ri_alloc_client_cb(const char *uri,
+ oc_server_handle_t *server,
+ oc_method_t method, void *handler,
+ oc_qos_t qos);
+
+oc_client_cb_t *oc_ri_get_client_cb(const char *uri, oc_server_handle_t *server,
+ oc_method_t method);
+
+void oc_ri_remove_client_cb_by_mid(uint16_t mid);
+
+oc_discovery_flags_t oc_ri_process_discovery_payload(uint8_t *payload, int len,
+ oc_discovery_cb_t *handler,
+ oc_endpoint_t *endpoint);
+
+bool oc_ri_send_rst(oc_endpoint_t *endpoint, uint8_t *token, uint8_t token_len,
+ uint16_t mid);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_CLIENT_STATE_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_constants.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_constants.h b/net/oic/include/oic/oc_constants.h
new file mode 100644
index 0000000..cde1acf
--- /dev/null
+++ b/net/oic/include/oic/oc_constants.h
@@ -0,0 +1,51 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_CONSTANTS_H
+#define OC_CONSTANTS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* OCF standard resource interfaces */
+#define OC_NUM_STD_INTERFACES (7)
+#define OC_RSRVD_IF_BASELINE "oic.if.baseline"
+#define OC_BASELINE_IF_LEN (15)
+#define OC_RSRVD_IF_LL "oic.if.ll"
+#define OC_LL_IF_LEN (9)
+#define OC_RSRVD_IF_B "oic.if.b"
+#define OC_B_IF_LEN (8)
+#define OC_RSRVD_IF_R "oic.if.r"
+#define OC_R_IF_LEN (8)
+#define OC_RSRVD_IF_RW "oic.if.rw"
+#define OC_RW_IF_LEN (9)
+#define OC_RSRVD_IF_A "oic.if.a"
+#define OC_A_IF_LEN (8)
+#define OC_RSRVD_IF_S "oic.if.s"
+#define OC_S_IF_LEN (8)
+
+/* OCF Core resource URIs */
+#define OC_RSRVD_WELL_KNOWN_URI "/oic/res"
+#define OC_MULTICAST_DISCOVERY_URI "/oic/res"
+#define OC_RSRVD_DEVICE_URI "/oic/d"
+#define OC_RSRVD_PLATFORM_URI "/oic/p"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_CONSTANTS_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_core_res.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_core_res.h b/net/oic/include/oic/oc_core_res.h
new file mode 100644
index 0000000..baf9fe8
--- /dev/null
+++ b/net/oic/include/oic/oc_core_res.h
@@ -0,0 +1,60 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_CORE_RES_H
+#define OC_CORE_RES_H
+
+#include "oc_ri.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*oc_core_init_platform_cb_t)(void *data);
+typedef void (*oc_core_add_device_cb_t)(void *data);
+
+oc_string_t *oc_core_init_platform(const char *mfg_name,
+ oc_core_init_platform_cb_t init_cb,
+ void *data);
+
+oc_string_t *oc_core_add_new_device(const char *uri, const char *rt,
+ const char *name, const char *spec_version,
+ const char *data_model_version,
+ oc_core_add_device_cb_t add_device_cb,
+ void *data);
+
+int oc_core_get_num_devices(void);
+
+oc_uuid_t *oc_core_get_device_id(int device);
+
+void oc_core_encode_interfaces_mask(CborEncoder *parent,
+ oc_interface_mask_t interface);
+
+oc_resource_t *oc_core_get_resource_by_index(int type);
+
+oc_resource_t *oc_core_get_resource_by_uri(const char *uri);
+
+void oc_core_populate_resource(
+ int type, const char *uri, const char *rt, oc_interface_mask_t interfaces,
+ oc_interface_mask_t default_interface, oc_resource_properties_t properties,
+ oc_request_handler_t get, oc_request_handler_t put, oc_request_handler_t post,
+ oc_request_handler_t delete, int device);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_CORE_RES_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_discovery.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_discovery.h b/net/oic/include/oic/oc_discovery.h
new file mode 100644
index 0000000..5b59a06
--- /dev/null
+++ b/net/oic/include/oic/oc_discovery.h
@@ -0,0 +1,30 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_DISCOVERY_H
+#define OC_DISCOVERY_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void oc_create_discovery_resource(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_DISCOVERY_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_gatt.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_gatt.h b/net/oic/include/oic/oc_gatt.h
new file mode 100644
index 0000000..ae6c59c
--- /dev/null
+++ b/net/oic/include/oic/oc_gatt.h
@@ -0,0 +1,38 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#ifndef OC_GATT_H
+#define OC_GATT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct ble_hs_cfg;
+
+/* returns the event q for bluetooth to use */
+int
+ble_coap_gatt_srv_init(struct os_eventq **out);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_GATT_H */
+
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_helpers.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_helpers.h b/net/oic/include/oic/oc_helpers.h
new file mode 100644
index 0000000..7520c7b
--- /dev/null
+++ b/net/oic/include/oic/oc_helpers.h
@@ -0,0 +1,86 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_HELPERS_H
+#define OC_HELPERS_H
+
+#include "../../src/util/oc_list.h"
+#include "../../src/util/oc_mmem.h"
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct oc_mmem oc_handle_t, oc_string_t, oc_array_t, oc_string_array_t;
+
+#define oc_cast(block, type) ((type *)(OC_MMEM_PTR(&(block))))
+#define oc_string(ocstring) (oc_cast(ocstring, char))
+
+void oc_new_string(oc_string_t *ocstring, const char str[]);
+void oc_alloc_string(oc_string_t *ocstring, int size);
+void oc_free_string(oc_string_t *ocstring);
+void oc_concat_strings(oc_string_t *concat, const char *str1, const char *str2);
+#define oc_string_len(ocstring) ((ocstring).size ? (ocstring).size - 1 : 0)
+
+void _oc_new_array(oc_array_t *ocarray, uint8_t size, pool type);
+void _oc_free_array(oc_array_t *ocarray, pool type);
+#define oc_new_int_array(ocarray, size) (_oc_new_array(ocarray, size, INT_POOL))
+#define oc_new_bool_array(ocarray, size) \
+ (_oc_new_array(ocarray, size, BYTE_POOL))
+#define oc_new_double_array(ocarray, size) \
+ (_oc_new_array(ocarray, size, DOUBLE_POOL))
+#define oc_free_int_array(ocarray) (_oc_free_array(ocarray, INT_POOL))
+#define oc_free_bool_array(ocarray) (_oc_free_array(ocarray, BYTE_POOL))
+#define oc_free_double_array(ocarray) (_oc_free_array(ocarray, DOUBLE_POOL))
+#define oc_int_array_size(ocintarray) ((ocintarray).size / sizeof(int64_t))
+#define oc_bool_array_size(ocboolarray) ((ocboolarray).size / sizeof(bool))
+#define oc_double_array_size(ocdoublearray) \
+ ((ocdoublearray).size / sizeof(double))
+#define oc_int_array(ocintarray) (oc_cast(ocintarray, int64_t))
+#define oc_bool_array(ocboolarray) (oc_cast(ocboolarray, bool))
+#define oc_double_array(ocdoublearray) (oc_cast(ocdoublearray, double))
+
+#define STRING_ARRAY_ITEM_MAX_LEN 24
+void _oc_alloc_string_array(oc_string_array_t *ocstringarray, uint8_t size);
+bool _oc_copy_string_to_string_array(oc_string_array_t *ocstringarray,
+ const char str[], uint8_t index);
+bool _oc_string_array_add_item(oc_string_array_t *ocstringarray,
+ const char str[]);
+void oc_join_string_array(oc_string_array_t *ocstringarray,
+ oc_string_t *ocstring);
+#define oc_new_string_array(ocstringarray, size) \
+ (_oc_alloc_string_array(ocstringarray, size))
+#define oc_free_string_array(ocstringarray) (oc_free_string(ocstringarray))
+#define oc_string_array_add_item(ocstringarray, str) \
+ (_oc_string_array_add_item(&(ocstringarray), str))
+#define oc_string_array_get_item(ocstringarray, index) \
+ (oc_string(ocstringarray) + index * STRING_ARRAY_ITEM_MAX_LEN)
+#define oc_string_array_set_item(ocstringarray, str, index) \
+ (_oc_copy_string_to_string_array(&(ocstringarray), str, index))
+#define oc_string_array_get_item_size(ocstringarray, index) \
+ (strlen((const char *)oc_string_array_get_item(ocstringarray, index)))
+#define oc_string_array_get_allocated_size(ocstringarray) \
+ ((ocstringarray).size / STRING_ARRAY_ITEM_MAX_LEN)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_HELPERS_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_network_events.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_network_events.h b/net/oic/include/oic/oc_network_events.h
new file mode 100644
index 0000000..d0f5d41
--- /dev/null
+++ b/net/oic/include/oic/oc_network_events.h
@@ -0,0 +1,37 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_NETWORK_EVENTS_H
+#define OC_NETWORK_EVENTS_H
+
+#include "../../src/port/oc_network_events_mutex.h"
+#include "../../src/util/oc_process.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OC_PROCESS_NAME(oc_network_events);
+
+typedef struct oc_message_s oc_message_t;
+
+void oc_network_event(oc_message_t *message);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_NETWORK_EVENTS_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_rep.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_rep.h b/net/oic/include/oic/oc_rep.h
new file mode 100644
index 0000000..f0f80a6
--- /dev/null
+++ b/net/oic/include/oic/oc_rep.h
@@ -0,0 +1,236 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_REP_H
+#define OC_REP_H
+
+#include <tinycbor/cbor.h>
+#include "oc_constants.h"
+#include "oc_helpers.h"
+#include "../src/port/mynewt/config.h"
+#include <stdbool.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern CborEncoder g_encoder, root_map, links_array;
+extern CborError g_err;
+
+void oc_rep_new(uint8_t *payload, int size);
+void oc_rep_reset(void);
+int oc_rep_finalize(void);
+
+#define oc_rep_object(name) &name##_map
+#define oc_rep_array(name) &name##_array
+
+#define oc_rep_set_double(object, key, value) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ g_err |= cbor_encode_double(&object##_map, value); \
+ } while (0)
+
+#define oc_rep_set_int(object, key, value) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ g_err |= cbor_encode_int(&object##_map, value); \
+ } while (0)
+
+#define oc_rep_set_uint(object, key, value) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ g_err |= cbor_encode_uint(&object##_map, value); \
+ } while (0)
+
+#define oc_rep_set_boolean(object, key, value) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ g_err |= cbor_encode_boolean(&object##_map, value); \
+ } while (0)
+
+#define oc_rep_set_text_string(object, key, value) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ g_err |= cbor_encode_text_string(&object##_map, value, strlen(value)); \
+ } while (0)
+
+#define oc_rep_set_byte_string(object, key, value) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ g_err |= cbor_encode_byte_string(&object##_map, value, strlen(value)); \
+ } while (0)
+
+#define oc_rep_start_array(parent, key) \
+ do { \
+ CborEncoder key##_array; \
+ g_err |= \
+ cbor_encoder_create_array(&parent, &key##_array, CborIndefiniteLength)
+
+#define oc_rep_end_array(parent, key) \
+ g_err |= cbor_encoder_close_container(&parent, &key##_array); \
+ } \
+ while (0)
+
+#define oc_rep_start_links_array() \
+ g_err |= \
+ cbor_encoder_create_array(&g_encoder, &links_array, CborIndefiniteLength)
+
+#define oc_rep_end_links_array() \
+ g_err |= cbor_encoder_close_container(&g_encoder, &links_array)
+
+#define oc_rep_start_root_object() \
+ g_err |= cbor_encoder_create_map(&g_encoder, &root_map, CborIndefiniteLength)
+
+#define oc_rep_end_root_object() \
+ g_err |= cbor_encoder_close_container(&g_encoder, &root_map)
+
+#define oc_rep_add_byte_string(parent, value) \
+ g_err |= cbor_encode_byte_string(&parent##_array, value, strlen(value))
+
+#define oc_rep_add_text_string(parent, value) \
+ g_err |= cbor_encode_text_string(&parent##_array, value, strlen(value))
+
+#define oc_rep_set_key(parent, key) \
+ g_err |= cbor_encode_text_string(&parent, key, strlen(key))
+
+#define oc_rep_set_array(object, key) \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ oc_rep_start_array(object##_map, key)
+
+#define oc_rep_close_array(object, key) oc_rep_end_array(object##_map, key)
+
+#define oc_rep_start_object(parent, key) \
+ do { \
+ CborEncoder key##_map; \
+ g_err |= cbor_encoder_create_map(&parent, &key##_map, CborIndefiniteLength)
+
+#define oc_rep_end_object(parent, key) \
+ g_err |= cbor_encoder_close_container(&parent, &key##_map); \
+ } \
+ while (0)
+
+#define oc_rep_object_array_start_item(key) \
+ oc_rep_start_object(key##_array, key)
+
+#define oc_rep_object_array_end_item(key) oc_rep_end_object(key##_array, key)
+
+#define oc_rep_set_object(object, key) \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ oc_rep_start_object(object##_map, key)
+
+#define oc_rep_close_object(object, key) oc_rep_end_object(object##_map, key)
+
+#define oc_rep_set_int_array(object, key, values, length) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ CborEncoder key##_value_array; \
+ g_err |= \
+ cbor_encoder_create_array(&object##_map, &key##_value_array, length); \
+ int i; \
+ for (i = 0; i < length; i++) { \
+ g_err |= cbor_encode_int(&key##_value_array, values[i]); \
+ } \
+ g_err |= cbor_encoder_close_container(&object##_map, &key##_value_array); \
+ } while (0)
+
+#define oc_rep_set_bool_array(object, key, values, length) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ CborEncoder key##_value_array; \
+ g_err |= \
+ cbor_encoder_create_array(&object##_map, &key##_value_array, length); \
+ int i; \
+ for (i = 0; i < length; i++) { \
+ g_err |= cbor_encode_boolean(&key##_value_array, values[i]); \
+ } \
+ g_err |= cbor_encoder_close_container(&object##_map, &key##_value_array); \
+ } while (0)
+
+#define oc_rep_set_double_array(object, key, values, length) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ CborEncoder key##_value_array; \
+ g_err |= \
+ cbor_encoder_create_array(&object##_map, &key##_value_array, length); \
+ int i; \
+ for (i = 0; i < length; i++) { \
+ g_err |= cbor_encode_floating_point(&key##_value_array, CborDoubleType, \
+ &values[i]); \
+ } \
+ g_err |= cbor_encoder_close_container(&object##_map, &key##_value_array); \
+ } while (0)
+
+#define oc_rep_set_string_array(object, key, values) \
+ do { \
+ g_err |= cbor_encode_text_string(&object##_map, #key, strlen(#key)); \
+ CborEncoder key##_value_array; \
+ g_err |= \
+ cbor_encoder_create_array(&object##_map, &key##_value_array, \
+ oc_string_array_get_allocated_size(values)); \
+ int i; \
+ for (i = 0; i < oc_string_array_get_allocated_size(values); i++) { \
+ g_err |= cbor_encode_text_string( \
+ &key##_value_array, oc_string_array_get_item(values, i), \
+ oc_string_array_get_item_size(values, i)); \
+ } \
+ g_err |= cbor_encoder_close_container(&object##_map, &key##_value_array); \
+ } while (0)
+
+typedef enum {
+ NIL = 0,
+ INT = 0x01,
+ DOUBLE = 0x02,
+ BOOL = 0x03,
+ BYTE_STRING = 0x04,
+ STRING = 0x05,
+ OBJECT = 0x06,
+ ARRAY = 0x08,
+ INT_ARRAY = 0x09,
+ DOUBLE_ARRAY = 0x0A,
+ BOOL_ARRAY = 0x0B,
+ BYTE_STRING_ARRAY = 0x0C,
+ STRING_ARRAY = 0x0D,
+ OBJECT_ARRAY = 0x0E
+} oc_rep_value_type_t;
+
+typedef struct oc_rep_s
+{
+ oc_rep_value_type_t type;
+ struct oc_rep_s *next;
+ oc_string_t name;
+ union
+ {
+ int64_t value_int;
+ bool value_boolean;
+ double value_double;
+ oc_string_t value_string;
+ oc_array_t value_array;
+ struct oc_rep_s *value_object;
+ struct oc_rep_s *value_object_array;
+ };
+} oc_rep_t;
+
+uint16_t oc_parse_rep(const uint8_t *payload, uint16_t payload_size,
+ oc_rep_t **value_list);
+
+void oc_free_rep(oc_rep_t *rep);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_REP_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_ri.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_ri.h b/net/oic/include/oic/oc_ri.h
new file mode 100644
index 0000000..a5bce1d
--- /dev/null
+++ b/net/oic/include/oic/oc_ri.h
@@ -0,0 +1,184 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_RI_H
+#define OC_RI_H
+
+#include "../src/port/mynewt/config.h"
+#include "oc_rep.h"
+#include "oc_uuid.h"
+#include "../../src/port/oc_connectivity.h"
+#include "../../src/util/oc_etimer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum { OC_GET = 1, OC_POST, OC_PUT, OC_DELETE } oc_method_t;
+
+typedef enum {
+ OC_DISCOVERABLE = (1 << 0),
+ OC_OBSERVABLE = (1 << 1),
+ OC_ACTIVE = (1 << 2),
+ OC_SECURE = (1 << 4),
+ OC_PERIODIC = (1 << 6),
+} oc_resource_properties_t;
+
+typedef enum {
+ OC_STATUS_OK = 0,
+ OC_STATUS_CREATED,
+ OC_STATUS_CHANGED,
+ OC_STATUS_DELETED,
+ OC_STATUS_NOT_MODIFIED,
+ OC_STATUS_BAD_REQUEST,
+ OC_STATUS_UNAUTHORIZED,
+ OC_STATUS_BAD_OPTION,
+ OC_STATUS_FORBIDDEN,
+ OC_STATUS_NOT_FOUND,
+ OC_STATUS_METHOD_NOT_ALLOWED,
+ OC_STATUS_NOT_ACCEPTABLE,
+ OC_STATUS_REQUEST_ENTITY_TOO_LARGE,
+ OC_STATUS_UNSUPPORTED_MEDIA_TYPE,
+ OC_STATUS_INTERNAL_SERVER_ERROR,
+ OC_STATUS_NOT_IMPLEMENTED,
+ OC_STATUS_BAD_GATEWAY,
+ OC_STATUS_SERVICE_UNAVAILABLE,
+ OC_STATUS_GATEWAY_TIMEOUT,
+ OC_STATUS_PROXYING_NOT_SUPPORTED,
+ __NUM_OC_STATUS_CODES__,
+ OC_IGNORE
+} oc_status_t;
+
+typedef struct oc_separate_response_s oc_separate_response_t;
+
+typedef struct oc_response_buffer_s oc_response_buffer_t;
+
+typedef struct
+{
+ oc_separate_response_t *separate_response;
+ oc_response_buffer_t *response_buffer;
+} oc_response_t;
+
+typedef enum {
+ OC_IF_BASELINE = 1 << 1,
+ OC_IF_LL = 1 << 2,
+ OC_IF_B = 1 << 3,
+ OC_IF_R = 1 << 4,
+ OC_IF_RW = 1 << 5,
+ OC_IF_A = 1 << 6,
+ OC_IF_S = 1 << 7,
+} oc_interface_mask_t;
+
+typedef enum {
+ OCF_RES = 0,
+ OCF_P,
+#ifdef OC_SECURITY
+ OCF_SEC_DOXM,
+ OCF_SEC_PSTAT,
+ OCF_SEC_ACL,
+ OCF_SEC_CRED,
+#endif
+ __NUM_OC_CORE_RESOURCES__
+} oc_core_resource_t;
+
+#define NUM_OC_CORE_RESOURCES (__NUM_OC_CORE_RESOURCES__ + MAX_NUM_DEVICES)
+
+typedef struct oc_resource_s oc_resource_t;
+
+typedef struct
+{
+ oc_endpoint_t *origin;
+ oc_resource_t *resource;
+ const char *query;
+ int query_len;
+ oc_rep_t *request_payload;
+ oc_response_t *response;
+} oc_request_t;
+
+typedef void (*oc_request_handler_t)(oc_request_t *, oc_interface_mask_t);
+
+typedef struct oc_resource_s
+{
+ struct oc_resource_s *next;
+ int device;
+ oc_string_t uri;
+ oc_string_array_t types;
+ oc_interface_mask_t interfaces;
+ oc_interface_mask_t default_interface;
+ oc_resource_properties_t properties;
+ oc_request_handler_t get_handler;
+ oc_request_handler_t put_handler;
+ oc_request_handler_t post_handler;
+ oc_request_handler_t delete_handler;
+ uint16_t observe_period_seconds;
+ uint8_t num_observers;
+} oc_resource_t;
+
+typedef enum { DONE = 0, CONTINUE } oc_event_callback_retval_t;
+
+typedef oc_event_callback_retval_t (*oc_trigger_t)(void *);
+
+typedef struct oc_event_callback_s
+{
+ struct oc_event_callback_s *next;
+ struct oc_etimer timer;
+ oc_trigger_t callback;
+ void *data;
+} oc_event_callback_t;
+
+void oc_ri_init(void);
+
+void oc_ri_shutdown(void);
+
+void oc_ri_add_timed_event_callback_ticks(void *cb_data,
+ oc_trigger_t event_callback,
+ oc_clock_time_t ticks);
+
+#define oc_ri_add_timed_event_callback_seconds(cb_data, event_callback, \
+ seconds) \
+ do { \
+ oc_ri_add_timed_event_callback_ticks( \
+ cb_data, event_callback, (oc_clock_time_t)(seconds * OC_CLOCK_SECOND)); \
+ } while (0)
+
+void oc_ri_remove_timed_event_callback(void *cb_data,
+ oc_trigger_t event_callback);
+
+int oc_status_code(oc_status_t key);
+
+oc_resource_t *oc_ri_get_app_resource_by_uri(const char *uri);
+
+oc_resource_t *oc_ri_get_app_resources(void);
+
+#ifdef OC_SERVER
+oc_resource_t *oc_ri_alloc_resource(void);
+bool oc_ri_add_resource(oc_resource_t *resource);
+void oc_ri_delete_resource(oc_resource_t *resource);
+#endif
+
+int oc_ri_get_query_nth_key_value(const char *query, int query_len, char **key,
+ int *key_len, char **value, int *value_len,
+ int n);
+int oc_ri_get_query_value(const char *query, int query_len, const char *key,
+ char **value);
+
+oc_interface_mask_t oc_ri_get_interface_mask(char *iface, int if_len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_RI_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/include/oic/oc_uuid.h
----------------------------------------------------------------------
diff --git a/net/oic/include/oic/oc_uuid.h b/net/oic/include/oic/oc_uuid.h
new file mode 100644
index 0000000..03a8740
--- /dev/null
+++ b/net/oic/include/oic/oc_uuid.h
@@ -0,0 +1,39 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#ifndef OC_UUID_H
+#define OC_UUID_H
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct
+{
+ uint8_t id[16];
+} oc_uuid_t;
+
+void oc_str_to_uuid(const char *str, oc_uuid_t *uuid);
+void oc_uuid_to_str(const oc_uuid_t *uuid, char *buffer, int buflen);
+void oc_gen_uuid(oc_uuid_t *uuid);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* OC_UUID_H */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/pkg.yml
----------------------------------------------------------------------
diff --git a/net/oic/pkg.yml b/net/oic/pkg.yml
new file mode 100644
index 0000000..0843be5
--- /dev/null
+++ b/net/oic/pkg.yml
@@ -0,0 +1,51 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+pkg.name: net/oic
+pkg.description: OCF contstrained iotivity stack
+pkg.author: "https://github.com/iotivity/iotivity-constrained"
+pkg.homepage: "https://www.iotivity.org/"
+pkg.keywords:
+
+pkg.deps:
+ - "@apache-mynewt-core/encoding/tinycbor"
+ - "@apache-mynewt-core/kernel/os"
+ - "@apache-mynewt-core/sys/log"
+
+pkg.deps.OC_TRANSPORT_GATT:
+ - "@apache-mynewt-core/net/nimble/host"
+ - "@apache-mynewt-core/net/nimble/host/services/gap"
+ - "@apache-mynewt-core/net/nimble/host/services/gatt"
+
+pkg.deps.OC_TRANSPORT_IP:
+ - "@apache-mynewt-core/net/ip/mn_socket"
+
+pkg.deps.OC_TRANSPORT_SERIAL:
+ - "@apache-mynewt-core/sys/shell"
+
+# remove debug option to save logging
+pkg.cflags:
+ - -std=c99
+ - -DSECURE=0
+ - -I./port/mynewt
+ - -I../port/mynewt
+ - -I../../port/mynewt
+ - -I../include/oic
+ - -I../../include/oic
+ - -I../../../include/oic
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/src/api/oc_buffer.c
----------------------------------------------------------------------
diff --git a/net/oic/src/api/oc_buffer.c b/net/oic/src/api/oc_buffer.c
new file mode 100644
index 0000000..e623221
--- /dev/null
+++ b/net/oic/src/api/oc_buffer.c
@@ -0,0 +1,138 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#include "messaging/coap/engine.h"
+#include "port/oc_signal_main_loop.h"
+#include "util/oc_memb.h"
+#include <stdint.h>
+#include <stdio.h>
+
+#ifdef OC_SECURITY
+#include "security/oc_dtls.h"
+#endif
+
+#include "config.h"
+#include "oc_buffer.h"
+#include "oc_events.h"
+
+OC_PROCESS(message_buffer_handler, "OC Message Buffer Handler");
+OC_MEMB(oc_buffers_s, oc_message_t, (MAX_NUM_CONCURRENT_REQUESTS * 2));
+
+oc_message_t *
+oc_allocate_message(void)
+{
+ oc_message_t *message = (oc_message_t *)oc_memb_alloc(&oc_buffers_s);
+ if (message) {
+ message->length = 0;
+ message->next = 0;
+ message->ref_count = 1;
+ LOG("buffer: Allocated TX/RX buffer; num free: %d\n",
+ oc_memb_numfree(&oc_buffers_s));
+ } else
+ LOG("buffer: No free TX/RX buffers!\n");
+ return message;
+}
+
+void
+oc_message_add_ref(oc_message_t *message)
+{
+ if (message)
+ message->ref_count++;
+}
+
+void
+oc_message_unref(oc_message_t *message)
+{
+ if (message) {
+ message->ref_count--;
+ if (message->ref_count == 0) {
+ oc_memb_free(&oc_buffers_s, message);
+ LOG("buffer: freed TX/RX buffer; num free: %d\n",
+ oc_memb_numfree(&oc_buffers_s));
+ }
+ }
+}
+
+void
+oc_recv_message(oc_message_t *message)
+{
+ oc_process_post(&message_buffer_handler, oc_events[INBOUND_NETWORK_EVENT],
+ message);
+}
+
+void
+oc_send_message(oc_message_t *message)
+{
+ oc_process_post(&message_buffer_handler, oc_events[OUTBOUND_NETWORK_EVENT],
+ message);
+
+ oc_signal_main_loop();
+}
+
+OC_PROCESS_THREAD(message_buffer_handler, ev, data)
+{
+ OC_PROCESS_BEGIN();
+ LOG("Started buffer handler process\n");
+ while (1) {
+ OC_PROCESS_YIELD();
+
+ if (ev == oc_events[INBOUND_NETWORK_EVENT]) {
+#ifdef OC_SECURITY
+ uint8_t b = (uint8_t)((oc_message_t *)data)->data[0];
+ if (b > 19 && b < 64) {
+ LOG("Inbound network event: encrypted request\n");
+ oc_process_post(&oc_dtls_handler, oc_events[UDP_TO_DTLS_EVENT], data);
+ } else {
+ LOG("Inbound network event: decrypted request\n");
+ oc_process_post(&coap_engine, oc_events[INBOUND_RI_EVENT], data);
+ }
+#else
+ LOG("Inbound network event: decrypted request\n");
+ oc_process_post(&coap_engine, oc_events[INBOUND_RI_EVENT], data);
+#endif
+ } else if (ev == oc_events[OUTBOUND_NETWORK_EVENT]) {
+ oc_message_t *message = (oc_message_t *)data;
+
+#ifdef OC_CLIENT
+ if (message->endpoint.flags & MULTICAST) {
+ LOG("Outbound network event: multicast request\n");
+ oc_send_multicast_message(message);
+ oc_message_unref(message);
+ } else
+#endif
+#ifdef OC_SECURITY
+ if (message->endpoint.flags & SECURED) {
+ LOG("Outbound network event: forwarding to DTLS\n");
+
+ if (!oc_sec_dtls_connected(&message->endpoint)) {
+ LOG("Posting INIT_DTLS_CONN_EVENT\n");
+ oc_process_post(&oc_dtls_handler, oc_events[INIT_DTLS_CONN_EVENT],
+ data);
+ } else {
+ LOG("Posting RI_TO_DTLS_EVENT\n");
+ oc_process_post(&oc_dtls_handler, oc_events[RI_TO_DTLS_EVENT], data);
+ }
+ } else
+#endif
+ {
+ LOG("Outbound network event: unicast message\n");
+ oc_send_buffer(message);
+ oc_message_unref(message);
+ }
+ }
+ }
+ OC_PROCESS_END();
+}
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/src/api/oc_client_api.c
----------------------------------------------------------------------
diff --git a/net/oic/src/api/oc_client_api.c b/net/oic/src/api/oc_client_api.c
new file mode 100644
index 0000000..bd73da3
--- /dev/null
+++ b/net/oic/src/api/oc_client_api.c
@@ -0,0 +1,287 @@
+/*
+// Copyright (c) 2016 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+
+#include "messaging/coap/coap.h"
+#include "messaging/coap/transactions.h"
+#include "oc_api.h"
+
+#ifdef OC_CLIENT
+#define OC_CLIENT_CB_TIMEOUT_SECS COAP_RESPONSE_TIMEOUT
+
+static oc_message_t *message;
+static coap_transaction_t *transaction;
+coap_packet_t request[1];
+
+static bool
+dispatch_coap_request(void)
+{
+ int response_length = oc_rep_finalize();
+ if (!transaction) {
+ if (message) {
+ if (response_length) {
+ coap_set_payload(request, message->data + COAP_MAX_HEADER_SIZE,
+ response_length);
+ coap_set_header_content_format(request, APPLICATION_CBOR);
+ }
+ message->length = coap_serialize_message(request, message->data);
+ coap_send_message(message);
+ message = 0;
+ return true;
+ }
+ } else {
+ if (response_length) {
+ coap_set_payload(request,
+ transaction->message->data + COAP_MAX_HEADER_SIZE,
+ response_length);
+ coap_set_header_content_format(request, APPLICATION_CBOR);
+ }
+ transaction->message->length =
+ coap_serialize_message(request, transaction->message->data);
+ coap_send_transaction(transaction);
+ transaction = 0;
+ return true;
+ }
+ return false;
+}
+
+static bool
+prepare_coap_request(oc_client_cb_t *cb, oc_string_t *query)
+{
+ coap_message_type_t type = COAP_TYPE_NON;
+
+ if (cb->qos == HIGH_QOS) {
+ type = COAP_TYPE_CON;
+ transaction = coap_new_transaction(cb->mid, &cb->server.endpoint);
+ if (!transaction)
+ return false;
+ oc_rep_new(transaction->message->data + COAP_MAX_HEADER_SIZE,
+ COAP_MAX_BLOCK_SIZE);
+ } else {
+ message = oc_allocate_message();
+ if (!message)
+ return false;
+ memcpy(&message->endpoint, &cb->server.endpoint, sizeof(oc_endpoint_t));
+ oc_rep_new(message->data + COAP_MAX_HEADER_SIZE, COAP_MAX_BLOCK_SIZE);
+ }
+
+ coap_init_message(request, type, cb->method, cb->mid);
+
+ coap_set_header_accept(request, APPLICATION_CBOR);
+
+ coap_set_token(request, cb->token, cb->token_len);
+
+ coap_set_header_uri_path(request, oc_string(cb->uri));
+
+ if (cb->observe_seq != -1)
+ coap_set_header_observe(request, cb->observe_seq);
+
+ if (query && oc_string_len(*query))
+ coap_set_header_uri_query(request, oc_string(*query));
+
+ if (cb->observe_seq == -1 && cb->qos == LOW_QOS) {
+ extern oc_event_callback_retval_t oc_ri_remove_client_cb(void *data);
+
+ oc_set_delayed_callback(cb, &oc_ri_remove_client_cb,
+ OC_CLIENT_CB_TIMEOUT_SECS);
+ }
+
+ return true;
+}
+
+bool
+oc_do_delete(const char *uri, oc_server_handle_t *server,
+ oc_response_handler_t handler, oc_qos_t qos)
+{
+ oc_client_cb_t *cb =
+ oc_ri_alloc_client_cb(uri, server, OC_DELETE, handler, qos);
+ if (!cb)
+ return false;
+
+ bool status = false;
+
+ status = prepare_coap_request(cb, NULL);
+
+ if (status)
+ status = dispatch_coap_request();
+
+ return status;
+}
+
+bool
+oc_do_get(const char *uri, oc_server_handle_t *server, const char *query,
+ oc_response_handler_t handler, oc_qos_t qos)
+{
+ oc_client_cb_t *cb = oc_ri_alloc_client_cb(uri, server, OC_GET, handler, qos);
+ if (!cb)
+ return false;
+
+ bool status = false;
+
+ if (query && strlen(query)) {
+ oc_string_t q;
+ oc_concat_strings(&q, "?", query);
+ status = prepare_coap_request(cb, &q);
+ oc_free_string(&q);
+ } else {
+ status = prepare_coap_request(cb, NULL);
+ }
+
+ if (status)
+ status = dispatch_coap_request();
+
+ return status;
+}
+
+bool
+oc_init_put(const char *uri, oc_server_handle_t *server, const char *query,
+ oc_response_handler_t handler, oc_qos_t qos)
+{
+ oc_client_cb_t *cb = oc_ri_alloc_client_cb(uri, server, OC_PUT, handler, qos);
+ if (!cb)
+ return false;
+
+ bool status = false;
+
+ if (query && strlen(query)) {
+ oc_string_t q;
+ oc_concat_strings(&q, "?", query);
+ status = prepare_coap_request(cb, &q);
+ oc_free_string(&q);
+ } else {
+ status = prepare_coap_request(cb, NULL);
+ }
+
+ return status;
+}
+
+bool
+oc_init_post(const char *uri, oc_server_handle_t *server, const char *query,
+ oc_response_handler_t handler, oc_qos_t qos)
+{
+ oc_client_cb_t *cb =
+ oc_ri_alloc_client_cb(uri, server, OC_POST, handler, qos);
+ if (!cb)
+ return false;
+
+ bool status = false;
+
+ if (query && strlen(query)) {
+ oc_string_t q;
+ oc_concat_strings(&q, "?", query);
+ status = prepare_coap_request(cb, &q);
+ oc_free_string(&q);
+ } else {
+ status = prepare_coap_request(cb, NULL);
+ }
+
+ return status;
+}
+
+bool
+oc_do_put(void)
+{
+ return dispatch_coap_request();
+}
+
+bool
+oc_do_post(void)
+{
+ return dispatch_coap_request();
+}
+
+bool
+oc_do_observe(const char *uri, oc_server_handle_t *server, const char *query,
+ oc_response_handler_t handler, oc_qos_t qos)
+{
+ oc_client_cb_t *cb = oc_ri_alloc_client_cb(uri, server, OC_GET, handler, qos);
+ if (!cb)
+ return false;
+
+ cb->observe_seq = 0;
+
+ bool status = false;
+
+ if (query && strlen(query)) {
+ oc_string_t q;
+ oc_concat_strings(&q, "?", query);
+ status = prepare_coap_request(cb, &q);
+ oc_free_string(&q);
+ } else {
+ status = prepare_coap_request(cb, NULL);
+ }
+
+ if (status)
+ status = dispatch_coap_request();
+
+ return status;
+}
+
+bool
+oc_stop_observe(const char *uri, oc_server_handle_t *server)
+{
+ oc_client_cb_t *cb = oc_ri_get_client_cb(uri, server, OC_GET);
+
+ if (!cb)
+ return false;
+
+ cb->observe_seq = 1;
+
+ bool status = false;
+
+ status = prepare_coap_request(cb, NULL);
+
+ if (status)
+ status = dispatch_coap_request();
+
+ return status;
+}
+
+bool
+oc_do_ip_discovery(const char *rt, oc_discovery_cb_t handler)
+{
+ oc_make_ip_endpoint(mcast, IP | MULTICAST, 5683, 0xff, 0x02, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0xfd);
+ mcast.ipv6_addr.scope = 0;
+
+ oc_server_handle_t handle;
+ memcpy(&handle.endpoint, &mcast, sizeof(oc_endpoint_t));
+
+ oc_client_cb_t *cb =
+ oc_ri_alloc_client_cb("/oic/res", &handle, OC_GET, handler, LOW_QOS);
+
+ if (!cb)
+ return false;
+
+ cb->discovery = true;
+
+ bool status = false;
+
+ oc_string_t query;
+
+ if (rt && strlen(rt) > 0) {
+ oc_concat_strings(&query, "if=oic.if.ll&rt=", rt);
+ } else {
+ oc_new_string(&query, "if=oic.if.ll");
+ }
+ status = prepare_coap_request(cb, &query);
+ oc_free_string(&query);
+
+ if (status)
+ status = dispatch_coap_request();
+
+ return status;
+}
+#endif /* OC_CLIENT */
http://git-wip-us.apache.org/repos/asf/incubator-mynewt-core/blob/f88168c2/net/oic/src/api/oc_core_res.c
----------------------------------------------------------------------
diff --git a/net/oic/src/api/oc_core_res.c b/net/oic/src/api/oc_core_res.c
new file mode 100644
index 0000000..ced0f88
--- /dev/null
+++ b/net/oic/src/api/oc_core_res.c
@@ -0,0 +1,280 @@
+/*
+ // Copyright (c) 2016 Intel Corporation
+ //
+ // Licensed under the Apache License, Version 2.0 (the "License");
+ // you may not use this file except in compliance with the License.
+ // You may obtain a copy of the License at
+ //
+ // http://www.apache.org/licenses/LICENSE-2.0
+ //
+ // Unless required by applicable law or agreed to in writing, software
+ // distributed under the License is distributed on an "AS IS" BASIS,
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ // See the License for the specific language governing permissions and
+ // limitations under the License.
+ */
+
+#include "oc_core_res.h"
+#include "messaging/coap/oc_coap.h"
+#include "oc_rep.h"
+#include "oc_ri.h"
+
+#ifdef OC_SECURITY
+#include "security/oc_pstat.h"
+#endif /* OC_SECURITY */
+
+static oc_resource_t core_resources[NUM_OC_CORE_RESOURCES];
+struct oc_device_info_t
+{
+ oc_uuid_t uuid;
+ oc_string_t payload;
+} oc_device_info[MAX_NUM_DEVICES];
+static int device_count;
+static oc_string_t oc_platform_payload;
+
+void
+oc_core_encode_interfaces_mask(CborEncoder *parent,
+ oc_interface_mask_t interface)
+{
+ oc_rep_set_key((*parent), "if");
+ oc_rep_start_array((*parent), if);
+ if (interface & OC_IF_LL) {
+ oc_rep_add_text_string(if, OC_RSRVD_IF_LL);
+ }
+ if (interface & OC_IF_B) {
+ oc_rep_add_text_string(if, OC_RSRVD_IF_B);
+ }
+ if (interface & OC_IF_R) {
+ oc_rep_add_text_string(if, OC_RSRVD_IF_R);
+ }
+ if (interface & OC_IF_RW) {
+ oc_rep_add_text_string(if, OC_RSRVD_IF_RW);
+ }
+ if (interface & OC_IF_A) {
+ oc_rep_add_text_string(if, OC_RSRVD_IF_A);
+ }
+ if (interface & OC_IF_S) {
+ oc_rep_add_text_string(if, OC_RSRVD_IF_S);
+ }
+ oc_rep_add_text_string(if, OC_RSRVD_IF_BASELINE);
+ oc_rep_end_array((*parent), if);
+}
+
+static void
+oc_core_device_handler(oc_request_t *request, oc_interface_mask_t interface)
+{
+ uint8_t *buffer = request->response->response_buffer->buffer;
+ uint16_t buffer_size = request->response->response_buffer->buffer_size;
+ int payload_size = oc_device_info[request->resource->device].payload.size;
+
+ if (buffer_size < payload_size) {
+ request->response->response_buffer->response_length = 0;
+ request->response->response_buffer->code =
+ oc_status_code(OC_STATUS_INTERNAL_SERVER_ERROR);
+ return;
+ }
+
+ switch (interface) {
+ case OC_IF_R:
+ case OC_IF_BASELINE:
+ memcpy(buffer,
+ oc_cast(oc_device_info[request->resource->device].payload, uint8_t),
+ payload_size);
+ request->response->response_buffer->response_length = payload_size;
+ request->response->response_buffer->code = oc_status_code(OC_STATUS_OK);
+ break;
+ default:
+ break;
+ }
+}
+
+int
+oc_core_get_num_devices(void)
+{
+ return device_count;
+}
+
+static int
+finalize_payload(oc_string_t *temp_buffer, oc_string_t *payload)
+{
+ oc_rep_end_root_object();
+ int size = oc_rep_finalize();
+ if (size != -1) {
+ oc_alloc_string(payload, size);
+ memcpy(oc_cast(*payload, uint8_t), oc_cast(*temp_buffer, uint8_t), size);
+ oc_free_string(temp_buffer);
+ return 1;
+ }
+
+ oc_free_string(temp_buffer);
+ return -1;
+}
+
+oc_string_t *
+oc_core_add_new_device(const char *uri, const char *rt, const char *name,
+ const char *spec_version, const char *data_model_version,
+ oc_core_add_device_cb_t add_device_cb, void *data)
+{
+ if (device_count == MAX_NUM_DEVICES)
+ return false;
+
+ oc_string_t temp_buffer;
+/* Once provisioned, UUID is retrieved from the credential store.
+ If not yet provisioned, a default is generated in the security
+ layer.
+*/
+#ifdef OC_SECURITY /*fix if add new devices after provisioning, need to reset \
+ or it will generate non-standard uuid */
+ /* where are secondary device ids persisted? */
+ if (!oc_sec_provisioned() && device_count > 0)
+ oc_gen_uuid(&oc_device_info[device_count].uuid);
+#else
+ oc_gen_uuid(&oc_device_info[device_count].uuid);
+#endif
+
+ int ocf_d = NUM_OC_CORE_RESOURCES - 1 - device_count;
+
+ /* Construct device resource */
+ oc_core_populate_resource(ocf_d, uri, rt, OC_IF_R | OC_IF_BASELINE,
+ OC_IF_BASELINE, OC_ACTIVE | OC_DISCOVERABLE,
+ oc_core_device_handler, 0, 0, 0, device_count);
+
+ /* Encoding device resource payload */
+ oc_alloc_string(&temp_buffer, MAX_DEVICE_PAYLOAD_SIZE);
+ oc_rep_new(oc_cast(temp_buffer, uint8_t), MAX_DEVICE_PAYLOAD_SIZE);
+
+ oc_rep_start_root_object();
+
+ oc_rep_set_string_array(root, rt, core_resources[ocf_d].types);
+ oc_core_encode_interfaces_mask(oc_rep_object(root),
+ core_resources[ocf_d].interfaces);
+ oc_rep_set_uint(root, p, core_resources[ocf_d].properties);
+
+ char uuid[37];
+ oc_uuid_to_str(&oc_device_info[device_count].uuid, uuid, 37);
+ oc_rep_set_text_string(root, di, uuid);
+ oc_rep_set_text_string(root, n, name);
+ oc_rep_set_text_string(root, icv, spec_version);
+ oc_rep_set_text_string(root, dmv, data_model_version);
+
+ if (add_device_cb)
+ add_device_cb(data);
+ if (!finalize_payload(&temp_buffer, &oc_device_info[device_count].payload))
+ return NULL;
+
+ return &oc_device_info[device_count++].payload;
+}
+
+void
+oc_core_platform_handler(oc_request_t *request, oc_interface_mask_t interface)
+{
+ uint8_t *buffer = request->response->response_buffer->buffer;
+ uint16_t buffer_size = request->response->response_buffer->buffer_size;
+ int payload_size = oc_platform_payload.size;
+
+ if (buffer_size < payload_size) {
+ request->response->response_buffer->response_length = 0;
+ request->response->response_buffer->code =
+ oc_status_code(OC_STATUS_INTERNAL_SERVER_ERROR);
+ return;
+ }
+
+ switch (interface) {
+ case OC_IF_R:
+ case OC_IF_BASELINE:
+ memcpy(buffer, oc_cast(oc_platform_payload, uint8_t), payload_size);
+ request->response->response_buffer->response_length = payload_size;
+ request->response->response_buffer->code = oc_status_code(OC_STATUS_OK);
+ break;
+ default:
+ break;
+ }
+}
+
+oc_string_t *
+oc_core_init_platform(const char *mfg_name, oc_core_init_platform_cb_t init_cb,
+ void *data)
+{
+ if (oc_platform_payload.size > 0)
+ return NULL;
+
+ oc_string_t temp_buffer;
+ /* Populating resource obuject */
+ oc_core_populate_resource(OCF_P, OC_RSRVD_PLATFORM_URI, "oic.wk.p",
+ OC_IF_R | OC_IF_BASELINE, OC_IF_BASELINE,
+ OC_ACTIVE | OC_DISCOVERABLE,
+ oc_core_platform_handler, 0, 0, 0, 0);
+
+ /* Encoding platform resource payload */
+ oc_alloc_string(&temp_buffer, MAX_PLATFORM_PAYLOAD_SIZE);
+ oc_rep_new(oc_cast(temp_buffer, uint8_t), MAX_PLATFORM_PAYLOAD_SIZE);
+ oc_rep_start_root_object();
+ oc_rep_set_string_array(root, rt, core_resources[OCF_P].types);
+
+ oc_core_encode_interfaces_mask(oc_rep_object(root),
+ core_resources[OCF_P].interfaces);
+ oc_rep_set_uint(root, p, core_resources[OCF_P].properties & ~OC_PERIODIC);
+
+ oc_uuid_t uuid; /*fix uniqueness of platform id?? */
+ oc_gen_uuid(&uuid);
+ char uuid_str[37];
+
+ oc_uuid_to_str(&uuid, uuid_str, 37);
+ oc_rep_set_text_string(root, pi, uuid_str);
+ oc_rep_set_text_string(root, mnmn, mfg_name);
+
+ if (init_cb)
+ init_cb(data);
+
+ if (!finalize_payload(&temp_buffer, &oc_platform_payload))
+ return NULL;
+
+ return &oc_platform_payload;
+}
+
+void
+oc_core_populate_resource(int type, const char *uri, const char *rt,
+ oc_interface_mask_t interfaces,
+ oc_interface_mask_t default_interface,
+ oc_resource_properties_t properties,
+ oc_request_handler_t get, oc_request_handler_t put,
+ oc_request_handler_t post,
+ oc_request_handler_t delete, int device)
+{
+ oc_resource_t *r = &core_resources[type];
+ r->device = device;
+ oc_new_string(&r->uri, uri);
+ r->properties = properties;
+ oc_new_string_array(&r->types, 1);
+ oc_string_array_add_item(r->types, rt);
+ r->interfaces = interfaces;
+ r->default_interface = default_interface;
+ r->get_handler = get;
+ r->put_handler = put;
+ r->post_handler = post;
+ r->delete_handler = delete;
+}
+
+oc_uuid_t *
+oc_core_get_device_id(int device)
+{
+ return &oc_device_info[device].uuid;
+}
+
+oc_resource_t *
+oc_core_get_resource_by_index(int type)
+{
+ return &core_resources[type];
+}
+
+oc_resource_t *
+oc_core_get_resource_by_uri(const char *uri)
+{
+ int i;
+ for (i = 0; i < NUM_OC_CORE_RESOURCES; i++) {
+ if (oc_string_len(core_resources[i].uri) == strlen(uri) &&
+ strncmp(uri, oc_string(core_resources[i].uri), strlen(uri)) == 0)
+ return &core_resources[i];
+ }
+ return NULL;
+}