/* * Delete all instances of an object except for the one with instanceId */ coap_status_t object_delete_others(lwm2m_context_t * contextP, uint16_t objectId, uint16_t instanceId) { lwm2m_object_t * objectP; lwm2m_list_t * instanceP; coap_status_t result; objectP = prv_find_object(contextP, objectId); if (NULL == objectP) return NOT_FOUND_4_04; if (NULL == objectP->deleteFunc) return METHOD_NOT_ALLOWED_4_05; LOG(" Call to object_delete_others\r\n"); result = COAP_202_DELETED; instanceP = objectP->instanceList; while (NULL != instanceP && result == COAP_202_DELETED) { if (instanceP->id == instanceId) { instanceP = instanceP->next; } else { result = objectP->deleteFunc(instanceP->id, objectP); instanceP = objectP->instanceList; } } return result; }
coap_status_t object_delete(lwm2m_context_t * contextP, lwm2m_uri_t * uriP) { lwm2m_object_t * objectP; coap_status_t result; objectP = prv_find_object(contextP, uriP->objectId); if (NULL == objectP) return NOT_FOUND_4_04; if (NULL == objectP->deleteFunc) return METHOD_NOT_ALLOWED_4_05; LOG(" Call to object_delete\r\n"); if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { result = objectP->deleteFunc(uriP->instanceId, objectP); } else { lwm2m_list_t * instanceP; result = COAP_202_DELETED; instanceP = objectP->instanceList; while (NULL != instanceP && result == COAP_202_DELETED) { result = objectP->deleteFunc(instanceP->id, objectP); instanceP = objectP->instanceList; } } return result; }
coap_status_t object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char * buffer, int length) { lwm2m_object_t * targetP; if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0) { return BAD_REQUEST_4_00; } targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { return NOT_FOUND_4_04; } if (NULL == targetP->writeFunc) { return METHOD_NOT_ALLOWED_4_05; } return targetP->writeFunc(uriP, buffer, length, targetP); }
void handle_value_changed(lwm2m_context_t * lwm2mH, lwm2m_uri_t * uri, const char * value, size_t valueLength) { lwm2m_object_t * object = prv_find_object(lwm2mH, uri->objectId); if (NULL != object) { if (object->writeFunc != NULL) { lwm2m_data_t * dataP; int result; dataP = lwm2m_data_new(1); if (dataP == NULL) { fprintf(stderr, "Internal allocation failure !\n"); return; } dataP->id = uri->resourceId; lwm2m_data_encode_nstring(value, valueLength, dataP); result = object->writeFunc(uri->instanceId, 1, dataP, object); if (COAP_405_METHOD_NOT_ALLOWED == result) { switch (uri->objectId) { case LWM2M_DEVICE_OBJECT_ID: result = device_change(dataP, object); break; default: break; } } if (COAP_204_CHANGED != result) { fprintf(stderr, "Failed to change value!\n"); } else { fprintf(stderr, "value changed!\n"); lwm2m_resource_value_changed(lwm2mH, uri); } lwm2m_data_free(1, dataP); return; } else { fprintf(stderr, "write not supported for specified resource!\n"); } return; } else { fprintf(stderr, "Object not found !\n"); } }
coap_status_t object_create(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char * buffer, int length) { lwm2m_object_t * targetP; lwm2m_tlv_t * tlvP = NULL; int size = 0; uint8_t result; if (length == 0 || buffer == 0) { return BAD_REQUEST_4_00; } targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->createFunc) return METHOD_NOT_ALLOWED_4_05; if (LWM2M_URI_IS_SET_INSTANCE(uriP)) { if (NULL != lwm2m_list_find(targetP->instanceList, uriP->instanceId)) { // Instance already exists return COAP_406_NOT_ACCEPTABLE; } } else { uriP->instanceId = lwm2m_list_newId(targetP->instanceList); uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; } targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->writeFunc) return METHOD_NOT_ALLOWED_4_05; size = lwm2m_tlv_parse(buffer, length, &tlvP); if (size == 0) return COAP_500_INTERNAL_SERVER_ERROR; result = targetP->createFunc(uriP->instanceId, size, tlvP, targetP); lwm2m_tlv_free(size, tlvP); return result; }
coap_status_t object_delete(lwm2m_context_t * contextP, lwm2m_uri_t * uriP) { lwm2m_object_t * targetP; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->deleteFunc) return METHOD_NOT_ALLOWED_4_05; return targetP->deleteFunc(uriP->instanceId, targetP); }
coap_status_t object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length) { coap_status_t result = NO_ERROR; lwm2m_object_t * targetP; lwm2m_data_t * dataP = NULL; int size = 0; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { result = NOT_FOUND_4_04; } else if (NULL == targetP->writeFunc) { result = METHOD_NOT_ALLOWED_4_05; } else { if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { size = 1; dataP = lwm2m_data_new(size); if (dataP == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } dataP->flags = LWM2M_TLV_FLAG_TEXT_FORMAT | LWM2M_TLV_FLAG_STATIC_DATA; dataP->type = LWM2M_TYPE_RESOURCE; dataP->id = uriP->resourceId; dataP->length = length; dataP->value = (uint8_t *)buffer; } else { size = lwm2m_data_parse(buffer, length, format, &dataP); if (size == 0) { result = COAP_500_INTERNAL_SERVER_ERROR; } } } if (result == NO_ERROR) { result = targetP->writeFunc(uriP->instanceId, size, dataP, targetP); lwm2m_data_free(size, dataP); } return result; }
coap_status_t object_execute(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char * buffer, int length) { lwm2m_object_t * targetP; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->executeFunc) return METHOD_NOT_ALLOWED_4_05; return targetP->executeFunc(uriP->instanceId, uriP->resourceId, buffer, length, targetP); }
coap_status_t ICACHE_FLASH_ATTR object_create(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length) { lwm2m_object_t * targetP; lwm2m_data_t * dataP = NULL; int size = 0; uint8_t result; if (length == 0 || buffer == 0) { return BAD_REQUEST_4_00; } targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->createFunc) return METHOD_NOT_ALLOWED_4_05; if (LWM2M_URI_IS_SET_INSTANCE(uriP)) { if (NULL != lwm2m_list_find(targetP->instanceList, uriP->instanceId)) { // Instance already exists return COAP_406_NOT_ACCEPTABLE; } } else { uriP->instanceId = lwm2m_list_newId(targetP->instanceList); uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; } size = lwm2m_data_parse(buffer, length, format, &dataP); if (size == 0) return COAP_500_INTERNAL_SERVER_ERROR; #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) { dataP->flags |= LWM2M_TLV_FLAG_BOOTSTRAPPING; } #endif result = targetP->createFunc(uriP->instanceId, size, dataP, targetP); lwm2m_data_free(size, dataP); return result; }
bool object_isInstanceNew(lwm2m_context_t * contextP, uint16_t objectId, uint16_t instanceId) { lwm2m_object_t * targetP; targetP = prv_find_object(contextP, objectId); if (targetP != NULL) { if (NULL != lwm2m_list_find(targetP->instanceList, instanceId)) { return false; } } return true; }
static void prv_object_dump(char * buffer, void * user_data) { lwm2m_context_t * lwm2mH = (lwm2m_context_t *) user_data; lwm2m_uri_t uri; char * end = NULL; int result; lwm2m_object_t * objectP; uint16_t i; end = get_end_of_arg(buffer); if (end[0] == 0) goto syntax_error; result = lwm2m_stringToUri(buffer, end - buffer, &uri); if (result == 0) goto syntax_error; if (uri.flag & LWM2M_URI_FLAG_RESOURCE_ID) goto syntax_error; objectP = prv_find_object(lwm2mH, uri.objectId); if (objectP == NULL) { fprintf(stdout, "Object not found.\n"); return; } if (uri.flag & LWM2M_URI_FLAG_INSTANCE_ID) { prv_instance_dump(objectP, uri.instanceId); } else { lwm2m_list_t * instanceP; for (instanceP = objectP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { fprintf(stdout, "Instance %d:\r\n", instanceP->id); prv_instance_dump(objectP, instanceP->id); fprintf(stdout, "\r\n"); } } return; syntax_error: fprintf(stdout, "Syntax error !\n"); }
coap_status_t ICACHE_FLASH_ATTR object_execute(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, uint8_t * buffer, size_t length) { lwm2m_object_t * targetP; #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) return METHOD_NOT_ALLOWED_4_05; #endif targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->executeFunc) return METHOD_NOT_ALLOWED_4_05; return targetP->executeFunc(uriP->instanceId, uriP->resourceId, buffer, length, targetP); }
coap_status_t object_create_execute(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char * buffer, int length) { lwm2m_object_t * targetP; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { return NOT_FOUND_4_04; } if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) != 0 && (uriP->flag & LWM2M_URI_FLAG_RESOURCE_ID) != 0) { // This is an execute if (NULL == targetP->executeFunc) { return METHOD_NOT_ALLOWED_4_05; } return targetP->executeFunc(uriP, buffer, length, targetP); } else if ((uriP->flag & LWM2M_URI_FLAG_RESOURCE_ID) == 0 && length != 0) { // This is a create if (length == 0 || buffer == 0) { return BAD_REQUEST_4_00; } if (NULL == targetP->createFunc) { return METHOD_NOT_ALLOWED_4_05; } return targetP->createFunc(uriP, buffer, length, targetP); } else return BAD_REQUEST_4_00; }
coap_status_t object_read(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char ** bufferP, int * lengthP) { lwm2m_object_t * targetP; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { return NOT_FOUND_4_04; } if (NULL == targetP->readFunc) { return METHOD_NOT_ALLOWED_4_05; } return targetP->readFunc(uriP, bufferP, lengthP, targetP); }
coap_status_t object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char * buffer, int length) { coap_status_t result; lwm2m_object_t * targetP; lwm2m_tlv_t * tlvP = NULL; int size = 0; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->writeFunc) return METHOD_NOT_ALLOWED_4_05; if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { size = 1; tlvP = lwm2m_tlv_new(size); if (tlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; tlvP->flags = LWM2M_TLV_FLAG_TEXT_FORMAT | LWM2M_TLV_FLAG_STATIC_DATA; tlvP->type = LWM2M_TYPE_RESSOURCE; tlvP->id = uriP->resourceId; tlvP->length = length; tlvP->value = buffer; } else { size = lwm2m_tlv_parse(buffer, length, &tlvP); if (size == 0) return COAP_500_INTERNAL_SERVER_ERROR; } result = targetP->writeFunc(uriP->instanceId, size, tlvP, targetP); lwm2m_tlv_free(size, tlvP); return result; }
coap_status_t object_delete(lwm2m_context_t * contextP, lwm2m_uri_t * uriP) { lwm2m_object_t * targetP; if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0 || (uriP->flag & LWM2M_URI_FLAG_RESOURCE_ID) != 0) { return BAD_REQUEST_4_00; } targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { return NOT_FOUND_4_04; } if (NULL == targetP->deleteFunc) { return METHOD_NOT_ALLOWED_4_05; } return targetP->deleteFunc(uriP->instanceId, targetP); }
coap_status_t ICACHE_FLASH_ATTR object_read(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t * formatP, uint8_t ** bufferP, size_t * lengthP) { coap_status_t result; lwm2m_object_t * targetP; lwm2m_data_t * dataP = NULL; int size = 0; #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) return METHOD_NOT_ALLOWED_4_05; #endif targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->readFunc) return METHOD_NOT_ALLOWED_4_05; if (targetP->instanceList == NULL) { // this is a single instance object if (LWM2M_URI_IS_SET_INSTANCE(uriP) && (uriP->instanceId != 0)) { return COAP_404_NOT_FOUND; } } else { if (LWM2M_URI_IS_SET_INSTANCE(uriP)) { if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) { return COAP_404_NOT_FOUND; } } else { // multiple object instances read lwm2m_list_t * instanceP; int i; size = 0; for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { size++; } dataP = lwm2m_data_new(size); if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; result = COAP_205_CONTENT; instanceP = targetP->instanceList; i = 0; while (instanceP != NULL && result == COAP_205_CONTENT) { result = targetP->readFunc(instanceP->id, (int*)&(dataP[i].length), (lwm2m_data_t **)&(dataP[i].value), targetP); dataP[i].type = LWM2M_TYPE_OBJECT_INSTANCE; dataP[i].id = instanceP->id; i++; instanceP = instanceP->next; } if (result == COAP_205_CONTENT) { *lengthP = lwm2m_data_serialize(size, dataP, formatP, bufferP); if (*lengthP == 0) result = COAP_500_INTERNAL_SERVER_ERROR; } lwm2m_data_free(size, dataP); return result; } } // single instance read if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { size = 1; dataP = lwm2m_data_new(size); if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; dataP->type = LWM2M_TYPE_RESOURCE; dataP->flags = LWM2M_TLV_FLAG_TEXT_FORMAT; dataP->id = uriP->resourceId; } result = targetP->readFunc(uriP->instanceId, &size, &dataP, targetP); if (result == COAP_205_CONTENT) { if (size == 1 && dataP->type == LWM2M_TYPE_RESOURCE && (dataP->flags && LWM2M_TLV_FLAG_TEXT_FORMAT) != 0 ) { *bufferP = (uint8_t *)c_zalloc(dataP->length); if (*bufferP == NULL) { result = COAP_500_INTERNAL_SERVER_ERROR; } else { c_memcpy(*bufferP, dataP->value, dataP->length); *lengthP = dataP->length; } } else { *lengthP = lwm2m_data_serialize(size, dataP, formatP, bufferP); if (*lengthP == 0) result = COAP_500_INTERNAL_SERVER_ERROR; } } lwm2m_data_free(size, dataP); return result; }
coap_status_t object_read(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, char ** bufferP, int * lengthP) { coap_status_t result; lwm2m_object_t * targetP; lwm2m_tlv_t * tlvP = NULL; int size = 0; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) return NOT_FOUND_4_04; if (NULL == targetP->readFunc) return METHOD_NOT_ALLOWED_4_05; if (targetP->instanceList == NULL) { // CDCC: Do not need to check the object instance for object which do not need register. // this is a single instance object if (targetP->needRegister && LWM2M_URI_IS_SET_INSTANCE(uriP) && (uriP->instanceId != 0)) { return COAP_404_NOT_FOUND; } } else { if (LWM2M_URI_IS_SET_INSTANCE(uriP)) { if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) { return COAP_404_NOT_FOUND; } } else { // multiple object instances read lwm2m_list_t * instanceP; int i; size = 0; for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next) { size++; } tlvP = lwm2m_tlv_new(size); if (tlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; result = COAP_205_CONTENT; instanceP = targetP->instanceList; i = 0; while (instanceP != NULL && result == COAP_205_CONTENT) { result = targetP->readFunc(instanceP->id, (int*)&(tlvP[i].length), (lwm2m_tlv_t **)&(tlvP[i].value), targetP); tlvP[i].type = LWM2M_TYPE_OBJECT_INSTANCE; tlvP[i].id = instanceP->id; i++; instanceP = instanceP->next; } if (result == COAP_205_CONTENT) { *lengthP = lwm2m_tlv_serialize(size, tlvP, bufferP); if (*lengthP == 0) result = COAP_500_INTERNAL_SERVER_ERROR; } lwm2m_tlv_free(size, tlvP); return result; } } // single instance read if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { size = 1; tlvP = lwm2m_tlv_new(size); if (tlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR; tlvP->type = LWM2M_TYPE_RESSOURCE; tlvP->flags = LWM2M_TLV_FLAG_TEXT_FORMAT; tlvP->id = uriP->resourceId; } result = targetP->readFunc(uriP->instanceId, &size, &tlvP, targetP); if (result == COAP_205_CONTENT) { if (size == 1 && tlvP->type == LWM2M_TYPE_RESSOURCE && (tlvP->flags && LWM2M_TLV_FLAG_TEXT_FORMAT) != 0 ) { *bufferP = (char *)malloc(tlvP->length); if (*bufferP == NULL) { result = COAP_500_INTERNAL_SERVER_ERROR; } else { memcpy(*bufferP, tlvP->value, tlvP->length); *lengthP = tlvP->length; } } else { *lengthP = lwm2m_tlv_serialize(size, tlvP, bufferP); if (*lengthP == 0) result = COAP_500_INTERNAL_SERVER_ERROR; } } lwm2m_tlv_free(size, tlvP); return result; }
coap_status_t ICACHE_FLASH_ATTR object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length) { coap_status_t result = NO_ERROR; lwm2m_object_t * targetP; lwm2m_data_t * dataP = NULL; int size = 0; targetP = prv_find_object(contextP, uriP->objectId); if (NULL == targetP) { result = NOT_FOUND_4_04; } else if (NULL == targetP->writeFunc) { result = METHOD_NOT_ALLOWED_4_05; } else { if (LWM2M_URI_IS_SET_RESOURCE(uriP)) { size = 1; dataP = lwm2m_data_new(size); if (dataP == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } dataP->flags = LWM2M_TLV_FLAG_TEXT_FORMAT | LWM2M_TLV_FLAG_STATIC_DATA; dataP->type = LWM2M_TYPE_RESOURCE; dataP->id = uriP->resourceId; dataP->length = length; dataP->value = (uint8_t *)buffer; } else { size = lwm2m_data_parse(buffer, length, format, &dataP); if (size == 0) { result = COAP_500_INTERNAL_SERVER_ERROR; } } } if (result == NO_ERROR) { #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) { dataP->flags |= LWM2M_TLV_FLAG_BOOTSTRAPPING; } #endif result = targetP->writeFunc(uriP->instanceId, size, dataP, targetP); lwm2m_data_free(size, dataP); } #ifdef ICACHE_FLASH_ATTR if (contextP->bsState == BOOTSTRAP_PENDING) { if (result == COAP_204_CHANGED) { reset_bootstrap_timer(contextP); } else { bootstrap_failed(contextP); } } #endif return result; }
void handle_value_changed(lwm2m_context_t * lwm2mH, lwm2m_uri_t * uri, const char * value, size_t valueLength) { lwm2m_object_t * object = prv_find_object(lwm2mH, uri->objectId); if (NULL != object) { if (object->writeFunc != NULL) { lwm2m_data_t * dataP; int result; dataP = lwm2m_data_new(1); if (dataP == NULL) { fprintf(stderr, "Internal allocation failure !\n"); return; } dataP->flags = LWM2M_TLV_FLAG_STATIC_DATA | LWM2M_TLV_FLAG_TEXT_FORMAT; #ifdef LWM2M_BOOTSTRAP if (lwm2mH->bsState == BOOTSTRAP_PENDING) { dataP->flags |= LWM2M_TLV_FLAG_BOOTSTRAPPING; } #endif dataP->id = uri->resourceId; dataP->length = valueLength; dataP->value = (uint8_t*) value; result = object->writeFunc(uri->instanceId, 1, dataP, object); if (COAP_405_METHOD_NOT_ALLOWED == result) { switch (uri->objectId) { case LWM2M_DEVICE_OBJECT_ID: result = device_change(dataP, object); break; default: break; } } if (COAP_204_CHANGED != result) { fprintf(stderr, "Failed to change value!\n"); } else { fprintf(stderr, "value changed!\n"); lwm2m_resource_value_changed(lwm2mH, uri); } lwm2m_data_free(1, dataP); return; } else { fprintf(stderr, "write not supported for specified resource!\n"); } return; } else { fprintf(stderr, "Object not found !\n"); } }