static CCNxInterestPayloadId * _ccnxInterestPayloadId_CreateFromNameSegment(const CCNxNameSegment *nameSegment) { ccnxNameSegment_AssertValid(nameSegment); assertTrue(ccnxNameSegment_GetType(nameSegment) == CCNxNameLabelType_PAYLOADID, "ccnxInterestPayloadId_CreateFromNameSegment: supplied nameSegment is not a PayloadId"); if (ccnxNameSegment_GetType(nameSegment) != CCNxNameLabelType_PAYLOADID) { return NULL; } CCNxInterestPayloadId *result = parcObject_CreateInstance(CCNxInterestPayloadId); result->nameSegment = ccnxNameSegment_Acquire(nameSegment); return result; }
LONGBOW_TEST_CASE(Global, ccnxInterest_SetPayloadAndId) { CCNxName *name = ccnxName_CreateFromURI("lci:/name"); CCNxInterest *interest = ccnxInterest_CreateSimple(name); CCNxInterestInterface *impl = ccnxInterestInterface_GetInterface(interest); if (impl->getPayload) { assertNull(ccnxInterest_GetPayload(interest), "Expected a NULL payload"); } if (impl->getPayload && impl->setPayload) { PARCBuffer *payload = parcBuffer_WrapCString("impls have pimples"); ccnxInterest_SetPayloadAndId(interest, payload); PARCBuffer *payloadOut = ccnxInterest_GetPayload(interest); assertTrue(parcBuffer_Equals(payload, payloadOut), "Expected an equal buffer"); CCNxName *nameAfterPayload = ccnxInterest_GetName(interest); CCNxNameSegment *segment = ccnxName_GetSegment(nameAfterPayload, ccnxName_GetSegmentCount(nameAfterPayload) - 1); assertTrue(ccnxNameSegment_GetType(segment) == CCNxNameLabelType_PAYLOADID, "Expected to find a payload ID appended to the name"); parcBuffer_Release(&payload); } ccnxName_Release(&name); ccnxInterest_Release(&interest); }
static void _getChunkNumberFromName(const CCNxName *name, uint64_t *chunkNum, bool *hasChunkNum) { // XXX: This could be a utility in CCNxName. size_t numSegments = ccnxName_GetSegmentCount(name); CCNxNameSegment *lastSeg = ccnxName_GetSegment(name, numSegments - 1); if (ccnxNameSegment_GetType(lastSeg) == CCNxNameLabelType_CHUNK) { *hasChunkNum = true; *chunkNum = ccnxNameSegmentNumber_Value(lastSeg); } else { *hasChunkNum = false; *chunkNum = 0; } }
CCNxInterestPayloadId * ccnxInterestPayloadId_CreateFromSegmentInName(const CCNxName *name) { ccnxName_AssertValid(name); CCNxInterestPayloadId *result = NULL; size_t count = ccnxName_GetSegmentCount(name); for (size_t i = 0; i < count; ++i) { CCNxNameSegment *segment = ccnxName_GetSegment(name, i); if (ccnxNameSegment_GetType(segment) == CCNxNameLabelType_PAYLOADID) { result = _ccnxInterestPayloadId_CreateFromNameSegment(segment); break; } } return result; }
MetisTlvName * metisTlvName_CreateFromCCNxName(const CCNxName *ccnxName) { // to avoid reallocs, calculate the exact size we need size_t memoryLength = 0; for (size_t i = 0; i < ccnxName_GetSegmentCount(ccnxName); i++) { CCNxNameSegment *segment = ccnxName_GetSegment(ccnxName, i); memoryLength += 4 + ccnxNameSegment_Length(segment); } MetisTlvName *name = parcMemory_AllocateAndClear(sizeof(MetisTlvName)); assertNotNull(name, "parcMemory_AllocateAndClear(%zu) returned NULL", sizeof(MetisTlvName)); name->memoryLength = memoryLength; name->memory = parcMemory_Allocate(memoryLength); assertNotNull(name->memory, "parcMemory_Allocate(%zu) returned NULL", memoryLength); uint8_t *p = name->memory; uint8_t *end = p + memoryLength; for (size_t i = 0; i < ccnxName_GetSegmentCount(ccnxName); i++) { CCNxNameSegment *segment = ccnxName_GetSegment(ccnxName, i); uint16_t type = ccnxNameSegment_GetType(segment); uint16_t length = ccnxNameSegment_Length(segment); *(uint16_t *) p = htons(type); p += 2; *(uint16_t *) p = htons(length); p += 2; if (length >0) { PARCBuffer *buffer = ccnxNameSegment_GetValue(segment); uint8_t *overlay = parcBuffer_Overlay(buffer, 0); memcpy(p, overlay, length); p += length; } // sanity check assertTrue(p <= end, "Wrote past the end of buffer, now at %p end at %p", p, end); } _setup(name); return name; }
LONGBOW_TEST_CASE(Global, ccnxInterest_SetPayloadWithId) { CCNxName *name = ccnxName_CreateFromURI("lci:/name"); CCNxInterest *interest = ccnxInterest_CreateSimple(name); CCNxName *origNameCopy = ccnxName_Copy(name); CCNxInterestInterface *impl = ccnxInterestInterface_GetInterface(interest); if (impl->getPayload) { assertNull(ccnxInterest_GetPayload(interest), "Expected a NULL payload"); } if (impl->getPayload && impl->setPayload) { PARCBuffer *payload = parcBuffer_WrapCString("impls have pimples"); PARCBuffer *payloadIdBuffer = parcBuffer_WrapCString("payload Id buffer"); CCNxInterestPayloadId *payloadId = ccnxInterestPayloadId_Create(payloadIdBuffer, CCNxInterestPayloadId_TypeCode_App + 2); ccnxInterest_SetPayloadWithId(interest, payload, payloadId); PARCBuffer *payloadOut = ccnxInterest_GetPayload(interest); assertTrue(parcBuffer_Equals(payload, payloadOut), "Expected an equal buffer"); CCNxName *nameAfterPayload = ccnxInterest_GetName(interest); CCNxNameSegment *segment = ccnxName_GetSegment(nameAfterPayload, ccnxName_GetSegmentCount(nameAfterPayload) - 1); assertTrue(ccnxNameSegment_GetType(segment) == CCNxNameLabelType_PAYLOADID, "Expected to find a payload ID appended to the name"); CCNxInterestPayloadId *outId = ccnxInterestPayloadId_CreateFromSegmentInName(nameAfterPayload); assertTrue(ccnxInterestPayloadId_Equals(outId, payloadId), "expected to see the same payload Id after setting the payload"); ccnxInterestPayloadId_Release(&payloadId); ccnxInterestPayloadId_Release(&outId); parcBuffer_Release(&payload); parcBuffer_Release(&payloadIdBuffer); } ccnxName_Release(&name); ccnxName_Release(&origNameCopy); ccnxInterest_Release(&interest); }
static bool _getSegmentIndexOfQueryArgs(CCNxName *name, char *nameString, size_t *segmentNumber) { bool result = false; size_t numSegments = ccnxName_GetSegmentCount(name); size_t curSegment = 0; while (curSegment < numSegments) { CCNxNameSegment *segment = ccnxName_GetSegment(name, curSegment); if (ccnxNameSegment_GetType(segment) == CCNxNameLabelType_NAME) { char *segString = ccnxNameSegment_ToString(segment); if (strncasecmp(segString, nameString, strlen(nameString)) == 0) { parcMemory_Deallocate(&segString); *segmentNumber = curSegment + 1; result = true; break; } parcMemory_Deallocate(&segString); curSegment++; } } return result; }