1 //******************************************************************
3 // Copyright 2014 Intel Corporation All Rights Reserved.
4 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 #include "ocstackinternal.h"
8 #include "ocserverrequest.h"
13 #define MOD_NAME PCF("ocserverrequest")
15 #define TAG PCF("OCStackServerRequest")
17 #define VERIFY_NON_NULL(arg, logLevel, retVal) { if (!(arg)) { OC_LOG((logLevel), \
18 TAG, PCF(#arg " is NULL")); return (retVal); } }
20 extern OCResource *headResource;
22 OCStackResult processResourceDiscoverReq (const char *request, char *response,
23 uint8_t filterOn, char *filterValue)
25 OCResource *resourcePtr = headResource;
26 OCResourceType *resourceTypePtr;
27 OCResourceInterface *interfacePtr;
28 cJSON *ocObj, *pLoadObj, *resArray, *resObj, *rtArray;
30 uint8_t encodeRes = 0;
32 ocObj = cJSON_CreateObject();
33 cJSON_AddItemToObject (ocObj, OC_RSRVD_OC, pLoadObj = cJSON_CreateObject());
34 cJSON_AddItemToObject (pLoadObj, OC_RSRVD_PAYLOAD, resArray = cJSON_CreateArray());
36 while (resourcePtr != NULL)
39 if (filterOn == STACK_RES_DISCOVERY_RT_FILTER) {
40 resourceTypePtr = resourcePtr->rsrcType;
41 while (resourceTypePtr != NULL) {
42 if (strcmp (resourceTypePtr->resourcetypename, filterValue) == 0) {
46 resourceTypePtr = resourceTypePtr->next;
48 } else if (filterOn == STACK_RES_DISCOVERY_IF_FILTER) {
49 interfacePtr = resourcePtr->rsrcInterface;
50 while (interfacePtr != NULL) {
51 if (strcmp (interfacePtr->name, filterValue) == 0) {
55 interfacePtr = interfacePtr->next;
57 } else if (filterOn == STACK_RES_DISCOVERY_NOFILTER) {
60 //TODO: Unsupported query filter
61 return OC_STACK_INVALID_QUERY;
65 cJSON_AddItemToArray (resArray, resObj = cJSON_CreateObject());
67 cJSON_AddItemToObject (resObj, OC_RSRVD_HREF, cJSON_CreateString(resourcePtr->uri));
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;
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;
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));
90 resourcePtr = resourcePtr->next;
92 jsonStr = cJSON_PrintUnformatted (ocObj);
93 memcpy (response, jsonStr, strlen(jsonStr));
100 OCStackResult validateUrlQuery (char *url, char *query, uint8_t *filterOn, char **filterValue)
105 return OC_STACK_INVALID_URI;
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;
121 // Other filter types not supported
122 return OC_STACK_INVALID_QUERY;
126 // Other URIs not yet supported
127 return OC_STACK_INVALID_URI;