1 //******************************************************************
3 // Copyright 2015 Samsung Electronics 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 #include "virtualResource.h"
24 MirrorResourceList *createMirrorResourceList()
26 MirrorResourceList *mirrorResourceList = (MirrorResourceList *)malloc(sizeof(MirrorResourceList));
27 if (!mirrorResourceList)
29 OC_LOG_V(DEBUG, VR_TAG,"Virtual Resource List Creation Fail.");
33 mirrorResourceList->headerNode = NULL;
34 mirrorResourceList->tailNode = NULL;
37 return mirrorResourceList;
40 MirrorResource *createMirrorResource()
42 MirrorResource *mirrorResource = (MirrorResource*)malloc(sizeof(MirrorResource));
45 OC_LOG_V(DEBUG, VR_TAG,"Virtual Resource List Creation Fail.");
49 mirrorResource->resourceHandle[OIC_REQUEST_HANDLE] = NULL;
50 mirrorResource->resourceHandle[OIC_MIRROR_HANDLE] = NULL;
51 mirrorResource->address[OIC_SOURCE_ADDRESS] = NULL;
52 mirrorResource->address[OIC_MIRROR_ADDRESS] = NULL;
54 mirrorResource->rep = NULL;
55 mirrorResource->uri = NULL;
56 mirrorResource->next = NULL;
58 mirrorResource->prop.countResourceType = 0;
59 mirrorResource->prop.resourceType = NULL;
60 mirrorResource->prop.countInterface = 0;
61 mirrorResource->prop.resourceInterfaceName = NULL;
64 return mirrorResource;
67 OCStackResult destroyMirrorResourceList(MirrorResourceList *mirrorResourceList)
69 OC_LOG_V(DEBUG, VR_TAG,"enter destroyVirtualResourceList");
70 if(mirrorResourceList)
72 while (mirrorResourceList->headerNode)
74 deleteMirrorResourceFromList(mirrorResourceList, mirrorResourceList->headerNode);
77 free(mirrorResourceList);
81 return OC_STACK_INVALID_PARAM;
87 OCStackResult destroyMirrorResource(MirrorResource *mirrorResource)
89 OC_LOG_V(DEBUG, VR_TAG,"enter destroy virtual resource.");
92 if(mirrorResource->next)
94 mirrorResource->next = NULL;
96 if (mirrorResource->rep)
98 cJSON_Delete(mirrorResource->rep);
100 if (mirrorResource->uri)
102 free(mirrorResource->uri);
104 if (mirrorResource->address[OIC_SOURCE_ADDRESS])
106 free(mirrorResource->address[OIC_SOURCE_ADDRESS]);
108 if (mirrorResource->address[OIC_MIRROR_ADDRESS])
110 free(mirrorResource->address[OIC_MIRROR_ADDRESS]);
112 if (mirrorResource->prop.resourceType)
115 for (i = 0; i < mirrorResource->prop.countResourceType; ++i)
117 free(mirrorResource->prop.resourceType[i]);
118 mirrorResource->prop.resourceType[i] = NULL;
120 free(mirrorResource->prop.resourceType);
121 mirrorResource->prop.countResourceType = 0;
123 if (mirrorResource->prop.resourceInterfaceName)
126 for (i = 0; i < mirrorResource->prop.countInterface; ++i)
128 free(mirrorResource->prop.resourceInterfaceName[i]);
129 mirrorResource->prop.resourceInterfaceName[i] = NULL;
131 free(mirrorResource->prop.resourceInterfaceName);
132 mirrorResource->prop.countInterface = 0;
134 free(mirrorResource);
138 return OC_STACK_INVALID_PARAM;
144 OCStackResult insertMirrorResource(MirrorResourceList *mirrorResourceList,
145 MirrorResource *mirrorResource)
147 if (mirrorResourceList == NULL || mirrorResource == NULL)
149 return OC_STACK_INVALID_PARAM;
152 if (mirrorResourceList->headerNode == NULL)
154 mirrorResourceList->headerNode = mirrorResource;
155 mirrorResourceList->tailNode = mirrorResource;
159 mirrorResourceList->tailNode->next = mirrorResource;
160 mirrorResourceList->tailNode = mirrorResource;
166 MirrorResource *findMirrorResourceUsingAddressAndURI(MirrorResourceList *mirrorResourceList,
167 const char *address, OICResourceCoordinatorParamType paramType, const char *uri)
169 if (mirrorResourceList == NULL || address == NULL)
171 OC_LOG_V(DEBUG, VR_TAG,"Find Virtual Resource : invalid parameter.");
174 if (mirrorResourceList->headerNode == NULL)
176 OC_LOG_V(DEBUG, VR_TAG,"Find Virtual Resource : Empty Virtual Resource List.");
180 MirrorResource *tempMirrorResource = mirrorResourceList->headerNode;
181 while (tempMirrorResource != NULL)
183 OC_LOG_V(DEBUG, VR_TAG,"node's uri = %s", tempMirrorResource->uri);
184 if (strcmp(tempMirrorResource->address[paramType], address) == 0) // if(It is Same)
186 if (strcmp(tempMirrorResource->uri, uri) == 0) // if(It is Same)
188 return tempMirrorResource;
191 tempMirrorResource = tempMirrorResource->next;
197 MirrorResource *findMirrorResourceUsingHandle(MirrorResourceList *mirrorResourceList,
198 OCResourceHandle handle, OICResourceCoordinatorParamType paramType)
200 if (mirrorResourceList == NULL || handle == NULL)
202 OC_LOG_V(DEBUG, VR_TAG,"Find Virtual Resource : invalid parameter.");
205 if (mirrorResourceList->headerNode == NULL)
207 OC_LOG_V(DEBUG, VR_TAG,"Find Virtual Resource : Empty Virtual Resource List.");
211 MirrorResource *tempMirrorResource = mirrorResourceList->headerNode;
212 while (tempMirrorResource != NULL)
214 if (tempMirrorResource->resourceHandle[paramType] == handle)
216 return tempMirrorResource;
218 tempMirrorResource = tempMirrorResource->next;
224 OCStackResult deleteMirrorResourceFromList(MirrorResourceList *mirrorResourceList,
225 MirrorResource *mirrorResource)
228 OC_LOG_V(DEBUG, VR_TAG,"enter delete virtual resource.");
230 if (mirrorResourceList == NULL || mirrorResource == NULL)
232 OC_LOG_V(DEBUG, VR_TAG,"Delete Virtual Resource : invalid parameter.");
233 return OC_STACK_INVALID_PARAM;
235 if (mirrorResourceList->headerNode == NULL)
237 OC_LOG_V(DEBUG, VR_TAG,"Delete Virtual Resource : Empty Virtual Resource List.");
238 return OC_STACK_ERROR;
241 if (mirrorResource == mirrorResourceList->headerNode)
243 mirrorResourceList->headerNode = mirrorResourceList->headerNode->next;
244 mirrorResource->next = NULL;
245 return destroyMirrorResource(mirrorResource);
248 MirrorResource *preNode = mirrorResourceList->headerNode;
249 MirrorResource *curNode = preNode->next;
250 while (curNode != NULL)
252 if (curNode == mirrorResource)
254 if (curNode == mirrorResourceList->tailNode)
256 mirrorResourceList->tailNode = preNode;
257 preNode->next = NULL;
261 preNode->next = curNode->next;
263 mirrorResource->next = NULL;
264 return destroyMirrorResource(mirrorResource);
267 curNode = curNode->next;
270 return OC_STACK_ERROR;
273 OCStackResult ejectMirrorResource(MirrorResourceList *mirrorResourceList,
274 MirrorResource *mirrorResource)
276 if (mirrorResourceList == NULL || mirrorResource == NULL)
278 OC_LOG_V(DEBUG, VR_TAG,"Eject Virtual Resource : invalid parameter.");
279 return OC_STACK_INVALID_PARAM;
281 if (mirrorResourceList->headerNode == NULL)
283 OC_LOG_V(DEBUG, VR_TAG, "Eject Virtual Resource : Empty Virtual Resource List.");
284 return OC_STACK_ERROR;
287 if (mirrorResource == mirrorResourceList->headerNode)
289 mirrorResourceList->headerNode = mirrorResourceList->headerNode->next;
293 MirrorResource *preNode = mirrorResourceList->headerNode;
294 MirrorResource *curNode = preNode->next;
295 while (curNode != NULL)
297 if (curNode == mirrorResource)
299 if(curNode == mirrorResourceList->headerNode)
301 mirrorResourceList->headerNode = NULL;
302 mirrorResourceList->tailNode = NULL;
304 else if(curNode == mirrorResourceList->tailNode)
306 mirrorResourceList->tailNode = preNode;
310 preNode->next = curNode->next;
315 curNode = curNode->next;
318 return OC_STACK_ERROR;
322 MirrorResource *cloneMirrorResource(MirrorResource *sourceMirrorResource)
324 MirrorResource *clonedMirrorResource = createMirrorResource();
329 clonedMirrorResource->rep = cJSON_Parse(cJSON_PrintUnformatted(sourceMirrorResource->rep));
331 sizeofstr = strlen(sourceMirrorResource->uri) + 1;
332 clonedMirrorResource->uri = (char *)malloc(sizeof(char) * sizeofstr);
333 memset(clonedMirrorResource->uri, '\0', sizeofstr);
334 strcpy(clonedMirrorResource->uri, sourceMirrorResource->uri);
336 for (i = OIC_SOURCE_ADDRESS; i < OIC_MIRROR_ADDRESS; ++i)
338 sizeofstr = strlen(sourceMirrorResource->address[i]) + 1;
339 clonedMirrorResource->address[i] = (char *)malloc(sizeof(char) * sizeofstr);
340 memset(clonedMirrorResource->address[i], '\0', sizeofstr);
341 strcpy(clonedMirrorResource->address[i], sourceMirrorResource->address[i]);
344 return clonedMirrorResource;
347 MirrorResourceList *findMirrorResourceListUsingAddress(MirrorResourceList *mirrorResourceList,
348 const char *address, OICResourceCoordinatorParamType paramType)
350 if (mirrorResourceList == NULL || address == NULL)
352 OC_LOG_V(DEBUG, VR_TAG,"Find Virtual Resource List : invalid parameter.");
355 if (mirrorResourceList->headerNode == NULL)
357 OC_LOG_V(DEBUG, VR_TAG,"Find Virtual Resource List : Empty Virtual Resource List.");
361 MirrorResource *tempNode = mirrorResourceList->headerNode;
362 while (tempNode != NULL)
364 OC_LOG_V(DEBUG, VR_TAG, "uri = %s", tempNode->uri);
365 tempNode = tempNode->next;
369 MirrorResourceList *resultMirrorResourceList = createMirrorResourceList();
370 MirrorResource *mirrorResource = mirrorResourceList->headerNode;
371 while (mirrorResource != NULL)
373 if (strcmp(mirrorResource->address[paramType], address) == 0) // if(It is Same)
375 insertMirrorResource(resultMirrorResourceList, cloneMirrorResource(mirrorResource));
377 mirrorResource = mirrorResource->next;
380 return resultMirrorResourceList;
384 OCStackResult printMirrorResourceList(MirrorResourceList *mirrorResourceList)
386 if (mirrorResourceList == NULL)
388 OC_LOG_V(DEBUG, VR_TAG, "print Virtual Resource list : invalid parameter.");
389 return OC_STACK_INVALID_PARAM;
391 if (mirrorResourceList->headerNode == NULL)
393 OC_LOG_V(DEBUG, VR_TAG, "print Virtual Resource list : Empty Virtual Resource List.");
394 return OC_STACK_INVALID_PARAM;
396 OC_LOG_V(DEBUG, VR_TAG, "==============================================================");
397 MirrorResource *mirrorResource = mirrorResourceList->headerNode;
398 while (mirrorResource != NULL)
400 OC_LOG_V(DEBUG, VR_TAG, "uri = %s", mirrorResource->uri);
401 mirrorResource = mirrorResource->next;
403 OC_LOG_V(DEBUG, VR_TAG, "==============================================================");