static uint8_t prv_server_write(uint16_t instanceId, int numData, lwm2m_data_t * dataArray, lwm2m_object_t * objectP) { server_instance_t * targetP; int i; uint8_t result; targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId); if (NULL == targetP) { return COAP_404_NOT_FOUND; } i = 0; do { switch (dataArray[i].id) { case LWM2M_SERVER_SHORT_ID_ID: { uint32_t value; result = prv_set_int_value(dataArray + i, &value); if (COAP_204_CHANGED == result) { if (0 < value && value <= 0xFFFF) { targetP->shortServerId = value; } else { result = COAP_406_NOT_ACCEPTABLE; } } } break; case LWM2M_SERVER_LIFETIME_ID: result = prv_set_int_value(dataArray + i, (uint32_t *)&(targetP->lifetime)); break; case LWM2M_SERVER_DISABLE_ID: result = COAP_405_METHOD_NOT_ALLOWED; break; case LWM2M_SERVER_STORING_ID: { bool value; if (1 == lwm2m_data_decode_bool(dataArray + i, &value)) { targetP->storing = value; result = COAP_204_CHANGED; } else { result = COAP_400_BAD_REQUEST; } } break; case LWM2M_SERVER_BINDING_ID: if ((dataArray[i].length > 0 && dataArray[i].length <= 3) && (strncmp((char*)dataArray[i].value, "U", dataArray[i].length) == 0 || strncmp((char*)dataArray[i].value, "UQ", dataArray[i].length) == 0 || strncmp((char*)dataArray[i].value, "S", dataArray[i].length) == 0 || strncmp((char*)dataArray[i].value, "SQ", dataArray[i].length) == 0 || strncmp((char*)dataArray[i].value, "US", dataArray[i].length) == 0 || strncmp((char*)dataArray[i].value, "UQS", dataArray[i].length) == 0)) { strncpy(targetP->binding, (char*)dataArray[i].value, dataArray[i].length); result = COAP_204_CHANGED; } else { result = COAP_400_BAD_REQUEST; } break; case LWM2M_SERVER_UPDATE_ID: result = COAP_405_METHOD_NOT_ALLOWED; break; default: return COAP_404_NOT_FOUND; } i++; } while (i < numData && result == COAP_204_CHANGED); return result; }
static uint8_t prv_server_write(uint16_t instanceId, int numData, lwm2m_data_t * dataArray, lwm2m_object_t * objectP) { server_instance_t * targetP; int i; uint8_t result; targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId); if (NULL == targetP) { return COAP_404_NOT_FOUND; } i = 0; do { switch (dataArray[i].id) { case LWM2M_SERVER_SHORT_ID_ID: { uint32_t value = targetP->shortServerId; result = prv_set_int_value(dataArray + i, &value); if (COAP_204_CHANGED == result) { if (0 < value && 0xFFFF >= value) { targetP->shortServerId = value; } else { result = COAP_406_NOT_ACCEPTABLE; } } } break; case LWM2M_SERVER_LIFETIME_ID: result = prv_set_int_value(dataArray + i, (uint32_t *)&(targetP->lifetime)); break; case LWM2M_SERVER_MIN_PERIOD_ID: result = prv_set_int_value(dataArray + i, &(targetP->defaultMinPeriod)); break; case LWM2M_SERVER_MAX_PERIOD_ID: result = prv_set_int_value(dataArray + i, &(targetP->defaultMaxPeriod)); break; case LWM2M_SERVER_DISABLE_ID: result = COAP_405_METHOD_NOT_ALLOWED; break; case LWM2M_SERVER_TIMEOUT_ID: result = prv_set_int_value(dataArray + i, &(targetP->disableTimeout)); break; case LWM2M_SERVER_STORING_ID: { bool value; if (1 == lwm2m_data_decode_bool(dataArray + i, &value)) { targetP->storing = value; result = COAP_204_CHANGED; } else { result = COAP_400_BAD_REQUEST; } } break; case LWM2M_SERVER_BINDING_ID: if ((dataArray[i].type == LWM2M_TYPE_STRING || dataArray[i].type == LWM2M_TYPE_OPAQUE) && dataArray[i].value.asBuffer.length > 0 && dataArray[i].value.asBuffer.length <= 3 && (strncmp((char*)dataArray[i].value.asBuffer.buffer, "U", dataArray[i].value.asBuffer.length) == 0 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQ", dataArray[i].value.asBuffer.length) == 0 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "S", dataArray[i].value.asBuffer.length) == 0 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "SQ", dataArray[i].value.asBuffer.length) == 0 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "US", dataArray[i].value.asBuffer.length) == 0 || strncmp((char*)dataArray[i].value.asBuffer.buffer, "UQS", dataArray[i].value.asBuffer.length) == 0)) { strncpy(targetP->binding, (char*)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length); result = COAP_204_CHANGED; } else { result = COAP_400_BAD_REQUEST; } break; case LWM2M_SERVER_UPDATE_ID: result = COAP_405_METHOD_NOT_ALLOWED; break; #ifndef LWM2M_VERSION_1_0 case LWM2M_SERVER_REG_ORDER_ID: { uint64_t value; if (1 == lwm2m_data_decode_uint(dataArray + i, &value)) { if (value <= INT_MAX) { targetP->registrationPriorityOrder = value; result = COAP_204_CHANGED; } else { result = COAP_406_NOT_ACCEPTABLE; } } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_INITIAL_REG_DELAY_ID: { uint64_t value; if (1 == lwm2m_data_decode_uint(dataArray + i, &value)) { if (value <= INT_MAX) { targetP->initialRegistrationDelayTimer = value; result = COAP_204_CHANGED; } else { result = COAP_406_NOT_ACCEPTABLE; } } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_REG_FAIL_BLOCK_ID: { bool value; if (1 == lwm2m_data_decode_bool(dataArray + i, &value)) { targetP->registrationFailureBlock = value; result = COAP_204_CHANGED; } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_REG_FAIL_BOOTSTRAP_ID: { bool value; if (1 == lwm2m_data_decode_bool(dataArray + i, &value)) { targetP->bootstrapOnRegistrationFailure = value; result = COAP_204_CHANGED; } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_COMM_RETRY_COUNT_ID: { uint64_t value; if (1 == lwm2m_data_decode_uint(dataArray + i, &value)) { if (value <= INT_MAX) { targetP->communicationRetryCount = value; result = COAP_204_CHANGED; } else { result = COAP_406_NOT_ACCEPTABLE; } } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_COMM_RETRY_TIMER_ID: { uint64_t value; if (1 == lwm2m_data_decode_uint(dataArray + i, &value)) { if (value <= INT_MAX) { targetP->communicationRetryTimer = value; result = COAP_204_CHANGED; } else { result = COAP_406_NOT_ACCEPTABLE; } } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_SEQ_DELAY_TIMER_ID: { uint64_t value; if (1 == lwm2m_data_decode_uint(dataArray + i, &value)) { if (value <= INT_MAX) { targetP->communicationSequenceDelayTimer = value; result = COAP_204_CHANGED; } else { result = COAP_406_NOT_ACCEPTABLE; } } else { result = COAP_400_BAD_REQUEST; } break; } case LWM2M_SERVER_SEQ_RETRY_COUNT_ID: { uint64_t value; if (1 == lwm2m_data_decode_uint(dataArray + i, &value)) { if (value <= INT_MAX) { targetP->communicationSequenceRetryCount = value; result = COAP_204_CHANGED; } else { result = COAP_406_NOT_ACCEPTABLE; } } else { result = COAP_400_BAD_REQUEST; } break; } #endif default: return COAP_404_NOT_FOUND; } i++; } while (i < numData && result == COAP_204_CHANGED); return result; }