Merge "[CA-Integration] Added connectivity type param in APIs" into connectivity...
authorSudarshan Prasad <sudarshan.prasad@intel.com>
Thu, 25 Dec 2014 00:15:29 +0000 (00:15 +0000)
committerGerrit Code Review <gerrit@172.30.200.205>
Thu, 25 Dec 2014 00:15:29 +0000 (00:15 +0000)
1  2 
resource/csdk/stack/src/ocstack.c

@@@ -69,7 -69,6 +69,7 @@@ uint32_t PresenceTimeOut[] = {50, 75, 8
  
  OCMode myStackMode;
  OCDeviceEntityHandler defaultDeviceHandler;
 +OCStackResult getQueryFromUri(const char * uri, unsigned char** resourceType, char ** newURI);
  
  //-----------------------------------------------------------------------------
  // Macros
@@@ -309,21 -308,10 +309,21 @@@ void HandleCARequests(const CARemoteEnd
      OCServerProtocolRequest serverRequest;
  
      memset (&serverRequest, 0, sizeof(OCServerProtocolRequest));
 -    // copy URI of resource
 -    memcpy (&(serverRequest.resourceUrl), endPoint->resourceUri, strlen(endPoint->resourceUri));
 +    OC_LOG_V(INFO, TAG, PCF("***** Endpoint URI ***** : %s\n"), (char*)endPoint->resourceUri);
 +
 +    char * newUri = (char *)endPoint->resourceUri;
 +    unsigned char * query = NULL;
 +    unsigned char * resourceType = NULL;
 +    getQueryFromUri(endPoint->resourceUri, &query, &newUri);
 +    OC_LOG_V(INFO, TAG, PCF("**********URI without query ****: %s\n"), newUri);
 +    OC_LOG_V(INFO, TAG, PCF("**********Query ****: %s\n"), query);
 +    //copy URI
 +    memcpy (&(serverRequest.resourceUrl), newUri, strlen(newUri));
      //copy query
 -    // TODO-CA: Is the query part of header option?
 +    if(query)
 +    {
 +        memcpy (&(serverRequest.query), query, strlen(query));
 +    }
      //copy request payload
      if (requestInfo->info.payload)
      {
@@@ -857,7 -845,7 +857,7 @@@ static void incrementSequenceNumber(OCR
  static OCStackResult verifyUriQueryLength(const char * inputUri,
          uint16_t uriLen);
  static uint8_t OCIsPacketTransferRequired(const char *request, const char *response, uint16_t size);
 -OCStackResult getResourceType(const char * uri, unsigned char** resourceType, char ** newURI);
 +OCStackResult getResourceType(const char * query, unsigned char** resourceType);
  
  //-----------------------------------------------------------------------------
  // Public APIs
@@@ -1092,18 -1080,23 +1092,24 @@@ OCStackResult verifyUriQueryLength(cons
   *     OC_STACK_INVALID_METHOD   - invalid resource method
   *     OC_STACK_INVALID_URI      - invalid required or reference URI
   */
+ #ifdef CA_INT
+ OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri,
+                            const char *referenceUri, const char *request, uint8_t conType,
+                            OCQualityOfService qos, OCCallbackData *cbData,
+                            OCHeaderOption * options, uint8_t numOptions)
+ #else
  OCStackResult OCDoResource(OCDoHandle *handle, OCMethod method, const char *requiredUri,
                             const char *referenceUri, const char *request,
                             OCQualityOfService qos, OCCallbackData *cbData,
                             OCHeaderOption * options, uint8_t numOptions)
+ #endif
  {
      OCStackResult result = OC_STACK_ERROR;
      OCCoAPToken token;
      ClientCB *clientCB = NULL;
      unsigned char * requestUri = NULL;
      unsigned char * resourceType = NULL;
 +    unsigned char * query = NULL;
      char * newUri = (char *)requiredUri;
      (void) referenceUri;
  #ifdef CA_INT
  #ifdef WITH_PRESENCE
      if(method == OC_REST_PRESENCE)
      {
 -        result = getResourceType(requiredUri, &resourceType, &newUri);
 -        if(resourceType) {
 -            OC_LOG_V(DEBUG, TAG, "Got Resource Type: %s", resourceType);
 +        // Replacing method type with GET because "presence" is a stack layer only implementation.
 +        method = OC_REST_GET;
 +        result = getQueryFromUri(requiredUri, &query, &newUri);
 +        if(query)
 +        {
 +            result = getResourceType((char *) query, &resourceType);
 +            if(resourceType)
 +            {
 +                OC_LOG_V(DEBUG, TAG, "Got Resource Type: %s", resourceType);
 +            }
 +            else
 +            {
 +                OC_LOG(DEBUG, TAG, PCF("Resource type is NULL."));
 +            }
          }
          else
          {
 -            OC_LOG(DEBUG, TAG, PCF("Got Resource Type is NULL."));
 +            OC_LOG(DEBUG, TAG, PCF("Query string is NULL."));
          }
          if(result != OC_STACK_OK)
          {
          goto exit;
      }
  
 -#ifdef WITH_PRESENCE
 -    if(method == OC_REST_PRESENCE)
 -    {
 -        // Replacing method type with GET because "presence" is a stack layer only implementation.
 -        method = OC_REST_GET;
 -    }
 -#endif
 -
      // Make call to OCCoAP layer
      result = OCDoCoAPResource(method, qos, &token, newUri, request, options, numOptions);
  #endif // CA_INT
@@@ -3088,50 -3078,29 +3094,50 @@@ uint8_t OCIsPacketTransferRequired(cons
  }
  
  /**
 - * Retrieves a resource type based upon a uri string if the uri string contains only just one
 + * Retrieves a resource type based upon a query ontains only just one
   * resource attribute (and that has to be of type "rt").
   *
 - * @remark This API malloc's memory for the resource type and newURI. Do not malloc resourceType
 - * or newURI before passing in.
 + * @remark This API malloc's memory for the resource type. Do not malloc resourceType
 + * before passing in.
   *
 - * @param uri - Valid URI for "requiredUri" parameter to OCDoResource API.
 + * @param query - The quert part of the URI
   * @param resourceType - The resource type to be populated; pass by reference.
 - * @param newURI - Return URI without resourceType appended to the end of it. This is used to
 - *                 ensure that the uri parameter is not modified; pass by reference.
   *
   * @return
 - *  OC_STACK_INVALID_URI   - Returns this if the URI is invalid/NULL.
   *  OC_STACK_INVALID_PARAM - Returns this if the resourceType parameter is invalid/NULL.
   *  OC_STACK_OK            - Success
   */
 -OCStackResult getResourceType(const char * uri, unsigned char** resourceType, char ** newURI)
 +OCStackResult getResourceType(const char * query, unsigned char** resourceType)
 +{
 +    if(!query)
 +    {
 +        return OC_STACK_INVALID_PARAM;
 +    }
 +
 +    OCStackResult result = OC_STACK_ERROR;
 +
 +    if(strncmp(query, "rt=", 3) == 0)
 +    {
 +        *resourceType = (unsigned char *) OCMalloc(strlen(query)-3);
 +        if(!*resourceType)
 +        {
 +            result = OC_STACK_NO_MEMORY;
 +        }
 +
 +        strcpy((char *)*resourceType, ((const char *)&query[3]));
 +        result = OC_STACK_OK;
 +    }
 +
 +    return result;
 +}
 +
 +OCStackResult getQueryFromUri(const char * uri, unsigned char** query, char ** newURI)
  {
      if(!uri)
      {
          return OC_STACK_INVALID_URI;
      }
 -    if(!resourceType || !newURI)
 +    if(!query || !newURI)
      {
          return OC_STACK_INVALID_PARAM;
      }
      char* strTokPtr;
      leftToken = strtok_r((char *)tempURI, "?", &strTokPtr);
  
 +    //TODO-CA: This could be simplified. Clean up required.
      while(leftToken != NULL)
      {
 -        if(strncmp(leftToken, "rt=", 3) == 0)
 +        if(strncmp(leftToken, "rt=", 3) == 0 || strncmp(leftToken, "if=", 3) == 0)
          {
 -            *resourceType = (unsigned char *) OCMalloc(strlen(leftToken)-3);
 -            if(!*resourceType)
 +            *query = (unsigned char *) OCMalloc(strlen(leftToken));
 +            if(!*query)
              {
                  goto exit;
              }
 -            strcpy((char *)*resourceType, ((const char *)&leftToken[3]));
 +            strcpy((char *)*query, ((const char *)&leftToken[0]));
              break;
          }
          leftToken = strtok_r(NULL, "?", &strTokPtr);