static int64_t OCConvertPresencePayload(OCPresencePayload* payload, uint8_t* outPayload, size_t* size) { CborEncoder encoder = {0}; int64_t err = 0; cbor_encoder_init(&encoder, outPayload, *size, 0); CborEncoder rootArray; err = err | cbor_encoder_create_array(&encoder, &rootArray, 1); CborEncoder map; err = err | cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); // Sequence Number err = err | cbor_encode_text_string(&map, OC_RSRVD_NONCE, sizeof(OC_RSRVD_NONCE) - 1); err = err | cbor_encode_uint(&map, payload->sequenceNumber); // Max Age err = err | cbor_encode_text_string(&map, OC_RSRVD_TTL, sizeof(OC_RSRVD_TTL) - 1); err = err | cbor_encode_uint(&map, payload->maxAge); // Trigger const char* triggerStr = convertTriggerEnumToString(payload->trigger); err = err | AddTextStringToMap(&map, OC_RSRVD_TRIGGER, sizeof(OC_RSRVD_TRIGGER) - 1, triggerStr); // Resource type name if(payload->trigger != OC_PRESENCE_TRIGGER_DELETE) { err = err | ConditionalAddTextStringToMap(&map, OC_RSRVD_RESOURCE_TYPE, sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->resourceType); } // Close Map err = err | cbor_encoder_close_container(&rootArray, &map); err = err | cbor_encoder_close_container(&encoder, &rootArray); return checkError(err, &encoder, outPayload, size); }
static OCStackResult OCConvertPresencePayload(OCPresencePayload* payload, uint8_t** outPayload, size_t* size) { *outPayload = (uint8_t*)OICCalloc(1, MAX_REQUEST_LENGTH); *size = MAX_REQUEST_LENGTH; if(!*outPayload) { return OC_STACK_NO_MEMORY; } CborEncoder encoder = {}; bool err = false; cbor_encoder_init(&encoder, *outPayload, *size, 0); CborEncoder rootArray; err = err || cbor_encoder_create_array(&encoder, &rootArray, 2); err = err || cbor_encode_uint(&rootArray, PAYLOAD_TYPE_PRESENCE); CborEncoder map; err = err || cbor_encoder_create_map(&rootArray, &map, CborIndefiniteLength); // Sequence Number err = err || cbor_encode_text_string(&map, OC_RSRVD_NONCE, sizeof(OC_RSRVD_NONCE) - 1); err = err || cbor_encode_uint(&map, payload->sequenceNumber); // Max Age err = err || cbor_encode_text_string(&map, OC_RSRVD_TTL, sizeof(OC_RSRVD_TTL) - 1); err = err || cbor_encode_uint(&map, payload->maxAge); // Trigger const char* triggerStr = convertTriggerEnumToString(payload->trigger); err = err || AddTextStringToMap(&map, OC_RSRVD_TRIGGER, sizeof(OC_RSRVD_TRIGGER) - 1, triggerStr); // Resource type name if(payload->trigger != OC_PRESENCE_TRIGGER_DELETE) { err = err || ConditionalAddTextStringToMap(&map, OC_RSRVD_RESOURCE_TYPE, sizeof(OC_RSRVD_RESOURCE_TYPE) - 1, payload->resourceType); } // Close Map err = err || cbor_encoder_close_container(&rootArray, &map); err = err || cbor_encoder_close_container(&encoder, &rootArray); if(err) { OC_LOG_V(ERROR, TAG, "Convert Presence Payload failed with : %d", err); return OC_STACK_ERROR; } *size = encoder.ptr - *outPayload; uint8_t* tempPayload = (uint8_t*)OICRealloc(*outPayload, *size); if(!tempPayload) { OC_LOG_V(ERROR, TAG, PCF("Payload realloc failed!")); OICFree(*outPayload); return OC_STACK_ERROR; } *outPayload = tempPayload; return OC_STACK_OK; }