terence zhang / Mbed OS mbed-os-example-wakaama

Dependencies:   C12832 LM75B

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?

UserRevisionLine numberNew 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