static lwm2m_client_object_t * prv_decodeRegisterPayload(uint8_t * payload, uint16_t payloadLength) { lwm2m_client_object_t * objList; uint16_t id; uint16_t instance; uint16_t start; uint16_t end; int result; objList = NULL; start = 0; while (start < payloadLength) { while (start < payloadLength && payload[start] == ' ') start++; if (start == payloadLength) return objList; end = start; while (end < payloadLength && payload[end] != ',') end++; result = prv_getId(payload + start, end - start, &id, &instance); if (result != 0) { lwm2m_client_object_t * objectP; objectP = (lwm2m_client_object_t *)lwm2m_list_find((lwm2m_list_t *)objList, id); if (objectP == NULL) { objectP = (lwm2m_client_object_t *)lwm2m_malloc(sizeof(lwm2m_client_object_t)); memset(objectP, 0, sizeof(lwm2m_client_object_t)); if (objectP == NULL) return objList; objectP->id = id; objList = (lwm2m_client_object_t *)LWM2M_LIST_ADD(objList, objectP); } if (result == 2) { lwm2m_list_t * instanceP; instanceP = lwm2m_list_find(objectP->instanceList, instance); if (instanceP == NULL) { instanceP = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t)); memset(instanceP, 0, sizeof(lwm2m_list_t)); instanceP->id = instance; objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, instanceP); } } } start = end + 1; } return objList; }
static lwm2m_client_object_t * prv_decodeRegisterPayload(uint8_t * payload, uint16_t payloadLength, char ** altPath) { lwm2m_client_object_t * objList; uint16_t id; uint16_t instance; uint16_t start; uint16_t end; int result; uint16_t altPathStart; uint16_t altPathEnd; uint16_t altPathLen; objList = NULL; start = 0; altPathStart = 0; altPathEnd = 0; altPathLen = 0; *altPath = NULL; // Does the registration payload begin with an alternative path ? while (start < payloadLength && payload[start] == ' ') start++; if (start != payloadLength) { if (payload[start] == '<') { altPathStart = start + 1; } while (start < payloadLength - 1 && payload[start] != '>') start++; if (start != payloadLength - 1) { altPathEnd = start - 1; if ((payloadLength > altPathEnd + REG_LWM2M_RESOURCE_TYPE_LEN) && (0 == lwm2m_strncmp(REG_LWM2M_RESOURCE_TYPE, (char *) payload + altPathEnd + 1, REG_LWM2M_RESOURCE_TYPE_LEN))) { payload[altPathEnd + 1] = 0; *altPath = lwm2m_strdup((char *)payload + altPathStart); if (*altPath == NULL) return NULL; if (0 == prv_isAltPathValid(*altPath)) { return NULL; } altPathLen = altPathEnd - altPathStart + 1; } } } if (altPathLen != 0) { start = altPathEnd + 1 + REG_LWM2M_RESOURCE_TYPE_LEN; // If declared alternative path is "/", use NULL instead if (altPathLen == 1) { lwm2m_free(*altPath); *altPath = NULL; } } else { start = 0; } while (start < payloadLength) { while (start < payloadLength && payload[start] == ' ') start++; if (start == payloadLength) return objList; end = start; while (end < payloadLength && payload[end] != ',') end++; result = prv_getId(payload + start, end - start, *altPath, altPathLen, &id, &instance); if (result != 0) { lwm2m_client_object_t * objectP; objectP = (lwm2m_client_object_t *)lwm2m_list_find((lwm2m_list_t *)objList, id); if (objectP == NULL) { objectP = (lwm2m_client_object_t *)lwm2m_malloc(sizeof(lwm2m_client_object_t)); memset(objectP, 0, sizeof(lwm2m_client_object_t)); if (objectP == NULL) return objList; objectP->id = id; objList = (lwm2m_client_object_t *)LWM2M_LIST_ADD(objList, objectP); } if (result == 2) { lwm2m_list_t * instanceP; instanceP = lwm2m_list_find(objectP->instanceList, instance); if (instanceP == NULL) { instanceP = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t)); memset(instanceP, 0, sizeof(lwm2m_list_t)); instanceP->id = instance; objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, instanceP); } } } start = end + 1; } return objList; }
static lwm2m_client_object_t * prv_decodeRegisterPayload(uint8_t * payload, uint16_t payloadLength, bool * supportJSON, char ** altPath) { uint16_t index; lwm2m_client_object_t * objList; bool linkAttrFound; *altPath = NULL; *supportJSON = false; objList = NULL; linkAttrFound = false; index = 0; while (index <= payloadLength) { uint16_t start; uint16_t length; int result; uint16_t id; uint16_t instance; while (index < payloadLength && payload[index] == ' ') index++; if (index == payloadLength) break; start = index; while (index < payloadLength && payload[index] != REG_DELIMITER) index++; length = index - start; result = prv_getId(payload + start, length, &id, &instance); if (result != 0) { lwm2m_client_object_t * objectP; objectP = (lwm2m_client_object_t *)lwm2m_list_find((lwm2m_list_t *)objList, id); if (objectP == NULL) { objectP = (lwm2m_client_object_t *)lwm2m_malloc(sizeof(lwm2m_client_object_t)); memset(objectP, 0, sizeof(lwm2m_client_object_t)); if (objectP == NULL) goto error; objectP->id = id; objList = (lwm2m_client_object_t *)LWM2M_LIST_ADD(objList, objectP); } if (result == 2) { lwm2m_list_t * instanceP; instanceP = lwm2m_list_find(objectP->instanceList, instance); if (instanceP == NULL) { instanceP = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t)); memset(instanceP, 0, sizeof(lwm2m_list_t)); instanceP->id = instance; objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, instanceP); } } } else if (linkAttrFound == false) { result = prv_parseLinkAttributes(payload + start, length, supportJSON, altPath); if (result == 0) goto error; linkAttrFound = true; } else goto error; index++; } return objList; error: if (*altPath != NULL) { lwm2m_free(*altPath); *altPath = NULL; } prv_freeClientObjectList(objList); return NULL; }