From 30b9f08a565bab3f9d25297e6c77da29543b49ed Mon Sep 17 00:00:00 2001 From: omkar Date: Wed, 24 Dec 2014 17:22:32 -0800 Subject: [PATCH] Initial Push to Integrate Presence With CA branch. Filtering based on rt and TLL changes are needed Signed-off-by: omkar Change-Id: Ie7c02f7c96fa9feb3622dd969a121a46d06b0020 --- resource/csdk/stack/src/ocobserve.c | 11 +++++ resource/csdk/stack/src/ocstack.c | 88 ++++++++++++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 2 deletions(-) diff --git a/resource/csdk/stack/src/ocobserve.c b/resource/csdk/stack/src/ocobserve.c index 6b9173c..2a6d9ff 100644 --- a/resource/csdk/stack/src/ocobserve.c +++ b/resource/csdk/stack/src/ocobserve.c @@ -148,10 +148,21 @@ OCStackResult SendAllObserverNotification (OCMethod method, OCResource *resPtr, unsigned char presenceResBuf[MAX_RESPONSE_LENGTH] = {0}; //This is effectively the implementation for the presence entity handler. OC_LOG(DEBUG, TAG, PCF("This notification is for Presence")); +#ifdef CA_INT + result = AddServerCARequest(&request, 0, 0, 0, 1, OC_REST_GET, + 0, resPtr->sequenceNum, qos, resourceObserver->query, + NULL, NULL, + &resourceObserver->token, resourceObserver->addr, + resourceObserver->resUri, 0, + &(resourceObserver->addressInfo), resourceObserver->connectivityType, + resourceObserver->CAToken); + +#else result = AddServerRequest(&request, 0, 0, 0, 1, OC_REST_GET, 0, OC_OBSERVE_NO_OPTION, OC_LOW_QOS, NULL, NULL, NULL, &resourceObserver->token, resourceObserver->addr, resourceObserver->resUri, 0); +#endif if(result == OC_STACK_OK) { // we create the payload here diff --git a/resource/csdk/stack/src/ocstack.c b/resource/csdk/stack/src/ocstack.c index 9ded668..3a29b30 100644 --- a/resource/csdk/stack/src/ocstack.c +++ b/resource/csdk/stack/src/ocstack.c @@ -238,13 +238,86 @@ OCStackResult CAToOCStackResult(CAResponseResult_t caCode) return ret; } +void HandlePresenceResponse(const CARemoteEndpoint_t* endPoint, const CAResponseInfo_t* responseInfo) +{ + OCStackApplicationResult cbResult = OC_STACK_DELETE_TRANSACTION; + ClientCB * cbNode = NULL; + char *resourceTypeName = NULL; + char * tok = NULL; + char * bufRes = responseInfo->info.payload; + OCClientResponse *response = (OCClientResponse *) OCMalloc(sizeof(OCClientResponse)); + + if(!bufRes) + { + goto exit; + } + + tok = strtok(bufRes, "[:]}"); + bufRes[strlen(bufRes)] = ':'; + tok = strtok(NULL, "[:]}"); + bufRes[strlen((char *)bufRes)] = ':'; + response->sequenceNumber = (uint32_t )atoi(tok); + tok = strtok(NULL, "[:]}"); + tok = strtok(NULL, "[:]}"); + if(tok) + { + resourceTypeName = (char *)OCMalloc(strlen(tok)); + if(!resourceTypeName) + { + goto exit; + } + bufRes[strlen((char *)bufRes)] = ':'; + strcpy(resourceTypeName, tok); + OC_LOG_V(DEBUG, TAG, "----------------resourceTypeName %s", + resourceTypeName); + } + bufRes[strlen((char *)bufRes)] = ']'; + + response->resJSONPayload = responseInfo->info.payload; + response->result = OC_STACK_OK; + + char *fullUri = (char *) OCMalloc(MAX_URI_LENGTH ); + char *ipAddress = (char *) OCMalloc(strlen(endPoint->addressInfo.IP.ipAddress) + 1); + + strncpy(ipAddress, endPoint->addressInfo.IP.ipAddress, strlen(endPoint->addressInfo.IP.ipAddress)); + ipAddress[strlen(endPoint->addressInfo.IP.ipAddress)] = '\0'; + + snprintf(fullUri, MAX_URI_LENGTH, "coap://%s:%u%s", ipAddress, endPoint->addressInfo.IP.port, + OC_PRESENCE_URI); + + cbNode = GetClientCB(NULL, NULL, fullUri); + + if(cbNode) + { + cbResult = cbNode->callBack(cbNode->context, cbNode->handle, response); + } + + if (cbResult == OC_STACK_DELETE_TRANSACTION) + { + FindAndDeleteClientCB(cbNode); + } + +exit: + +OCFree(fullUri); +OCFree(ipAddress); +OCFree(resourceTypeName); +} + + //This function will be called back by CA layer when a response is received void HandleCAResponses(const CARemoteEndpoint_t* endPoint, const CAResponseInfo_t* responseInfo) { OC_LOG(INFO, TAG, PCF("Enter HandleCAResponses")); printf ("Received payload: %s\n", (char *)responseInfo->info.payload); OCStackApplicationResult result = OC_STACK_DELETE_TRANSACTION; + if(strcmp(endPoint->resourceUri, OC_PRESENCE_URI) == 0) + { + HandlePresenceResponse(endPoint, responseInfo); + return 0; + } ClientCB *cbNode = GetClientCB((CAToken_t *)&responseInfo->info.token, NULL, NULL); + if (cbNode) { OC_LOG(INFO, TAG, PCF("Calling into application address space")); @@ -432,7 +505,6 @@ void HandleCARequests(const CARemoteEndpoint_t* endPoint, const CARequestInfo_t* OCStackResult HandleStackRequests(OCServerProtocolRequest * protocolRequest) { OC_LOG(INFO, TAG, PCF("Entering HandleStackRequests (OCStack Layer)")); - OCStackResult result = OC_STACK_ERROR; ResourceHandling resHandling; OCResource *resource; @@ -1616,9 +1688,22 @@ OCStackResult OCStartPresence(const uint32_t ttl) presenceState = OC_PRESENCE_INITIALIZED; OCGenerateCoAPToken(&token); OCBuildIPv4Address(224, 0, 1, 187, 5683, &multiCastAddr); +#ifdef CA_INT + CAAddress_t addressInfo; + strncpy(addressInfo.IP.ipAddress, "224.0.1.187", CA_IPADDR_SIZE); + addressInfo.IP.port = 5298; + + CAToken_t caToken = NULL; + CAGenerateToken(&caToken); + + AddCAObserver(OC_PRESENCE_URI, NULL, 0, &token, + &multiCastAddr, (OCResource *)presenceResource.handle, OC_LOW_QOS, + &addressInfo, CA_WIFI, caToken); +#else //add the presence observer AddObserver(OC_PRESENCE_URI, NULL, 0, &token, &multiCastAddr, (OCResource *)presenceResource.handle, OC_LOW_QOS); +#endif } // Each time OCStartPresence is called @@ -2628,7 +2713,6 @@ OCStackResult OCDoResponse(OCEntityHandlerResponse *ehResponse) else { // Normal response - // Get pointer to request info serverRequest = GetServerRequestUsingHandle((OCServerRequest *)ehResponse->requestHandle); if(serverRequest) -- 2.7.4