static int prv_getId(uint8_t * data, uint16_t length, uint16_t * objId, uint16_t * instanceId) { int value; uint16_t limit; uint16_t end; // Expecting application/link-format (RFC6690) // leading space were removed before. Remove trailing spaces. while (length > 0 && data[length-1] == ' ') length--; // strip open and close tags if (length >= 1 && data[0] == REG_URI_START && data[length-1] == REG_URI_END) { data += 1; length -= 2; } else { return 0; } // If there is a preceding /, remove it if (length >= 1 && data[0] == '/') { data += 1; length -= 1; } limit = 0; while (limit < length && data[limit] != '/') limit++; value = prv_get_number(data, limit); if (value < 0 || value >= LWM2M_MAX_ID) return 0; *objId = value; if (limit < length) { limit += 1; data += limit; length -= limit; if (length > 0) { value = prv_get_number(data, length); if (value >= 0 && value < LWM2M_MAX_ID) { *instanceId = value; return 2; } else { return 0; } } } return 1; }
static int prv_getId(uint8_t * data, uint16_t length, uint16_t * objId, uint16_t * instanceId) { int value; uint16_t limit; uint16_t end; limit = 0; while (limit < length && data[limit] != '/' && data[limit] != ' ') limit++; value = prv_get_number(data, limit); if (value < 0 || value >= LWM2M_MAX_ID) return 0; *objId = value; if (limit != length) { limit += 1; end = limit; while (end < length && data[end] != ' ') end++; if (end != limit) { value = prv_get_number(data + limit, end - limit); if (value >= 0 && value < LWM2M_MAX_ID) { *instanceId = value; return 2; } } } return 1; }
static int prv_getId(uint8_t * data, uint16_t length, uint16_t * objId, uint16_t * instanceId) { int value; uint16_t limit; uint16_t end; // Expecting application/link-format (RFC6690) // strip open and close tags if (length >= 1 && data[0] == '<' && data[length-1] == '>') { data++; length-=2; } else { return 0; } // If there is a preceding /, remove it if (length >= 1 && data[0] == '/') { data++; length-=1; } limit = 0; while (limit < length && data[limit] != '/' && data[limit] != ' ') limit++; value = prv_get_number(data, limit); if (value < 0 || value >= LWM2M_MAX_ID) return 0; *objId = value; if (limit != length) { limit += 1; end = limit; while (end < length && data[end] != ' ') end++; if (end != limit) { value = prv_get_number(data + limit, end - limit); if (value >= 0 && value < LWM2M_MAX_ID) { *instanceId = value; return 2; } } } return 1; }
lwm2m_uri_t * lwm2m_decode_uri(multi_option_t *uriPath) { lwm2m_uri_t * uriP; int readNum; if (NULL == uriPath) return NULL; uriP = (lwm2m_uri_t *)lwm2m_malloc(sizeof(lwm2m_uri_t)); if (NULL == uriP) return NULL; memset(uriP, 0, sizeof(lwm2m_uri_t)); // Read object ID if (URI_REGISTRATION_SEGMENT_LEN == uriPath->len && 0 == strncmp(URI_REGISTRATION_SEGMENT, uriPath->data, uriPath->len)) { uriP->flag |= LWM2M_URI_FLAG_REGISTRATION; uriPath = uriPath->next; if (uriPath == NULL) return uriP; } else if (URI_BOOTSTRAP_SEGMENT_LEN == uriPath->len && 0 == strncmp(URI_BOOTSTRAP_SEGMENT, uriPath->data, uriPath->len)) { uriP->flag |= LWM2M_URI_FLAG_BOOTSTRAP; uriPath = uriPath->next; if (uriPath != NULL) goto error; return uriP; } readNum = prv_get_number(uriPath->data, uriPath->len); if (readNum < 0 || readNum > LWM2M_MAX_ID) goto error; uriP->objectId = (uint16_t)readNum; uriP->flag |= LWM2M_URI_FLAG_OBJECT_ID; uriPath = uriPath->next; if ((uriP->flag & LWM2M_URI_MASK_TYPE) == LWM2M_URI_FLAG_REGISTRATION) { if (uriPath != NULL) goto error; return uriP; } uriP->flag |= LWM2M_URI_FLAG_DM; if (uriPath == NULL) return uriP; // Read object instance if (uriPath->len != 0) { readNum = prv_get_number(uriPath->data, uriPath->len); if (readNum < 0 || readNum >= LWM2M_MAX_ID) goto error; uriP->instanceId = (uint16_t)readNum; uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; } uriPath = uriPath->next; if (uriPath == NULL) return uriP; // Read ressource ID if (uriPath->len != 0) { readNum = prv_get_number(uriPath->data, uriPath->len); if (readNum < 0 || readNum > LWM2M_MAX_ID) goto error; uriP->resourceId = (uint16_t)readNum; uriP->flag |= LWM2M_URI_FLAG_RESOURCE_ID; } // must be the last segment if (NULL == uriPath->next) return uriP; error: lwm2m_free(uriP); return NULL; }
lwm2m_uri_t * lwm2m_decode_uri(char * altPath, multi_option_t *uriPath) { lwm2m_uri_t * uriP; int readNum; uriP = (lwm2m_uri_t *)lwm2m_malloc(sizeof(lwm2m_uri_t)); if (NULL == uriP) return NULL; memset(uriP, 0, sizeof(lwm2m_uri_t)); // Read object ID if (NULL != uriPath && URI_REGISTRATION_SEGMENT_LEN == uriPath->len && 0 == strncmp(URI_REGISTRATION_SEGMENT, (char *)uriPath->data, uriPath->len)) { uriP->flag |= LWM2M_URI_FLAG_REGISTRATION; uriPath = uriPath->next; if (uriPath == NULL) return uriP; } else if (NULL != uriPath && URI_BOOTSTRAP_SEGMENT_LEN == uriPath->len && 0 == strncmp(URI_BOOTSTRAP_SEGMENT, (char *)uriPath->data, uriPath->len)) { uriP->flag |= LWM2M_URI_FLAG_BOOTSTRAP; uriPath = uriPath->next; if (uriPath != NULL) goto error; return uriP; } if ((uriP->flag & LWM2M_URI_MASK_TYPE) != LWM2M_URI_FLAG_REGISTRATION) { // Read altPath if any if (altPath != NULL) { int i; if (NULL == uriPath) { lwm2m_free(uriP); return NULL; } for (i = 0 ; i < uriPath->len ; i++) { if (uriPath->data[i] != altPath[i+1]) { lwm2m_free(uriP); return NULL; } } uriPath = uriPath->next; } if (NULL == uriPath || uriPath->len == 0) { uriP->flag |= LWM2M_URI_FLAG_DELETE_ALL; return uriP; } } readNum = prv_get_number(uriPath->data, uriPath->len); if (readNum < 0 || readNum > LWM2M_MAX_ID) goto error; uriP->objectId = (uint16_t)readNum; uriP->flag |= LWM2M_URI_FLAG_OBJECT_ID; uriPath = uriPath->next; if ((uriP->flag & LWM2M_URI_MASK_TYPE) == LWM2M_URI_FLAG_REGISTRATION) { if (uriPath != NULL) goto error; return uriP; } uriP->flag |= LWM2M_URI_FLAG_DM; if (uriPath == NULL) return uriP; // Read object instance if (uriPath->len != 0) { readNum = prv_get_number(uriPath->data, uriPath->len); if (readNum < 0 || readNum >= LWM2M_MAX_ID) goto error; uriP->instanceId = (uint16_t)readNum; uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID; } uriPath = uriPath->next; if (uriPath == NULL) return uriP; // Read resource ID if (uriPath->len != 0) { // resource ID without an instance ID is not allowed if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0) goto error; readNum = prv_get_number(uriPath->data, uriPath->len); if (readNum < 0 || readNum > LWM2M_MAX_ID) goto error; uriP->resourceId = (uint16_t)readNum; uriP->flag |= LWM2M_URI_FLAG_RESOURCE_ID; } // must be the last segment if (NULL == uriPath->next) return uriP; error: lwm2m_free(uriP); return NULL; }