1 //******************************************************************
3 // Copyright 2014 Intel Mobile Communications GmbH All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 // Defining _POSIX_C_SOURCE macro with 200112L (or greater) as value
22 // causes header files to expose definitions
23 // corresponding to the POSIX.1-2001 base
24 // specification (excluding the XSI extension).
25 // For POSIX.1-2001 base specification,
26 // Refer http://pubs.opengroup.org/onlinepubs/009695399/
27 #define _POSIX_C_SOURCE 200112L
30 #include "ocstackconfig.h"
31 #include "ocstackinternal.h"
32 #include "ocresourcehandler.h"
33 #include "ocobserve.h"
34 #include "occollection.h"
40 #include "cainterface.h"
44 #define TAG PCF("ocresource")
45 #define VERIFY_SUCCESS(op, successCode) { if (op != successCode) \
46 {OC_LOG_V(FATAL, TAG, "%s failed!!", #op); goto exit;} }
48 #define VERIFY_NON_NULL(arg, logLevel, retVal) { if (!(arg)) { OC_LOG((logLevel), \
49 TAG, PCF(#arg " is NULL")); return (retVal); } }
51 extern OCResource *headResource;
52 static cJSON *savedDeviceInfo = NULL;
54 static const char * VIRTUAL_RSRCS[] =
64 //-----------------------------------------------------------------------------
65 // Default resource entity handler function
66 //-----------------------------------------------------------------------------
67 OCEntityHandlerResult defaultResourceEHandler(OCEntityHandlerFlag flag,
68 OCEntityHandlerRequest * request)
70 //TODO ("Implement me!!!!");
71 // TODO: remove silence unused param warnings
74 return OC_EH_OK; // Making sure that the Default EH and the Vendor EH have matching signatures
77 /* This method will retrieve the port at which the secure resource is hosted */
78 static OCStackResult GetSecurePortInfo(CATransportType_t connType, uint16_t *port)
80 CALocalConnectivity_t* info = NULL;
82 OCStackResult ret = OC_STACK_ERROR;
84 CAResult_t caResult = CAGetNetworkInformation(&info, &size);
85 if ((caResult == CA_STATUS_OK) && info && size)
89 if (info[size].isSecured && info[size].type == connType)
91 if (info[size].type == CA_IPV4)
93 *port = info[size].addressInfo.IP.port;
105 static OCStackResult ValidateUrlQuery (char *url, char *query,
106 uint8_t *filterOn, char **filterValue)
108 if(!filterOn || !filterValue)
110 return OC_STACK_INVALID_PARAM;
113 char *filterParam = NULL;
115 OC_LOG(INFO, TAG, PCF("Entering ValidateUrlQuery"));
118 return OC_STACK_INVALID_URI;
121 if (strcmp ((char *)url, GetVirtualResourceUri(OC_WELL_KNOWN_URI)) == 0 ||
122 strcmp ((char *)url, GetVirtualResourceUri(OC_DEVICE_URI)) == 0)
124 *filterOn = STACK_RES_DISCOVERY_NOFILTER;
127 char* strTokPtr = NULL;
128 filterParam = strtok_r((char *)query, "=", &strTokPtr);
129 *filterValue = strtok_r(NULL, " ", &strTokPtr);
131 if (!(*filterValue) || ! filterParam)
133 return OC_STACK_INVALID_QUERY;
135 else if (strcmp (filterParam, OC_RSRVD_INTERFACE) == 0)
137 // Resource discovery with interface filter
138 *filterOn = STACK_RES_DISCOVERY_IF_FILTER;
140 else if (strcmp (filterParam, OC_RSRVD_RESOURCE_TYPE) == 0)
142 // Resource discovery with resource type filter
143 *filterOn = STACK_RES_DISCOVERY_RT_FILTER;
145 else if (strcmp (filterParam, OC_RSRVD_DEVICE_ID) == 0)
148 *filterOn = STACK_DEVICE_DISCOVERY_DI_FILTER;
150 else if (strcmp (filterParam, OC_RSRVD_DEVICE_NAME) == 0)
153 *filterOn = STACK_DEVICE_DISCOVERY_DN_FILTER;
157 // Other filter types not supported
158 return OC_STACK_INVALID_QUERY;
163 else if (strcmp((char *)url, GetVirtualResourceUri(OC_PRESENCE)) == 0)
165 //Nothing needs to be done, except for pass a OC_PRESENCE query through as OC_STACK_OK.
166 OC_LOG(INFO, TAG, PCF("OC_PRESENCE Request"));
167 *filterOn = STACK_RES_DISCOVERY_NOFILTER;
172 // Other URIs not yet supported
173 return OC_STACK_INVALID_URI;
175 OC_LOG(INFO, TAG, PCF("Exiting ValidateUrlQuery"));
181 BuildVirtualResourceResponse(const OCResource *resourcePtr, uint8_t filterOn,
182 const char *filterValue, char *out, uint16_t *remaining,
183 CATransportType_t connType )
185 if(!resourcePtr || !out || !remaining)
187 return OC_STACK_INVALID_PARAM;
190 OCResourceType *resourceTypePtr = NULL;
191 OCResourceInterface *interfacePtr = NULL;
192 cJSON *resObj = NULL;
193 cJSON *propObj = NULL;
194 cJSON *rtArray = NULL;
195 char *jsonStr = NULL;
196 uint8_t encodeRes = 0;
197 OCStackResult ret = OC_STACK_OK;
198 uint16_t jsonLen = 0;
200 OC_LOG(INFO, TAG, PCF("Entering BuildVirtualResourceResponse"));
201 resObj = cJSON_CreateObject();
206 if ((filterOn == STACK_RES_DISCOVERY_RT_FILTER) && filterValue)
208 resourceTypePtr = resourcePtr->rsrcType;
209 while (resourceTypePtr)
211 if (strcmp (resourceTypePtr->resourcetypename, filterValue) == 0)
216 resourceTypePtr = resourceTypePtr->next;
219 else if ((filterOn == STACK_RES_DISCOVERY_IF_FILTER) && filterValue)
221 interfacePtr = resourcePtr->rsrcInterface;
224 if (strcmp (interfacePtr->name, filterValue) == 0)
229 interfacePtr = interfacePtr->next;
232 else if (filterOn == STACK_RES_DISCOVERY_NOFILTER)
238 //TODO: Unsupported query filter
239 return OC_STACK_INVALID_QUERY;
245 cJSON_AddItemToObject (resObj, OC_RSRVD_HREF, cJSON_CreateString(resourcePtr->uri));
247 // Add server instance id
248 cJSON_AddItemToObject (resObj,
249 OC_RSRVD_SERVER_INSTANCE_ID,
250 cJSON_CreateString(OCGetServerInstanceIDString()));
252 cJSON_AddItemToObject (resObj, OC_RSRVD_PROPERTY, propObj = cJSON_CreateObject());
253 // Add resource types
254 cJSON_AddItemToObject (propObj, OC_RSRVD_RESOURCE_TYPE, rtArray = cJSON_CreateArray());
255 resourceTypePtr = resourcePtr->rsrcType;
256 while (resourceTypePtr)
258 cJSON_AddItemToArray (rtArray,
259 cJSON_CreateString(resourceTypePtr->resourcetypename));
260 resourceTypePtr = resourceTypePtr->next;
262 // Add interface types
263 cJSON_AddItemToObject (propObj, OC_RSRVD_INTERFACE, rtArray = cJSON_CreateArray());
264 interfacePtr = resourcePtr->rsrcInterface;
267 cJSON_AddItemToArray (rtArray, cJSON_CreateString(interfacePtr->name));
268 interfacePtr = interfacePtr->next;
270 // If resource is observable, set observability flag.
271 // Resources that are not observable will not have the flag.
272 if (resourcePtr->resourceProperties & OC_OBSERVABLE)
274 cJSON_AddItemToObject (propObj, OC_RSRVD_OBSERVABLE,
275 cJSON_CreateNumber(OC_RESOURCE_OBSERVABLE));
277 // Set secure flag for secure resources
278 if (resourcePtr->resourceProperties & OC_SECURE)
280 cJSON_AddNumberToObject (propObj, OC_RSRVD_SECURE, OC_RESOURCE_SECURE);
281 //Set the IP port also as secure resources are hosted on a different port
283 if (GetSecurePortInfo (connType, &port) == OC_STACK_OK)
285 cJSON_AddNumberToObject (propObj, OC_RSRVD_HOSTING_PORT, port);
291 jsonStr = cJSON_PrintUnformatted (resObj);
293 jsonLen = strlen(jsonStr);
294 if (jsonLen < *remaining)
296 strcpy(out, jsonStr);
297 *remaining = *remaining - jsonLen;
301 ret = OC_STACK_ERROR;
303 cJSON_Delete (resObj);
306 OC_LOG(INFO, TAG, PCF("Exiting BuildVirtualResourceResponse"));
310 OCStackResult BuildVirtualResourceResponseForDevice(uint8_t filterOn, char *filterValue,
311 char *out, uint16_t *remaining)
313 if(!out || !remaining)
315 return OC_STACK_INVALID_PARAM;
318 OCStackResult ret = OC_STACK_ERROR;
320 if (savedDeviceInfo != NULL)
322 char *jsonStr = NULL;
323 uint16_t jsonLen = 0;
324 cJSON *repObj = cJSON_GetObjectItem(savedDeviceInfo, OC_RSRVD_REPRESENTATION);
326 OC_LOG(INFO, TAG, PCF("Entering BuildVirtualResourceResponseForDevice"));
328 if ((filterOn == STACK_DEVICE_DISCOVERY_DI_FILTER) && filterValue)
330 if((cJSON_GetObjectItem(repObj,OC_RSRVD_DEVICE_ID) != NULL) &&
331 strcmp(cJSON_GetObjectItem(repObj,OC_RSRVD_DEVICE_ID)->valuestring, filterValue)
337 else if ((filterOn == STACK_DEVICE_DISCOVERY_DN_FILTER) && filterValue)
339 if((cJSON_GetObjectItem(repObj,OC_RSRVD_DEVICE_NAME) != NULL) &&
340 strcmp(cJSON_GetObjectItem(repObj,OC_RSRVD_DEVICE_NAME)->valuestring,
346 else if (filterOn == STACK_RES_DISCOVERY_NOFILTER)
352 ret = OC_STACK_INVALID_QUERY;
355 if (ret == OC_STACK_OK)
357 jsonStr = cJSON_PrintUnformatted (savedDeviceInfo);
361 jsonLen = strlen(jsonStr);
363 if (jsonLen < *remaining)
365 strncpy(out, jsonStr, (jsonLen + 1));
366 *remaining = *remaining - jsonLen;
371 ret = OC_STACK_ERROR;
378 ret = OC_STACK_ERROR;
383 ret = OC_STACK_INVALID_DEVICE_INFO;
388 //error so that stack won't respond with empty payload
389 ret = OC_STACK_INVALID_DEVICE_INFO;
392 OC_LOG(INFO, TAG, PCF("Exiting BuildVirtualResourceResponseForDevice"));
396 const char * GetVirtualResourceUri( OCVirtualResources resource)
398 if (resource < OC_MAX_VIRTUAL_RESOURCES)
400 return VIRTUAL_RSRCS[resource];
406 bool IsVirtualResource(const char* resourceUri)
413 for (int i = 0; i < OC_MAX_VIRTUAL_RESOURCES; i++)
415 if (strcmp(resourceUri, GetVirtualResourceUri((OCVirtualResources)i)) == 0)
423 uint8_t IsCollectionResource (OCResource *resource)
430 for (int i = 0; i < MAX_CONTAINED_RESOURCES; i++)
432 if (resource->rsrcResources[i])
440 OCResource *FindResourceByUri(const char* resourceUri)
447 OCResource * pointer = headResource;
450 if (strcmp(resourceUri, pointer->uri) == 0)
454 pointer = pointer->next;
456 OC_LOG(INFO, TAG, PCF("Resource not found"));
461 OCStackResult DetermineResourceHandling (const OCServerRequest *request,
462 ResourceHandling *handling,
463 OCResource **resource)
465 if(!request || !handling || !resource)
467 return OC_STACK_INVALID_PARAM;
470 OC_LOG(INFO, TAG, PCF("Entering DetermineResourceHandling"));
472 // Check if virtual resource
473 if (IsVirtualResource((const char*)request->resourceUrl))
475 *handling = OC_RESOURCE_VIRTUAL;
476 *resource = headResource;
479 if (NULL == request->resourceUrl || (strlen((const char*)(request->resourceUrl)) == 0))
481 // Resource URL not specified
482 *handling = OC_RESOURCE_NOT_SPECIFIED;
483 return OC_STACK_NO_RESOURCE;
487 OCResource *resourcePtr = NULL;
488 resourcePtr = FindResourceByUri((const char*)request->resourceUrl);
489 *resource = resourcePtr;
492 if(defaultDeviceHandler)
494 *handling = OC_RESOURCE_DEFAULT_DEVICE_ENTITYHANDLER;
498 // Resource does not exist
499 // and default device handler does not exist
500 *handling = OC_RESOURCE_NOT_SPECIFIED;
501 return OC_STACK_NO_RESOURCE;
504 // secure resource will entertain only authorized requests
505 if ((resourcePtr->resourceProperties & OC_SECURE) && (request->secured == 0))
507 OC_LOG(ERROR, TAG, PCF("Un-authorized request. Ignoring"));
508 return OC_STACK_RESOURCE_ERROR;
511 if (IsCollectionResource (resourcePtr))
513 // Collection resource
514 if (resourcePtr->entityHandler != defaultResourceEHandler)
516 *handling = OC_RESOURCE_COLLECTION_WITH_ENTITYHANDLER;
521 *handling = OC_RESOURCE_COLLECTION_DEFAULT_ENTITYHANDLER;
527 // Resource not a collection
528 if (resourcePtr->entityHandler != defaultResourceEHandler)
530 *handling = OC_RESOURCE_NOT_COLLECTION_WITH_ENTITYHANDLER;
535 *handling = OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER;
542 OCStackResult EntityHandlerCodeToOCStackCode(OCEntityHandlerResult ehResult)
544 OCStackResult result;
549 result = OC_STACK_OK;
552 result = OC_STACK_SLOW_RESOURCE;
555 result = OC_STACK_ERROR;
557 case OC_EH_FORBIDDEN:
558 result = OC_STACK_RESOURCE_ERROR;
560 case OC_EH_RESOURCE_CREATED:
561 result = OC_STACK_RESOURCE_CREATED;
563 case OC_EH_RESOURCE_DELETED:
564 result = OC_STACK_RESOURCE_DELETED;
566 case OC_EH_RESOURCE_NOT_FOUND:
567 result = OC_STACK_NO_RESOURCE;
570 result = OC_STACK_ERROR;
577 HandleVirtualResource (OCServerRequest *request, OCResource* resource)
579 if(!request || !resource)
581 return OC_STACK_INVALID_PARAM;
584 OCStackResult result = OC_STACK_ERROR;
585 char *filterValue = NULL;
586 uint8_t filterOn = 0;
587 uint16_t remaining = 0;
589 uint8_t firstLoopDone = 0;
590 char discoveryResBuf[MAX_RESPONSE_LENGTH] = {};
592 OC_LOG(INFO, TAG, PCF("Entering HandleVirtualResource"));
594 result = ValidateUrlQuery (request->resourceUrl,
595 request->query, &filterOn,
598 if (result == OC_STACK_OK)
600 if (strcmp ((char *)request->resourceUrl, GetVirtualResourceUri(OC_WELL_KNOWN_URI)) == 0)
602 ptr = discoveryResBuf;
603 remaining = MAX_RESPONSE_LENGTH;
605 // Check if valid resource and enough space in buffer for atleast
606 // the null character.
607 while(resource && (remaining > 1))
609 if((resource->resourceProperties & OC_ACTIVE)
610 && (resource->resourceProperties & OC_DISCOVERABLE))
612 // if there is data on the buffer, we have already added a response,
613 // so we need to add a comma before we do anything
615 && remaining >= (sizeof(OC_JSON_SEPARATOR)+1))
617 *ptr = OC_JSON_SEPARATOR;
622 result = BuildVirtualResourceResponse(resource, filterOn, filterValue,
623 (char*)ptr, &remaining, request->connectivityType );
625 if (result != OC_STACK_OK)
627 // if this failed, we need to remove the comma added above.
636 ptr += strlen((char *)ptr);
638 resource = resource->next;
641 if(strlen((const char *)discoveryResBuf) > 0)
643 OCEntityHandlerResponse response = {};
645 response.ehResult = OC_EH_OK;
646 response.payload = discoveryResBuf;
647 response.payloadSize = strlen((const char *)discoveryResBuf) + 1;
648 response.persistentBufferFlag = 0;
649 response.requestHandle = (OCRequestHandle) request;
650 response.resourceHandle = (OCResourceHandle) resource;
652 result = OCDoResponse(&response);
655 else if (strcmp ((char *)request->resourceUrl, GetVirtualResourceUri(OC_DEVICE_URI)) == 0)
657 remaining = MAX_RESPONSE_LENGTH;
658 ptr = discoveryResBuf;
660 result = BuildVirtualResourceResponseForDevice(filterOn, filterValue,
661 (char*)ptr, &remaining);
663 if(result == OC_STACK_OK)
665 ptr += strlen((char*)ptr);
668 if(remaining < MAX_RESPONSE_LENGTH)
670 OCEntityHandlerResponse response = {0};
672 response.ehResult = OC_EH_OK;
673 response.payload = discoveryResBuf;
674 response.payloadSize = strlen((const char *)discoveryResBuf) + 1;
675 response.persistentBufferFlag = 0;
676 response.requestHandle = (OCRequestHandle) request;
677 response.resourceHandle = (OCResourceHandle) resource;
679 result = OCDoResponse(&response);
685 if(resource->resourceProperties & OC_ACTIVE){
686 SendPresenceNotification(NULL);
691 result = OC_STACK_OK;
696 HandleDefaultDeviceEntityHandler (OCServerRequest *request)
700 return OC_STACK_INVALID_PARAM;
703 OCStackResult result = OC_STACK_OK;
704 OCEntityHandlerResult ehResult = OC_EH_ERROR;
705 OCEntityHandlerRequest ehRequest = {};
707 OC_LOG(INFO, TAG, PCF("Entering HandleResourceWithDefaultDeviceEntityHandler"));
708 result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle) request,
709 request->method, (OCResourceHandle) NULL, request->query,
710 request->reqJSONPayload, request->numRcvdVendorSpecificHeaderOptions,
711 request->rcvdVendorSpecificHeaderOptions,
712 (OCObserveAction)request->observationOption, (OCObservationId)0);
713 VERIFY_SUCCESS(result, OC_STACK_OK);
715 // At this point we know for sure that defaultDeviceHandler exists
716 ehResult = defaultDeviceHandler(OC_REQUEST_FLAG, &ehRequest,
717 (char*) request->resourceUrl);
718 if(ehResult == OC_EH_SLOW)
720 OC_LOG(INFO, TAG, PCF("This is a slow resource"));
721 request->slowFlag = 1;
723 else if(ehResult == OC_EH_ERROR)
725 FindAndDeleteServerRequest(request);
727 result = EntityHandlerCodeToOCStackCode(ehResult);
733 HandleResourceWithEntityHandler (OCServerRequest *request,
734 OCResource *resource,
735 uint8_t collectionResource)
737 if(!request || ! resource)
739 return OC_STACK_INVALID_PARAM;
742 OCStackResult result = OC_STACK_ERROR;
743 OCEntityHandlerResult ehResult = OC_EH_ERROR;
744 OCEntityHandlerFlag ehFlag = OC_REQUEST_FLAG;
745 ResourceObserver *resObs = NULL;
747 OCEntityHandlerRequest ehRequest = {};
749 OC_LOG(INFO, TAG, PCF("Entering HandleResourceWithEntityHandler"));
750 result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle) request,
751 request->method, (OCResourceHandle) resource, request->query,
752 request->reqJSONPayload, request->numRcvdVendorSpecificHeaderOptions,
753 request->rcvdVendorSpecificHeaderOptions,
754 (OCObserveAction)request->observationOption, 0);
755 VERIFY_SUCCESS(result, OC_STACK_OK);
757 if(ehRequest.obsInfo.action == OC_OBSERVE_NO_OPTION)
759 OC_LOG(INFO, TAG, PCF("No observation requested"));
760 ehFlag = OC_REQUEST_FLAG;
762 else if(ehRequest.obsInfo.action == OC_OBSERVE_REGISTER &&
765 OC_LOG(INFO, TAG, PCF("Registering observation requested"));
766 result = GenerateObserverId(&ehRequest.obsInfo.obsId);
767 VERIFY_SUCCESS(result, OC_STACK_OK);
769 result = AddObserver ((const char*)(request->resourceUrl),
770 (const char *)(request->query),
771 ehRequest.obsInfo.obsId, request->requestToken, request->tokenLength,
772 resource, request->qos,
773 &request->addressInfo, request->connectivityType);
775 if(result == OC_STACK_OK)
777 OC_LOG(INFO, TAG, PCF("Added observer successfully"));
778 request->observeResult = OC_STACK_OK;
779 ehFlag = (OCEntityHandlerFlag)(OC_REQUEST_FLAG | OC_OBSERVE_FLAG);
783 result = OC_STACK_OK;
784 // The error in observeResult for the request will be
785 // used when responding to this request by omitting
786 // the observation option/sequence number.
787 request->observeResult = OC_STACK_ERROR;
788 OC_LOG(ERROR, TAG, PCF("Observer Addition failed"));
789 ehFlag = OC_REQUEST_FLAG;
793 else if(ehRequest.obsInfo.action == OC_OBSERVE_DEREGISTER &&
796 OC_LOG(INFO, TAG, PCF("Deregistering observation requested"));
798 resObs = GetObserverUsingToken (request->requestToken, request->tokenLength);
802 // Stack does not contain this observation request
803 // Either token is incorrect or observation list is corrupted
804 result = OC_STACK_ERROR;
807 ehRequest.obsInfo.obsId = resObs->observeId;
808 ehFlag = (OCEntityHandlerFlag)(ehFlag | OC_OBSERVE_FLAG);
810 result = DeleteObserverUsingToken (request->requestToken, request->tokenLength);
812 if(result == OC_STACK_OK)
814 OC_LOG(INFO, TAG, PCF("Removed observer successfully"));
815 request->observeResult = OC_STACK_OK;
819 result = OC_STACK_OK;
820 request->observeResult = OC_STACK_ERROR;
821 OC_LOG(ERROR, TAG, PCF("Observer Removal failed"));
826 result = OC_STACK_ERROR;
830 ehResult = resource->entityHandler(ehFlag, &ehRequest);
831 if(ehResult == OC_EH_SLOW)
833 OC_LOG(INFO, TAG, PCF("This is a slow resource"));
834 request->slowFlag = 1;
836 else if(ehResult == OC_EH_ERROR)
838 FindAndDeleteServerRequest(request);
840 result = EntityHandlerCodeToOCStackCode(ehResult);
846 HandleCollectionResourceDefaultEntityHandler (OCServerRequest *request,
847 OCResource *resource)
849 if(!request || !resource)
851 return OC_STACK_INVALID_PARAM;
854 OCStackResult result = OC_STACK_ERROR;
855 OCEntityHandlerRequest ehRequest = {};
857 result = FormOCEntityHandlerRequest(&ehRequest, (OCRequestHandle) request,
858 request->method, (OCResourceHandle) resource, request->query,
859 request->reqJSONPayload, request->numRcvdVendorSpecificHeaderOptions,
860 request->rcvdVendorSpecificHeaderOptions,
861 (OCObserveAction)request->observationOption, (OCObservationId) 0);
862 if(result != OC_STACK_OK)
867 return (DefaultCollectionEntityHandler (OC_REQUEST_FLAG, &ehRequest));
871 ProcessRequest(ResourceHandling resHandling, OCResource *resource, OCServerRequest *request)
873 OCStackResult ret = OC_STACK_OK;
877 case OC_RESOURCE_VIRTUAL:
879 ret = HandleVirtualResource (request, resource);
882 case OC_RESOURCE_DEFAULT_DEVICE_ENTITYHANDLER:
884 ret = HandleDefaultDeviceEntityHandler(request);
887 case OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER:
889 OC_LOG(INFO, TAG, PCF("OC_RESOURCE_NOT_COLLECTION_DEFAULT_ENTITYHANDLER"));
890 return OC_STACK_ERROR;
892 case OC_RESOURCE_NOT_COLLECTION_WITH_ENTITYHANDLER:
894 ret = HandleResourceWithEntityHandler (request, resource, 0);
897 case OC_RESOURCE_COLLECTION_WITH_ENTITYHANDLER:
899 ret = HandleResourceWithEntityHandler (request, resource, 1);
902 case OC_RESOURCE_COLLECTION_DEFAULT_ENTITYHANDLER:
904 ret = HandleCollectionResourceDefaultEntityHandler (request, resource);
907 case OC_RESOURCE_NOT_SPECIFIED:
909 ret = OC_STACK_NO_RESOURCE;
914 OC_LOG(INFO, TAG, PCF("Invalid Resource Determination"));
915 return OC_STACK_ERROR;
921 void DeleteDeviceInfo()
925 cJSON_Delete(savedDeviceInfo);
929 OCStackResult SaveDeviceInfo(OCDeviceInfo deviceInfo)
933 savedDeviceInfo = cJSON_CreateObject();
934 cJSON *repObj = NULL;
936 cJSON_AddItemToObject (savedDeviceInfo, OC_RSRVD_HREF,
937 cJSON_CreateString(GetVirtualResourceUri(OC_DEVICE_URI)));
939 cJSON_AddItemToObject (savedDeviceInfo, OC_RSRVD_REPRESENTATION, repObj = cJSON_CreateObject());
941 if (deviceInfo.contentType)
943 cJSON_AddItemToObject (repObj, OC_RSRVD_CONTENT_TYPE,
944 cJSON_CreateString(deviceInfo.contentType));
947 if (deviceInfo.dateOfManufacture)
949 cJSON_AddItemToObject (repObj, OC_RSRVD_MFG_DATE,
950 cJSON_CreateString(deviceInfo.dateOfManufacture));
953 if (deviceInfo.deviceName)
955 cJSON_AddItemToObject (repObj, OC_RSRVD_DEVICE_NAME,
956 cJSON_CreateString(deviceInfo.deviceName));
959 if (deviceInfo.deviceUUID)
961 cJSON_AddItemToObject (repObj, OC_RSRVD_DEVICE_ID,
962 cJSON_CreateString(deviceInfo.deviceUUID));
965 if (deviceInfo.firmwareVersion)
967 cJSON_AddItemToObject (repObj, OC_RSRVD_FW_VERSION,
968 cJSON_CreateString(deviceInfo.firmwareVersion));
971 if (deviceInfo.hostName)
973 cJSON_AddItemToObject (repObj, OC_RSRVD_HOST_NAME,
974 cJSON_CreateString(deviceInfo.hostName));
977 if (deviceInfo.manufacturerName)
979 if(strlen(deviceInfo.manufacturerName) > MAX_MANUFACTURER_NAME_LENGTH)
982 return OC_STACK_INVALID_PARAM;
985 cJSON_AddItemToObject (repObj, OC_RSRVD_MFG_NAME,
986 cJSON_CreateString(deviceInfo.manufacturerName));
989 if (deviceInfo.manufacturerUrl)
991 if(strlen(deviceInfo.manufacturerUrl) > MAX_MANUFACTURER_URL_LENGTH)
994 return OC_STACK_INVALID_PARAM;
997 cJSON_AddItemToObject (repObj, OC_RSRVD_MFG_URL,
998 cJSON_CreateString(deviceInfo.manufacturerUrl));
1001 if (deviceInfo.modelNumber)
1003 cJSON_AddItemToObject (repObj, OC_RSRVD_MODEL_NUM,
1004 cJSON_CreateString(deviceInfo.modelNumber));
1007 if (deviceInfo.platformVersion)
1009 cJSON_AddItemToObject (repObj, OC_RSRVD_PLATFORM_VERSION,
1010 cJSON_CreateString(deviceInfo.platformVersion));
1013 if (deviceInfo.supportUrl)
1015 cJSON_AddItemToObject (repObj, OC_RSRVD_SUPPORT_URL,
1016 cJSON_CreateString(deviceInfo.supportUrl));
1019 if (deviceInfo.version)
1021 cJSON_AddItemToObject (repObj, OC_RSRVD_VERSION,
1022 cJSON_CreateString(deviceInfo.version));