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@15:d0f20339c1ad, 2017-05-07 (annotated)
- Committer:
- terencez
- Date:
- Sun May 07 03:00:16 2017 +0000
- Revision:
- 15:d0f20339c1ad
- Parent:
- 3:a280069151ac
Fix the "Get" operation fail issue, tested get information from device.
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; |
| terencez | 15:d0f20339c1ad | 139 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 140 | |
| 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; |
| terencez | 15:d0f20339c1ad | 144 | |
| terencez | 15:d0f20339c1ad | 145 | printf("TERENCE:%s, %d, flag = 0x%x\n",__FUNCTION__, __LINE__, uriP->flag); |
| terence zhang | 3:a280069151ac | 146 | if (LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terence zhang | 3:a280069151ac | 147 | { |
| terencez | 15:d0f20339c1ad | 148 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 149 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terencez | 15:d0f20339c1ad | 150 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 151 | // single instance read |
| terence zhang | 3:a280069151ac | 152 | if (LWM2M_URI_IS_SET_RESOURCE(uriP)) |
| terence zhang | 3:a280069151ac | 153 | { |
| terencez | 15:d0f20339c1ad | 154 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 155 | *sizeP = 1; |
| terence zhang | 3:a280069151ac | 156 | *dataP = lwm2m_data_new(*sizeP); |
| terence zhang | 3:a280069151ac | 157 | if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 158 | |
| terence zhang | 3:a280069151ac | 159 | (*dataP)->id = uriP->resourceId; |
| terence zhang | 3:a280069151ac | 160 | } |
| terencez | 15:d0f20339c1ad | 161 | printf("TERENCE:%s, %d** result = %d\n",__FUNCTION__, __LINE__,result); |
| terencez | 15:d0f20339c1ad | 162 | |
| terence zhang | 3:a280069151ac | 163 | result = targetP->readFunc(uriP->instanceId, sizeP, dataP, targetP); |
| terencez | 15:d0f20339c1ad | 164 | |
| terencez | 15:d0f20339c1ad | 165 | printf("TERENCE:%s, %d** result = %d\n",__FUNCTION__, __LINE__,result); |
| terence zhang | 3:a280069151ac | 166 | } |
| terence zhang | 3:a280069151ac | 167 | else |
| terence zhang | 3:a280069151ac | 168 | { |
| terencez | 15:d0f20339c1ad | 169 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 170 | // multiple object instances read |
| terence zhang | 3:a280069151ac | 171 | lwm2m_list_t * instanceP; |
| terence zhang | 3:a280069151ac | 172 | int i; |
| terence zhang | 3:a280069151ac | 173 | |
| terence zhang | 3:a280069151ac | 174 | result = COAP_205_CONTENT; |
| terencez | 15:d0f20339c1ad | 175 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 176 | *sizeP = 0; |
| terence zhang | 3:a280069151ac | 177 | for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) |
| terence zhang | 3:a280069151ac | 178 | { |
| terence zhang | 3:a280069151ac | 179 | (*sizeP)++; |
| terence zhang | 3:a280069151ac | 180 | } |
| terence zhang | 3:a280069151ac | 181 | |
| terence zhang | 3:a280069151ac | 182 | if (*sizeP == 0) |
| terence zhang | 3:a280069151ac | 183 | { |
| terencez | 15:d0f20339c1ad | 184 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 185 | *dataP = NULL; |
| terence zhang | 3:a280069151ac | 186 | } |
| terence zhang | 3:a280069151ac | 187 | else |
| terence zhang | 3:a280069151ac | 188 | { |
| terencez | 15:d0f20339c1ad | 189 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 190 | *dataP = lwm2m_data_new(*sizeP); |
| terence zhang | 3:a280069151ac | 191 | if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 192 | |
| terencez | 15:d0f20339c1ad | 193 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 194 | instanceP = targetP->instanceList; |
| terence zhang | 3:a280069151ac | 195 | i = 0; |
| terencez | 15:d0f20339c1ad | 196 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 197 | while (instanceP != NULL && result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 198 | { |
| terencez | 15:d0f20339c1ad | 199 | printf(" TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 200 | result = targetP->readFunc(instanceP->id, (int*)&((*dataP)[i].value.asChildren.count), &((*dataP)[i].value.asChildren.array), targetP); |
| terence zhang | 3:a280069151ac | 201 | (*dataP)[i].type = LWM2M_TYPE_OBJECT_INSTANCE; |
| terence zhang | 3:a280069151ac | 202 | (*dataP)[i].id = instanceP->id; |
| terence zhang | 3:a280069151ac | 203 | i++; |
| terence zhang | 3:a280069151ac | 204 | instanceP = instanceP->next; |
| terence zhang | 3:a280069151ac | 205 | } |
| terence zhang | 3:a280069151ac | 206 | } |
| terence zhang | 3:a280069151ac | 207 | } |
| terencez | 15:d0f20339c1ad | 208 | printf("TERENCE:%s, %d\n",__FUNCTION__, __LINE__); |
| terence zhang | 3:a280069151ac | 209 | |
| terence zhang | 3:a280069151ac | 210 | LOG_ARG("result: %u.%2u, size: %d", (result & 0xFF) >> 5, (result & 0x1F), *sizeP); |
| terence zhang | 3:a280069151ac | 211 | return result; |
| terencez | 0:f9d13e09cf11 | 212 | } |
| terencez | 0:f9d13e09cf11 | 213 | |
| terencez | 0:f9d13e09cf11 | 214 | coap_status_t object_read(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 215 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 216 | lwm2m_media_type_t * formatP, |
| terence zhang | 3:a280069151ac | 217 | uint8_t ** bufferP, |
| terence zhang | 3:a280069151ac | 218 | size_t * lengthP) |
| terencez | 0:f9d13e09cf11 | 219 | { |
| terencez | 0:f9d13e09cf11 | 220 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 221 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 222 | int size = 0; |
| terence zhang | 3:a280069151ac | 223 | int res; |
| terencez | 0:f9d13e09cf11 | 224 | |
| terence zhang | 3:a280069151ac | 225 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 226 | result = object_readData(contextP, uriP, &size, &dataP); |
| terencez | 0:f9d13e09cf11 | 227 | |
| terence zhang | 3:a280069151ac | 228 | if (result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 229 | { |
| terence zhang | 3:a280069151ac | 230 | res = lwm2m_data_serialize(uriP, size, dataP, formatP, bufferP); |
| terence zhang | 3:a280069151ac | 231 | if (res < 0) |
| terence zhang | 3:a280069151ac | 232 | { |
| terence zhang | 3:a280069151ac | 233 | result = COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 234 | } |
| terence zhang | 3:a280069151ac | 235 | else |
| terence zhang | 3:a280069151ac | 236 | { |
| terence zhang | 3:a280069151ac | 237 | *lengthP = (size_t)res; |
| terencez | 0:f9d13e09cf11 | 238 | } |
| terencez | 0:f9d13e09cf11 | 239 | } |
| terence zhang | 3:a280069151ac | 240 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 241 | |
| terence zhang | 3:a280069151ac | 242 | LOG_ARG("result: %u.%2u, length: %d", (result & 0xFF) >> 5, (result & 0x1F), *lengthP); |
| terencez | 0:f9d13e09cf11 | 243 | |
| terencez | 0:f9d13e09cf11 | 244 | return result; |
| terencez | 0:f9d13e09cf11 | 245 | } |
| terencez | 0:f9d13e09cf11 | 246 | |
| terencez | 0:f9d13e09cf11 | 247 | coap_status_t object_write(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 248 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 249 | lwm2m_media_type_t format, |
| terence zhang | 3:a280069151ac | 250 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 251 | size_t length) |
| terencez | 0:f9d13e09cf11 | 252 | { |
| terence zhang | 3:a280069151ac | 253 | coap_status_t result = NO_ERROR; |
| terence zhang | 3:a280069151ac | 254 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 255 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 256 | int size = 0; |
| terencez | 0:f9d13e09cf11 | 257 | |
| terence zhang | 3:a280069151ac | 258 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 259 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 260 | if (NULL == targetP) |
| terence zhang | 3:a280069151ac | 261 | { |
| terence zhang | 3:a280069151ac | 262 | result = COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 263 | } |
| terence zhang | 3:a280069151ac | 264 | else if (NULL == targetP->writeFunc) |
| terence zhang | 3:a280069151ac | 265 | { |
| terence zhang | 3:a280069151ac | 266 | result = COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 267 | } |
| terence zhang | 3:a280069151ac | 268 | else |
| terence zhang | 3:a280069151ac | 269 | { |
| terence zhang | 3:a280069151ac | 270 | size = lwm2m_data_parse(uriP, buffer, length, format, &dataP); |
| terence zhang | 3:a280069151ac | 271 | if (size == 0) |
| terence zhang | 3:a280069151ac | 272 | { |
| terence zhang | 3:a280069151ac | 273 | result = COAP_406_NOT_ACCEPTABLE; |
| terencez | 0:f9d13e09cf11 | 274 | } |
| terencez | 0:f9d13e09cf11 | 275 | } |
| terence zhang | 3:a280069151ac | 276 | if (result == NO_ERROR) |
| terence zhang | 3:a280069151ac | 277 | { |
| terence zhang | 3:a280069151ac | 278 | result = targetP->writeFunc(uriP->instanceId, size, dataP, targetP); |
| terence zhang | 3:a280069151ac | 279 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 280 | } |
| terence zhang | 3:a280069151ac | 281 | |
| terence zhang | 3:a280069151ac | 282 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terencez | 0:f9d13e09cf11 | 283 | |
| terencez | 0:f9d13e09cf11 | 284 | return result; |
| terencez | 0:f9d13e09cf11 | 285 | } |
| terencez | 0:f9d13e09cf11 | 286 | |
| terencez | 0:f9d13e09cf11 | 287 | coap_status_t object_execute(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 288 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 289 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 290 | size_t length) |
| terencez | 0:f9d13e09cf11 | 291 | { |
| terence zhang | 3:a280069151ac | 292 | lwm2m_object_t * targetP; |
| terencez | 0:f9d13e09cf11 | 293 | |
| terence zhang | 3:a280069151ac | 294 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 295 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 296 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 297 | if (NULL == targetP->executeFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 298 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terencez | 0:f9d13e09cf11 | 299 | |
| terence zhang | 3:a280069151ac | 300 | return targetP->executeFunc(uriP->instanceId, uriP->resourceId, buffer, length, targetP); |
| terencez | 0:f9d13e09cf11 | 301 | } |
| terencez | 0:f9d13e09cf11 | 302 | |
| terencez | 0:f9d13e09cf11 | 303 | coap_status_t object_create(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 304 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 305 | lwm2m_media_type_t format, |
| terence zhang | 3:a280069151ac | 306 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 307 | size_t length) |
| terencez | 0:f9d13e09cf11 | 308 | { |
| terence zhang | 3:a280069151ac | 309 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 310 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 311 | int size = 0; |
| terence zhang | 3:a280069151ac | 312 | uint8_t result; |
| terence zhang | 3:a280069151ac | 313 | |
| terence zhang | 3:a280069151ac | 314 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 315 | |
| terencez | 0:f9d13e09cf11 | 316 | if (length == 0 || buffer == 0) |
| terencez | 0:f9d13e09cf11 | 317 | { |
| terence zhang | 3:a280069151ac | 318 | return COAP_400_BAD_REQUEST; |
| terencez | 0:f9d13e09cf11 | 319 | } |
| terencez | 0:f9d13e09cf11 | 320 | |
| terence zhang | 3:a280069151ac | 321 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 322 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 323 | if (NULL == targetP->createFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 324 | |
| terence zhang | 3:a280069151ac | 325 | size = lwm2m_data_parse(uriP, buffer, length, format, &dataP); |
| terence zhang | 3:a280069151ac | 326 | if (size <= 0) return COAP_400_BAD_REQUEST; |
| terence zhang | 3:a280069151ac | 327 | |
| terence zhang | 3:a280069151ac | 328 | switch (dataP[0].type) |
| terencez | 0:f9d13e09cf11 | 329 | { |
| terence zhang | 3:a280069151ac | 330 | case LWM2M_TYPE_OBJECT: |
| terence zhang | 3:a280069151ac | 331 | result = COAP_400_BAD_REQUEST; |
| terence zhang | 3:a280069151ac | 332 | goto exit; |
| terencez | 0:f9d13e09cf11 | 333 | |
| terence zhang | 3:a280069151ac | 334 | case LWM2M_TYPE_OBJECT_INSTANCE: |
| terence zhang | 3:a280069151ac | 335 | if (size != 1) |
| terence zhang | 3:a280069151ac | 336 | { |
| terence zhang | 3:a280069151ac | 337 | result = COAP_400_BAD_REQUEST; |
| terence zhang | 3:a280069151ac | 338 | goto exit; |
| terence zhang | 3:a280069151ac | 339 | } |
| terence zhang | 3:a280069151ac | 340 | if (NULL != lwm2m_list_find(targetP->instanceList, dataP[0].id)) |
| terence zhang | 3:a280069151ac | 341 | { |
| terence zhang | 3:a280069151ac | 342 | // Instance already exists |
| terence zhang | 3:a280069151ac | 343 | result = COAP_406_NOT_ACCEPTABLE; |
| terence zhang | 3:a280069151ac | 344 | goto exit; |
| terence zhang | 3:a280069151ac | 345 | } |
| terence zhang | 3:a280069151ac | 346 | result = targetP->createFunc(dataP[0].id, dataP[0].value.asChildren.count, dataP[0].value.asChildren.array, targetP); |
| terence zhang | 3:a280069151ac | 347 | uriP->instanceId = dataP[0].id; |
| terence zhang | 3:a280069151ac | 348 | uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; |
| terence zhang | 3:a280069151ac | 349 | break; |
| terencez | 0:f9d13e09cf11 | 350 | |
| terencez | 0:f9d13e09cf11 | 351 | default: |
| terence zhang | 3:a280069151ac | 352 | if (!LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terencez | 0:f9d13e09cf11 | 353 | { |
| terence zhang | 3:a280069151ac | 354 | uriP->instanceId = lwm2m_list_newId(targetP->instanceList); |
| terence zhang | 3:a280069151ac | 355 | uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; |
| terence zhang | 3:a280069151ac | 356 | } |
| terence zhang | 3:a280069151ac | 357 | result = targetP->createFunc(uriP->instanceId, size, dataP, targetP); |
| terence zhang | 3:a280069151ac | 358 | break; |
| terence zhang | 3:a280069151ac | 359 | } |
| terencez | 0:f9d13e09cf11 | 360 | |
| terence zhang | 3:a280069151ac | 361 | exit: |
| terence zhang | 3:a280069151ac | 362 | lwm2m_data_free(size, dataP); |
| terencez | 0:f9d13e09cf11 | 363 | |
| terence zhang | 3:a280069151ac | 364 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terencez | 0:f9d13e09cf11 | 365 | |
| terence zhang | 3:a280069151ac | 366 | return result; |
| terencez | 0:f9d13e09cf11 | 367 | } |
| terencez | 0:f9d13e09cf11 | 368 | |
| terencez | 0:f9d13e09cf11 | 369 | coap_status_t object_delete(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 370 | lwm2m_uri_t * uriP) |
| terencez | 0:f9d13e09cf11 | 371 | { |
| terence zhang | 3:a280069151ac | 372 | lwm2m_object_t * objectP; |
| terence zhang | 3:a280069151ac | 373 | coap_status_t result; |
| terencez | 0:f9d13e09cf11 | 374 | |
| terence zhang | 3:a280069151ac | 375 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 376 | objectP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 377 | if (NULL == objectP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 378 | if (NULL == objectP->deleteFunc) return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 379 | |
| terence zhang | 3:a280069151ac | 380 | LOG("Entering"); |
| terencez | 0:f9d13e09cf11 | 381 | |
| terence zhang | 3:a280069151ac | 382 | if (LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terence zhang | 3:a280069151ac | 383 | { |
| terence zhang | 3:a280069151ac | 384 | result = objectP->deleteFunc(uriP->instanceId, objectP); |
| terence zhang | 3:a280069151ac | 385 | } |
| terence zhang | 3:a280069151ac | 386 | else |
| terence zhang | 3:a280069151ac | 387 | { |
| terence zhang | 3:a280069151ac | 388 | lwm2m_list_t * instanceP; |
| terencez | 0:f9d13e09cf11 | 389 | |
| terence zhang | 3:a280069151ac | 390 | result = COAP_202_DELETED; |
| terence zhang | 3:a280069151ac | 391 | instanceP = objectP->instanceList; |
| terence zhang | 3:a280069151ac | 392 | while (NULL != instanceP |
| terence zhang | 3:a280069151ac | 393 | && result == COAP_202_DELETED) |
| terence zhang | 3:a280069151ac | 394 | { |
| terence zhang | 3:a280069151ac | 395 | result = objectP->deleteFunc(instanceP->id, objectP); |
| terence zhang | 3:a280069151ac | 396 | instanceP = objectP->instanceList; |
| terencez | 0:f9d13e09cf11 | 397 | } |
| terencez | 0:f9d13e09cf11 | 398 | } |
| terence zhang | 3:a280069151ac | 399 | |
| terence zhang | 3:a280069151ac | 400 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terence zhang | 3:a280069151ac | 401 | |
| terence zhang | 3:a280069151ac | 402 | return result; |
| terence zhang | 3:a280069151ac | 403 | } |
| terence zhang | 3:a280069151ac | 404 | |
| terence zhang | 3:a280069151ac | 405 | coap_status_t object_discover(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 406 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 407 | lwm2m_server_t * serverP, |
| terence zhang | 3:a280069151ac | 408 | uint8_t ** bufferP, |
| terence zhang | 3:a280069151ac | 409 | size_t * lengthP) |
| terence zhang | 3:a280069151ac | 410 | { |
| terence zhang | 3:a280069151ac | 411 | coap_status_t result; |
| terence zhang | 3:a280069151ac | 412 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 413 | lwm2m_data_t * dataP = NULL; |
| terence zhang | 3:a280069151ac | 414 | int size = 0; |
| terence zhang | 3:a280069151ac | 415 | |
| terence zhang | 3:a280069151ac | 416 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 417 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 418 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 419 | if (NULL == targetP->discoverFunc) return COAP_501_NOT_IMPLEMENTED; |
| terence zhang | 3:a280069151ac | 420 | |
| terence zhang | 3:a280069151ac | 421 | if (LWM2M_URI_IS_SET_INSTANCE(uriP)) |
| terence zhang | 3:a280069151ac | 422 | { |
| terence zhang | 3:a280069151ac | 423 | if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 424 | |
| terence zhang | 3:a280069151ac | 425 | // single instance read |
| terence zhang | 3:a280069151ac | 426 | if (LWM2M_URI_IS_SET_RESOURCE(uriP)) |
| terence zhang | 3:a280069151ac | 427 | { |
| terence zhang | 3:a280069151ac | 428 | size = 1; |
| terence zhang | 3:a280069151ac | 429 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 430 | if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 431 | |
| terence zhang | 3:a280069151ac | 432 | dataP->id = uriP->resourceId; |
| terence zhang | 3:a280069151ac | 433 | } |
| terence zhang | 3:a280069151ac | 434 | |
| terence zhang | 3:a280069151ac | 435 | result = targetP->discoverFunc(uriP->instanceId, &size, &dataP, targetP); |
| terence zhang | 3:a280069151ac | 436 | } |
| terence zhang | 3:a280069151ac | 437 | else |
| terence zhang | 3:a280069151ac | 438 | { |
| terence zhang | 3:a280069151ac | 439 | // multiple object instances read |
| terence zhang | 3:a280069151ac | 440 | lwm2m_list_t * instanceP; |
| terence zhang | 3:a280069151ac | 441 | int i; |
| terence zhang | 3:a280069151ac | 442 | |
| terence zhang | 3:a280069151ac | 443 | result = COAP_205_CONTENT; |
| terence zhang | 3:a280069151ac | 444 | |
| terence zhang | 3:a280069151ac | 445 | size = 0; |
| terence zhang | 3:a280069151ac | 446 | for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) |
| terence zhang | 3:a280069151ac | 447 | { |
| terence zhang | 3:a280069151ac | 448 | size++; |
| terence zhang | 3:a280069151ac | 449 | } |
| terence zhang | 3:a280069151ac | 450 | |
| terence zhang | 3:a280069151ac | 451 | if (size != 0) |
| terence zhang | 3:a280069151ac | 452 | { |
| terence zhang | 3:a280069151ac | 453 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 454 | if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 455 | |
| terence zhang | 3:a280069151ac | 456 | instanceP = targetP->instanceList; |
| terence zhang | 3:a280069151ac | 457 | i = 0; |
| terence zhang | 3:a280069151ac | 458 | while (instanceP != NULL && result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 459 | { |
| terence zhang | 3:a280069151ac | 460 | result = targetP->discoverFunc(instanceP->id, (int*)&(dataP[i].value.asChildren.count), &(dataP[i].value.asChildren.array), targetP); |
| terence zhang | 3:a280069151ac | 461 | dataP[i].type = LWM2M_TYPE_OBJECT_INSTANCE; |
| terence zhang | 3:a280069151ac | 462 | dataP[i].id = instanceP->id; |
| terence zhang | 3:a280069151ac | 463 | i++; |
| terence zhang | 3:a280069151ac | 464 | instanceP = instanceP->next; |
| terence zhang | 3:a280069151ac | 465 | } |
| terence zhang | 3:a280069151ac | 466 | } |
| terence zhang | 3:a280069151ac | 467 | } |
| terence zhang | 3:a280069151ac | 468 | |
| terence zhang | 3:a280069151ac | 469 | if (result == COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 470 | { |
| terence zhang | 3:a280069151ac | 471 | int len; |
| terence zhang | 3:a280069151ac | 472 | |
| terence zhang | 3:a280069151ac | 473 | len = discover_serialize(contextP, uriP, serverP, size, dataP, bufferP); |
| terence zhang | 3:a280069151ac | 474 | if (len <= 0) result = COAP_500_INTERNAL_SERVER_ERROR; |
| terence zhang | 3:a280069151ac | 475 | else *lengthP = len; |
| terence zhang | 3:a280069151ac | 476 | } |
| terence zhang | 3:a280069151ac | 477 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 478 | |
| terence zhang | 3:a280069151ac | 479 | LOG_ARG("result: %u.%2u", (result & 0xFF) >> 5, (result & 0x1F)); |
| terence zhang | 3:a280069151ac | 480 | |
| terence zhang | 3:a280069151ac | 481 | return result; |
| terencez | 0:f9d13e09cf11 | 482 | } |
| terencez | 0:f9d13e09cf11 | 483 | |
| terencez | 0:f9d13e09cf11 | 484 | bool object_isInstanceNew(lwm2m_context_t * contextP, |
| terencez | 0:f9d13e09cf11 | 485 | uint16_t objectId, |
| terencez | 0:f9d13e09cf11 | 486 | uint16_t instanceId) |
| terencez | 0:f9d13e09cf11 | 487 | { |
| terence zhang | 3:a280069151ac | 488 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 489 | |
| terence zhang | 3:a280069151ac | 490 | LOG("Entering"); |
| terence zhang | 3:a280069151ac | 491 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, objectId); |
| terence zhang | 3:a280069151ac | 492 | if (targetP != NULL) |
| terencez | 0:f9d13e09cf11 | 493 | { |
| terence zhang | 3:a280069151ac | 494 | if (NULL != lwm2m_list_find(targetP->instanceList, instanceId)) |
| terencez | 0:f9d13e09cf11 | 495 | { |
| terencez | 0:f9d13e09cf11 | 496 | return false; |
| terencez | 0:f9d13e09cf11 | 497 | } |
| terencez | 0:f9d13e09cf11 | 498 | } |
| terencez | 0:f9d13e09cf11 | 499 | |
| terencez | 0:f9d13e09cf11 | 500 | return true; |
| terencez | 0:f9d13e09cf11 | 501 | } |
| terencez | 0:f9d13e09cf11 | 502 | |
| terence zhang | 3:a280069151ac | 503 | static int prv_getObjectTemplate(uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 504 | size_t length, |
| terence zhang | 3:a280069151ac | 505 | uint16_t id) |
| terencez | 0:f9d13e09cf11 | 506 | { |
| terencez | 0:f9d13e09cf11 | 507 | int index; |
| terencez | 0:f9d13e09cf11 | 508 | int result; |
| terencez | 0:f9d13e09cf11 | 509 | |
| terence zhang | 3:a280069151ac | 510 | if (length < REG_OBJECT_MIN_LEN) return -1; |
| terence zhang | 3:a280069151ac | 511 | |
| terence zhang | 3:a280069151ac | 512 | buffer[0] = '<'; |
| terence zhang | 3:a280069151ac | 513 | buffer[1] = '/'; |
| terence zhang | 3:a280069151ac | 514 | index = 2; |
| terence zhang | 3:a280069151ac | 515 | |
| terence zhang | 3:a280069151ac | 516 | result = utils_intCopy((char *)buffer + index, length - index, id); |
| terence zhang | 3:a280069151ac | 517 | if (result < 0) return -1; |
| terence zhang | 3:a280069151ac | 518 | index += result; |
| terence zhang | 3:a280069151ac | 519 | |
| terence zhang | 3:a280069151ac | 520 | if (length - index < REG_OBJECT_MIN_LEN - 3) return -1; |
| terence zhang | 3:a280069151ac | 521 | buffer[index] = '/'; |
| terence zhang | 3:a280069151ac | 522 | index++; |
| terencez | 0:f9d13e09cf11 | 523 | |
| terence zhang | 3:a280069151ac | 524 | return index; |
| terence zhang | 3:a280069151ac | 525 | } |
| terence zhang | 3:a280069151ac | 526 | |
| terence zhang | 3:a280069151ac | 527 | int object_getRegisterPayload(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 528 | uint8_t * buffer, |
| terence zhang | 3:a280069151ac | 529 | size_t bufferLen) |
| terence zhang | 3:a280069151ac | 530 | { |
| terence zhang | 3:a280069151ac | 531 | size_t index; |
| terence zhang | 3:a280069151ac | 532 | int result; |
| terence zhang | 3:a280069151ac | 533 | lwm2m_object_t * objectP; |
| terence zhang | 3:a280069151ac | 534 | |
| terence zhang | 3:a280069151ac | 535 | LOG("Entering"); |
| terence zhang | 3:a280069151ac | 536 | // index can not be greater than bufferLen |
| terencez | 0:f9d13e09cf11 | 537 | index = 0; |
| terence zhang | 3:a280069151ac | 538 | |
| terence zhang | 3:a280069151ac | 539 | result = utils_stringCopy((char *)buffer, bufferLen, REG_START); |
| terence zhang | 3:a280069151ac | 540 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 541 | index += result; |
| terence zhang | 3:a280069151ac | 542 | |
| terence zhang | 3:a280069151ac | 543 | if ((contextP->altPath != NULL) |
| terence zhang | 3:a280069151ac | 544 | && (contextP->altPath[0] != 0)) |
| terence zhang | 3:a280069151ac | 545 | { |
| terence zhang | 3:a280069151ac | 546 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, contextP->altPath); |
| terence zhang | 3:a280069151ac | 547 | } |
| terence zhang | 3:a280069151ac | 548 | else |
| terencez | 0:f9d13e09cf11 | 549 | { |
| terence zhang | 3:a280069151ac | 550 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_DEFAULT_PATH); |
| terence zhang | 3:a280069151ac | 551 | } |
| terence zhang | 3:a280069151ac | 552 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 553 | index += result; |
| terence zhang | 3:a280069151ac | 554 | |
| terence zhang | 3:a280069151ac | 555 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_LWM2M_RESOURCE_TYPE); |
| terence zhang | 3:a280069151ac | 556 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 557 | index += result; |
| terence zhang | 3:a280069151ac | 558 | |
| terence zhang | 3:a280069151ac | 559 | for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next) |
| terence zhang | 3:a280069151ac | 560 | { |
| terence zhang | 3:a280069151ac | 561 | size_t start; |
| terence zhang | 3:a280069151ac | 562 | size_t length; |
| terence zhang | 3:a280069151ac | 563 | |
| terence zhang | 3:a280069151ac | 564 | if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) continue; |
| terence zhang | 3:a280069151ac | 565 | |
| terence zhang | 3:a280069151ac | 566 | start = index; |
| terence zhang | 3:a280069151ac | 567 | result = prv_getObjectTemplate(buffer + index, bufferLen - index, objectP->objID); |
| terence zhang | 3:a280069151ac | 568 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 569 | length = result; |
| terence zhang | 3:a280069151ac | 570 | index += length; |
| terence zhang | 3:a280069151ac | 571 | |
| terence zhang | 3:a280069151ac | 572 | if (objectP->instanceList == NULL) |
| terencez | 0:f9d13e09cf11 | 573 | { |
| terence zhang | 3:a280069151ac | 574 | index--; |
| terence zhang | 3:a280069151ac | 575 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_PATH_END); |
| terence zhang | 3:a280069151ac | 576 | if (result < 0) return 0; |
| terencez | 0:f9d13e09cf11 | 577 | index += result; |
| terencez | 0:f9d13e09cf11 | 578 | } |
| terencez | 0:f9d13e09cf11 | 579 | else |
| terencez | 0:f9d13e09cf11 | 580 | { |
| terence zhang | 3:a280069151ac | 581 | lwm2m_list_t * targetP; |
| terence zhang | 3:a280069151ac | 582 | for (targetP = objectP->instanceList ; targetP != NULL ; targetP = targetP->next) |
| terencez | 0:f9d13e09cf11 | 583 | { |
| terence zhang | 3:a280069151ac | 584 | if (bufferLen - index <= length) return 0; |
| terence zhang | 3:a280069151ac | 585 | |
| terence zhang | 3:a280069151ac | 586 | if (index != start + length) |
| terence zhang | 3:a280069151ac | 587 | { |
| terence zhang | 3:a280069151ac | 588 | memcpy(buffer + index, buffer + start, length); |
| terence zhang | 3:a280069151ac | 589 | index += length; |
| terence zhang | 3:a280069151ac | 590 | } |
| terencez | 0:f9d13e09cf11 | 591 | |
| terence zhang | 3:a280069151ac | 592 | result = utils_intCopy((char *)buffer + index, bufferLen - index, targetP->id); |
| terence zhang | 3:a280069151ac | 593 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 594 | index += result; |
| terence zhang | 3:a280069151ac | 595 | |
| terence zhang | 3:a280069151ac | 596 | result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_PATH_END); |
| terence zhang | 3:a280069151ac | 597 | if (result < 0) return 0; |
| terence zhang | 3:a280069151ac | 598 | index += result; |
| terencez | 0:f9d13e09cf11 | 599 | } |
| terencez | 0:f9d13e09cf11 | 600 | } |
| terencez | 0:f9d13e09cf11 | 601 | } |
| terencez | 0:f9d13e09cf11 | 602 | |
| terencez | 0:f9d13e09cf11 | 603 | if (index > 0) |
| terencez | 0:f9d13e09cf11 | 604 | { |
| terencez | 0:f9d13e09cf11 | 605 | index = index - 1; // remove trailing ',' |
| terencez | 0:f9d13e09cf11 | 606 | } |
| terencez | 0:f9d13e09cf11 | 607 | |
| terencez | 0:f9d13e09cf11 | 608 | buffer[index] = 0; |
| terencez | 0:f9d13e09cf11 | 609 | |
| terencez | 0:f9d13e09cf11 | 610 | return index; |
| terencez | 0:f9d13e09cf11 | 611 | } |
| terence zhang | 3:a280069151ac | 612 | |
| terence zhang | 3:a280069151ac | 613 | static lwm2m_list_t * prv_findServerInstance(lwm2m_object_t * objectP, |
| terence zhang | 3:a280069151ac | 614 | uint16_t shortID) |
| terence zhang | 3:a280069151ac | 615 | { |
| terence zhang | 3:a280069151ac | 616 | lwm2m_list_t * instanceP; |
| terence zhang | 3:a280069151ac | 617 | |
| terence zhang | 3:a280069151ac | 618 | instanceP = objectP->instanceList; |
| terence zhang | 3:a280069151ac | 619 | while (NULL != instanceP) |
| terence zhang | 3:a280069151ac | 620 | { |
| terence zhang | 3:a280069151ac | 621 | int64_t value; |
| terence zhang | 3:a280069151ac | 622 | lwm2m_data_t * dataP; |
| terence zhang | 3:a280069151ac | 623 | int size; |
| terence zhang | 3:a280069151ac | 624 | |
| terence zhang | 3:a280069151ac | 625 | size = 1; |
| terence zhang | 3:a280069151ac | 626 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 627 | if (dataP == NULL) return NULL; |
| terence zhang | 3:a280069151ac | 628 | dataP->id = LWM2M_SERVER_SHORT_ID_ID; |
| terence zhang | 3:a280069151ac | 629 | |
| terence zhang | 3:a280069151ac | 630 | if (objectP->readFunc(instanceP->id, &size, &dataP, objectP) != COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 631 | { |
| terence zhang | 3:a280069151ac | 632 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 633 | return NULL; |
| terence zhang | 3:a280069151ac | 634 | } |
| terence zhang | 3:a280069151ac | 635 | |
| terence zhang | 3:a280069151ac | 636 | if (1 == lwm2m_data_decode_int(dataP, &value)) |
| terence zhang | 3:a280069151ac | 637 | { |
| terence zhang | 3:a280069151ac | 638 | if (value == shortID) |
| terence zhang | 3:a280069151ac | 639 | { |
| terence zhang | 3:a280069151ac | 640 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 641 | break; |
| terence zhang | 3:a280069151ac | 642 | } |
| terence zhang | 3:a280069151ac | 643 | } |
| terence zhang | 3:a280069151ac | 644 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 645 | instanceP = instanceP->next; |
| terence zhang | 3:a280069151ac | 646 | } |
| terence zhang | 3:a280069151ac | 647 | |
| terence zhang | 3:a280069151ac | 648 | return instanceP; |
| terence zhang | 3:a280069151ac | 649 | } |
| terence zhang | 3:a280069151ac | 650 | |
| terence zhang | 3:a280069151ac | 651 | static int prv_getMandatoryInfo(lwm2m_object_t * objectP, |
| terence zhang | 3:a280069151ac | 652 | uint16_t instanceID, |
| terence zhang | 3:a280069151ac | 653 | lwm2m_server_t * targetP) |
| terence zhang | 3:a280069151ac | 654 | { |
| terence zhang | 3:a280069151ac | 655 | lwm2m_data_t * dataP; |
| terence zhang | 3:a280069151ac | 656 | int size; |
| terence zhang | 3:a280069151ac | 657 | int64_t value; |
| terence zhang | 3:a280069151ac | 658 | |
| terence zhang | 3:a280069151ac | 659 | size = 2; |
| terence zhang | 3:a280069151ac | 660 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 661 | if (dataP == NULL) return -1; |
| terence zhang | 3:a280069151ac | 662 | dataP[0].id = LWM2M_SERVER_LIFETIME_ID; |
| terence zhang | 3:a280069151ac | 663 | dataP[1].id = LWM2M_SERVER_BINDING_ID; |
| terence zhang | 3:a280069151ac | 664 | |
| terence zhang | 3:a280069151ac | 665 | if (objectP->readFunc(instanceID, &size, &dataP, objectP) != COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 666 | { |
| terence zhang | 3:a280069151ac | 667 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 668 | return -1; |
| terence zhang | 3:a280069151ac | 669 | } |
| terence zhang | 3:a280069151ac | 670 | |
| terence zhang | 3:a280069151ac | 671 | if (0 == lwm2m_data_decode_int(dataP, &value) |
| terence zhang | 3:a280069151ac | 672 | || value < 0 || value >0xFFFFFFFF) // This is an implementation limit |
| terence zhang | 3:a280069151ac | 673 | { |
| terence zhang | 3:a280069151ac | 674 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 675 | return -1; |
| terence zhang | 3:a280069151ac | 676 | } |
| terence zhang | 3:a280069151ac | 677 | targetP->lifetime = value; |
| terence zhang | 3:a280069151ac | 678 | |
| terence zhang | 3:a280069151ac | 679 | targetP->binding = utils_stringToBinding(dataP[1].value.asBuffer.buffer, dataP[1].value.asBuffer.length); |
| terence zhang | 3:a280069151ac | 680 | |
| terence zhang | 3:a280069151ac | 681 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 682 | |
| terence zhang | 3:a280069151ac | 683 | if (targetP->binding == BINDING_UNKNOWN) |
| terence zhang | 3:a280069151ac | 684 | { |
| terence zhang | 3:a280069151ac | 685 | return -1; |
| terence zhang | 3:a280069151ac | 686 | } |
| terence zhang | 3:a280069151ac | 687 | |
| terence zhang | 3:a280069151ac | 688 | return 0; |
| terence zhang | 3:a280069151ac | 689 | } |
| terence zhang | 3:a280069151ac | 690 | |
| terence zhang | 3:a280069151ac | 691 | int object_getServers(lwm2m_context_t * contextP) |
| terence zhang | 3:a280069151ac | 692 | { |
| terence zhang | 3:a280069151ac | 693 | lwm2m_object_t * objectP; |
| terence zhang | 3:a280069151ac | 694 | lwm2m_object_t * securityObjP = NULL; |
| terence zhang | 3:a280069151ac | 695 | lwm2m_object_t * serverObjP = NULL; |
| terence zhang | 3:a280069151ac | 696 | lwm2m_list_t * securityInstP; // instanceID of the server in the LWM2M Security Object |
| terence zhang | 3:a280069151ac | 697 | |
| terence zhang | 3:a280069151ac | 698 | LOG("Entering"); |
| terence zhang | 3:a280069151ac | 699 | |
| terence zhang | 3:a280069151ac | 700 | for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next) |
| terence zhang | 3:a280069151ac | 701 | { |
| terence zhang | 3:a280069151ac | 702 | if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) |
| terence zhang | 3:a280069151ac | 703 | { |
| terence zhang | 3:a280069151ac | 704 | securityObjP = objectP; |
| terence zhang | 3:a280069151ac | 705 | } |
| terence zhang | 3:a280069151ac | 706 | else if (objectP->objID == LWM2M_SERVER_OBJECT_ID) |
| terence zhang | 3:a280069151ac | 707 | { |
| terence zhang | 3:a280069151ac | 708 | serverObjP = objectP; |
| terence zhang | 3:a280069151ac | 709 | } |
| terence zhang | 3:a280069151ac | 710 | } |
| terence zhang | 3:a280069151ac | 711 | |
| terence zhang | 3:a280069151ac | 712 | if (NULL == securityObjP) return -1; |
| terence zhang | 3:a280069151ac | 713 | |
| terence zhang | 3:a280069151ac | 714 | securityInstP = securityObjP->instanceList; |
| terence zhang | 3:a280069151ac | 715 | while (securityInstP != NULL) |
| terence zhang | 3:a280069151ac | 716 | { |
| terence zhang | 3:a280069151ac | 717 | if (LWM2M_LIST_FIND(contextP->bootstrapServerList, securityInstP->id) == NULL |
| terence zhang | 3:a280069151ac | 718 | && LWM2M_LIST_FIND(contextP->serverList, securityInstP->id) == NULL) |
| terence zhang | 3:a280069151ac | 719 | { |
| terence zhang | 3:a280069151ac | 720 | // This server is new. eg created by last bootstrap |
| terence zhang | 3:a280069151ac | 721 | |
| terence zhang | 3:a280069151ac | 722 | lwm2m_data_t * dataP; |
| terence zhang | 3:a280069151ac | 723 | int size; |
| terence zhang | 3:a280069151ac | 724 | lwm2m_server_t * targetP; |
| terence zhang | 3:a280069151ac | 725 | bool isBootstrap; |
| terence zhang | 3:a280069151ac | 726 | int64_t value = 0; |
| terence zhang | 3:a280069151ac | 727 | |
| terence zhang | 3:a280069151ac | 728 | size = 3; |
| terence zhang | 3:a280069151ac | 729 | dataP = lwm2m_data_new(size); |
| terence zhang | 3:a280069151ac | 730 | if (dataP == NULL) return -1; |
| terence zhang | 3:a280069151ac | 731 | dataP[0].id = LWM2M_SECURITY_BOOTSTRAP_ID; |
| terence zhang | 3:a280069151ac | 732 | dataP[1].id = LWM2M_SECURITY_SHORT_SERVER_ID; |
| terence zhang | 3:a280069151ac | 733 | dataP[2].id = LWM2M_SECURITY_HOLD_OFF_ID; |
| terence zhang | 3:a280069151ac | 734 | |
| terence zhang | 3:a280069151ac | 735 | if (securityObjP->readFunc(securityInstP->id, &size, &dataP, securityObjP) != COAP_205_CONTENT) |
| terence zhang | 3:a280069151ac | 736 | { |
| terence zhang | 3:a280069151ac | 737 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 738 | return -1; |
| terence zhang | 3:a280069151ac | 739 | } |
| terence zhang | 3:a280069151ac | 740 | |
| terence zhang | 3:a280069151ac | 741 | targetP = (lwm2m_server_t *)lwm2m_malloc(sizeof(lwm2m_server_t)); |
| terence zhang | 3:a280069151ac | 742 | if (targetP == NULL) { |
| terence zhang | 3:a280069151ac | 743 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 744 | return -1; |
| terence zhang | 3:a280069151ac | 745 | } |
| terence zhang | 3:a280069151ac | 746 | memset(targetP, 0, sizeof(lwm2m_server_t)); |
| terence zhang | 3:a280069151ac | 747 | targetP->secObjInstID = securityInstP->id; |
| terence zhang | 3:a280069151ac | 748 | |
| terence zhang | 3:a280069151ac | 749 | if (0 == lwm2m_data_decode_bool(dataP + 0, &isBootstrap)) |
| terence zhang | 3:a280069151ac | 750 | { |
| terence zhang | 3:a280069151ac | 751 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 752 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 753 | return -1; |
| terence zhang | 3:a280069151ac | 754 | } |
| terence zhang | 3:a280069151ac | 755 | |
| terence zhang | 3:a280069151ac | 756 | if (0 == lwm2m_data_decode_int(dataP + 1, &value) |
| terence zhang | 3:a280069151ac | 757 | || value < (isBootstrap ? 0 : 1) || value > 0xFFFF) // 0 is forbidden as a Short Server ID |
| terence zhang | 3:a280069151ac | 758 | { |
| terence zhang | 3:a280069151ac | 759 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 760 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 761 | return -1; |
| terence zhang | 3:a280069151ac | 762 | } |
| terence zhang | 3:a280069151ac | 763 | targetP->shortID = value; |
| terence zhang | 3:a280069151ac | 764 | |
| terence zhang | 3:a280069151ac | 765 | if (isBootstrap == true) |
| terence zhang | 3:a280069151ac | 766 | { |
| terence zhang | 3:a280069151ac | 767 | if (0 == lwm2m_data_decode_int(dataP + 2, &value) |
| terence zhang | 3:a280069151ac | 768 | || value < 0 || value > 0xFFFFFFFF) // This is an implementation limit |
| terence zhang | 3:a280069151ac | 769 | { |
| terence zhang | 3:a280069151ac | 770 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 771 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 772 | return -1; |
| terence zhang | 3:a280069151ac | 773 | } |
| terence zhang | 3:a280069151ac | 774 | // lifetime of a bootstrap server is set to ClientHoldOffTime |
| terence zhang | 3:a280069151ac | 775 | targetP->lifetime = value; |
| terence zhang | 3:a280069151ac | 776 | |
| terence zhang | 3:a280069151ac | 777 | contextP->bootstrapServerList = (lwm2m_server_t*)LWM2M_LIST_ADD(contextP->bootstrapServerList, targetP); |
| terence zhang | 3:a280069151ac | 778 | } |
| terence zhang | 3:a280069151ac | 779 | else |
| terence zhang | 3:a280069151ac | 780 | { |
| terence zhang | 3:a280069151ac | 781 | lwm2m_list_t * serverInstP; // instanceID of the server in the LWM2M Server Object |
| terence zhang | 3:a280069151ac | 782 | |
| terence zhang | 3:a280069151ac | 783 | serverInstP = prv_findServerInstance(serverObjP, targetP->shortID); |
| terence zhang | 3:a280069151ac | 784 | if (serverInstP == NULL) |
| terence zhang | 3:a280069151ac | 785 | { |
| terence zhang | 3:a280069151ac | 786 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 787 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 788 | return -1; |
| terence zhang | 3:a280069151ac | 789 | } |
| terence zhang | 3:a280069151ac | 790 | if (0 != prv_getMandatoryInfo(serverObjP, serverInstP->id, targetP)) |
| terence zhang | 3:a280069151ac | 791 | { |
| terence zhang | 3:a280069151ac | 792 | lwm2m_free(targetP); |
| terence zhang | 3:a280069151ac | 793 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 794 | return -1; |
| terence zhang | 3:a280069151ac | 795 | } |
| terence zhang | 3:a280069151ac | 796 | targetP->status = STATE_DEREGISTERED; |
| terence zhang | 3:a280069151ac | 797 | contextP->serverList = (lwm2m_server_t*)LWM2M_LIST_ADD(contextP->serverList, targetP); |
| terence zhang | 3:a280069151ac | 798 | } |
| terence zhang | 3:a280069151ac | 799 | lwm2m_data_free(size, dataP); |
| terence zhang | 3:a280069151ac | 800 | } |
| terence zhang | 3:a280069151ac | 801 | securityInstP = securityInstP->next; |
| terence zhang | 3:a280069151ac | 802 | } |
| terence zhang | 3:a280069151ac | 803 | |
| terence zhang | 3:a280069151ac | 804 | return 0; |
| terence zhang | 3:a280069151ac | 805 | } |
| terence zhang | 3:a280069151ac | 806 | |
| terence zhang | 3:a280069151ac | 807 | coap_status_t object_createInstance(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 808 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 809 | lwm2m_data_t * dataP) |
| terence zhang | 3:a280069151ac | 810 | { |
| terence zhang | 3:a280069151ac | 811 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 812 | |
| terence zhang | 3:a280069151ac | 813 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 814 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 815 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 816 | |
| terence zhang | 3:a280069151ac | 817 | if (NULL == targetP->createFunc) |
| terence zhang | 3:a280069151ac | 818 | { |
| terence zhang | 3:a280069151ac | 819 | return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 820 | } |
| terence zhang | 3:a280069151ac | 821 | |
| terence zhang | 3:a280069151ac | 822 | return targetP->createFunc(lwm2m_list_newId(targetP->instanceList), dataP->value.asChildren.count, dataP->value.asChildren.array, targetP); |
| terence zhang | 3:a280069151ac | 823 | } |
| terence zhang | 3:a280069151ac | 824 | |
| terence zhang | 3:a280069151ac | 825 | coap_status_t object_writeInstance(lwm2m_context_t * contextP, |
| terence zhang | 3:a280069151ac | 826 | lwm2m_uri_t * uriP, |
| terence zhang | 3:a280069151ac | 827 | lwm2m_data_t * dataP) |
| terence zhang | 3:a280069151ac | 828 | { |
| terence zhang | 3:a280069151ac | 829 | lwm2m_object_t * targetP; |
| terence zhang | 3:a280069151ac | 830 | |
| terence zhang | 3:a280069151ac | 831 | LOG_URI(uriP); |
| terence zhang | 3:a280069151ac | 832 | targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId); |
| terence zhang | 3:a280069151ac | 833 | if (NULL == targetP) return COAP_404_NOT_FOUND; |
| terence zhang | 3:a280069151ac | 834 | |
| terence zhang | 3:a280069151ac | 835 | if (NULL == targetP->writeFunc) |
| terence zhang | 3:a280069151ac | 836 | { |
| terence zhang | 3:a280069151ac | 837 | return COAP_405_METHOD_NOT_ALLOWED; |
| terence zhang | 3:a280069151ac | 838 | } |
| terence zhang | 3:a280069151ac | 839 | |
| terence zhang | 3:a280069151ac | 840 | return targetP->writeFunc(dataP->id, dataP->value.asChildren.count, dataP->value.asChildren.array, targetP); |
| terence zhang | 3:a280069151ac | 841 | } |
| terence zhang | 3:a280069151ac | 842 | |
| terencez | 0:f9d13e09cf11 | 843 | #endif |