void OCPayloadDestroy(OCPayload* payload) { if(!payload) { return; } switch(payload->type) { case PAYLOAD_TYPE_REPRESENTATION: OCRepPayloadDestroy((OCRepPayload*)payload); break; case PAYLOAD_TYPE_DISCOVERY: OCDiscoveryPayloadDestroy((OCDiscoveryPayload*)payload); break; case PAYLOAD_TYPE_DEVICE: OCDevicePayloadDestroy((OCDevicePayload*)payload); break; case PAYLOAD_TYPE_PLATFORM: OCPlatformPayloadDestroy((OCPlatformPayload*)payload); break; case PAYLOAD_TYPE_PRESENCE: OCPresencePayloadDestroy((OCPresencePayload*)payload); break; case PAYLOAD_TYPE_SECURITY: OCSecurityPayloadDestroy((OCSecurityPayload*)payload); break; default: OC_LOG_V(ERROR, TAG, "Unsupported payload type in destroy: %d", payload->type); OICFree(payload); break; } }
static OCStackResult OCParsePresencePayload(OCPayload **outPayload, CborValue *rootValue) { OCStackResult ret = OC_STACK_INVALID_PARAM; OCPresencePayload *payload = NULL; VERIFY_PARAM_NON_NULL(TAG, outPayload, "Invalid Parameter outPayload"); *outPayload = NULL; payload = (OCPresencePayload *)OICCalloc(1, sizeof(OCPresencePayload)); ret = OC_STACK_NO_MEMORY; VERIFY_PARAM_NON_NULL(TAG, payload, "Failed allocating presence payload"); payload->base.type = PAYLOAD_TYPE_PRESENCE; ret = OC_STACK_MALFORMED_RESPONSE; if (cbor_value_is_map(rootValue)) { CborValue curVal; // Sequence Number CborError err = cbor_value_map_find_value(rootValue, OC_RSRVD_NONCE, &curVal); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding nonce tag"); err = cbor_value_get_uint64(&curVal, (uint64_t *)&payload->sequenceNumber); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding nonce value"); // Max Age err = cbor_value_map_find_value(rootValue, OC_RSRVD_TTL, &curVal); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding ttl tag"); err = cbor_value_get_uint64(&curVal, (uint64_t *)&payload->maxAge); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding ttl value"); // Trigger err = cbor_value_map_find_value(rootValue, OC_RSRVD_TRIGGER, &curVal); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding trigger tag"); err = cbor_value_get_simple_type(&curVal, (uint8_t *)&payload->trigger); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding trigger value"); // Resource type name err = cbor_value_map_find_value(rootValue, OC_RSRVD_RESOURCE_TYPE, &curVal); if (cbor_value_is_valid(&curVal)) { size_t len = 0; err = cbor_value_dup_text_string(&curVal, &payload->resourceType, &len, NULL); VERIFY_CBOR_SUCCESS(TAG, err, "Failed finding resource type value"); } err = cbor_value_advance(rootValue); VERIFY_CBOR_SUCCESS(TAG, err, "Failed advancing root value"); *outPayload = (OCPayload *)payload; return OC_STACK_OK; } exit: OIC_LOG(ERROR, TAG, "CBOR error Parse Presence Payload"); OCPresencePayloadDestroy(payload); return ret; }
OCStackResult SendAllObserverNotification (OCMethod method, OCResource *resPtr, uint32_t maxAge, OCQualityOfService qos) #endif { OC_LOG(INFO, TAG, "Entering SendObserverNotification"); if(!resPtr) { return OC_STACK_INVALID_PARAM; } OCStackResult result = OC_STACK_ERROR; ResourceObserver * resourceObserver = serverObsList; uint8_t numObs = 0; OCServerRequest * request = NULL; OCEntityHandlerRequest ehRequest = {0}; OCEntityHandlerResult ehResult = OC_EH_ERROR; bool observeErrorFlag = false; // Find clients that are observing this resource while (resourceObserver) { if (resourceObserver->resource == resPtr) { numObs++; #ifdef WITH_PRESENCE if(method != OC_REST_PRESENCE) { #endif qos = DetermineObserverQoS(method, resourceObserver, qos); result = AddServerRequest(&request, 0, 0, 1, OC_REST_GET, 0, resPtr->sequenceNum, qos, resourceObserver->query, NULL, NULL, resourceObserver->token, resourceObserver->tokenLength, resourceObserver->resUri, 0, resourceObserver->acceptFormat, &resourceObserver->devAddr); if(request) { request->observeResult = OC_STACK_OK; if(result == OC_STACK_OK) { result = FormOCEntityHandlerRequest( &ehRequest, (OCRequestHandle) request, request->method, &request->devAddr, (OCResourceHandle) resPtr, request->query, PAYLOAD_TYPE_REPRESENTATION, request->payload, request->payloadSize, request->numRcvdVendorSpecificHeaderOptions, request->rcvdVendorSpecificHeaderOptions, OC_OBSERVE_NO_OPTION, 0); if(result == OC_STACK_OK) { ehResult = resPtr->entityHandler(OC_REQUEST_FLAG, &ehRequest, resPtr->entityHandlerCallbackParam); if(ehResult == OC_EH_ERROR) { FindAndDeleteServerRequest(request); } } OCPayloadDestroy(ehRequest.payload); } } #ifdef WITH_PRESENCE } else { OCEntityHandlerResponse ehResponse = {0}; //This is effectively the implementation for the presence entity handler. OC_LOG(DEBUG, TAG, "This notification is for Presence"); result = AddServerRequest(&request, 0, 0, 1, OC_REST_GET, 0, resPtr->sequenceNum, qos, resourceObserver->query, NULL, NULL, resourceObserver->token, resourceObserver->tokenLength, resourceObserver->resUri, 0, resourceObserver->acceptFormat, &resourceObserver->devAddr); if(result == OC_STACK_OK) { OCPresencePayload* presenceResBuf = OCPresencePayloadCreate( resPtr->sequenceNum, maxAge, trigger, resourceType ? resourceType->resourcetypename : NULL); if(!presenceResBuf) { return OC_STACK_NO_MEMORY; } if(result == OC_STACK_OK) { ehResponse.ehResult = OC_EH_OK; ehResponse.payload = (OCPayload*)presenceResBuf; ehResponse.persistentBufferFlag = 0; ehResponse.requestHandle = (OCRequestHandle) request; ehResponse.resourceHandle = (OCResourceHandle) resPtr; OICStrcpy(ehResponse.resourceUri, sizeof(ehResponse.resourceUri), resourceObserver->resUri); result = OCDoResponse(&ehResponse); } OCPresencePayloadDestroy(presenceResBuf); } } #endif // Since we are in a loop, set an error flag to indicate at least one error occurred. if (result != OC_STACK_OK) { observeErrorFlag = true; } } resourceObserver = resourceObserver->next; } if (numObs == 0) { OC_LOG(INFO, TAG, "Resource has no observers"); result = OC_STACK_NO_OBSERVERS; } else if (observeErrorFlag) { OC_LOG(ERROR, TAG, "Observer notification error"); result = OC_STACK_ERROR; } return result; }