Modify related topiclist.
[platform/upstream/iotivity.git] / service / notification / src / provider / NSProviderTopic.c
1 //******************************************************************\r
2 //\r
3 // Copyright 2016 Samsung Electronics All Rights Reserved.\r
4 //\r
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
6 //\r
7 // Licensed under the Apache License, Version 2.0 (the "License");\r
8 // you may not use this file except in compliance with the License.\r
9 // You may obtain a copy of the License at\r
10 //\r
11 //      http://www.apache.org/licenses/LICENSE-2.0\r
12 //\r
13 // Unless required by applicable law or agreed to in writing, software\r
14 // distributed under the License is distributed on an "AS IS" BASIS,\r
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16 // See the License for the specific language governing permissions and\r
17 // limitations under the License.\r
18 //\r
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\r
20 \r
21 #include "NSProviderTopic.h"\r
22 \r
23 static bool isTopicList = false;\r
24 \r
25 NSResult NSInitTopicList()\r
26 {\r
27     NS_LOG(DEBUG, "NSInitTopicList - IN");\r
28 \r
29     if(isTopicList)\r
30     {\r
31         NS_LOG(DEBUG, "topic list has already initiated");\r
32         return NS_FAIL;\r
33     }\r
34 \r
35     consumerTopicList = NSStorageCreate();\r
36     consumerTopicList->cacheType = NS_PROVIDER_CACHE_TOPIC;\r
37     isTopicList = true;\r
38 \r
39     NS_LOG(DEBUG, "NSInitTopicList - OUT");\r
40     return NS_OK;\r
41 }\r
42 \r
43 NSTopicList * NSGetTopics(char *consumerId)\r
44 {\r
45     NS_LOG(DEBUG, "NSGetTopics()");\r
46 \r
47     NSTopicList  * topicList;\r
48 \r
49     if(consumerId == NULL)\r
50     {\r
51         NS_LOG(DEBUG, "All registered topic list");\r
52     }\r
53     else\r
54     {\r
55         NS_LOG_V(DEBUG, "Subscribed topic list for consumerId(%s)", consumerId);\r
56     }\r
57 \r
58     NS_LOG(DEBUG, "NSGetTopics() NS_OK");\r
59     return topicList;\r
60 }\r
61 \r
62 //TODO: update parameter\r
63 NSResult NSStoreTopics(char * consumerId, NSTopic** topics)\r
64 {\r
65     NS_LOG(DEBUG, "NSWriteTopicsToStorage()");\r
66 \r
67     NSCacheElement * element = (NSCacheElement *) OICMalloc(sizeof(NSCacheElement));\r
68     NSCacheTopicData * topicData = (NSCacheTopicData *) OICMalloc(sizeof(NSCacheTopicData));\r
69 \r
70     OICStrcpy(topicData->consumerId, UUID_STRING_SIZE, consumerId);\r
71     NS_LOG_V(DEBUG, "consumer id: %s", topicData->consumerId);\r
72 \r
73     // TODO: print topic list\r
74     topicData->topics = topics;\r
75     NS_LOG(DEBUG, "print topic list");\r
76 \r
77     element->data = (void*) topicData;\r
78     element->next = NULL;\r
79 \r
80     if(NSStorageWrite(consumerTopicList, element) != NS_OK)\r
81     {\r
82         NS_LOG(DEBUG, "fail to write cache");\r
83     }\r
84 \r
85     NS_LOG(DEBUG, "NSWriteTopicsToStorage() NS_OK");\r
86     return NS_OK;\r
87 }\r
88 \r
89 NSResult NSRegisterTopicList(NSTopicList *topicList)\r
90 {\r
91     NS_LOG(DEBUG, "NSRegisterTopicList()");\r
92 \r
93     if(!topicList)\r
94     {\r
95         NS_LOG(ERROR, "no topics");\r
96         return NS_ERROR;\r
97     }\r
98 \r
99     OCResourceHandle rHandle = NULL;\r
100     if(NSPutTopicResource(topicList, &rHandle) != NS_OK)\r
101     {\r
102         NS_LOG(ERROR, "Fail to put topic resource");\r
103         return NS_ERROR;\r
104     }\r
105 \r
106     if(topicList->consumerId != NULL)\r
107     {\r
108         // id should be null to register topic list\r
109         NS_LOG(ERROR, "invalid consumer id");\r
110         return NS_ERROR;\r
111     }\r
112 \r
113     NSStoreTopics(topicList->consumerId, topicList->head);\r
114 \r
115     NS_LOG(DEBUG, "NSRegisterTopicList() NS_OK");\r
116     return NS_OK;\r
117 }\r
118 \r
119 NSResult NSSendTopicUpdation()\r
120 {\r
121     NS_LOG(DEBUG, "NSSendTopicUpdation - IN");\r
122 \r
123     OCRepPayload* payload = OCRepPayloadCreate();\r
124 \r
125     if (!payload)\r
126     {\r
127         NS_LOG(ERROR, "fail to create playload");\r
128         return NS_ERROR;\r
129     }\r
130 \r
131     OCResourceHandle rHandle = NULL;\r
132     if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
133     {\r
134         NS_LOG(ERROR, "Fail to put message resource");\r
135         return NS_ERROR;\r
136     }\r
137 \r
138     OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
139     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
140     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
141 \r
142     OCObservationId obArray[255] = { 0, };\r
143     int obCount = 0;\r
144 \r
145     NSCacheElement * it = consumerSubList->head;\r
146 \r
147     while (it)\r
148     {\r
149         NSCacheSubData * subData = (NSCacheSubData *) it->data;\r
150 \r
151         if (subData->isWhite)\r
152         {\r
153             if(subData->messageObId != 0)\r
154             {\r
155                 obArray[obCount++] = subData->messageObId;\r
156             }\r
157 \r
158 #ifdef WITH_CLOUD\r
159             if(subData->remote_messageObId != 0)\r
160             {\r
161                 obArray[obCount++] = subData->remote_messageObId;\r
162             }\r
163 #endif\r
164 \r
165         }\r
166         it = it->next;\r
167     }\r
168 \r
169     if(!obCount)\r
170     {\r
171         NS_LOG(ERROR, "observer count is zero");\r
172         return NS_ERROR;\r
173     }\r
174 \r
175     if (OCNotifyListOfObservers(rHandle, obArray, obCount, payload, OC_HIGH_QOS)\r
176             != OC_STACK_OK)\r
177     {\r
178         NS_LOG(ERROR, "fail to send topic updation");\r
179         OCRepPayloadDestroy(payload);\r
180         return NS_ERROR;\r
181 \r
182     }\r
183     OCRepPayloadDestroy(payload);\r
184 \r
185     NS_LOG(DEBUG, "NSSendTopicUpdation - OUT");\r
186     return NS_OK;\r
187 }\r
188 \r
189 NSResult NSSendTopicUpdationToConsumer(char *consumerId)\r
190 {\r
191     NS_LOG(DEBUG, "NSSendTopicUpdationToConsumer - IN");\r
192 \r
193     OCRepPayload* payload = OCRepPayloadCreate();\r
194 \r
195     if (!payload)\r
196     {\r
197         NS_LOG(ERROR, "fail to create playload");\r
198         return NS_ERROR;\r
199     }\r
200 \r
201     OCResourceHandle rHandle = NULL;\r
202     if (NSPutMessageResource(NULL, &rHandle) != NS_OK)\r
203     {\r
204         NS_LOG(ERROR, "Fail to put message resource");\r
205         return NS_ERROR;\r
206     }\r
207 \r
208     OCRepPayloadSetUri(payload, NS_COLLECTION_MESSAGE_URI);\r
209     OCRepPayloadSetPropInt(payload, NS_ATTRIBUTE_MESSAGE_ID, NS_TOPIC);\r
210     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_PROVIDER_ID, NSGetProviderInfo()->providerId);\r
211 \r
212     NSCacheElement * element = NSStorageRead(consumerSubList, consumerId);\r
213 \r
214     if(element == NULL)\r
215     {\r
216         NS_LOG(ERROR, "element is NULL");\r
217         return NS_ERROR;\r
218     }\r
219 \r
220     NSCacheSubData * subData = (NSCacheSubData*) element->data;\r
221 \r
222     if (OCNotifyListOfObservers(rHandle, (OCObservationId*)&subData->messageObId, 1, payload, OC_HIGH_QOS)\r
223             != OC_STACK_OK)\r
224     {\r
225         NS_LOG(ERROR, "fail to send topic updation");\r
226         OCRepPayloadDestroy(payload);\r
227         return NS_ERROR;\r
228 \r
229     }\r
230 \r
231     OCRepPayloadDestroy(payload);\r
232 \r
233     NS_LOG(DEBUG, "NSSendTopicUpdationToConsumer - OUT");\r
234     return NS_OK;\r
235 }\r
236 \r
237 NSResult NSSendTopicList(OCEntityHandlerRequest * entityHandlerRequest)\r
238 {\r
239     NS_LOG(DEBUG, "NSSendTopicList - IN");\r
240 \r
241     char * id = NSGetValueFromQuery(OICStrdup(entityHandlerRequest->query), NS_QUERY_CONSUMER_ID);\r
242     if(!id)\r
243     {\r
244         NS_LOG(DEBUG, "Send registered topic list");\r
245         //TODO: get registered topic list\r
246     }\r
247     else\r
248     {\r
249         NS_LOG(DEBUG, "Send subscribed topic list to consumer");\r
250         //TODO: get subscribed topic list for consumer\r
251     }\r
252 \r
253     // make response for the Get Request\r
254     OCEntityHandlerResponse response;\r
255     response.numSendVendorSpecificHeaderOptions = 0;\r
256     memset(response.sendVendorSpecificHeaderOptions, 0,\r
257             sizeof response.sendVendorSpecificHeaderOptions);\r
258     memset(response.resourceUri, 0, sizeof response.resourceUri);\r
259 \r
260     OCRepPayload* payload = OCRepPayloadCreate();\r
261     if (!payload)\r
262     {\r
263         NS_LOG(ERROR, "payload is NULL");\r
264         return NS_ERROR;\r
265     }\r
266 \r
267     OCRepPayloadSetUri(payload, NS_COLLECTION_TOPIC_URI);\r
268     OCRepPayloadSetPropString(payload, NS_ATTRIBUTE_CONSUMER_ID, id);\r
269     // TODO: add PayLoadSet with topic list got above\r
270 \r
271     response.requestHandle = entityHandlerRequest->requestHandle;\r
272     response.resourceHandle = entityHandlerRequest->resource;\r
273     response.persistentBufferFlag = 0;\r
274     response.ehResult = OC_EH_OK;\r
275     response.payload = (OCPayload *) payload;\r
276 \r
277     // Send Response\r
278     if (OCDoResponse(&response) != OC_STACK_OK)\r
279     {\r
280         NS_LOG(ERROR, "Fail to response topic list");\r
281         return NS_ERROR;\r
282     }\r
283     OCRepPayloadDestroy(payload);\r
284     NSFreeOCEntityHandlerRequest(entityHandlerRequest);\r
285 \r
286     NS_LOG(DEBUG, "NSSendTopicList - OUT");\r
287     return NS_OK;\r
288 }\r
289 \r
290 bool NSIsTopicSubscribed(char * consumerId, char * topic)\r
291 {\r
292     //TODO: implement function\r
293     return true;\r
294 }\r
295 \r
296 void * NSTopicSchedule(void * ptr)\r
297 {\r
298     if (ptr == NULL)\r
299     {\r
300         NS_LOG(DEBUG, "Create NSTopicSchedule");\r
301     }\r
302 \r
303     while (NSIsRunning[TOPIC_SCHEDULER])\r
304     {\r
305         sem_wait(&NSSemaphore[TOPIC_SCHEDULER]);\r
306         pthread_mutex_lock(&NSMutex[TOPIC_SCHEDULER]);\r
307 \r
308         if (NSHeadMsg[TOPIC_SCHEDULER] != NULL)\r
309         {\r
310             NSTask *node = NSHeadMsg[TOPIC_SCHEDULER];\r
311             NSHeadMsg[TOPIC_SCHEDULER] = node->nextTask;\r
312 \r
313             switch (node->taskType)\r
314             {\r
315                 case TASK_SEND_TOPICS:\r
316                     NS_LOG(DEBUG, "CASE TASK_SEND_TOPICS : ");\r
317                     NSSendTopicList((OCEntityHandlerRequest*) node->taskData);\r
318                     break;\r
319                 case TASK_SUBSCRIBE_TOPICS:\r
320                     NS_LOG(DEBUG, "CASE TASK_SUBSCRIBE_TOPICS : ");\r
321                     break;\r
322                 case TASK_REGISTER_TOPICS:\r
323                     NS_LOG(DEBUG, "CASE TASK_REGISTER_TOPICS : ");\r
324                     NSTopicList * topicList = (NSTopicList *) node->taskData;\r
325                     NSRegisterTopicList(topicList);\r
326                     NSSendTopicUpdation();\r
327                     // TODO : free NSTopic\r
328                     // NSFreeTopicList(topicList);\r
329                     break;\r
330                 default:\r
331                     break;\r
332             }\r
333 \r
334             OICFree(node);\r
335         }\r
336 \r
337         pthread_mutex_unlock(&NSMutex[TOPIC_SCHEDULER]);\r
338     }\r
339 \r
340     NS_LOG(DEBUG, "Destroy NSTopicSchedule");\r
341     return NULL;\r
342 }\r