Add example for related Topic.
[platform/upstream/iotivity.git] / service / notification / examples / linux / notificationprovider.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 <stdio.h>\r
22 #include <stdbool.h>\r
23 #include <stdlib.h>\r
24 #include <unistd.h>\r
25 \r
26 #include "NSProviderInterface.h"\r
27 #include "NSCommon.h"\r
28 #include "logger.h"\r
29 #include "octypes.h"\r
30 #include "pthread.h"\r
31 #include "oic_string.h"\r
32 #include "oic_malloc.h"\r
33 \r
34 #define TAG "NSProviderExample"\r
35 \r
36 // Input the following values to publish resource to cloud\r
37 char REMOTE_SERVER_ADDRESS[50];\r
38 char REMOTE_SERVER_SESSION[50];\r
39 char mainConsumer[37] = '\0';\r
40 \r
41 extern char *strdup(const char *s);\r
42 \r
43 bool isExit = false;\r
44 \r
45 int id;\r
46 \r
47 void* OCProcessThread(void * ptr)\r
48 {\r
49     (void) ptr;\r
50     while (!isExit)\r
51     {\r
52         if (OCProcess() != OC_STACK_OK)\r
53         {\r
54             printf("OCStack process error");\r
55             return NULL;\r
56         }\r
57     }\r
58 \r
59     return NULL;\r
60 }\r
61 \r
62 void subscribeRequestCallback(NSConsumer *consumer)\r
63 {\r
64     printf("consumer requested to subscribe");\r
65 \r
66     printf("NS_APP Consumer Device ID: %s\n", consumer->consumerId);\r
67 \r
68     if(mainConsumer[0] == '\0')\r
69     {\r
70         OICStrcpy(mainConsumer, 37, consumer->consumerId);\r
71     }\r
72 \r
73     NSAcceptSubscription(consumer, true);\r
74 }\r
75 \r
76 void syncCallback(NSSyncInfo *sync)\r
77 {\r
78     printf("sync requested");\r
79 \r
80     printf("NS_APP Sync State: %d\n", sync->state);\r
81 }\r
82 \r
83 #ifdef WITH_CLOUD\r
84 OCStackApplicationResult CloudLoginoutCallback(void *ctx,\r
85         OCDoHandle handle, OCClientResponse *clientResponse)\r
86 {\r
87     int CtxValue = 0x99;\r
88     if (ctx != (void *)CtxValue)\r
89     {\r
90         printf("Invalid Cloud Login/out callback received");\r
91     }\r
92 \r
93     printf("Login/out response received");\r
94 \r
95     if (clientResponse->payload != NULL &&\r
96             clientResponse->payload->type == PAYLOAD_TYPE_REPRESENTATION)\r
97     {\r
98         printf("PAYLOAD_TYPE_REPRESENTATION received");\r
99 \r
100         OCRepPayloadValue *val = ((OCRepPayload *)clientResponse->payload)->values;\r
101 \r
102         printf("Get payload values");\r
103         while (val)\r
104         {\r
105             printf("key: %s / Value: %s", val->name, val->str);\r
106             val = val->next;\r
107         }\r
108 \r
109         NSProviderEnableRemoteService(REMOTE_SERVER_ADDRESS);\r
110     }\r
111 \r
112     return OC_STACK_KEEP_TRANSACTION;\r
113 }\r
114 #endif\r
115 \r
116 FILE* server_fopen(const char *path, const char *mode)\r
117 {\r
118     (void)path;\r
119     return fopen("oic_ns_provider_db.dat", mode);\r
120 }\r
121 \r
122 void printTopics(NSTopics * topics)\r
123 {\r
124     if(!topics)\r
125     {\r
126         printf("topics is null\n");\r
127         return;\r
128     }\r
129 \r
130     NSTopics * iter = topics;\r
131 \r
132     while(iter)\r
133     {\r
134         printf("tName = %s, tState = %d\n", iter->topicName, (int)iter->state);\r
135         iter = iter->next;\r
136     }\r
137 }\r
138 \r
139 void removeTopics(NSTopics * topics)\r
140 {\r
141     if(!topics)\r
142     {\r
143         printf("topics is null\n");\r
144         return;\r
145     }\r
146 \r
147     NSTopics * iter = topics;\r
148 \r
149     while(iter)\r
150     {\r
151         NSTopics * del = iter;\r
152         if(del->topicName)\r
153         {\r
154             OICFree(del->topicName);\r
155         }\r
156         iter = iter->next;\r
157 \r
158         OICFree(del);\r
159     }\r
160 }\r
161 \r
162 int main()\r
163 {\r
164     int num;\r
165     pthread_t processThread;\r
166 \r
167     printf("NSStartProvider()");\r
168 \r
169     // open oic_db\r
170     static OCPersistentStorage ps = {server_fopen, fread, fwrite, fclose, unlink};\r
171     OCRegisterPersistentStorageHandler(&ps);\r
172 \r
173     if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK)\r
174     {\r
175         printf("OCStack init error");\r
176         return 0;\r
177     }\r
178 \r
179     pthread_create(&processThread, NULL, OCProcessThread, unlink);\r
180 \r
181     while (!isExit)\r
182     {\r
183         char dummy;\r
184 \r
185         printf("==============================================\n");\r
186         printf("1.  NSStartProvider(Accepter: Provider) \n");\r
187         printf("2.  NSStartProvider(Accepter: Consumer) \n");\r
188         printf("3.  NSSendNotification() \n");\r
189         printf("4.  NSRead() \n");\r
190         printf("5.  NSProviderAddTopic(); \n");\r
191         printf("6.  NSProviderDeleteTopic(); \n");\r
192         printf("7.  NSProviderSelectTopic(); \n");\r
193         printf("8.  NSProviderUnselectTopic(); \n");\r
194         printf("9.  NSProviderGetConsumerTopics(); \n");\r
195         printf("10. NSProviderGetTopics(); \n");\r
196         printf("11. NSStopProvider() \n");\r
197         printf("12. NSCloudLogin \n");\r
198         printf("13. NSCloudLogout \n");\r
199         printf("0. Exit() \n");\r
200         printf("==============================================\n");\r
201 \r
202         printf("input : ");\r
203 \r
204         scanf("%d", &num);\r
205         fflush(stdin);\r
206         scanf("%c", &dummy);\r
207         fflush(stdin);\r
208 \r
209         switch (num)\r
210         {\r
211             case 1:\r
212             {\r
213                 printf("NSStartProvider(Accepter: Provider)");\r
214                 NSProviderConfig config;\r
215                 config.policy = false;\r
216                 config.subRequestCallback = subscribeRequestCallback;\r
217                 config.syncInfoCallback = syncCallback;\r
218                 config.userInfo = OICStrdup("OCF_NOTIFICATION");\r
219                 NSStartProvider(config);\r
220             }\r
221                 break;\r
222 \r
223             case 2:\r
224             {\r
225                 printf("NSStartProvider(Accepter: Consumer)");\r
226                 NSProviderConfig config;\r
227                 config.policy = false;\r
228                 config.subRequestCallback = subscribeRequestCallback;\r
229                 config.syncInfoCallback = syncCallback;\r
230                 config.userInfo = OICStrdup("OCF_NOTIFICATION");\r
231                 NSStartProvider(config);\r
232             }\r
233                 break;\r
234 \r
235             case 3:\r
236             {\r
237                 printf("NSSendNotification()");\r
238                 char title[100];\r
239                 char body[100];\r
240 \r
241                 printf("id : %d\n", ++id);\r
242                 printf("title : ");\r
243 \r
244                 gets(title);\r
245 \r
246                 printf("body : ");\r
247                 gets(body);\r
248 \r
249                 printf("app - mTitle : %s \n", title);\r
250                 printf("app - mContentText : %s \n", body);\r
251 \r
252                 NSMessage * msg = NSCreateMessage();\r
253 \r
254                 msg->title = OICStrdup(title);\r
255                 msg->contentText = OICStrdup(body);\r
256                 msg->sourceName = OICStrdup("OCF");\r
257 \r
258                 NSSendMessage(msg);\r
259             }\r
260                 break;\r
261 \r
262             case 4:\r
263                 printf("NSRead\n");\r
264                 break;\r
265 \r
266             case 5:\r
267                 printf("NSProviderAddTopic\n");\r
268                 NSProviderAddTopic("OCF_TOPIC1");\r
269                 NSProviderAddTopic("OCF_TOPIC2");\r
270                 NSProviderAddTopic("OCF_TOPIC3");\r
271                 NSProviderAddTopic("OCF_TOPIC4");\r
272                 break;\r
273 \r
274             case 6:\r
275                 printf("NSProviderDeleteTopic\n");\r
276                 NSProviderDeleteTopic("OCF_TOPIC2");\r
277                 break;\r
278 \r
279             case 7:\r
280                 printf("NSProviderSelectTopic\n");\r
281                 NSProviderSelectTopic("OCF_TOPIC1");\r
282                 NSProviderSelectTopic("OCF_TOPIC2");\r
283                 NSProviderSelectTopic("OCF_TOPIC3");\r
284                 NSProviderSelectTopic("OCF_TOPIC4");\r
285                 break;\r
286 \r
287             case 8:\r
288                 printf("NSProviderUnSelectTopic\n");\r
289                 NSProviderUnSelectTopic("OCF_TOPIC1");\r
290                 break;\r
291 \r
292             case 9:\r
293                 printf("NSProviderGetConsumerTopics\n");\r
294                 NSTopics * topics = NSProviderGetConsumerTopics(mainConsumer);\r
295                 printTopics(topics);\r
296                 removeTopics(topics);\r
297                 break;\r
298 \r
299             case 10:\r
300                 printf("NSProviderGetConsumerTopics\n");\r
301                 NSTopics * topics = NSProviderGetTopics();\r
302                 printTopics(topics);\r
303                 removeTopics(topics);\r
304                 break;\r
305 \r
306             case 11:\r
307                 NSStopProvider();\r
308                 break;\r
309 \r
310             case 12:\r
311                 printf("NSCloudLogin");\r
312 \r
313                 printf("Cloud Address: ");\r
314                 gets(REMOTE_SERVER_ADDRESS);\r
315 \r
316                 printf("Session Code: ");\r
317                 gets(REMOTE_SERVER_SESSION);\r
318 \r
319 #ifdef WITH_CLOUD\r
320                 NSCloudLogin(REMOTE_SERVER_ADDRESS, REMOTE_SERVER_SESSION, CloudLoginoutCallback);\r
321 #endif\r
322                 printf("OCCloudLogin requested");\r
323                 break;\r
324             case 13:\r
325                 printf("NSCloudLogout");\r
326 #ifdef WITH_CLOUD\r
327                 NSCloudLogout(REMOTE_SERVER_ADDRESS, REMOTE_SERVER_SESSION, CloudLoginoutCallback);\r
328 #endif\r
329                 printf("OCCloudLogout requested");\r
330                 break;\r
331             case 0:\r
332                 NSStopProvider();\r
333                 isExit = true;\r
334                 break;\r
335             default:\r
336                 printf("Under Construction");\r
337                 break;\r
338         }\r
339 \r
340         printf("\n");\r
341     }\r
342 \r
343     return 0;\r
344 }\r