replace : iotivity -> iotivity-sec
[platform/upstream/iotivity.git] / service / notification / examples / linux / notificationprovider.c
1 //******************************************************************
2 //
3 // Copyright 2016 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 <stdio.h>
22 #include <stdbool.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25
26 #include "NSProviderInterface.h"
27 #include "NSCommon.h"
28 #include "logger.h"
29 #include "octypes.h"
30 #include "pthread.h"
31 #include "oic_string.h"
32 #include "oic_malloc.h"
33 #include "ocstack.h"
34
35 #define TAG "NSProviderExample"
36
37 #ifdef WITH_CLOUD
38 #include "cloud_connector.h"
39
40 // Input the following values to publish resource to cloud
41 char REMOTE_SERVER_ADDRESS[50] = {'\0',};
42 char AUTH_PROVIDER[50] = {'\0',};
43 char AUTH_CODE[50] = {'\0',};
44 char UID[50] = {'\0',};
45 char ACCESS_TOKEN[50] = {'\0',};
46 #endif
47
48 #ifdef WITH_MQ
49 char CLOUD_ADDRESS[100] = "10.113.64.52:5686";
50 char CLOUD_TOPIC[100] = "/oic/ps/notification";
51 #endif
52
53 char mainConsumer[37] = {'\0',};
54
55 extern char *strdup(const char *s);
56
57 bool isExit = false;
58
59 int id;
60
61 void* OCProcessThread(void * ptr)
62 {
63     (void) ptr;
64     while (!isExit)
65     {
66         if (OCProcess() != OC_STACK_OK)
67         {
68             printf("OCStack process error");
69             return NULL;
70         }
71     }
72
73     return NULL;
74 }
75
76 void subscribeRequestCallback(NSConsumer *consumer)
77 {
78     printf("consumer requested to subscribe");
79
80     printf("NS_APP Consumer Device ID: %s\n", consumer->consumerId);
81
82     if(mainConsumer[0] == '\0')
83     {
84         OICStrcpy(mainConsumer, 37, consumer->consumerId);
85     }
86
87     NSAcceptSubscription(consumer->consumerId, true);
88 }
89
90 void syncCallback(NSSyncInfo *sync)
91 {
92     printf("sync requested");
93
94     printf("NS_APP Sync State: %d\n", sync->state);
95 }
96
97 FILE* server_fopen(const char *path, const char *mode)
98 {
99     (void)path;
100     return fopen("oic_ns_provider_db.dat", mode);
101 }
102
103 void printTopics(NSTopicLL * topics)
104 {
105     if(!topics)
106     {
107         printf("topics is null\n");
108         return;
109     }
110
111     NSTopicLL * iter = topics;
112
113     while(iter)
114     {
115         printf("tName = %s, tState = %d\n", iter->topicName, (int)iter->state);
116         iter = iter->next;
117     }
118 }
119
120 void removeTopics(NSTopicLL * topics)
121 {
122     if(!topics)
123     {
124         printf("topics is null\n");
125         return;
126     }
127
128     NSTopicLL * iter = topics;
129
130     while(iter)
131     {
132         NSTopicLL * del = iter;
133         if(del->topicName)
134         {
135             OICFree(del->topicName);
136         }
137         iter = iter->next;
138
139         OICFree(del);
140     }
141 }
142
143 void input(char * buffer)
144 {
145     char ch;
146     int i = 0;
147
148     while( (ch = getchar()) != '\n' && i < 100)
149         buffer[i++] = ch;
150
151     buffer[i] = '\0';
152 }
153
154 int main()
155 {
156     int num;
157     pthread_t processThread;
158
159     printf("NSStartProvider()\n\n");
160
161     // open oic_db
162     static OCPersistentStorage ps = {server_fopen, fread, fwrite, fclose, unlink};
163     OCRegisterPersistentStorageHandler(&ps);
164
165     if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK)
166     {
167         printf("OCStack init error");
168         return 0;
169     }
170
171     pthread_create(&processThread, NULL, OCProcessThread, unlink);
172
173     while (!isExit)
174     {
175         char dummy;
176
177         printf("==============================================\n");
178         printf("1.  NSStartProvider(Accepter: Provider) \n");
179         printf("2.  NSStartProvider(Accepter: Consumer) \n");
180         printf("3.  NSSendNotification() \n");
181         printf("4.  NSRead() \n");
182         printf("5.  NSProviderAddTopic(); \n");
183         printf("6.  NSProviderDeleteTopic(); \n");
184         printf("7.  NSProviderSelectTopic(); \n");
185         printf("8.  NSProviderUnselectTopic(); \n");
186         printf("9.  NSProviderGetConsumerTopics(); \n");
187         printf("10. NSProviderGetTopics(); \n");
188         printf("11. NSProviderSubscribeMQService() \n");
189         printf("0. NSStopProvider() \n");
190 #ifdef WITH_CLOUD
191         printf("21. NSProviderEnableRemoteService (after login) \n");
192         printf("22. NSProviderDisableRemoteService (after login) \n");
193         printf("31. Cloud Signup \n");
194         printf("32. Cloud Login \n");
195         printf("33. Cloud Logout \n");
196 #endif
197         printf("0. Exit() \n");
198         printf("==============================================\n");
199
200         printf("input : ");
201
202         if(scanf("%d", &num) > 0)
203         {
204             if(scanf("%c", &dummy) > 0)
205             {
206                 fflush(stdin);
207                 printf("\n");
208             }
209         }
210         else
211         {
212             printf("invalid input \n");
213             num = 0;
214         }
215
216         switch (num)
217         {
218             case 1:
219             {
220                 printf("NSStartProvider(Accepter: Provider)");
221                 NSProviderConfig config;
222                 config.subControllability = true;
223                 config.subRequestCallback = subscribeRequestCallback;
224                 config.syncInfoCallback = syncCallback;
225                 config.userInfo = OICStrdup("OCF_NOTIFICATION");
226                 NSStartProvider(config);
227             }
228                 break;
229
230             case 2:
231             {
232                 printf("NSStartProvider(Accepter: Consumer)");
233                 NSProviderConfig config;
234                 config.subControllability = false;
235                 config.subRequestCallback = subscribeRequestCallback;
236                 config.syncInfoCallback = syncCallback;
237                 config.userInfo = OICStrdup("OCF_NOTIFICATION");
238                 NSStartProvider(config);
239             }
240                 break;
241
242             case 3:
243             {
244                 printf("NSSendNotification()");
245                 char title[100] = {'\0',};
246                 char body[100] = {'\0',};
247                 char topic[100] = {'\0',};
248
249                 printf("id : %d\n", ++id);
250                 printf("title : ");
251                 input(title);
252
253                 printf("body : ");
254                 input(body);
255
256                 printf("topic : ");
257
258                 input(topic);
259
260                 printf("app - mTitle : %s \n", title);
261                 printf("app - mContentText : %s \n", body);
262                 printf("app - topic : %s \n", topic);
263
264                 NSMessage * msg = NSCreateMessage();
265                 if(msg)
266                 {
267
268                     msg->title = OICStrdup(title);
269                     msg->contentText = OICStrdup(body);
270                     msg->sourceName = OICStrdup("OCF");
271
272                     if(topic[0] != '\0')
273                     {
274                         msg->topic = OICStrdup(topic);
275                     }
276
277                     NSSendMessage(msg);
278                 }
279             }
280                 break;
281
282             case 4:
283                 printf("NSRead\n");
284                 break;
285
286             case 5:
287                 printf("NSProviderAddTopic\n");
288                 NSProviderRegisterTopic("OCF_TOPIC1");
289                 NSProviderRegisterTopic("OCF_TOPIC2");
290                 NSProviderRegisterTopic("OCF_TOPIC3");
291                 NSProviderRegisterTopic("OCF_TOPIC4");
292                 break;
293
294             case 6:
295                 printf("NSProviderDeleteTopic\n");
296                 NSProviderUnregisterTopic("OCF_TOPIC2");
297                 break;
298
299             case 7:
300                 printf("NSProviderSelectTopic\n");
301                 NSProviderSetConsumerTopic(mainConsumer, "OCF_TOPIC1");
302                 NSProviderSetConsumerTopic(mainConsumer, "OCF_TOPIC2");
303                 NSProviderSetConsumerTopic(mainConsumer, "OCF_TOPIC3");
304                 NSProviderSetConsumerTopic(mainConsumer, "OCF_TOPIC4");
305                 break;
306
307             case 8:
308                 printf("NSProviderUnSelectTopic\n");
309                 NSProviderUnsetConsumerTopic(mainConsumer, "OCF_TOPIC1");
310                 break;
311
312             case 9:
313                 printf("NSProviderGetConsumerTopics\n");
314                 {
315                     NSTopicLL * topics = NSProviderGetConsumerTopics(mainConsumer);
316                     printTopics(topics);
317                     removeTopics(topics);
318                 }
319                 break;
320
321             case 10:
322                 printf("NSProviderGetTopics\n");
323                 {
324                     NSTopicLL * topics = NSProviderGetTopics();
325                     printTopics(topics);
326                     removeTopics(topics);
327                 }
328                 break;
329
330 #if WITH_MQ
331             case 11:
332                 printf("11. Subscribe MQ Service\n");
333
334                 printf("Remote Server Address: ");
335                 //input(CLOUD_ADDRESS);
336
337                 printf("Topic[notificationtest]: ");
338                 //input(CLOUD_TOPIC);
339
340                 NSProviderSubscribeMQService(CLOUD_ADDRESS, CLOUD_TOPIC);
341                 break;
342 #endif
343
344 #ifdef WITH_CLOUD
345             case 21:
346                 printf("Enable Remote Service\n");
347                 if(!IsCloudLoggedin())
348                 {
349                     printf("Login required\n");
350                     break;
351                 }
352                 NSProviderEnableRemoteService(REMOTE_SERVER_ADDRESS);
353                 break;
354
355             case 22:
356                 printf("Disable Remote Service\n");
357                 if(!IsCloudLoggedin())
358                 {
359                     printf("Login required\n");
360                     break;
361                 }
362                 NSProviderDisableRemoteService(REMOTE_SERVER_ADDRESS);
363                 break;
364
365             case 31:
366                 printf("Remote Server Address: ");
367                 input(REMOTE_SERVER_ADDRESS);
368
369                 printf("Auth Provider(eg. github): ");
370                 input(AUTH_PROVIDER);
371
372                 printf("Auth Code: ");
373                 input(AUTH_CODE);
374
375                 OCCloudSignup(REMOTE_SERVER_ADDRESS, OCGetServerInstanceIDString(),
376                     AUTH_PROVIDER, AUTH_CODE, CloudSignupCallback);
377                 printf("OCCloudSignup requested");
378                 break;
379             case 32:
380                 printf("Remote Server Address: ");
381                 input(REMOTE_SERVER_ADDRESS);
382
383                 printf("UID: ");
384                 input(UID);
385
386                 printf("ACCESS_TOKEN: ");
387                 input(ACCESS_TOKEN);
388
389                 OCCloudLogin(REMOTE_SERVER_ADDRESS, UID, OCGetServerInstanceIDString(),
390                     ACCESS_TOKEN, CloudLoginoutCallback);
391                 printf("OCCloudLogin requested\n");
392                 break;
393             case 33:
394                 OCCloudLogout(REMOTE_SERVER_ADDRESS, CloudLoginoutCallback);
395                 printf("OCCloudLogin requested\n");
396                 break;
397 #endif
398             case 0:
399                 NSStopProvider();
400                 isExit = true;
401                 break;
402             default:
403                 break;
404         }
405
406         printf("\n");
407     }
408
409     return 0;
410 }