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; }
int lwm2m_configure(lwm2m_context_t * contextP, const char * endpointName, const char * msisdn, const char * altPath, uint16_t numObject, lwm2m_object_t * objectList[]) { int i; uint8_t found; // This API can be called only once for now if (contextP->endpointName != NULL) return COAP_400_BAD_REQUEST; if (endpointName == NULL) return COAP_400_BAD_REQUEST; if (numObject < 3) return COAP_400_BAD_REQUEST; // Check that mandatory objects are present found = 0; for (i = 0 ; i < numObject ; i++) { if (objectList[i]->objID == LWM2M_SECURITY_OBJECT_ID) found |= 0x01; if (objectList[i]->objID == LWM2M_SERVER_OBJECT_ID) found |= 0x02; if (objectList[i]->objID == LWM2M_DEVICE_OBJECT_ID) found |= 0x04; } if (found != 0x07) return COAP_400_BAD_REQUEST; if (altPath != NULL) { if (0 == prv_isAltPathValid(altPath)) { return COAP_400_BAD_REQUEST; } if (altPath[1] == 0) { altPath = NULL; } } contextP->endpointName = lwm2m_strdup(endpointName); if (contextP->endpointName == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } if (msisdn != NULL) { contextP->msisdn = lwm2m_strdup(msisdn); if (contextP->msisdn == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } } if (altPath != NULL) { contextP->altPath = lwm2m_strdup(altPath); if (contextP->altPath == NULL) { return COAP_500_INTERNAL_SERVER_ERROR; } } contextP->objectList = (lwm2m_object_t **)lwm2m_malloc(numObject * sizeof(lwm2m_object_t *)); if (NULL != contextP->objectList) { memcpy(contextP->objectList, objectList, numObject * sizeof(lwm2m_object_t *)); contextP->numObject = numObject; } else { lwm2m_free(contextP->endpointName); contextP->endpointName = NULL; return COAP_500_INTERNAL_SERVER_ERROR; } return COAP_NO_ERROR; }