CA Integration: Adding observe cancellation support
authorVijay <vijay.s.kesavan@intel.com>
Sat, 20 Dec 2014 10:11:43 +0000 (02:11 -0800)
committersudarshan prasad <sudarshan.prasad@intel.com>
Sat, 20 Dec 2014 10:29:32 +0000 (02:29 -0800)
Change-Id: Ib34b27fac26de63ccee75f03dc336f23ff3303a0
Signed-off-by: Vijay <vijay.s.kesavan@intel.com>
resource/csdk/stack/include/internal/ocobserve.h
resource/csdk/stack/include/internal/ocstackinternal.h
resource/csdk/stack/src/occlientcb.c
resource/csdk/stack/src/ocobserve.c
resource/csdk/stack/src/ocresource.c
resource/csdk/stack/src/ocserverrequest.c
resource/csdk/stack/src/ocstack.c

index 00b291c..a78d6ec 100644 (file)
@@ -46,7 +46,7 @@ typedef struct ResourceObserver {
     CAAddress_t addressInfo;
     /** Connectivity of the endpoint**/
     CAConnectivityType_t connectivityType;
-    char CAToken[32];   // TODO-CA:  What is max CAToken_t length?  Get rid of magic number
+    char CAToken[CA_MAX_TOKEN_LEN+1];
 #endif
     // Quality of service of the request
     OCQualityOfService qos;
@@ -84,9 +84,17 @@ OCStackResult AddObserver (const char         *resUri,
                            OCResource         *resHandle,
                            OCQualityOfService qos);
 
+#ifdef CA_INT
+OCStackResult DeleteObserverUsingToken (char * token);
+#else
 OCStackResult DeleteObserverUsingToken (OCCoAPToken * token);
+#endif
 
+#ifdef CA_INT
+ResourceObserver* GetObserverUsingToken (const char * token);
+#else
 ResourceObserver* GetObserverUsingToken (const OCCoAPToken * token);
+#endif
 
 ResourceObserver* GetObserverUsingId (const OCObservationId observeId);
 
index 0eb46d7..e48bfff 100644 (file)
@@ -57,6 +57,12 @@ extern OCDeviceEntityHandler defaultDeviceHandler;
 #define OC_COAP_SCHEME "coap://"
 #define OC_OFFSET_SEQUENCE_NUMBER (4) // the first outgoing sequence number will be 5
 
+#ifdef CA_INT
+// TODO-CA: This has been defined in CA layer as well, but is not exposed externally.
+// Need to expose it from CA and remove the definition below.
+#define CA_MAX_TOKEN_LEN   (8)
+#endif //CA_INT
+
 typedef struct {
     // Observe option field
     uint32_t option;
@@ -90,7 +96,7 @@ typedef struct {
     CAAddress_t addressInfo;
     /** Connectivity of the endpoint**/
     CAConnectivityType_t connectivityType;
-    char token[32];   // TODO-CA:  What is max CAToken_t length?  Get rid of magic number
+    char token[CA_MAX_TOKEN_LEN+1];
 #endif
     //////////////////////////////////////////////////////////
     // TODO: Consider moving these member to CoAP
index 01f9c2e..6d2565e 100644 (file)
 /// Module Name
 #define TAG PCF("occlientcb")
 
-#ifdef CA_INT
-// TODO-CA: This has been defined in CA layer as well, but is not exposed externally.
-// Need to expose it from CA and remove the definition below.
-#define CA_MAX_TOKEN_LEN   (8)
-#endif //CA_INT
-
 struct ClientCB *cbList = NULL;
 OCMulticastNode * mcPresenceNodes = NULL;
 
index 8960b99..0a8c270 100644 (file)
@@ -345,7 +345,7 @@ OCStackResult AddCAObserver (const char         *resUri,
         obsNode->connectivityType = connectivityType;
         if(CAtoken)
         {
-            strncpy(obsNode->CAToken, CAtoken, sizeof(obsNode->CAToken) - 1);
+            strncpy(obsNode->CAToken, CAtoken, CA_MAX_TOKEN_LEN);
         }
 
         obsNode->resource = resHandle;
@@ -435,7 +435,11 @@ ResourceObserver* GetObserverUsingId (const OCObservationId observeId)
     return NULL;
 }
 
+#ifdef CA_INT
+ResourceObserver* GetObserverUsingToken (const char * token)
+#else
 ResourceObserver* GetObserverUsingToken (const OCCoAPToken * token)
+#endif
 {
     ResourceObserver *out = NULL;
 
@@ -443,6 +447,13 @@ ResourceObserver* GetObserverUsingToken (const OCCoAPToken * token)
     {
         LL_FOREACH (serverObsList, out)
         {
+            #ifdef CA_INT
+            if((strlen(token) == strlen(out->CAToken)) &&
+               (memcmp(out->CAToken, token, strlen(token)) == 0))
+            {
+                return out;
+            }
+            #else
             OC_LOG(INFO, TAG,PCF("comparing tokens"));
             OC_LOG_BUFFER(INFO, TAG, token->token, token->tokenLength);
             OC_LOG_BUFFER(INFO, TAG, out->token.token, out->token.tokenLength);
@@ -451,13 +462,18 @@ ResourceObserver* GetObserverUsingToken (const OCCoAPToken * token)
             {
                 return out;
             }
+            #endif // CA_INT
         }
     }
     OC_LOG(INFO, TAG, PCF("Observer node not found!!"));
     return NULL;
 }
 
+#ifdef CA_INT
+OCStackResult DeleteObserverUsingToken (char * token)
+#else
 OCStackResult DeleteObserverUsingToken (OCCoAPToken * token)
+#endif
 {
     ResourceObserver *obsNode = NULL;
 
@@ -482,7 +498,11 @@ void DeleteObserverList()
     ResourceObserver *tmp = NULL;
     LL_FOREACH_SAFE (serverObsList, out, tmp)
     {
+        #ifdef CA_INT
+        DeleteObserverUsingToken (out->CAToken);
+        #else
         DeleteObserverUsingToken (&(out->token));
+        #endif
     }
     serverObsList = NULL;
 }
index 425ae6d..8725b8d 100644 (file)
@@ -597,7 +597,11 @@ HandleResourceWithEntityHandler (OCServerRequest *request,
             !collectionResource)
     {
         OC_LOG(INFO, TAG, PCF("Deregistering observation requested"));
+        #ifdef CA_INT
+        resObs = GetObserverUsingToken (request->token);
+        #else
         resObs = GetObserverUsingToken (&request->requestToken);
+        #endif
         if (NULL == resObs)
         {
             // Stack does not contain this observation request
@@ -608,7 +612,11 @@ HandleResourceWithEntityHandler (OCServerRequest *request,
         ehRequest.obsInfo.obsId = resObs->observeId;
         ehFlag = (OCEntityHandlerFlag)(ehFlag | OC_OBSERVE_FLAG);
 
+        #ifdef CA_INT
+        resObs = GetObserverUsingToken (request->token);
+        #else
         result = DeleteObserverUsingToken (&request->requestToken);
+        #endif
         if(result == OC_STACK_OK)
         {
             OC_LOG(DEBUG, TAG, PCF("Removed observer successfully"));
index 0ecb89f..083424a 100644 (file)
@@ -222,7 +222,7 @@ OCStackResult AddServerCARequest (OCServerRequest ** request, uint16_t coapID,
     serverRequest->connectivityType = connectivityType;
     if (token)
     {
-        strncpy(serverRequest->token, token, sizeof(serverRequest->token) - 1);
+        strncpy(serverRequest->token, token, CA_MAX_TOKEN_LEN);
     }
 
     *request = serverRequest;
index 37113f0..0edcad6 100644 (file)
@@ -102,7 +102,11 @@ OCStackResult OCStackFeedBack(OCCoAPToken * token, uint8_t status)
     {
     case OC_OBSERVER_NOT_INTERESTED:
         OC_LOG(DEBUG, TAG, PCF("observer is not interested in our notifications anymore"));
+        #ifdef CA_INT
+        observer = GetObserverUsingToken (token->token);
+        #else
         observer = GetObserverUsingToken (token);
+        #endif
         if(observer)
         {
             result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle) NULL,
@@ -115,7 +119,11 @@ OCStackResult OCStackFeedBack(OCCoAPToken * token, uint8_t status)
             observer->resource->entityHandler(OC_OBSERVE_FLAG, &ehRequest);
         }
         //observer is not observing anymore
+        #ifdef CA_INT
+        result = DeleteObserverUsingToken (token->token);
+        #else
         result = DeleteObserverUsingToken (token);
+        #endif
         if(result == OC_STACK_OK)
         {
             OC_LOG(DEBUG, TAG, PCF("Removed observer successfully"));
@@ -130,7 +138,11 @@ OCStackResult OCStackFeedBack(OCCoAPToken * token, uint8_t status)
         //observer is still interested
         OC_LOG(DEBUG, TAG, PCF("observer is interested in our \
                 notifications, reset the failedCount"));
-        observer = GetObserverUsingToken(token);
+        #ifdef CA_INT
+        observer = GetObserverUsingToken (token->token);
+        #else
+        observer = GetObserverUsingToken (token);
+        #endif
         if(observer)
         {
             observer->forceHighQos = 0;
@@ -145,7 +157,11 @@ OCStackResult OCStackFeedBack(OCCoAPToken * token, uint8_t status)
     case OC_OBSERVER_FAILED_COMM:
         //observer is not reachable
         OC_LOG(DEBUG, TAG, PCF("observer is unreachable"));
-        observer = GetObserverUsingToken(token);
+        #ifdef CA_INT
+        observer = GetObserverUsingToken (token->token);
+        #else
+        observer = GetObserverUsingToken (token);
+        #endif
         if(observer)
         {
             if(observer->failedCommCount >= MAX_OBSERVER_FAILED_COMM)
@@ -1320,7 +1336,6 @@ exit:
     {
         OCFree(requestData.options);
     }
-    //TODO-CA: CADestroyToken here
 #endif // CA_INT
     return result;
 }
@@ -1339,7 +1354,8 @@ exit:
  *     OC_STACK_INVALID_PARAM    - The handle provided is invalid.
  */
 OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption * options,
-        uint8_t numOptions) {
+        uint8_t numOptions) 
+{
     /*
      * This ftn is implemented one of two ways in the case of observation:
      *
@@ -1358,6 +1374,14 @@ OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption
      *      Remove the callback associated on client side.
      */
     OCStackResult ret = OC_STACK_OK;
+#ifdef CA_INT
+    CARemoteEndpoint_t* endpoint = NULL;
+    CAResult_t caResult;
+    CAInfo_t requestData;
+    CARequestInfo_t requestInfo;
+    // Track if memory is allocated for additional header options
+    uint8_t hdrOptionMemAlloc = 0;
+#endif // CA_INT
 
     if(!handle) {
         return OC_STACK_INVALID_PARAM;
@@ -1372,6 +1396,41 @@ OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption
         {
             case OC_REST_OBSERVE:
             case OC_REST_OBSERVE_ALL:
+                #ifdef CA_INT
+                caResult = CACreateRemoteEndpoint((char *)clientCB->requestUri, CA_WIFI, 
+                                                  &endpoint);
+                endpoint->connectivityType = CA_WIFI;
+                if (caResult != CA_STATUS_OK)
+                {
+                    OC_LOG(ERROR, TAG, PCF("CACreateRemoteEndpoint error"));
+                    return OC_STACK_ERROR;
+                }
+
+                memset(&requestData, 0, sizeof(CAInfo_t));
+                // TODO-CA: Map QoS to the right CA msg type
+                requestData.type = CA_MSG_NONCONFIRM;
+                requestData.token = clientCB->token;
+                if (CreateObserveHeaderOption (&(requestData.options),
+                            options, numOptions, OC_OBSERVE_DEREGISTER) != OC_STACK_OK)
+                {
+                    return OC_STACK_ERROR;
+                }
+                hdrOptionMemAlloc = 1;
+                requestData.numOptions = numOptions + 1;
+                memset(&requestInfo, 0, sizeof(CARequestInfo_t));
+                requestInfo.method = CA_GET;
+                requestInfo.info = requestData;
+                // send request
+                caResult = CASendRequest(endpoint, &requestInfo);
+                if (caResult != CA_STATUS_OK)
+                {
+                    OC_LOG(ERROR, TAG, PCF("CASendRequest error"));
+                }
+                if(caResult == CA_STATUS_OK)
+                {
+                    ret = OC_STACK_OK;
+                }
+                #else // CA_INT
                 if(qos == OC_HIGH_QOS)
                 {
                     ret = OCDoCoAPResource(OC_REST_CANCEL_OBSERVE, qos,
@@ -1383,6 +1442,7 @@ OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption
                     FindAndDeleteClientCB(clientCB);
                 }
                 break;
+                #endif // CA_INT
             #ifdef WITH_PRESENCE
             case OC_REST_PRESENCE:
                 FindAndDeleteClientCB(clientCB);
@@ -1392,6 +1452,14 @@ OCStackResult OCCancel(OCDoHandle handle, OCQualityOfService qos, OCHeaderOption
                 return OC_STACK_INVALID_METHOD;
         }
     }
+#ifdef CA_INT
+    CADestroyRemoteEndpoint(endpoint);
+    if (hdrOptionMemAlloc)
+    {
+        OCFree(requestData.options);
+    }
+#endif // CA_INT
+
     return ret;
 }
 #ifdef WITH_PRESENCE