Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / service / notification-manager / NotificationManager / src / requestHandler.c
1 //******************************************************************
2 //
3 // Copyright 2015 Samsung Electronics All Rights Reserved.
4 //
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
6 //
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
10 //
11 //      http://www.apache.org/licenses/LICENSE-2.0
12 //
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.
18 //
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
20
21 #include "virtualResource.h"
22
23 RequestHandleList *createRequestHandleList()
24 {
25     RequestHandleList *requestHandleList = (RequestHandleList*)malloc(sizeof(RequestHandleList));
26     if(!requestHandleList)
27     {
28         OC_LOG(DEBUG, RH_TAG,"Request Handle List Creation Fail.");
29     }
30     else
31     {
32         requestHandleList->headerNode = NULL;
33         requestHandleList->tailNode = NULL;
34     }
35
36     return requestHandleList;
37 }
38
39 RequestHandle *createRequestHandle()
40 {
41     RequestHandle *requestHandle = (RequestHandle*)malloc(sizeof(RequestHandle));
42     if(!requestHandle)
43     {
44         OC_LOG(DEBUG, RH_TAG,"Request Handle Creation Fail.");
45     }
46     else
47     {
48         requestHandle->requestHandle[OIC_REQUEST_BY_CLIENT] = NULL;
49         requestHandle->requestHandle[OIC_REQUEST_BY_COORDINATOR] = NULL;
50         requestHandle->resourceHandle = NULL;
51
52         requestHandle->isAliveCheck = 0;
53
54         requestHandle->next = NULL;
55     }
56
57     return requestHandle;
58
59 }
60 OCStackResult insertRequestHandle(RequestHandleList *requestHandleList,
61         RequestHandle *requestHandle)
62 {
63     if(requestHandleList == NULL || requestHandle == NULL)
64     {
65         return OC_STACK_INVALID_PARAM;
66     }
67
68     if(requestHandleList->headerNode == NULL)
69     {
70         requestHandleList->headerNode = requestHandle;
71         requestHandleList->tailNode = requestHandle;
72     }
73     else
74     {
75         requestHandleList->tailNode->next = requestHandle;
76         requestHandleList->tailNode = requestHandle;
77     }
78
79     return OC_STACK_OK;
80 }
81
82 OCStackResult deleteRequestHandleFromList(RequestHandleList *requestHandleList,
83         RequestHandle *requestHandle)
84 {
85     if(requestHandleList == NULL || requestHandle == NULL)
86     {
87         OC_LOG(DEBUG, RH_TAG,"Delete Request Handle : invalid parameter.");
88         return OC_STACK_INVALID_PARAM;
89     }
90     if(requestHandleList->headerNode == NULL)
91     {
92         OC_LOG(DEBUG, RH_TAG,"Delete Request Handle : Empty Request Handle List.");
93         return OC_STACK_ERROR;
94     }
95
96     if(requestHandle == requestHandleList->headerNode)
97     {
98         requestHandleList->headerNode = requestHandleList->headerNode->next;
99         requestHandle->next = NULL;
100         return destroyRequestHandle(requestHandle);
101     }
102
103     RequestHandle *preNode = requestHandleList->headerNode;
104     RequestHandle *curNode = preNode->next;
105     while(curNode != NULL)
106     {
107         if(curNode == requestHandle)
108         {
109             if(curNode == requestHandleList->tailNode)
110             {
111                 requestHandleList->tailNode = preNode;
112                 preNode->next = NULL;
113             }
114             else
115             {
116                 preNode->next = curNode->next;
117             }
118             requestHandle->next = NULL;
119             return destroyRequestHandle(requestHandle);
120         }
121         preNode = curNode;
122         curNode = curNode->next;
123     }
124
125     return OC_STACK_ERROR;
126 }
127
128 OCStackResult destroyRequestHandle(RequestHandle *requestHandle)
129 {
130     if(requestHandle)
131     {
132         if(requestHandle->next)
133         {
134 //            destroyRequestHandle(requestHandle->next);
135             requestHandle->next = NULL;
136         }
137
138         requestHandle->requestHandle[OIC_REQUEST_BY_CLIENT] = NULL;
139         requestHandle->requestHandle[OIC_REQUEST_BY_COORDINATOR] = NULL;
140
141         requestHandle->isAliveCheck = 0;
142
143         free(requestHandle);
144     }
145     else
146     {
147         return OC_STACK_INVALID_PARAM;
148     }
149
150     return OC_STACK_OK;
151 }
152
153 OCStackResult destroyRequestHandleList(RequestHandleList *requestHandleList){
154     if(requestHandleList)
155     {
156         while(requestHandleList->headerNode)
157         {
158             deleteRequestHandleFromList(requestHandleList,requestHandleList->headerNode);
159         }
160         free(requestHandleList);
161     }
162     else{
163         return OC_STACK_INVALID_PARAM;
164     }
165
166     return OC_STACK_OK;
167 }
168
169 RequestHandle *findRequestHandle(RequestHandleList *requestHandleList,
170         OCDoHandle handle, OICResourceCoordinatorParamType paramType)
171 {
172     if(requestHandleList == NULL || handle == NULL)
173     {
174         OC_LOG(DEBUG, RH_TAG,"Find Virtual Resource : invalid parameter.");
175         return NULL;
176     }
177     if(requestHandleList->headerNode == NULL)
178     {
179         OC_LOG(DEBUG, RH_TAG,"Find Virtual Resource : Empty Virtual Resource List.");
180         return NULL;
181     }
182
183     if(paramType == OIC_REQUEST_BY_CLIENT)
184     {
185         RequestHandle *tempRequestHandle = requestHandleList->headerNode;
186         while(tempRequestHandle != NULL)
187         {
188             if((OCEntityHandlerRequest*)tempRequestHandle->requestHandle[paramType] == handle)
189             {
190                 return tempRequestHandle;
191             }
192             tempRequestHandle = tempRequestHandle->next;
193         }
194     }
195     else
196     {
197         RequestHandle *tempRequestHandle = requestHandleList->headerNode;
198         while(tempRequestHandle != NULL)
199         {
200             if((OCDoHandle)tempRequestHandle->requestHandle[paramType] == handle)
201             {
202                 return tempRequestHandle;
203             }
204             tempRequestHandle = tempRequestHandle->next;
205         }
206     }
207     return NULL;
208 }