Initial merge-commit of the OIC code. Should successfully do discovery for single...
[platform/upstream/iotivity.git] / csdk / stack / src / ocserverrequest.c
1 //******************************************************************
2 //
3 // Copyright 2014 Intel Corporation All Rights Reserved.
4 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
5
6 #include "ocstack.h"
7 #include "ocstackinternal.h"
8 #include "ocserverrequest.h"
9 #include "debug.h"
10 #include "cJSON.h"
11
12 // Module Name
13 #define MOD_NAME PCF("ocserverrequest")
14
15 #define TAG  PCF("OCStackServerRequest")
16
17 #define VERIFY_NON_NULL(arg, logLevel, retVal) { if (!(arg)) { OC_LOG((logLevel), \
18              TAG, PCF(#arg " is NULL")); return (retVal); } }
19
20 extern OCResource *headResource;
21
22 OCStackResult processResourceDiscoverReq (const char *request, char *response,
23                                  uint8_t filterOn, char *filterValue)
24 {
25     OCResource *resourcePtr = headResource;
26     OCResourceType *resourceTypePtr;
27     OCResourceInterface *interfacePtr;
28     cJSON *ocObj, *pLoadObj, *resArray, *resObj, *rtArray;
29     char *jsonStr;
30     uint8_t encodeRes = 0;
31
32     ocObj = cJSON_CreateObject();
33     cJSON_AddItemToObject (ocObj, OC_RSRVD_OC, pLoadObj = cJSON_CreateObject());
34     cJSON_AddItemToObject (pLoadObj, OC_RSRVD_PAYLOAD, resArray = cJSON_CreateArray());
35
36     while (resourcePtr != NULL)
37     {
38         encodeRes = 0;
39         if (filterOn == STACK_RES_DISCOVERY_RT_FILTER) {
40             resourceTypePtr = resourcePtr->rsrcType;
41             while (resourceTypePtr != NULL) {
42                 if (strcmp (resourceTypePtr->resourcetypename, filterValue) == 0) {
43                     encodeRes = 1;
44                     break;
45                 }
46                 resourceTypePtr = resourceTypePtr->next;
47             }
48         } else if (filterOn == STACK_RES_DISCOVERY_IF_FILTER) {
49             interfacePtr = resourcePtr->rsrcInterface;
50             while (interfacePtr != NULL) {
51                 if (strcmp (interfacePtr->name, filterValue) == 0) {
52                     encodeRes = 1;
53                     break;
54                 }
55                 interfacePtr = interfacePtr->next;
56             }
57         } else if (filterOn == STACK_RES_DISCOVERY_NOFILTER) {
58             encodeRes = 1;
59         } else {
60             //TODO: Unsupported query filter
61             return OC_STACK_INVALID_QUERY;
62         }
63
64         if (encodeRes) {
65             cJSON_AddItemToArray (resArray, resObj = cJSON_CreateObject());
66             // Add URIs
67             cJSON_AddItemToObject (resObj, OC_RSRVD_HREF, cJSON_CreateString(resourcePtr->uri));
68             // Add resource types
69             cJSON_AddItemToObject (resObj, OC_RSRVD_RESOURCE_TYPE, rtArray = cJSON_CreateArray());
70             resourceTypePtr = resourcePtr->rsrcType;
71             while (resourceTypePtr != NULL) {
72                 cJSON_AddItemToArray (rtArray,
73                                       cJSON_CreateString(resourceTypePtr->resourcetypename));
74                 resourceTypePtr = resourceTypePtr->next;
75             }
76             // Add interface types
77             cJSON_AddItemToObject (resObj, OC_RSRVD_INTERFACE, rtArray = cJSON_CreateArray());
78             interfacePtr = resourcePtr->rsrcInterface;
79             while (interfacePtr != NULL) {
80                 cJSON_AddItemToArray (rtArray, cJSON_CreateString(interfacePtr->name));
81                 interfacePtr = interfacePtr->next;
82             }
83             // If resource is observable, set observability flag.
84             // Resources that are not observable will not have the flag.
85             if (resourcePtr->resourceProperties & OC_OBSERVABLE) {
86                 cJSON_AddItemToObject (resObj, OC_RSRVD_OBSERVABLE,
87                                        cJSON_CreateNumber(OC_RESOURCE_OBSERVABLE));
88             }
89         }
90         resourcePtr = resourcePtr->next;
91     }
92     jsonStr = cJSON_PrintUnformatted (ocObj);
93     memcpy (response, jsonStr, strlen(jsonStr));
94     cJSON_Delete (ocObj);
95     free (jsonStr);
96
97     return OC_STACK_OK;
98 }
99
100 OCStackResult validateUrlQuery (char *url, char *query, uint8_t *filterOn, char **filterValue)
101 {
102     char *filterParam;
103
104     if (NULL == url)
105         return OC_STACK_INVALID_URI;
106
107     if (strcmp (url, OC_RESOURCE_DISCOVERY_URI) == 0) {
108         *filterOn = STACK_RES_DISCOVERY_NOFILTER;
109         if (*query != NULL) {
110             filterParam = strtok (query, "=");
111             *filterValue = strtok (NULL, " ");
112             if (*filterValue == NULL) {
113                 return OC_STACK_INVALID_QUERY;
114             } else if (strcmp (filterParam, OC_RSRVD_INTERFACE) == 0) {
115                 // Resource discovery with interface filter
116                 *filterOn = STACK_RES_DISCOVERY_IF_FILTER;
117             } else if (strcmp (filterParam, OC_RSRVD_RESOURCE_TYPE) == 0) {
118                 // Resource discovery with resource type filter
119                 *filterOn = STACK_RES_DISCOVERY_RT_FILTER;
120             } else {
121                 // Other filter types not supported
122                 return OC_STACK_INVALID_QUERY;
123             }
124         }
125     } else {
126         // Other URIs not yet supported
127         return OC_STACK_INVALID_URI;
128     }
129     return OC_STACK_OK;
130 }
131
132
133