API change , Retransmission Callback on expiry , remove glib source for dynamic linking
[platform/upstream/iotivity.git] / resource / csdk / connectivity / samples / tizen / casample.c
1 /******************************************************************
2  *
3  * Copyright 2014 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 <ctype.h>
22 #include <fcntl.h>
23 #include <errno.h>
24 #include <glib.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <pthread.h>
29 #include "cacommon.h"
30 #include "cainterface.h"
31
32 static GMainLoop *mainloop;
33 static GIOChannel *channel;
34 static guint g_test_io_watch_id;
35 static GError *g_err_Sample;
36
37 pthread_t thread;
38
39 #define MAX_BUF_LEN 1024
40 #define MAX_OPT_LEN 16
41
42 char get_menu();
43 void process();
44
45 void initialize();
46 void start_listening_server();
47 void start_discovery_server();
48 void find_resource();
49 void send_request();
50 void send_response();
51 void advertise_resource();
52 void send_notification();
53 void select_network();
54 void unselect_network();
55 void handle_request_response();
56
57 void request_handler(const CARemoteEndpoint_t *object, const CARequestInfo_t *requestInfo);
58 void response_handler(const CARemoteEndpoint_t *object, const CAResponseInfo_t *responseInfo);
59 void send_request_tmp(CARemoteEndpoint_t *endpoint, CAToken_t token);
60 void terminate();
61 CAConnectivityType_t get_network_type();
62
63
64 void pthread_func()
65 {
66     g_main_loop_run(mainloop);
67 }
68
69 int main()
70 {
71
72     printf("=============================================\n");
73     printf("\t\tsample main\n");
74     printf("=============================================\n");
75
76     process();
77
78     return 0;
79 }
80
81 void process()
82 {
83     while (1)
84     {
85         char menu = toupper(get_menu());
86
87         switch (menu)
88         {
89             case 'Q': // quits the sample program
90                 printf("quit..!!\n");
91                 g_main_loop_quit(mainloop);
92                 return;
93
94             case 'I': // Initialize interface
95                 initialize();
96                 break;
97
98             case 'S': // start server
99                 start_listening_server();
100                 break;
101
102             case 'C': // start client
103                 start_discovery_server();
104                 break;
105
106             case 'F': // find resource
107                 find_resource();
108                 break;
109
110             case 'R': // send request
111                 send_request();
112                 break;
113
114             case 'A': // advertise resource
115                 advertise_resource();
116                 break;
117
118             case 'N': // select network
119                 select_network();
120                 break;
121
122             case 'X': // unselect network
123                 unselect_network();
124                 break;
125
126             case 'H': // handle request response
127                 handle_request_response();
128                 break;
129
130             case 'T': // Terminate interface
131                 terminate();
132                 break;
133
134             default:
135                 printf("not supported menu!!\n");
136                 break;
137         }
138     }
139
140 }
141
142 void initialize()
143 {
144     mainloop = g_main_loop_new(NULL, FALSE);
145     pthread_create (&thread, NULL, (void *) &pthread_func, NULL);
146
147     CAInitialize();
148
149     // network enable
150     // default
151     printf("select default network(WIFI)\n");
152     CASelectNetwork(CA_WIFI);
153
154     // set handler.
155     CARegisterHandler(request_handler, response_handler);
156 }
157
158 void start_listening_server()
159 {
160     printf("start listening server!!\n");
161
162     CAStartListeningServer();
163 }
164
165 void start_discovery_server()
166 {
167     printf("start discovery server at client!!\n");
168
169     CAStartDiscoveryServer();
170 }
171
172 void find_resource()
173 {
174     char buf[MAX_BUF_LEN];
175
176     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
177
178     printf("\n=============================================\n");
179     printf("ex) a/light\n");
180     printf("reference uri : ");
181
182     gets(buf);
183
184     // create token
185     CAToken_t token = NULL;
186     CAResult_t res = CAGenerateToken(&token);
187     if (res != CA_STATUS_OK)
188     {
189         printf("token generate error!!\n");
190         token = NULL;
191     }
192
193     printf("generated token %s\n", (token != NULL) ? token : "");
194
195     res = CAFindResource(buf, token);
196
197     if (res != CA_STATUS_OK)
198     {
199         printf("find resource error:%d !!\n", res);
200     }
201     else
202     {
203         printf("find resource for %s URI\n", buf);
204     }
205
206     printf("=============================================\n");
207 }
208
209 void send_request()
210 {
211     char buf[MAX_BUF_LEN];
212
213     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
214     CAConnectivityType_t selectedNetwork;
215
216     selectedNetwork = get_network_type();
217
218     printf("\n=============================================\n");
219     printf("10.11.12.13:4545/resource_uri ( for IP )\n");
220     printf("10:11:12:13:45:45/resource_uri ( for BT )\n");
221     printf("uri : ");
222
223     gets(buf);
224
225     // create remote endpoint
226     CARemoteEndpoint_t *endpoint = NULL;
227     CAResult_t res = CACreateRemoteEndpoint(buf,selectedNetwork, &endpoint);
228
229     if (res != CA_STATUS_OK)
230     {
231         printf("create remote endpoint error!!");
232         CADestroyRemoteEndpoint(endpoint);
233         return;
234     }
235
236     // create token
237     CAToken_t token = NULL;
238     res = CAGenerateToken(&token);
239
240     if (res != CA_STATUS_OK)
241     {
242         printf("token generate error!!");
243         token = NULL;
244     }
245
246     printf("generated token %s\n", (token != NULL) ? token : "");
247
248     CAInfo_t requestData;
249     memset(&requestData, 0, sizeof(CAInfo_t));
250     requestData.token = token;
251     requestData.payload = "Temp Json Payload";
252
253     CARequestInfo_t requestInfo;
254     memset(&requestInfo, 0, sizeof(CARequestInfo_t));
255     requestInfo.method = CA_GET;
256     requestInfo.info = requestData;
257
258     // send request
259     CASendRequest(endpoint, &requestInfo);
260
261     if (token != NULL)
262     {
263         CADestroyToken(token);
264     }
265
266     // destroy remote endpoint
267     if (endpoint != NULL)
268     {
269         CADestroyRemoteEndpoint(endpoint);
270     }
271
272     printf("=============================================\n");
273 }
274
275 void advertise_resource()
276 {
277     char buf[MAX_BUF_LEN];
278
279     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
280
281     printf("\n=============================================\n");
282     printf("uri : ");
283
284     scanf("%s", buf);
285
286     int optionNum = 0;
287     char optionData[MAX_OPT_LEN];
288
289     printf("Option Num : ");
290     scanf("%d", &optionNum);
291     CAHeaderOption_t *headerOpt;
292
293     if (optionNum > 0)
294     {
295         headerOpt = (CAHeaderOption_t *) malloc(sizeof(CAHeaderOption_t) * optionNum);
296         if (NULL == headerOpt)
297         {
298             printf("memory allocation failed!\n");
299             return;
300         }
301         memset(headerOpt, 0, sizeof(CAHeaderOption_t) * optionNum);
302     }
303
304     int i;
305     for (i = 0 ; i < optionNum ; i++)
306     {
307         int optionID = 0;
308         printf("[%d] Option ID : ", i + 1);
309         scanf("%d", &optionID);
310         headerOpt[i].optionID = optionID;
311
312         memset(optionData, 0, sizeof(char) * MAX_OPT_LEN);
313         printf("[%d] Option Data : ", i + 1);
314         scanf("%s", optionData);
315         memcpy(headerOpt[i].optionData, optionData, MAX_OPT_LEN);
316         printf("[%d] inputed option : ID : %d, data : %s\n", i + 1, optionID, optionData );
317
318         headerOpt[i].optionLength = (uint16_t)strlen(optionData);
319     }
320     printf("\n=============================================\n");
321
322     // create token
323     CAToken_t token = NULL;
324     CAResult_t res = CAGenerateToken(&token);
325     if (res != CA_STATUS_OK)
326     {
327         printf("token generate error!!\n");
328         token = NULL;
329     }
330
331     printf("generated token %s\n", (token != NULL) ? token : "");
332
333     CAAdvertiseResource(buf, token, headerOpt, (uint8_t)optionNum);
334
335     free(headerOpt);
336
337 }
338
339 void select_network()
340 {
341     char buf[MAX_BUF_LEN];
342
343     printf("\n=============================================\n");
344     printf("\tselect network\n");
345     printf("ETHERNET : 0\n");
346     printf("WIFI : 1\n");
347     printf("EDR : 2\n");
348     printf("LE : 3\n");
349     printf("select : ");
350
351     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
352     gets(buf);
353
354     int number = buf[0] - '0';
355
356     number = (number < 0 || number > 3) ? 1 : number;
357
358     CASelectNetwork(1 << number);
359
360     printf("=============================================\n");
361 }
362
363 void unselect_network()
364 {
365     char buf[MAX_BUF_LEN];
366
367     printf("\n=============================================\n");
368     printf("\tunselect enabled network\n");
369     printf("ETHERNET : 0\n");
370     printf("WIFI : 1\n");
371     printf("EDR : 2\n");
372     printf("LE : 3\n");
373     printf("select : ");
374
375     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
376     gets(buf);
377
378     int number = buf[0] - '0';
379
380     number = (number < 0 || number > 3) ? 1 : number;
381
382     CAUnSelectNetwork(1 << number);
383     printf("Terminating...\n");
384     CATerminate();
385     //pthread_join(thread, NULL);
386     printf("=============================================\n");
387 }
388
389 char get_menu()
390 {
391     char buf[MAX_BUF_LEN];
392
393     printf("\n=============================================\n");
394     printf("\t\tMenu\n");
395     printf("\ti : Initialize\n");
396     printf("\ts : start server\n");
397     printf("\tc : start client\n");
398     printf("\tf : find resource\n");
399     printf("\tr : send request\n");
400     printf("\ta : advertise resource\n");
401     printf("\tn : select network\n");
402     printf("\tx : unselect network\n");
403     printf("\th : handle request response\n");
404     printf("\tt : terminate\n");
405     printf("\tq : quit\n");
406     printf("=============================================\n");
407     printf("select : ");
408
409     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
410
411     gets(buf);
412
413     return buf[0];
414 }
415
416 void handle_request_response()
417 {
418     printf("handle_request_response\n");
419     CAHandleRequestResponse();
420 }
421
422 void request_handler(const CARemoteEndpoint_t *object, const CARequestInfo_t *requestInfo)
423 {
424
425     printf("[CALLBACK] request_handler, uri : %s, data : %s\n",
426            (object != NULL) ? object->resourceUri : "",
427            (requestInfo != NULL) ? requestInfo->info.payload : "");
428
429     printf("[CALLBACK] request_handler, address : %s\n",
430            (object != NULL) ? object->addressInfo.IP.ipAddress : "");
431
432     if (requestInfo->info.options)
433     {
434         uint32_t len =  requestInfo->info.numOptions;
435         uint32_t i;
436         for (i = 0 ; i < len ; i++)
437         {
438             printf("[CALLBACK] request_handler, option ID : %d\n", requestInfo->info.options[i].optionID);
439             printf("[CALLBACK] request_handler, options data length : %d\n",
440                    requestInfo->info.options[i].optionLength);
441             printf("[CALLBACK] request_handler, options data : %s\n", requestInfo->info.options[i].optionData );
442         }
443     }
444
445     printf("send response with URI\n");
446     send_response(object, (requestInfo != NULL) ? requestInfo->info.token : "");
447
448 }
449
450 void response_handler(const CARemoteEndpoint_t *object, const CAResponseInfo_t *responseInfo)
451 {
452
453     printf("[CALLBACK] response_handler, uri : %s, data : %s\n",
454            (object != NULL) ? object->resourceUri : "",
455            (responseInfo != NULL) ? responseInfo->info.payload : "");
456
457     printf("[CALLBACK] response_handler, address : %s\n",
458            (object != NULL) ? object->addressInfo.IP.ipAddress : "");
459
460     if (responseInfo->info.options)
461     {
462         uint32_t len =  responseInfo->info.numOptions;
463         uint32_t i;
464         for (i = 0 ; i < len ; i++)
465         {
466             printf("[CALLBACK] response_handler, option ID : %d\n", responseInfo->info.options[i].optionID);
467             printf("[CALLBACK] response_handler, options data length : %d\n",
468                    responseInfo->info.options[i].optionLength);
469             printf("[CALLBACK] response_handler, options data : %s\n",
470                    responseInfo->info.options[i].optionData );
471         }
472     }
473
474     //printf("send request with URI\n");
475     //send_request_tmp(object, (responseInfo != NULL) ? responseInfo->info.token : "");
476 }
477
478 void send_response(CARemoteEndpoint_t *endpoint, CAToken_t request_token)
479 {
480
481     printf("\n=============================================\n");
482
483     CAInfo_t responseData;
484     //responseData = (CAInfo*) malloc(sizeof(CAInfo));
485     memset(&responseData, 0, sizeof(CAInfo_t));
486     responseData.token = request_token;
487     responseData.payload = "response payload";
488
489     CAResponseInfo_t responseInfo;
490     //responseInfo = (CAResponseInfo*) malloc(sizeof(CAResponseInfo));
491     memset(&responseInfo, 0, sizeof(CAResponseInfo_t));
492     responseInfo.result = 203;
493     responseInfo.info = responseData;
494
495     // send request (connectivityType from remoteEndpoint of request Info)
496     CASendResponse(endpoint, &responseInfo);
497
498     printf("=============================================\n");
499
500 }
501
502 void send_request_tmp(CARemoteEndpoint_t *endpoint, CAToken_t token)
503 {
504
505     printf("\n=============================================\n");
506
507     CAInfo_t requestData;
508     memset(&requestData, 0, sizeof(CAInfo_t));
509     requestData.token = token;
510     requestData.payload = "Temp Json Payload";
511
512     CARequestInfo_t requestInfo;
513     memset(&requestInfo, 0, sizeof(CARequestInfo_t));
514     requestInfo.method = CA_GET;
515     requestInfo.info = requestData;
516
517     // send request
518     endpoint->connectivityType = CA_WIFI;
519     CASendRequest(endpoint, &requestInfo);
520
521     printf("=============================================\n");
522
523 }
524
525 void terminate()
526 {
527     unselect_network();
528 }
529
530 CAConnectivityType_t get_network_type()
531 {
532     char buf[MAX_BUF_LEN];
533
534     printf("\n=============================================\n");
535     printf("\tselect network type\n");
536     printf("ETHERNET : 0\n");
537     printf("WIFI : 1\n");
538     printf("EDR : 2\n");
539     printf("LE : 3\n");
540     printf("select : ");
541
542     memset(buf, 0, sizeof(char) * MAX_BUF_LEN);
543     gets(buf);
544
545     int number = buf[0] - '0';
546
547     number = (number < 0 || number > 3) ? 0 : 1 << number;
548
549     if (number & CA_ETHERNET)
550     {
551         return CA_ETHERNET;
552     }
553     if (number & CA_WIFI)
554     {
555         return CA_WIFI;
556     }
557     if (number & CA_EDR)
558     {
559         return CA_EDR;
560     }
561     if (number & CA_LE)
562     {
563         return CA_LE;
564     }
565
566     printf("\n=============================================\n");
567 }
568