}
OCResource *collResource = (OCResource *)ehRequest->resource;
-
+ OCChildResource *tempChildResource = NULL;
OCRepPayload* payload = NULL;
+
+ if(!collResource)
+ {
+ return OC_STACK_INVALID_PARAM;
+ }
+
OCStackResult ret = BuildResponseRepresentation(collResource, &payload);
if (ret == OC_STACK_OK)
{
- for (size_t i = 0; i < MAX_CONTAINED_RESOURCES && ret == OC_STACK_OK; i++)
+ tempChildResource = collResource->rsrcChildResourcesHead;
+ while (tempChildResource && ret == OC_STACK_OK)
{
- if (collResource)
+ OCResource* temp = tempChildResource->rsrcResource;
+ if (temp)
{
- OCResource* temp = collResource->rsrcResources[i];
- if (temp)
- {
- //TODO : Add resource type filtering once collections
- // start supporting queries.
- ret = BuildResponseRepresentation(temp, &payload);
- }
+ //TODO : Add resource type filtering once collections
+ // start supporting queries.
+ ret = BuildResponseRepresentation(temp, &payload);
}
+
+ tempChildResource = tempChildResource->next;
}
}
response.resourceHandle = (OCResourceHandle) collResource;
ret = OCDoResponse(&response);
}
+
OCRepPayloadDestroy(payload);
return ret;
}
}
OCResource * collResource = (OCResource *) ehRequest->resource;
+ OCChildResource *tempChildResource = NULL;
OCRepPayload* payload = OCRepPayloadCreate();
if (!payload)
if (stackRet == OC_STACK_OK)
{
- for (uint8_t i = 0; i < MAX_CONTAINED_RESOURCES; i++)
+ tempChildResource = collResource->rsrcChildResourcesHead;
+
+ while(tempChildResource)
{
- OCResource* temp = collResource->rsrcResources[i];
- if (temp)
+ OCResource* tempRsrcResource = tempChildResource->rsrcResource;
+
+ if (tempRsrcResource)
{
// Note that all entity handlers called through a collection
// will get the same pointer to ehRequest, the only difference
// is ehRequest->resource
- ehRequest->resource = (OCResourceHandle) temp;
+ ehRequest->resource = (OCResourceHandle) tempRsrcResource;
- OCEntityHandlerResult ehResult = temp->entityHandler(OC_REQUEST_FLAG, ehRequest,
- temp->entityHandlerCallbackParam);
+ OCEntityHandlerResult ehResult = tempRsrcResource->entityHandler(OC_REQUEST_FLAG, ehRequest,
+ tempRsrcResource->entityHandlerCallbackParam);
// The default collection handler is returning as OK
if (stackRet != OC_STACK_SLOW_RESOURCE)
{
break;
}
+
+ tempChildResource = tempChildResource->next;
+
}
+
ehRequest->resource = (OCResourceHandle) collResource;
}
return stackRet;
if (resource)
{
uint8_t num = 0;
- for (uint8_t i = 0; i < MAX_CONTAINED_RESOURCES; i++)
+ OCChildResource *tempChildResource = NULL;
+
+ tempChildResource = resource->rsrcChildResourcesHead;
+
+ while(tempChildResource)
{
- if (resource->rsrcResources[i])
- {
- num++;
- }
+ num++;
+ tempChildResource = tempChildResource->next;
}
+
return num;
}
else
pointer->entityHandlerCallbackParam = NULL;
}
+ // Initialize a pointer indicating child resources in case of collection
+ pointer->rsrcChildResourcesHead = NULL;
+
*handle = pointer;
result = OC_STACK_OK;
return result;
}
-
OCStackResult OCBindResource(
OCResourceHandle collectionHandle, OCResourceHandle resourceHandle)
{
OCResource *resource = NULL;
- uint8_t i = 0;
+ OCChildResource *tempChildResource = NULL;
+ OCChildResource *newChildResource = NULL;
OIC_LOG(INFO, TAG, "Entering OCBindResource");
// Look for an open slot to add add the child resource.
// If found, add it and return success
- for (i = 0; i < MAX_CONTAINED_RESOURCES; i++)
+
+ tempChildResource = resource->rsrcChildResourcesHead;
+
+ while(resource->rsrcChildResourcesHead && tempChildResource->next)
{
- if (!resource->rsrcResources[i])
- {
- resource->rsrcResources[i] = (OCResource *) resourceHandle;
- OIC_LOG(INFO, TAG, "resource bound");
+ // TODO: what if one of child resource was deregistered without unbinding?
+ tempChildResource = tempChildResource->next;
+ }
-#ifdef WITH_PRESENCE
- if (presenceResource.handle)
- {
- ((OCResource *)presenceResource.handle)->sequenceNum = OCGetRandom();
- SendPresenceNotification(((OCResource *) resourceHandle)->rsrcType,
- OC_PRESENCE_TRIGGER_CHANGE);
- }
-#endif
- return OC_STACK_OK;
+ // Do memory allocation for child resource
+ newChildResource = (OCChildResource *) OICCalloc(1, sizeof(OCChildResource));
+ if(!newChildResource)
+ {
+ OIC_LOG(ERROR, TAG, "Adding new child resource is failed due to memory allocation failure");
+ return OC_STACK_ERROR;
+ }
- }
+ newChildResource->rsrcResource = (OCResource *) resourceHandle;
+ newChildResource->next = NULL;
+
+ if(!resource->rsrcChildResourcesHead)
+ {
+ resource->rsrcChildResourcesHead = newChildResource;
+ }
+ else {
+ tempChildResource->next = newChildResource;
}
- // Unable to add resourceHandle, so return error
- return OC_STACK_ERROR;
+ OIC_LOG(INFO, TAG, "resource bound");
+
+#ifdef WITH_PRESENCE
+ if (presenceResource.handle)
+ {
+ ((OCResource *)presenceResource.handle)->sequenceNum = OCGetRandom();
+ SendPresenceNotification(((OCResource *) resourceHandle)->rsrcType,
+ OC_PRESENCE_TRIGGER_CHANGE);
+ }
+#endif
+
+ return OC_STACK_OK;
}
OCStackResult OCUnBindResource(
OCResourceHandle collectionHandle, OCResourceHandle resourceHandle)
{
OCResource *resource = NULL;
- uint8_t i = 0;
+ OCChildResource *tempChildResource = NULL;
+ OCChildResource *tempLastChildResource = NULL;
OIC_LOG(INFO, TAG, "Entering OCUnBindResource");
// Look for an open slot to add add the child resource.
// If found, add it and return success
- for (i = 0; i < MAX_CONTAINED_RESOURCES; i++)
+ if(!resource->rsrcChildResourcesHead)
{
- if (resourceHandle == resource->rsrcResources[i])
+ OIC_LOG(INFO, TAG, "resource not found in collection");
+
+ // Unable to add resourceHandle, so return error
+ return OC_STACK_ERROR;
+
+ }
+
+ tempChildResource = resource->rsrcChildResourcesHead;
+
+ while (tempChildResource)
+ {
+ if(tempChildResource->rsrcResource == resourceHandle)
{
- resource->rsrcResources[i] = (OCResource *) NULL;
+ // if resource going to be unbinded is the head one.
+ if( tempChildResource == resource->rsrcChildResourcesHead )
+ {
+ OCChildResource *temp = resource->rsrcChildResourcesHead->next;
+ OICFree(resource->rsrcChildResourcesHead);
+ resource->rsrcChildResourcesHead = temp;
+ temp = NULL;
+ }
+ else
+ {
+ OCChildResource *temp = tempChildResource->next;
+ OICFree(tempChildResource);
+ tempLastChildResource->next = temp;
+ temp = NULL;
+ }
+
OIC_LOG(INFO, TAG, "resource unbound");
// Send notification when resource is unbounded successfully.
OC_PRESENCE_TRIGGER_CHANGE);
}
#endif
+ tempChildResource = NULL;
+ tempLastChildResource = NULL;
+
return OC_STACK_OK;
+
}
+
+ tempLastChildResource = tempChildResource;
+ tempChildResource = tempChildResource->next;
}
OIC_LOG(INFO, TAG, "resource not found in collection");
+ tempChildResource = NULL;
+ tempLastChildResource = NULL;
+
// Unable to add resourceHandle, so return error
return OC_STACK_ERROR;
}
uint8_t index)
{
OCResource *resource = NULL;
+ OCChildResource *tempChildResource = NULL;
+ uint8_t num = 0;
- if (index >= MAX_CONTAINED_RESOURCES)
+ resource = findResource((OCResource *) collectionHandle);
+ if (!resource)
{
return NULL;
}
- resource = findResource((OCResource *) collectionHandle);
- if (!resource)
+ tempChildResource = resource->rsrcChildResourcesHead;
+
+ while(tempChildResource)
{
- return NULL;
+ if( num == index )
+ {
+ return tempChildResource->rsrcResource;
+ }
+ num++;
+ tempChildResource = tempChildResource->next;
}
- return resource->rsrcResources[index];
+ // In this case, the number of resource handles in the collection exceeds the index
+ tempChildResource = NULL;
+ return NULL;
}
OCStackResult OCBindResourceHandler(OCResourceHandle handle,
EXPECT_EQ(OC_STACK_OK, OCBindResource(containerHandle, handle2));
EXPECT_EQ(OC_STACK_OK, OCBindResource(containerHandle, handle3));
EXPECT_EQ(OC_STACK_OK, OCBindResource(containerHandle, handle4));
- EXPECT_EQ(OC_STACK_ERROR, OCBindResource(containerHandle, handle5));
+ EXPECT_EQ(OC_STACK_OK, OCBindResource(containerHandle, handle5));
EXPECT_EQ(handle0, OCGetResourceHandleFromCollection(containerHandle, 0));
EXPECT_EQ(handle1, OCGetResourceHandleFromCollection(containerHandle, 1));
EXPECT_EQ(handle2, OCGetResourceHandleFromCollection(containerHandle, 2));
EXPECT_EQ(handle3, OCGetResourceHandleFromCollection(containerHandle, 3));
EXPECT_EQ(handle4, OCGetResourceHandleFromCollection(containerHandle, 4));
-
- EXPECT_EQ(NULL, OCGetResourceHandleFromCollection(containerHandle, 5));
+ EXPECT_EQ(handle5, OCGetResourceHandleFromCollection(containerHandle, 5));
EXPECT_EQ(OC_STACK_OK, OCStop());
}