void handle_value_changed(lwm2m_context_t * lwm2mH, lwm2m_uri_t * uri, const char * value, size_t valueLength) { lwm2m_object_t * object = (lwm2m_object_t *)LWM2M_LIST_FIND(lwm2mH->objectList, 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"); } }
static bool prv_convertValue(const _record_t * recordP, lwm2m_data_t * targetP) { switch (recordP->value.type) { case LWM2M_TYPE_STRING: if (0 != recordP->value.value.asBuffer.length) { size_t stringLen; uint8_t *string = (uint8_t *)lwm2m_malloc(recordP->value.value.asBuffer.length); if (!string) return false; stringLen = json_unescapeString(string, recordP->value.value.asBuffer.buffer, recordP->value.value.asBuffer.length); if (stringLen) { lwm2m_data_encode_nstring((char *)string, stringLen, targetP); lwm2m_free(string); } else { lwm2m_free(string); return false; } } else { lwm2m_data_encode_nstring(NULL, 0, targetP); } break; case LWM2M_TYPE_OPAQUE: if (0 != recordP->value.value.asBuffer.length) { size_t dataLength; uint8_t *data; dataLength = utils_base64GetDecodedSize((const char *)recordP->value.value.asBuffer.buffer, recordP->value.value.asBuffer.length); data = lwm2m_malloc(dataLength); if (!data) return false; dataLength = utils_base64Decode((const char *)recordP->value.value.asBuffer.buffer, recordP->value.value.asBuffer.length, data, dataLength); if (dataLength) { lwm2m_data_encode_opaque(data, dataLength, targetP); lwm2m_free(data); } else { lwm2m_free(data); return false; } } else { lwm2m_data_encode_opaque(NULL, 0, targetP); } break; default: targetP->type = recordP->value.type; memcpy(&targetP->value, &recordP->value.value, sizeof(targetP->value)); break; case LWM2M_TYPE_OBJECT: case LWM2M_TYPE_OBJECT_INSTANCE: case LWM2M_TYPE_MULTIPLE_RESOURCE: case LWM2M_TYPE_CORE_LINK: /* Should never happen */ return false; } return true; }