bef1e204737760f7bebfa1cfc1debed200a528ad
[platform/upstream/iotivity.git] / service / notification / examples / linux / notificationconsumer.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 <unistd.h>
23 #include <string.h>
24 #include "pthread.h"
25
26 #include "ocstack.h"
27 #include "NSCommon.h"
28 #include "NSConsumerInterface.h"
29
30 #ifdef WITH_CLOUD
31 #include "NSConstants.h"
32 #include "oic_malloc.h"
33 #include "cloud_connector.h"
34
35 #define CLOUD_CONTEXT_VALUE 0x99
36
37 char CLOUD_ADDRESS[100];
38 char CLOUD_AUTH_PROVIDER[100];
39 char CLOUD_AUTH_CODE[100];
40 char CLOUD_UID[100];
41 char CLOUD_ACCESS_TOKEN[100];
42 #endif
43
44
45 NSProvider * g_provider = NULL;
46 NSTopicLL * g_topicLL = NULL;
47
48 FILE* server_fopen(const char *path, const char *mode)
49 {
50     (void)path;
51     return fopen("oic_ns_provider_db.dat", mode);
52 }
53
54 void printProviderTopicList(NSTopicLL * topics)
55 {
56     printf("printProviderTopicList\n");
57     if (topics)
58     {
59         NSTopicLL * iter = topics;
60         while (iter)
61         {
62             printf("Topic Name: %s\t Topic State: %d\n", iter->topicName, iter->state);
63             iter = iter->next;
64         }
65     }
66 }
67
68 void onProviderChanged(NSProvider * provider, NSProviderState response)
69 {
70     printf("Provider changed: %d\n", response);
71     printf("subscribed provider Id : %s\n", provider->providerId);
72
73     if (response == NS_DISCOVERED)
74     {
75         printf("notification resource discovered\n");
76         printf("subscribe result %d\n", NSSubscribe(provider->providerId));
77         printf("startSubscribing\n");
78     }
79
80     else if (response == NS_TOPIC)
81     {
82         printf ("Provider Topic Updated\n");
83         g_topicLL = NSConsumerGetTopicList(provider->providerId);
84         printProviderTopicList(g_topicLL);
85         g_provider = provider;
86     }
87 }
88
89 void onNotificationPosted(NSMessage * notification)
90 {
91     printf("id : %lld\n", (long long int)notification->messageId);
92     printf("title : %s\n", notification->title);
93     printf("content : %s\n", notification->contentText);
94     printf("source : %s\n", notification->sourceName);
95     if (notification->topic && strlen(notification->topic) > 0)
96     {
97         printf("topic : %s\n", notification->topic);
98     }
99     NSConsumerSendSyncInfo(notification->providerId, notification->messageId, NS_SYNC_READ);
100 }
101
102 void onNotificationSync(NSSyncInfo * sync)
103 {
104     printf("Sync ID : %lld\n", (long long int)sync->messageId);
105     printf("Sync STATE : %d\n", sync->state);
106 }
107
108 void* OCProcessThread(void * ptr)
109 {
110     (void) ptr;
111
112     while (true)
113     {
114         usleep(2000);
115         if(OCProcess() != OC_STACK_OK)
116         {
117             OCStop();
118             break;
119         }
120     }
121
122     return NULL;
123 }
124
125 void input(char * buffer)
126 {
127     char ch;
128     int i = 0;
129
130     while( (ch = getchar()) != '\n' && i < 100)
131         buffer[i++] = ch;
132
133     buffer[i] = '\0';
134 }
135
136 int main(void)
137 {
138     bool isExit = false;
139     pthread_t OCThread = NULL;
140
141     printf("start Iotivity\n");
142
143     // open oic_db
144     static OCPersistentStorage ps = {server_fopen, fread, fwrite, fclose, unlink};
145     OCRegisterPersistentStorageHandler(&ps);
146
147     if (OCInit1(OC_CLIENT_SERVER, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK)
148     {
149         printf("OCInit fail\n");
150         return 0;
151     }
152
153     NSConsumerConfig cfg;
154     cfg.changedCb = onProviderChanged;
155     cfg.messageCb = onNotificationPosted;
156     cfg.syncInfoCb = onNotificationSync;
157
158     pthread_create(&OCThread, NULL, OCProcessThread, NULL);
159
160     printf("start notification consumer service\n");
161     while (!isExit)
162     {
163         int num = 0;
164         char dummy = '\0';
165
166         printf("1. Start Consumer\n");
167         printf("2. Stop Consumer\n");
168         printf("3. Get Topics\n");
169         printf("4. Select Topics\n");
170         printf("5. Cancel select Topics\n");
171         printf("0. Exit\n");
172 #ifdef WITH_CLOUD
173         printf("21. Enable Remote Service (after login)\n");
174         printf("31. Cloud Signup\n");
175         printf("32. Cloud Login\n");
176         printf("33. Cloud Logout\n");
177 #endif
178
179         printf("Input: ");
180
181         if(scanf("%d", &num) == EOF)
182         {
183             printf("Fail to input num\n");
184         }
185         fflush(stdin);
186
187         if(scanf("%c", &dummy) == EOF)
188         {
189             printf("Fail to input dummy\n");
190         }
191         fflush(stdin);
192
193         switch (num)
194         {
195             case 1:
196                 printf("1. Start Consumer\n");
197                 NSStartConsumer(cfg);
198                 break;
199             case 2:
200                 printf("2. Stop Consumer");
201                 NSStopConsumer();
202                 break;
203             case 3:
204                 printf("3. Get Topics\n");
205                 if(g_provider)
206                 {
207                     g_topicLL = NSConsumerGetTopicList(g_provider->providerId);
208                     printProviderTopicList(g_topicLL);
209                 }
210                 break;
211             case 4:
212                 printf("4. Select Topics\n");
213
214                 if (g_provider && g_topicLL)
215                 {
216                     NSTopicLL * iter = g_topicLL;
217                     int i = 0;
218                     while (iter)
219                     {
220                         iter->state = (i++)%2;
221                         iter = iter->next;
222                     }
223                     NSResult ret = NSConsumerUpdateTopicList(g_provider->providerId, g_topicLL);
224                     if (ret == NS_OK)
225                     {
226                         printProviderTopicList(g_topicLL);
227                     }
228                     else
229                     {
230                         printf("Update fail\n");
231                     }
232                 }
233                 break;
234             case 5:
235                 printf("5. Cancel select Topics\n");
236                 NSTopicLL * iter = g_topicLL;
237                 while (iter)
238                 {
239                     iter->state = NS_TOPIC_UNSUBSCRIBED;
240                     iter = iter->next;
241                 }
242
243                 NSResult ret = NSConsumerUpdateTopicList(g_provider->providerId, g_topicLL);
244                 if (ret != NS_OK)
245                 {
246                     printf("Cancel select topic fail\n");
247                 }
248                 break;
249             case 0:
250                 printf("0. Exit");
251                 isExit = true;
252                 break;
253 #ifdef WITH_CLOUD
254             case 21:
255                 printf("Enable Remote Service");
256                 if(!IsCloudLoggedin())
257                 {
258                     printf("Cloud Login required");
259                     break;
260                 }
261                 NSConsumerEnableRemoteService(CLOUD_ADDRESS);
262                 break;
263             case 31:
264                 printf("Remote Server Address: ");
265                 input(CLOUD_ADDRESS);
266
267                 printf("Auth Provider(eg. github): ");
268                 input(CLOUD_AUTH_PROVIDER);
269
270                 printf("Auth Code: ");
271                 input(CLOUD_AUTH_CODE);
272
273                 OCCloudSignup(CLOUD_ADDRESS, OCGetServerInstanceIDString(),
274                     CLOUD_AUTH_PROVIDER, CLOUD_AUTH_CODE, CloudSignupCallback);
275                 printf("OCCloudSignup requested");
276                 break;
277             case 32:
278                 printf("Remote Server Address: ");
279                 input(CLOUD_ADDRESS);
280
281                 printf("UID: ");
282                 input(CLOUD_UID);
283
284                 printf("ACCESS_TOKEN: ");
285                 input(CLOUD_ACCESS_TOKEN);
286
287                 OCCloudLogin(CLOUD_ADDRESS, CLOUD_UID, OCGetServerInstanceIDString(),
288                     CLOUD_ACCESS_TOKEN, CloudLoginoutCallback);
289                 printf("OCCloudLogin requested");
290                 break;
291             case 33:
292                 OCCloudLogout(CLOUD_ADDRESS, CloudLoginoutCallback);
293                 printf("OCCloudLogin requested");
294                 break;
295 #endif
296             default:
297                 break;
298         }
299     }
300     return 0;
301 }
302