Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
wakaama/objects.c@3:a280069151ac, 2017-04-28 (annotated)
- Committer:
- terence zhang
- Date:
- Fri Apr 28 18:13:27 2017 +0800
- Revision:
- 3:a280069151ac
- Parent:
- 0:f9d13e09cf11
- Child:
- 15:d0f20339c1ad
update and merge wakaama to the latest version.
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| terencez | 0:f9d13e09cf11 | 1 | /******************************************************************************* |
| terencez | 0:f9d13e09cf11 | 2 | * |
| terencez | 0:f9d13e09cf11 | 3 | * Copyright (c) 2013, 2014 Intel Corporation and others. |
| terencez | 0:f9d13e09cf11 | 4 | * All rights reserved. This program and the accompanying materials |
| terencez | 0:f9d13e09cf11 | 5 | * are made available under the terms of the Eclipse Public License v1.0 |
| terencez | 0:f9d13e09cf11 | 6 | * and Eclipse Distribution License v1.0 which accompany this distribution. |
| terencez | 0:f9d13e09cf11 | 7 | * |
| terencez | 0:f9d13e09cf11 | 8 | * The Eclipse Public License is available at |
| terencez | 0:f9d13e09cf11 | 9 | * http://www.eclipse.org/legal/epl-v10.html |
| terencez | 0:f9d13e09cf11 | 10 | * The Eclipse Distribution License is available at |
| terencez | 0:f9d13e09cf11 | 11 | * http://www.eclipse.org/org/documents/edl-v10.php. |
| terencez | 0:f9d13e09cf11 | 12 | * |
| terencez | 0:f9d13e09cf11 | 13 | * Contributors: |
| terencez | 0:f9d13e09cf11 | 14 | * David Navarro, Intel Corporation - initial API and implementation |
| terencez | 0:f9d13e09cf11 | 15 | * Fabien Fleutot - Please refer to git log |
| terencez | 0:f9d13e09cf11 | 16 | * Toby Jaffey - Please refer to git log |
| terencez | 0:f9d13e09cf11 | 17 | * Benjamin Cabé - Please refer to git log |
| terence zhang | 3:a280069151ac | 18 | * Bosch Software Innovations GmbH - Please refer to git log |
| terence zhang | 3:a280069151ac | 19 | * Pascal Rieux - Please refer to git log |
| terencez | 0:f9d13e09cf11 | 20 | * |
| terencez | 0:f9d13e09cf11 | 21 | *******************************************************************************/ |
| terencez | 0:f9d13e09cf11 | 22 | |
| terencez | 0:f9d13e09cf11 | 23 | /* |
| terencez | 0:f9d13e09cf11 | 24 | Copyright (c) 2013, 2014 Intel Corporation |
| terencez | 0:f9d13e09cf11 | 25 | |
| terencez | 0:f9d13e09cf11 | 26 | Redistribution and use in source and binary forms, with or without modification, |
| terencez | 0:f9d13e09cf11 | 27 | are permitted provided that the following conditions are met: |
| terencez | 0:f9d13e09cf11 | 28 | |
| terencez | 0:f9d13e09cf11 | 29 | * Redistributions of source code must retain the above copyright notice, |
| terencez | 0:f9d13e09cf11 | 30 | this list of conditions and the following disclaimer. |
| terencez | 0:f9d13e09cf11 | 31 | * Redistributions in binary form must reproduce the above copyright notice, |
| terencez | 0:f9d13e09cf11 | 32 | this list of conditions and the following disclaimer in the documentation |
| terencez | 0:f9d13e09cf11 | 33 | and/or other materials provided with the distribution. |
| terencez | 0:f9d13e09cf11 | 34 | * Neither the name of Intel Corporation nor the names of its contributors |
| terencez | 0:f9d13e09cf11 | 35 | may be used to endorse or promote products derived from this software |
| terencez | 0:f9d13e09cf11 | 36 | without specific prior written permission. |
| terencez | 0:f9d13e09cf11 | 37 | |
| terencez | 0:f9d13e09cf11 | 38 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
| terencez | 0:f9d13e09cf11 | 39 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| terencez | 0:f9d13e09cf11 | 40 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| terencez | 0:f9d13e09cf11 | 41 | IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, |
| terencez | 0:f9d13e09cf11 | 42 | INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
| terencez | 0:f9d13e09cf11 | 43 | BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| terencez | 0:f9d13e09cf11 | 44 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| terencez | 0:f9d13e09cf11 | 45 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| terencez | 0:f9d13e09cf11 | 46 | OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| terencez | 0:f9d13e09cf11 | 47 | THE POSSIBILITY OF SUCH DAMAGE. |
| terencez | 0:f9d13e09cf11 | 48 | |
| terencez | 0:f9d13e09cf11 | 49 | David Navarro <david.navarro@intel.com> |
| terencez | 0:f9d13e09cf11 | 50 | |
| terencez | 0:f9d13e09cf11 | 51 | */ |
| terencez | 0:f9d13e09cf11 | 52 | #include "internals.h" |
| terencez | 0:f9d13e09cf11 | 53 | |
| terencez | 0:f9d13e09cf11 | 54 | #ifdef LWM2M_CLIENT_MODE |
| terence zhang | 3:a280069151ac | 55 | |
| terence zhang | 3:a280069151ac | 56 | |
| terencez | 0:f9d13e09cf11 | 57 | #include <stdlib.h> |
| terencez | 0:f9d13e09cf11 | 58 | #include <string.h> |
| terencez | 0:f9d13e09cf11 | 59 | #include <stdio.h> |
| terencez | 0:f9d13e09cf11 | 60 | |
| terencez | 0:f9d13e09cf11 | 61 | |
| terence zhang | 3:a280069151ac | 62 | uint8_t object_checkReadable(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 63 | lwm2m_uri_t * uriP) |
| terencez | 0:f9d13e09cf11 | 64 | { |
| terence zhang | 3:a280069151ac | 65 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 66 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 67 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 68 | int size; |
| terence zhang | 3:a280069151ac | 69 | |
| terence zhang | 3:a280069151ac | 70 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 71 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 72 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 73 | if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 74 | |
| terence zhang | 3:a280069151ac | 75 | if (!LWM2M_URI_IS_SET_INSTANCE(uriP)) return COAP_205_CONTENT; |
| terence zhang | 3:a280069151ac | 76 | |
| terence zhang | 3:a280069151ac | 77 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 78 | |
| terence zhang | 3:a280069151ac | 79 | if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_205_CONTENT; |
| terence zhang | 3:a280069151ac | 80 | |
| terence zhang | 3:a280069151ac | 81 | size = 1; |
| terence zhang | 3:a280069151ac | 82 | dataP = lwm2m_data_new(1); |
| terence zhang | 3:a280069151ac | 83 | if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 84 | |
| terence zhang | 3:a280069151ac | 85 | dataP->id = uriP->resourceId; |
| terence zhang | 3:a280069151ac | 86 | |
| terence zhang | 3:a280069151ac | 87 | result = targetP->readFunc(uriP->instanceId, &size, &dataP, targetP); |
| terence zhang | 3:a280069151ac | 88 | lwm2m_data_free(1, dataP); |
| terence zhang | 3:a280069151ac | 89 | |
| terence zhang | 3:a280069151ac | 90 | return result; |
| terence zhang | 3:a280069151ac | 91 | } |
| terencez | 0:f9d13e09cf11 | 92 | |
| terence zhang | 3:a280069151ac | 93 | uint8_t object_checkNumeric(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 94 | lwm2m_uri_t * uriP) |
| terence zhang | 3:a280069151ac | 95 | { |
| terence zhang | 3:a280069151ac | 96 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 97 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 98 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 99 | int size; |
| terence zhang | 3:a280069151ac | 100 | |
| terence zhang | 3:a280069151ac | 101 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 102 | if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 103 | |
| terence zhang | 3:a280069151ac | 104 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 105 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 106 | if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 107 | |
| terence zhang | 3:a280069151ac | 108 | size = 1; |
| terence zhang | 3:a280069151ac | 109 | dataP = lwm2m_data_new(1); |
| terence zhang | 3:a280069151ac | 110 | if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 111 | |
| terence zhang | 3:a280069151ac | 112 | dataP->id = uriP->resourceId; |
| terence zhang | 3:a280069151ac | 113 | |
| terence zhang | 3:a280069151ac | 114 | result = targetP->readFunc(uriP->instanceId, &size, &dataP, targetP); |
| terence zhang | 3:a280069151ac | 115 | if (result == COAP_205_CONTENT) |
| terencez | 0:f9d13e09cf11 | 116 | { |
| terence zhang | 3:a280069151ac | 117 | switch (dataP->type) |
| terencez | 0:f9d13e09cf11 | 118 | { |
| terence zhang | 3:a280069151ac | 119 | case LWM2M_TYPE_INTEGER: |
| terence zhang | 3:a280069151ac | 120 | case LWM2M_TYPE_FLOAT: |
| terence zhang | 3:a280069151ac | 121 | break; |
| terence zhang | 3:a280069151ac | 122 | default: |
| terence zhang | 3:a280069151ac | 123 | result = COAP_405_METHOD_NOT_ALLOWED; |
| terencez | 0:f9d13e09cf11 | 124 | } |
| terencez | 0:f9d13e09cf11 | 125 | } |
| terencez | 0:f9d13e09cf11 | 126 | |
| terence zhang | 3:a280069151ac | 127 | lwm2m_data_free(1, dataP); |
| terence zhang | 3:a280069151ac | 128 | |
| terence zhang | 3:a280069151ac | 129 | return result; |
| terence zhang | 3:a280069151ac | 130 | } |
| terence zhang | 3:a280069151ac | 131 | |
| terence zhang | 3:a280069151ac | 132 | coap_status_t object_readData(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 133 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 134 | int * sizeP, |
| terence zhang | 3:a280069151ac | 135 | lwm2m_data_t ** dataP) |
| terence zhang | 3:a280069151ac | 136 | { |
| terence zhang | 3:a280069151ac | 137 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 138 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 139 | |
| terence zhang | 3:a280069151ac | 140 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 141 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 142 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 143 | if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 144 | |
| terence zhang | 3:a280069151ac | 145 | if (LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terence zhang | 3:a280069151ac | 146 | { |
| terence zhang | 3:a280069151ac | 147 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 148 | |
| terence zhang | 3:a280069151ac | 149 | // single instance read |
| terence zhang | 3:a280069151ac | 150 | if (LWM2M_URI_IS_SET_RESOURCE(uriP)) |
| terence zhang | 3:a280069151ac | 151 | { |
| terence zhang | 3:a280069151ac | 152 | *sizeP = 1; |
| terence zhang | 3:a280069151ac | 153 | *dataP = lwm2m_data_new(*sizeP); |
| terence zhang | 3:a280069151ac | 154 | if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 155 | |
| terence zhang | 3:a280069151ac | 156 | (*dataP)->id = uriP->resourceId; |
| terence zhang | 3:a280069151ac | 157 | } |
| terence zhang | 3:a280069151ac | 158 | |
| terence zhang | 3:a280069151ac | 159 | result = targetP->readFunc(uriP->instanceId, sizeP, dataP, targetP); |
| terence zhang | 3:a280069151ac | 160 | } |
| terence zhang | 3:a280069151ac | 161 | else |
| terence zhang | 3:a280069151ac | 162 | { |
| terence zhang | 3:a280069151ac | 163 | // multiple object instances read |
| terence zhang | 3:a280069151ac | 164 | lwm2m_list_t * instanceP; |
| terence zhang | 3:a280069151ac | 165 | int i; |
| terence zhang | 3:a280069151ac | 166 | |
| terence zhang | 3:a280069151ac | 167 | result = COAP_205_CONTENT; |
| terence zhang | 3:a280069151ac | 168 | |
| terence zhang | 3:a280069151ac | 169 | *sizeP = 0; |
| terence zhang | 3:a280069151ac | 170 | for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) |
| terence zhang | 3:a280069151ac | 171 | { |
| terence zhang | 3:a280069151ac | 172 | (*sizeP)++; |
| terence zhang | 3:a280069151ac | 173 | } |
| terence zhang | 3:a280069151ac | 174 | |
| terence zhang | 3:a280069151ac | 175 | if (*sizeP == 0) |
| terence zhang | 3:a280069151ac | 176 | { |
| terence zhang | 3:a280069151ac | 177 | *dataP = NULL; |
| terence zhang | 3:a280069151ac | 178 | } |
| terence zhang | 3:a280069151ac | 179 | else |
| terence zhang | 3:a280069151ac | 180 | { |
| terence zhang | 3:a280069151ac | 181 | *dataP = lwm2m_data_new(*sizeP); |
| terence zhang | 3:a280069151ac | 182 | if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 183 | |
| terence zhang | 3:a280069151ac | 184 | instanceP = targetP->instanceList; |
| terence zhang | 3:a280069151ac | 185 | i = 0; |
| terence zhang | 3:a280069151ac | 186 | while (instanceP != NULL && result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 187 | { |
| terence zhang | 3:a280069151ac | 188 | result = targetP->readFunc(instanceP->id, (int*)&((*dataP)[i].value.asChildren.count), &((*dataP)[i].value.asChildren.array), targetP); |
| terence zhang | 3:a280069151ac | 189 | (*dataP)[i].type = LWM2M_TYPE_OBJECT_INSTANCE; |
| terence zhang | 3:a280069151ac | 190 | (*dataP)[i].id = instanceP->id; |
| terence zhang | 3:a280069151ac | 191 | i++; |
| terence zhang | 3:a280069151ac | 192 | instanceP = instanceP->next; |
| terence zhang | 3:a280069151ac | 193 | } |
| terence zhang | 3:a280069151ac | 194 | } |
| terence zhang | 3:a280069151ac | 195 | } |
| terence zhang | 3:a280069151ac | 196 | |
| terence zhang | 3:a280069151ac | 197 | LOG_ARG("result: %u.%2u, size: %d", (result & 0xFF) >> 5, (result & 0x1F), *sizeP); |
| terence zhang | 3:a280069151ac | 198 | return result; |
| terencez | 0:f9d13e09cf11 | 199 | } |
| terencez | 0:f9d13e09cf11 | 200 | |
| terencez | 0:f9d13e09cf11 | 201 | coap_status_t object_read(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 202 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 203 | lwm2m_media_type_t * formatP, |
| terence zhang | 3:a280069151ac | 204 | uint8_t ** bufferP, |
| terence zhang | 3:a280069151ac | 205 | size_t * lengthP) |
| terencez | 0:f9d13e09cf11 | 206 | { |
| terencez | 0:f9d13e09cf11 | 207 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 208 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 209 | int size = 0; |
| terence zhang | 3:a280069151ac | 210 | int res; |
| terencez | 0:f9d13e09cf11 | 211 | |
| terence zhang | 3:a280069151ac | 212 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 213 | result = object_readData(contextP, uriP, &size, &dataP); |
| terencez | 0:f9d13e09cf11 | 214 | |
| terence zhang | 3:a280069151ac | 215 | if (result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 216 | { |
| terence zhang | 3:a280069151ac | 217 | res = lwm2m_data_serialize(uriP, size, dataP, formatP, bufferP); |
| terence zhang | 3:a280069151ac | 218 | if (res < 0) |
| terence zhang | 3:a280069151ac | 219 | { |
| terence zhang | 3:a280069151ac | 220 | result = COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 221 | } |
| terence zhang | 3:a280069151ac | 222 | else |
| terence zhang | 3:a280069151ac | 223 | { |
| terence zhang | 3:a280069151ac | 224 | *lengthP = (size_t)res; |
| terencez | 0:f9d13e09cf11 | 225 | } |
| terencez | 0:f9d13e09cf11 | 226 | } |
| terence zhang | 3:a280069151ac | 227 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 228 | |
| terence zhang | 3:a280069151ac | 229 | LOG_ARG("result: %u.%2u, length: %d", (result & 0xFF) >> 5, (result & 0x1F), *lengthP); |
| terencez | 0:f9d13e09cf11 | 230 | |
| terencez | 0:f9d13e09cf11 | 231 | return result; |
| terencez | 0:f9d13e09cf11 | 232 | } |
| terencez | 0:f9d13e09cf11 | 233 | |
| terencez | 0:f9d13e09cf11 | 234 | coap_status_t object_write(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 235 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 236 | lwm2m_media_type_t format, |
| terence zhang | 3:a280069151ac | 237 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 238 | size_t length) |
| terencez | 0:f9d13e09cf11 | 239 | { |
| terence zhang | 3:a280069151ac | 240 | coap_status_t result = NO_ERROR; |
| terence zhang | 3:a280069151ac | 241 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 242 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 243 | int size = 0; |
| terencez | 0:f9d13e09cf11 | 244 | |
| terence zhang | 3:a280069151ac | 245 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 246 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 247 | if (NULL == targetP) |
| terence zhang | 3:a280069151ac | 248 | { |
| terence zhang | 3:a280069151ac | 249 | result = COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 250 | } |
| terence zhang | 3:a280069151ac | 251 | else if (NULL == targetP->writeFunc) |
| terence zhang | 3:a280069151ac | 252 | { |
| terence zhang | 3:a280069151ac | 253 | result = COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 254 | } |
| terence zhang | 3:a280069151ac | 255 | else |
| terence zhang | 3:a280069151ac | 256 | { |
| terence zhang | 3:a280069151ac | 257 | size = lwm2m_data_parse(uriP, buffer, length, format, &dataP); |
| terence zhang | 3:a280069151ac | 258 | if (size == 0) |
| terence zhang | 3:a280069151ac | 259 | { |
| terence zhang | 3:a280069151ac | 260 | result = COAP_406_NOT_ACCEPTABLE; |
| terencez | 0:f9d13e09cf11 | 261 | } |
| terencez | 0:f9d13e09cf11 | 262 | } |
| terence zhang | 3:a280069151ac | 263 | if (result == NO_ERROR) |
| terence zhang | 3:a280069151ac | 264 | { |
| terence zhang | 3:a280069151ac | 265 | result = targetP->writeFunc(uriP->instanceId, size, dataP, targetP); |
| terence zhang | 3:a280069151ac | 266 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 267 | } |
| terence zhang | 3:a280069151ac | 268 | |
| terence zhang | 3:a280069151ac | 269 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terencez | 0:f9d13e09cf11 | 270 | |
| terencez | 0:f9d13e09cf11 | 271 | return result; |
| terencez | 0:f9d13e09cf11 | 272 | } |
| terencez | 0:f9d13e09cf11 | 273 | |
| terencez | 0:f9d13e09cf11 | 274 | coap_status_t object_execute(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 275 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 276 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 277 | size_t length) |
| terencez | 0:f9d13e09cf11 | 278 | { |
| terence zhang | 3:a280069151ac | 279 | lwm2m_object_t * targetP; |
| terencez | 0:f9d13e09cf11 | 280 | |
| terence zhang | 3:a280069151ac | 281 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 282 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 283 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 284 | if (NULL == targetP->executeFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 285 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terencez | 0:f9d13e09cf11 | 286 | |
| terence zhang | 3:a280069151ac | 287 | return targetP->executeFunc(uriP->instanceId, uriP->resourceId, buffer, length, targetP); |
| terencez | 0:f9d13e09cf11 | 288 | } |
| terencez | 0:f9d13e09cf11 | 289 | |
| terencez | 0:f9d13e09cf11 | 290 | coap_status_t object_create(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 291 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 292 | lwm2m_media_type_t format, |
| terence zhang | 3:a280069151ac | 293 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 294 | size_t length) |
| terencez | 0:f9d13e09cf11 | 295 | { |
| terence zhang | 3:a280069151ac | 296 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 297 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 298 | int size = 0; |
| terence zhang | 3:a280069151ac | 299 | uint8_t result; |
| terence zhang | 3:a280069151ac | 300 | |
| terence zhang | 3:a280069151ac | 301 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 302 | |
| terencez | 0:f9d13e09cf11 | 303 | if (length == 0 || buffer == 0) |
| terencez | 0:f9d13e09cf11 | 304 | { |
| terence zhang | 3:a280069151ac | 305 | return COAP_400_BAD_REQUEST; |
| terencez | 0:f9d13e09cf11 | 306 | } |
| terencez | 0:f9d13e09cf11 | 307 | |
| terence zhang | 3:a280069151ac | 308 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 309 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 310 | if (NULL == targetP->createFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 311 | |
| terence zhang | 3:a280069151ac | 312 | size = lwm2m_data_parse(uriP, buffer, length, format, &dataP); |
| terence zhang | 3:a280069151ac | 313 | if (size <= 0) return COAP_400_BAD_REQUEST; |
| terence zhang | 3:a280069151ac | 314 | |
| terence zhang | 3:a280069151ac | 315 | switch (dataP[0].type) |
| terencez | 0:f9d13e09cf11 | 316 | { |
| terence zhang | 3:a280069151ac | 317 | case LWM2M_TYPE_OBJECT: |
| terence zhang | 3:a280069151ac | 318 | result = COAP_400_BAD_REQUEST; |
| terence zhang | 3:a280069151ac | 319 | goto exit; |
| terencez | 0:f9d13e09cf11 | 320 | |
| terence zhang | 3:a280069151ac | 321 | case LWM2M_TYPE_OBJECT_INSTANCE: |
| terence zhang | 3:a280069151ac | 322 | if (size != 1) |
| terence zhang | 3:a280069151ac | 323 | { |
| terence zhang | 3:a280069151ac | 324 | result = COAP_400_BAD_REQUEST; |
| terence zhang | 3:a280069151ac | 325 | goto exit; |
| terence zhang | 3:a280069151ac | 326 | } |
| terence zhang | 3:a280069151ac | 327 | if (NULL != lwm2m_list_find(targetP->instanceList, dataP[0].id)) |
| terence zhang | 3:a280069151ac | 328 | { |
| terence zhang | 3:a280069151ac | 329 | // Instance already exists |
| terence zhang | 3:a280069151ac | 330 | result = COAP_406_NOT_ACCEPTABLE; |
| terence zhang | 3:a280069151ac | 331 | goto exit; |
| terence zhang | 3:a280069151ac | 332 | } |
| terence zhang | 3:a280069151ac | 333 | result = targetP->createFunc(dataP[0].id, dataP[0].value.asChildren.count, dataP[0].value.asChildren.array, targetP); |
| terence zhang | 3:a280069151ac | 334 | uriP->instanceId = dataP[0].id; |
| terence zhang | 3:a280069151ac | 335 | uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; |
| terence zhang | 3:a280069151ac | 336 | break; |
| terencez | 0:f9d13e09cf11 | 337 | |
| terencez | 0:f9d13e09cf11 | 338 | default: |
| terence zhang | 3:a280069151ac | 339 | if (!LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terencez | 0:f9d13e09cf11 | 340 | { |
| terence zhang | 3:a280069151ac | 341 | uriP->instanceId = lwm2m_list_newId(targetP->instanceList); |
| terence zhang | 3:a280069151ac | 342 | uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; |
| terence zhang | 3:a280069151ac | 343 | } |
| terence zhang | 3:a280069151ac | 344 | result = targetP->createFunc(uriP->instanceId, size, dataP, targetP); |
| terence zhang | 3:a280069151ac | 345 | break; |
| terence zhang | 3:a280069151ac | 346 | } |
| terencez | 0:f9d13e09cf11 | 347 | |
| terence zhang | 3:a280069151ac | 348 | exit: |
| terence zhang | 3:a280069151ac | 349 | lwm2m_data_free(size, dataP); |
| terencez | 0:f9d13e09cf11 | 350 | |
| terence zhang | 3:a280069151ac | 351 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terencez | 0:f9d13e09cf11 | 352 | |
| terence zhang | 3:a280069151ac | 353 | return result; |
| terencez | 0:f9d13e09cf11 | 354 | } |
| terencez | 0:f9d13e09cf11 | 355 | |
| terencez | 0:f9d13e09cf11 | 356 | coap_status_t object_delete(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 357 | lwm2m_uri_t * uriP) |
| terencez | 0:f9d13e09cf11 | 358 | { |
| terence zhang | 3:a280069151ac | 359 | lwm2m_object_t * objectP; |
| terence zhang | 3:a280069151ac | 360 | coap_status_t result; |
| terencez | 0:f9d13e09cf11 | 361 | |
| terence zhang | 3:a280069151ac | 362 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 363 | objectP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 364 | if (NULL == objectP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 365 | if (NULL == objectP->deleteFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 366 | |
| terence zhang | 3:a280069151ac | 367 | LOG("Entering"); |
| terencez | 0:f9d13e09cf11 | 368 | |
| terence zhang | 3:a280069151ac | 369 | if (LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terence zhang | 3:a280069151ac | 370 | { |
| terence zhang | 3:a280069151ac | 371 | result = objectP->deleteFunc(uriP->instanceId, objectP); |
| terence zhang | 3:a280069151ac | 372 | } |
| terence zhang | 3:a280069151ac | 373 | else |
| terence zhang | 3:a280069151ac | 374 | { |
| terence zhang | 3:a280069151ac | 375 | lwm2m_list_t * instanceP; |
| terencez | 0:f9d13e09cf11 | 376 | |
| terence zhang | 3:a280069151ac | 377 | result = COAP_202_DELETED; |
| terence zhang | 3:a280069151ac | 378 | instanceP = objectP->instanceList; |
| terence zhang | 3:a280069151ac | 379 | while (NULL != instanceP |
| terence zhang | 3:a280069151ac | 380 | && result == COAP_202_DELETED) |
| terence zhang | 3:a280069151ac | 381 | { |
| terence zhang | 3:a280069151ac | 382 | result = objectP->deleteFunc(instanceP->id, objectP); |
| terence zhang | 3:a280069151ac | 383 | instanceP = objectP->instanceList; |
| terencez | 0:f9d13e09cf11 | 384 | } |
| terencez | 0:f9d13e09cf11 | 385 | } |
| terence zhang | 3:a280069151ac | 386 | |
| terence zhang | 3:a280069151ac | 387 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terence zhang | 3:a280069151ac | 388 | |
| terence zhang | 3:a280069151ac | 389 | return result; |
| terence zhang | 3:a280069151ac | 390 | } |
| terence zhang | 3:a280069151ac | 391 | |
| terence zhang | 3:a280069151ac | 392 | coap_status_t object_discover(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 393 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 394 | lwm2m_server_t * serverP, |
| terence zhang | 3:a280069151ac | 395 | uint8_t ** bufferP, |
| terence zhang | 3:a280069151ac | 396 | size_t * lengthP) |
| terence zhang | 3:a280069151ac | 397 | { |
| terence zhang | 3:a280069151ac | 398 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 399 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 400 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 401 | int size = 0; |
| terence zhang | 3:a280069151ac | 402 | |
| terence zhang | 3:a280069151ac | 403 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 404 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 405 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 406 | if (NULL == targetP->discoverFunc) return COAP_501_NOT_IMPLEMENTED; |
| terence zhang | 3:a280069151ac | 407 | |
| terence zhang | 3:a280069151ac | 408 | if (LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terence zhang | 3:a280069151ac | 409 | { |
| terence zhang | 3:a280069151ac | 410 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 411 | |
| terence zhang | 3:a280069151ac | 412 | // single instance read |
| terence zhang | 3:a280069151ac | 413 | if (LWM2M_URI_IS_SET_RESOURCE(uriP)) |
| terence zhang | 3:a280069151ac | 414 | { |
| terence zhang | 3:a280069151ac | 415 | size = 1; |
| terence zhang | 3:a280069151ac | 416 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 417 | if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 418 | |
| terence zhang | 3:a280069151ac | 419 | dataP->id = uriP->resourceId; |
| terence zhang | 3:a280069151ac | 420 | } |
| terence zhang | 3:a280069151ac | 421 | |
| terence zhang | 3:a280069151ac | 422 | result = targetP->discoverFunc(uriP->instanceId, &size, &dataP, targetP); |
| terence zhang | 3:a280069151ac | 423 | } |
| terence zhang | 3:a280069151ac | 424 | else |
| terence zhang | 3:a280069151ac | 425 | { |
| terence zhang | 3:a280069151ac | 426 | // multiple object instances read |
| terence zhang | 3:a280069151ac | 427 | lwm2m_list_t * instanceP; |
| terence zhang | 3:a280069151ac | 428 | int i; |
| terence zhang | 3:a280069151ac | 429 | |
| terence zhang | 3:a280069151ac | 430 | result = COAP_205_CONTENT; |
| terence zhang | 3:a280069151ac | 431 | |
| terence zhang | 3:a280069151ac | 432 | size = 0; |
| terence zhang | 3:a280069151ac | 433 | for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) |
| terence zhang | 3:a280069151ac | 434 | { |
| terence zhang | 3:a280069151ac | 435 | size++; |
| terence zhang | 3:a280069151ac | 436 | } |
| terence zhang | 3:a280069151ac | 437 | |
| terence zhang | 3:a280069151ac | 438 | if (size != 0) |
| terence zhang | 3:a280069151ac | 439 | { |
| terence zhang | 3:a280069151ac | 440 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 441 | if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 442 | |
| terence zhang | 3:a280069151ac | 443 | instanceP = targetP->instanceList; |
| terence zhang | 3:a280069151ac | 444 | i = 0; |
| terence zhang | 3:a280069151ac | 445 | while (instanceP != NULL && result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 446 | { |
| terence zhang | 3:a280069151ac | 447 | result = targetP->discoverFunc(instanceP->id, (int*)&(dataP[i].value.asChildren.count), &(dataP[i].value.asChildren.array), targetP); |
| terence zhang | 3:a280069151ac | 448 | dataP[i].type = LWM2M_TYPE_OBJECT_INSTANCE; |
| terence zhang | 3:a280069151ac | 449 | dataP[i].id = instanceP->id; |
| terence zhang | 3:a280069151ac | 450 | i++; |
| terence zhang | 3:a280069151ac | 451 | instanceP = instanceP->next; |
| terence zhang | 3:a280069151ac | 452 | } |
| terence zhang | 3:a280069151ac | 453 | } |
| terence zhang | 3:a280069151ac | 454 | } |
| terence zhang | 3:a280069151ac | 455 | |
| terence zhang | 3:a280069151ac | 456 | if (result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 457 | { |
| terence zhang | 3:a280069151ac | 458 | int len; |
| terence zhang | 3:a280069151ac | 459 | |
| terence zhang | 3:a280069151ac | 460 | len = discover_serialize(contextP, uriP, serverP, size, dataP, bufferP); |
| terence zhang | 3:a280069151ac | 461 | if (len <= 0) result = COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 462 | else *lengthP = len; |
| terence zhang | 3:a280069151ac | 463 | } |
| terence zhang | 3:a280069151ac | 464 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 465 | |
| terence zhang | 3:a280069151ac | 466 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terence zhang | 3:a280069151ac | 467 | |
| terence zhang | 3:a280069151ac | 468 | return result; |
| terencez | 0:f9d13e09cf11 | 469 | } |
| terencez | 0:f9d13e09cf11 | 470 | |
| terencez | 0:f9d13e09cf11 | 471 | bool object_isInstanceNew(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 472 | uint16_t objectId, |
| terencez | 0:f9d13e09cf11 | 473 | uint16_t instanceId) |
| terencez | 0:f9d13e09cf11 | 474 | { |
| terence zhang | 3:a280069151ac | 475 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 476 | |
| terence zhang | 3:a280069151ac | 477 | LOG("Entering"); |
| terence zhang | 3:a280069151ac | 478 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, objectId); |
| terence zhang | 3:a280069151ac | 479 | if (targetP != NULL) |
| terencez | 0:f9d13e09cf11 | 480 | { |
| terence zhang | 3:a280069151ac | 481 | if (NULL != lwm2m_list_find(targetP->instanceList, instanceId)) |
| terencez | 0:f9d13e09cf11 | 482 | { |
| terencez | 0:f9d13e09cf11 | 483 | return false; |
| terencez | 0:f9d13e09cf11 | 484 | } |
| terencez | 0:f9d13e09cf11 | 485 | } |
| terencez | 0:f9d13e09cf11 | 486 | |
| terencez | 0:f9d13e09cf11 | 487 | return true; |
| terencez | 0:f9d13e09cf11 | 488 | } |
| terencez | 0:f9d13e09cf11 | 489 | |
| terence zhang | 3:a280069151ac | 490 | static int prv_getObjectTemplate(uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 491 | size_t length, |
| terence zhang | 3:a280069151ac | 492 | uint16_t id) |
| terencez | 0:f9d13e09cf11 | 493 | { |
| terencez | 0:f9d13e09cf11 | 494 | int index; |
| terencez | 0:f9d13e09cf11 | 495 | int result; |
| terencez | 0:f9d13e09cf11 | 496 | |
| terence zhang | 3:a280069151ac | 497 | if (length < REG_OBJECT_MIN_LEN) return -1; |
| terence zhang | 3:a280069151ac | 498 | |
| terence zhang | 3:a280069151ac | 499 | buffer[0] = '<'; |
| terence zhang | 3:a280069151ac | 500 | buffer[1] = '/'; |
| terence zhang | 3:a280069151ac | 501 | index = 2; |
| terence zhang | 3:a280069151ac | 502 | |
| terence zhang | 3:a280069151ac | 503 | result = utils_intCopy((char *)buffer + index, length - index, id); |
| terence zhang | 3:a280069151ac | 504 | if (result < 0) return -1; |
| terence zhang | 3:a280069151ac | 505 | index += result; |
| terence zhang | 3:a280069151ac | 506 | |
| terence zhang | 3:a280069151ac | 507 | if (length - index < REG_OBJECT_MIN_LEN - 3) return -1; |
| terence zhang | 3:a280069151ac | 508 | buffer[index] = '/'; |
| terence zhang | 3:a280069151ac | 509 | index++; |
| terencez | 0:f9d13e09cf11 | 510 | |
| terence zhang | 3:a280069151ac | 511 | return index; |
| terence zhang | 3:a280069151ac | 512 | } |
| terence zhang | 3:a280069151ac | 513 | |
| terence zhang | 3:a280069151ac | 514 | int object_getRegisterPayload(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 515 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 516 | size_t bufferLen) |
| terence zhang | 3:a280069151ac | 517 | { |
| terence zhang | 3:a280069151ac | 518 | size_t index; |
| terence zhang | 3:a280069151ac | 519 | int result; |
| terence zhang | 3:a280069151ac | 520 | lwm2m_object_t * objectP; |
| terence zhang | 3:a280069151ac | 521 | |
| terence zhang | 3:a280069151ac | 522 | LOG("Entering"); |
| terence zhang | 3:a280069151ac | 523 | // index can not be greater than bufferLen |
| terencez | 0:f9d13e09cf11 | 524 | index = 0; |
| terence zhang | 3:a280069151ac | 525 | |
| terence zhang | 3:a280069151ac | 526 | result = utils_stringCopy((char *)buffer, bufferLen, REG_START); |
| terence zhang | 3:a280069151ac | 527 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 528 | index += result; |
| terence zhang | 3:a280069151ac | 529 | |
| terence zhang | 3:a280069151ac | 530 | if ((contextP->altPath != NULL) |
| terence zhang | 3:a280069151ac | 531 | && (contextP->altPath[0] != 0)) |
| terence zhang | 3:a280069151ac | 532 | { |
| terence zhang | 3:a280069151ac | 533 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, contextP->altPath); |
| terence zhang | 3:a280069151ac | 534 | } |
| terence zhang | 3:a280069151ac | 535 | else |
| terencez | 0:f9d13e09cf11 | 536 | { |
| terence zhang | 3:a280069151ac | 537 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_DEFAULT_PATH); |
| terence zhang | 3:a280069151ac | 538 | } |
| terence zhang | 3:a280069151ac | 539 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 540 | index += result; |
| terence zhang | 3:a280069151ac | 541 | |
| terence zhang | 3:a280069151ac | 542 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_LWM2M_RESOURCE_TYPE); |
| terence zhang | 3:a280069151ac | 543 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 544 | index += result; |
| terence zhang | 3:a280069151ac | 545 | |
| terence zhang | 3:a280069151ac | 546 | for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next) |
| terence zhang | 3:a280069151ac | 547 | { |
| terence zhang | 3:a280069151ac | 548 | size_t start; |
| terence zhang | 3:a280069151ac | 549 | size_t length; |
| terence zhang | 3:a280069151ac | 550 | |
| terence zhang | 3:a280069151ac | 551 | if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) continue; |
| terence zhang | 3:a280069151ac | 552 | |
| terence zhang | 3:a280069151ac | 553 | start = index; |
| terence zhang | 3:a280069151ac | 554 | result = prv_getObjectTemplate(buffer + index, bufferLen - index, objectP->objID); |
| terence zhang | 3:a280069151ac | 555 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 556 | length = result; |
| terence zhang | 3:a280069151ac | 557 | index += length; |
| terence zhang | 3:a280069151ac | 558 | |
| terence zhang | 3:a280069151ac | 559 | if (objectP->instanceList == NULL) |
| terencez | 0:f9d13e09cf11 | 560 | { |
| terence zhang | 3:a280069151ac | 561 | index--; |
| terence zhang | 3:a280069151ac | 562 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_PATH_END); |
| terence zhang | 3:a280069151ac | 563 | if (result < 0) return 0; |
| terencez | 0:f9d13e09cf11 | 564 | index += result; |
| terencez | 0:f9d13e09cf11 | 565 | } |
| terencez | 0:f9d13e09cf11 | 566 | else |
| terencez | 0:f9d13e09cf11 | 567 | { |
| terence zhang | 3:a280069151ac | 568 | lwm2m_list_t * targetP; |
| terence zhang | 3:a280069151ac | 569 | for (targetP = objectP->instanceList ; targetP != NULL ; targetP = targetP->next) |
| terencez | 0:f9d13e09cf11 | 570 | { |
| terence zhang | 3:a280069151ac | 571 | if (bufferLen - index <= length) return 0; |
| terence zhang | 3:a280069151ac | 572 | |
| terence zhang | 3:a280069151ac | 573 | if (index != start + length) |
| terence zhang | 3:a280069151ac | 574 | { |
| terence zhang | 3:a280069151ac | 575 | memcpy(buffer + index, buffer + start, length); |
| terence zhang | 3:a280069151ac | 576 | index += length; |
| terence zhang | 3:a280069151ac | 577 | } |
| terencez | 0:f9d13e09cf11 | 578 | |
| terence zhang | 3:a280069151ac | 579 | result = utils_intCopy((char *)buffer + index, bufferLen - index, targetP->id); |
| terence zhang | 3:a280069151ac | 580 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 581 | index += result; |
| terence zhang | 3:a280069151ac | 582 | |
| terence zhang | 3:a280069151ac | 583 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_PATH_END); |
| terence zhang | 3:a280069151ac | 584 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 585 | index += result; |
| terencez | 0:f9d13e09cf11 | 586 | } |
| terencez | 0:f9d13e09cf11 | 587 | } |
| terencez | 0:f9d13e09cf11 | 588 | } |
| terencez | 0:f9d13e09cf11 | 589 | |
| terencez | 0:f9d13e09cf11 | 590 | if (index > 0) |
| terencez | 0:f9d13e09cf11 | 591 | { |
| terencez | 0:f9d13e09cf11 | 592 | index = index - 1; // remove trailing ',' |
| terencez | 0:f9d13e09cf11 | 593 | } |
| terencez | 0:f9d13e09cf11 | 594 | |
| terencez | 0:f9d13e09cf11 | 595 | buffer[index] = 0; |
| terencez | 0:f9d13e09cf11 | 596 | |
| terencez | 0:f9d13e09cf11 | 597 | return index; |
| terencez | 0:f9d13e09cf11 | 598 | } |
| terence zhang | 3:a280069151ac | 599 | |
| terence zhang | 3:a280069151ac | 600 | static lwm2m_list_t * prv_findServerInstance(lwm2m_object_t * objectP, |
| terence zhang | 3:a280069151ac | 601 | uint16_t shortID) |
| terence zhang | 3:a280069151ac | 602 | { |
| terence zhang | 3:a280069151ac | 603 | lwm2m_list_t * instanceP; |
| terence zhang | 3:a280069151ac | 604 | |
| terence zhang | 3:a280069151ac | 605 | instanceP = objectP->instanceList; |
| terence zhang | 3:a280069151ac | 606 | while (NULL != instanceP) |
| terence zhang | 3:a280069151ac | 607 | { |
| terence zhang | 3:a280069151ac | 608 | int64_t value; |
| terence zhang | 3:a280069151ac | 609 | lwm2m_data_t * dataP; |
| terence zhang | 3:a280069151ac | 610 | int size; |
| terence zhang | 3:a280069151ac | 611 | |
| terence zhang | 3:a280069151ac | 612 | size = 1; |
| terence zhang | 3:a280069151ac | 613 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 614 | if (dataP == NULL) return NULL; |
| terence zhang | 3:a280069151ac | 615 | dataP->id = LWM2M_SERVER_SHORT_ID_ID; |
| terence zhang | 3:a280069151ac | 616 | |
| terence zhang | 3:a280069151ac | 617 | if (objectP->readFunc(instanceP->id, &size, &dataP, objectP) != COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 618 | { |
| terence zhang | 3:a280069151ac | 619 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 620 | return NULL; |
| terence zhang | 3:a280069151ac | 621 | } |
| terence zhang | 3:a280069151ac | 622 | |
| terence zhang | 3:a280069151ac | 623 | if (1 == lwm2m_data_decode_int(dataP, &value)) |
| terence zhang | 3:a280069151ac | 624 | { |
| terence zhang | 3:a280069151ac | 625 | if (value == shortID) |
| terence zhang | 3:a280069151ac | 626 | { |
| terence zhang | 3:a280069151ac | 627 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 628 | break; |
| terence zhang | 3:a280069151ac | 629 | } |
| terence zhang | 3:a280069151ac | 630 | } |
| terence zhang | 3:a280069151ac | 631 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 632 | instanceP = instanceP->next; |
| terence zhang | 3:a280069151ac | 633 | } |
| terence zhang | 3:a280069151ac | 634 | |
| terence zhang | 3:a280069151ac | 635 | return instanceP; |
| terence zhang | 3:a280069151ac | 636 | } |
| terence zhang | 3:a280069151ac | 637 | |
| terence zhang | 3:a280069151ac | 638 | static int prv_getMandatoryInfo(lwm2m_object_t * objectP, |
| terence zhang | 3:a280069151ac | 639 | uint16_t instanceID, |
| terence zhang | 3:a280069151ac | 640 | lwm2m_server_t * targetP) |
| terence zhang | 3:a280069151ac | 641 | { |
| terence zhang | 3:a280069151ac | 642 | lwm2m_data_t * dataP; |
| terence zhang | 3:a280069151ac | 643 | int size; |
| terence zhang | 3:a280069151ac | 644 | int64_t value; |
| terence zhang | 3:a280069151ac | 645 | |
| terence zhang | 3:a280069151ac | 646 | size = 2; |
| terence zhang | 3:a280069151ac | 647 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 648 | if (dataP == NULL) return -1; |
| terence zhang | 3:a280069151ac | 649 | dataP[0].id = LWM2M_SERVER_LIFETIME_ID; |
| terence zhang | 3:a280069151ac | 650 | dataP[1].id = LWM2M_SERVER_BINDING_ID; |
| terence zhang | 3:a280069151ac | 651 | |
| terence zhang | 3:a280069151ac | 652 | if (objectP->readFunc(instanceID, &size, &dataP, objectP) != COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 653 | { |
| terence zhang | 3:a280069151ac | 654 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 655 | return -1; |
| terence zhang | 3:a280069151ac | 656 | } |
| terence zhang | 3:a280069151ac | 657 | |
| terence zhang | 3:a280069151ac | 658 | if (0 == lwm2m_data_decode_int(dataP, &value) |
| terence zhang | 3:a280069151ac | 659 | || value < 0 || value >0xFFFFFFFF) // This is an implementation limit |
| terence zhang | 3:a280069151ac | 660 | { |
| terence zhang | 3:a280069151ac | 661 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 662 | return -1; |
| terence zhang | 3:a280069151ac | 663 | } |
| terence zhang | 3:a280069151ac | 664 | targetP->lifetime = value; |
| terence zhang | 3:a280069151ac | 665 | |
| terence zhang | 3:a280069151ac | 666 | targetP->binding = utils_stringToBinding(dataP[1].value.asBuffer.buffer, dataP[1].value.asBuffer.length); |
| terence zhang | 3:a280069151ac | 667 | |
| terence zhang | 3:a280069151ac | 668 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 669 | |
| terence zhang | 3:a280069151ac | 670 | if (targetP->binding == BINDING_UNKNOWN) |
| terence zhang | 3:a280069151ac | 671 | { |
| terence zhang | 3:a280069151ac | 672 | return -1; |
| terence zhang | 3:a280069151ac | 673 | } |
| terence zhang | 3:a280069151ac | 674 | |
| terence zhang | 3:a280069151ac | 675 | return 0; |
| terence zhang | 3:a280069151ac | 676 | } |
| terence zhang | 3:a280069151ac | 677 | |
| terence zhang | 3:a280069151ac | 678 | int object_getServers(lwm2m_context_t * contextP) |
| terence zhang | 3:a280069151ac | 679 | { |
| terence zhang | 3:a280069151ac | 680 | lwm2m_object_t * objectP; |
| terence zhang | 3:a280069151ac | 681 | lwm2m_object_t * securityObjP = NULL; |
| terence zhang | 3:a280069151ac | 682 | lwm2m_object_t * serverObjP = NULL; |
| terence zhang | 3:a280069151ac | 683 | lwm2m_list_t * securityInstP; // instanceID of the server in the LWM2M Security Object |
| terence zhang | 3:a280069151ac | 684 | |
| terence zhang | 3:a280069151ac | 685 | LOG("Entering"); |
| terence zhang | 3:a280069151ac | 686 | |
| terence zhang | 3:a280069151ac | 687 | for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next) |
| terence zhang | 3:a280069151ac | 688 | { |
| terence zhang | 3:a280069151ac | 689 | if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) |
| terence zhang | 3:a280069151ac | 690 | { |
| terence zhang | 3:a280069151ac | 691 | securityObjP = objectP; |
| terence zhang | 3:a280069151ac | 692 | } |
| terence zhang | 3:a280069151ac | 693 | else if (objectP->objID == LWM2M_SERVER_OBJECT_ID) |
| terence zhang | 3:a280069151ac | 694 | { |
| terence zhang | 3:a280069151ac | 695 | serverObjP = objectP; |
| terence zhang | 3:a280069151ac | 696 | } |
| terence zhang | 3:a280069151ac | 697 | } |
| terence zhang | 3:a280069151ac | 698 | |
| terence zhang | 3:a280069151ac | 699 | if (NULL == securityObjP) return -1; |
| terence zhang | 3:a280069151ac | 700 | |
| terence zhang | 3:a280069151ac | 701 | securityInstP = securityObjP->instanceList; |
| terence zhang | 3:a280069151ac | 702 | while (securityInstP != NULL) |
| terence zhang | 3:a280069151ac | 703 | { |
| terence zhang | 3:a280069151ac | 704 | if (LWM2M_LIST_FIND(contextP->bootstrapServerList, securityInstP->id) == NULL |
| terence zhang | 3:a280069151ac | 705 | && LWM2M_LIST_FIND(contextP->serverList, securityInstP->id) == NULL) |
| terence zhang | 3:a280069151ac | 706 | { |
| terence zhang | 3:a280069151ac | 707 | // This server is new. eg created by last bootstrap |
| terence zhang | 3:a280069151ac | 708 | |
| terence zhang | 3:a280069151ac | 709 | lwm2m_data_t * dataP; |
| terence zhang | 3:a280069151ac | 710 | int size; |
| terence zhang | 3:a280069151ac | 711 | lwm2m_server_t * targetP; |
| terence zhang | 3:a280069151ac | 712 | bool isBootstrap; |
| terence zhang | 3:a280069151ac | 713 | int64_t value = 0; |
| terence zhang | 3:a280069151ac | 714 | |
| terence zhang | 3:a280069151ac | 715 | size = 3; |
| terence zhang | 3:a280069151ac | 716 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 717 | if (dataP == NULL) return -1; |
| terence zhang | 3:a280069151ac | 718 | dataP[0].id = LWM2M_SECURITY_BOOTSTRAP_ID; |
| terence zhang | 3:a280069151ac | 719 | dataP[1].id = LWM2M_SECURITY_SHORT_SERVER_ID; |
| terence zhang | 3:a280069151ac | 720 | dataP[2].id = LWM2M_SECURITY_HOLD_OFF_ID; |
| terence zhang | 3:a280069151ac | 721 | |
| terence zhang | 3:a280069151ac | 722 | if (securityObjP->readFunc(securityInstP->id, &size, &dataP, securityObjP) != COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 723 | { |
| terence zhang | 3:a280069151ac | 724 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 725 | return -1; |
| terence zhang | 3:a280069151ac | 726 | } |
| terence zhang | 3:a280069151ac | 727 | |
| terence zhang | 3:a280069151ac | 728 | targetP = (lwm2m_server_t *)lwm2m_malloc(sizeof(lwm2m_server_t)); |
| terence zhang | 3:a280069151ac | 729 | if (targetP == NULL) { |
| terence zhang | 3:a280069151ac | 730 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 731 | return -1; |
| terence zhang | 3:a280069151ac | 732 | } |
| terence zhang | 3:a280069151ac | 733 | memset(targetP, 0, sizeof(lwm2m_server_t)); |
| terence zhang | 3:a280069151ac | 734 | targetP->secObjInstID = securityInstP->id; |
| terence zhang | 3:a280069151ac | 735 | |
| terence zhang | 3:a280069151ac | 736 | if (0 == lwm2m_data_decode_bool(dataP + 0, &isBootstrap)) |
| terence zhang | 3:a280069151ac | 737 | { |
| terence zhang | 3:a280069151ac | 738 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 739 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 740 | return -1; |
| terence zhang | 3:a280069151ac | 741 | } |
| terence zhang | 3:a280069151ac | 742 | |
| terence zhang | 3:a280069151ac | 743 | if (0 == lwm2m_data_decode_int(dataP + 1, &value) |
| terence zhang | 3:a280069151ac | 744 | || value < (isBootstrap ? 0 : 1) || value > 0xFFFF) // 0 is forbidden as a Short Server ID |
| terence zhang | 3:a280069151ac | 745 | { |
| terence zhang | 3:a280069151ac | 746 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 747 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 748 | return -1; |
| terence zhang | 3:a280069151ac | 749 | } |
| terence zhang | 3:a280069151ac | 750 | targetP->shortID = value; |
| terence zhang | 3:a280069151ac | 751 | |
| terence zhang | 3:a280069151ac | 752 | if (isBootstrap == true) |
| terence zhang | 3:a280069151ac | 753 | { |
| terence zhang | 3:a280069151ac | 754 | if (0 == lwm2m_data_decode_int(dataP + 2, &value) |
| terence zhang | 3:a280069151ac | 755 | || value < 0 || value > 0xFFFFFFFF) // This is an implementation limit |
| terence zhang | 3:a280069151ac | 756 | { |
| terence zhang | 3:a280069151ac | 757 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 758 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 759 | return -1; |
| terence zhang | 3:a280069151ac | 760 | } |
| terence zhang | 3:a280069151ac | 761 | // lifetime of a bootstrap server is set to ClientHoldOffTime |
| terence zhang | 3:a280069151ac | 762 | targetP->lifetime = value; |
| terence zhang | 3:a280069151ac | 763 | |
| terence zhang | 3:a280069151ac | 764 | contextP->bootstrapServerList = (lwm2m_server_t*)LWM2M_LIST_ADD(contextP->bootstrapServerList, targetP); |
| terence zhang | 3:a280069151ac | 765 | } |
| terence zhang | 3:a280069151ac | 766 | else |
| terence zhang | 3:a280069151ac | 767 | { |
| terence zhang | 3:a280069151ac | 768 | lwm2m_list_t * serverInstP; // instanceID of the server in the LWM2M Server Object |
| terence zhang | 3:a280069151ac | 769 | |
| terence zhang | 3:a280069151ac | 770 | serverInstP = prv_findServerInstance(serverObjP, targetP->shortID); |
| terence zhang | 3:a280069151ac | 771 | if (serverInstP == NULL) |
| terence zhang | 3:a280069151ac | 772 | { |
| terence zhang | 3:a280069151ac | 773 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 774 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 775 | return -1; |
| terence zhang | 3:a280069151ac | 776 | } |
| terence zhang | 3:a280069151ac | 777 | if (0 != prv_getMandatoryInfo(serverObjP, serverInstP->id, targetP)) |
| terence zhang | 3:a280069151ac | 778 | { |
| terence zhang | 3:a280069151ac | 779 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 780 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 781 | return -1; |
| terence zhang | 3:a280069151ac | 782 | } |
| terence zhang | 3:a280069151ac | 783 | targetP->status = STATE_DEREGISTERED; |
| terence zhang | 3:a280069151ac | 784 | contextP->serverList = (lwm2m_server_t*)LWM2M_LIST_ADD(contextP->serverList, targetP); |
| terence zhang | 3:a280069151ac | 785 | } |
| terence zhang | 3:a280069151ac | 786 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 787 | } |
| terence zhang | 3:a280069151ac | 788 | securityInstP = securityInstP->next; |
| terence zhang | 3:a280069151ac | 789 | } |
| terence zhang | 3:a280069151ac | 790 | |
| terence zhang | 3:a280069151ac | 791 | return 0; |
| terence zhang | 3:a280069151ac | 792 | } |
| terence zhang | 3:a280069151ac | 793 | |
| terence zhang | 3:a280069151ac | 794 | coap_status_t object_createInstance(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 795 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 796 | lwm2m_data_t * dataP) |
| terence zhang | 3:a280069151ac | 797 | { |
| terence zhang | 3:a280069151ac | 798 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 799 | |
| terence zhang | 3:a280069151ac | 800 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 801 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 802 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 803 | |
| terence zhang | 3:a280069151ac | 804 | if (NULL == targetP->createFunc) |
| terence zhang | 3:a280069151ac | 805 | { |
| terence zhang | 3:a280069151ac | 806 | return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 807 | } |
| terence zhang | 3:a280069151ac | 808 | |
| terence zhang | 3:a280069151ac | 809 | return targetP->createFunc(lwm2m_list_newId(targetP->instanceList), dataP->value.asChildren.count, dataP->value.asChildren.array, targetP); |
| terence zhang | 3:a280069151ac | 810 | } |
| terence zhang | 3:a280069151ac | 811 | |
| terence zhang | 3:a280069151ac | 812 | coap_status_t object_writeInstance(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 813 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 814 | lwm2m_data_t * dataP) |
| terence zhang | 3:a280069151ac | 815 | { |
| terence zhang | 3:a280069151ac | 816 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 817 | |
| terence zhang | 3:a280069151ac | 818 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 819 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 820 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 821 | |
| terence zhang | 3:a280069151ac | 822 | if (NULL == targetP->writeFunc) |
| terence zhang | 3:a280069151ac | 823 | { |
| terence zhang | 3:a280069151ac | 824 | return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 825 | } |
| terence zhang | 3:a280069151ac | 826 | |
| terence zhang | 3:a280069151ac | 827 | return targetP->writeFunc(dataP->id, dataP->value.asChildren.count, dataP->value.asChildren.array, targetP); |
| terence zhang | 3:a280069151ac | 828 | } |
| terence zhang | 3:a280069151ac | 829 | |
| terencez | 0:f9d13e09cf11 | 830 | #endif |