Imported Upstream version 0.9.1
[platform/upstream/iotivity.git] / service / soft-sensor-manager / SampleApp / tizen / SSMTesterApp / src / ssmtesterapp.cpp
1 #include <tizen.h>
2 #include <wifi.h>
3 #include <net_connection.h>
4 #include <algorithm>
5 #include "string.h"
6 #include "ssmtesterapp.h"
7 #include "SSMInterface.h"
8
9 typedef struct appdata {
10         Evas_Object *win;
11         Evas_Object *conform;
12         Evas_Object *naviframe;
13         Evas_Object *layout;
14         Evas_Object *scroller;
15         Evas_Object *box;
16
17         Evas_Object *query_text;
18         Evas_Object *log;
19         Evas_Object *unregister_query_id;
20
21         Evas_Object *register_button;
22         Evas_Object *clear_button;
23         Evas_Object *unregister_button;
24         Evas_Object *search_devices_button;
25         Evas_Object *discomfort_index_button;
26         Evas_Object *plus_button;
27         Evas_Object *minus_button;
28         Evas_Object *clear_log_button;
29
30         Evas_Object *example_queries_label;
31         Evas_Object *unregister_query_label;
32 } appdata_s;
33
34 typedef struct threadContext{
35         appdata_s *ad;
36         const char *log;
37 } threadContext_s;
38
39 #define ELM_DEMO_EDJ "opt/usr/apps/org.iotivity.service.ssm.ssmtesterapp/res/ui_controls.edj"
40
41 char log_buffer[10000];
42 void updateLog(appdata_s *ad, const char *newlog)
43 {
44         const char *log_text = NULL;
45
46         log_text = elm_entry_entry_get(ad->log);
47         strcpy(log_buffer,log_text);
48         strcat(log_buffer,newlog);
49         elm_entry_entry_set(ad->log,log_buffer);
50         elm_entry_cursor_end_set(ad->log);
51 }
52
53 void* updateCallbackLog(void *data)
54 {
55         threadContext_s  *pThreadContext = (threadContext_s*)data;
56
57         updateLog(pThreadContext->ad, pThreadContext->log);
58
59         return NULL;
60 }
61
62 static int s_hc2i(char hexChar)
63 {
64     if ((hexChar <= '9') && (hexChar >= '0')) return (int)hexChar-(int)'0';
65     if ((hexChar <= 'F') && (hexChar >= 'A')) return 10+(int)hexChar-(int)'A';
66     if ((hexChar <= 'f') && (hexChar >= 'a')) return 10+(int)hexChar-(int)'a';
67     return -1;
68 }
69
70 long long s_h2uint64(const char *hex, size_t maxdigit)
71 {
72     long long nNumber = 0;
73     int nInt;
74     size_t nLen=0;
75     while (nLen < maxdigit && (nInt = s_hc2i(*hex)) >= 0) {
76         nNumber=(nNumber*(long long)16) + (long long)nInt;
77         hex++;
78         nLen++;
79     }
80     return nNumber;
81 }
82
83 int s_h2i(char *strHex) {
84     return (int) s_h2uint64(strHex, sizeof(int)*2);
85 }
86
87 void unescape(char *val)
88 {
89     char *tmp = (char *)val;
90     int i,nChar;
91     int len;
92
93     if (!val) return;
94     len=(int)strlen(val);
95
96     // process special chars
97     while (*tmp) {
98         if (!strncmp((char *)tmp,"&amp;",5)) {
99             *tmp='&';
100             memmove(&tmp[1],&tmp[5],strlen((char *)&tmp[5])+1);
101         }
102         else if (!strncmp((char *)tmp,"&nbsp;",6)) {
103             *tmp=' ';
104             memmove(&tmp[1],&tmp[6],strlen((char *)&tmp[6])+1);
105         }
106         else if (!strncmp((char *)tmp,"&lt;",4)) {
107             *tmp='<';
108             memmove(&tmp[1],&tmp[4],strlen((char *)&tmp[4])+1);
109         }
110         else if (!strncmp((char *)tmp,"&gt;",4)) {
111             *tmp='>';
112             memmove(&tmp[1],&tmp[4],strlen((char *)&tmp[4])+1);
113         }
114         else if (!strncmp((char *)tmp,"&apos;",6)) {
115             *tmp='\'';
116             memmove(&tmp[1],&tmp[6],strlen((char *)&tmp[6])+1);
117         }
118         else if (!strncmp((char *)tmp,"&quot;",6)) {
119             *tmp='"';
120             memmove(&tmp[1],&tmp[6],strlen((char *)&tmp[6])+1);
121         }
122         else if (!strncmp((char *)tmp,"&#",2)) { // &#nnn; || &#xnn;
123             for(i=2;i<7;i++) {
124                 if (tmp[i] == ';') {
125                     if (tmp[2]=='x') nChar=s_h2i((char *)&tmp[3]);
126                     else nChar=atoi((char *)&tmp[2]);
127                     *tmp=(char)nChar;
128                     memmove(&tmp[1],&tmp[i+1],strlen((char *)&tmp[i+1])+1);
129                     break;
130                 }
131             }
132         }
133         tmp++;
134     }
135
136     if (tmp < (char *)(val+len))
137         *tmp='\0';
138 }
139
140 class CQueryEngineEvent : public OIC::IQueryEngineEvent
141 {
142 private:
143         appdata_s *m_pAppData;
144         threadContext_s m_ThreadContext;
145
146 public:
147         CQueryEngineEvent(appdata_s *pAppData)
148         {
149                 m_pAppData = pAppData;
150                 m_ThreadContext.ad = m_pAppData;
151                 m_ThreadContext.log = NULL;
152         }
153
154         OIC::SSMRESULT onQueryEngineEvent(int cqid, OIC::IDataReader *pResult)
155         {
156                 int     dataCount = 0;
157                 char log[2000],buf[100];
158                 OIC::IModelData      *pModelData = NULL;
159                 std::vector<std::string>        affectedModels;
160
161                 dlog_print(DLOG_ERROR,LOG_TAG,"Event received!");
162
163                 sprintf(buf,"Event received! cqid = %d<br>", cqid);
164                 strcpy(log,buf);
165
166                 pResult->getAffectedModels(&affectedModels);
167
168                 for (std::vector<std::string>::iterator itor = affectedModels.begin();
169                                 itor != affectedModels.end(); ++itor)
170                 {
171                         sprintf(buf,"Printing = %s model<br>", (*itor).c_str());
172                         strcat(log,buf);
173
174                         pResult->getModelDataCount(*itor, &dataCount);
175                         for (int i = 0; i < dataCount; i++)
176                         {
177                                 pResult->getModelData(*itor, i, &pModelData);
178                                 sprintf(buf,"dataId: %d<br>", pModelData->getDataId());
179                                 strcat(log,buf);
180                                 for (int j = 0; j < pModelData->getPropertyCount(); j++)
181                                 {
182                                         sprintf(buf,"Type: %s Value: %s<br>", (pModelData->getPropertyName(j)).c_str(), (pModelData->getPropertyValue(j)).c_str());
183                                         strcat(log,buf);
184                                 }
185                                 m_ThreadContext.log = log;
186                                 ecore_main_loop_thread_safe_call_sync((void *(*)(void *))updateCallbackLog, &m_ThreadContext);
187                         }
188                 }
189
190                 return OIC::SSM_S_OK;
191         }
192 };
193
194 CQueryEngineEvent               *g_pQueryEngineEvent = NULL;
195
196
197 static void
198 win_delete_request_cb(void *data , Evas_Object *obj , void *event_info)
199 {
200         ui_app_exit();
201 }
202
203 static void
204 win_back_cb(void *data, Evas_Object *obj, void *event_info)
205 {
206         //appdata_s *ad = (appdata_s *)data;
207         /* Let window go to hide state. */
208         //elm_win_lower(ad->win);
209         ui_app_exit();
210 }
211
212
213 static void
214 register_cb(void *data , Evas_Object *obj , void *event_info)
215 {
216         appdata_s *ad = (appdata_s *)data;
217         const char *main_text = NULL;
218         char *escaped_text = NULL;
219         if (!ad->query_text)
220                 return;
221         main_text = elm_entry_entry_get(ad->query_text);
222         if (!main_text || (strlen(main_text) == 0))
223                 return;
224
225         //invoke registerQuery
226         int qid = 0;
227         char log[50];
228
229         escaped_text = strdup(main_text);
230         unescape(escaped_text);
231
232     dlog_print(DLOG_ERROR,LOG_TAG,"registering query");
233
234         OIC::SSMRESULT res = OIC::RegisterQuery(escaped_text, g_pQueryEngineEvent, qid);
235         if(res == OIC::SSM_S_OK)
236         {
237                 updateLog(ad, "The query has been registered!<br>");
238                 sprintf(log, "QID : %d<br>", qid);
239                 updateLog(ad, log);
240         }
241         else
242         {
243                 sprintf(log,"Error occured(%d)<br>", res);
244                 updateLog(ad, log);
245         }
246
247         free(escaped_text);
248
249         dlog_print(DLOG_ERROR,LOG_TAG,"registering query done");
250 }
251
252 static void
253 search_devices_cb(void *data , Evas_Object *obj , void *event_info)
254 {
255         appdata_s *ad = (appdata_s *)data;
256         elm_entry_entry_set(ad->query_text, "subscribe Device if Device.dataId > 0");
257 }
258
259 static void
260 discomfort_index_cb(void *data , Evas_Object *obj , void *event_info)
261 {
262         appdata_s *ad = (appdata_s *)data;
263         elm_entry_entry_set(ad->query_text, "subscribe Device.DiscomfortIndexSensor "\
264                         "if Device.DiscomfortIndexSensor.discomfortIndex != 0");
265 }
266
267 static void
268 minus_cb(void *data , Evas_Object *obj , void *event_info)
269 {
270         appdata_s *ad = (appdata_s *)data;
271         char output[10];
272         const char *query_id_str = elm_entry_entry_get(ad->unregister_query_id);
273         if (!query_id_str || (strlen(query_id_str) == 0))
274                 return;
275         try{
276                 int val = atoi(query_id_str);
277                 sprintf(output,"%d",val-1);
278                 elm_entry_entry_set(ad->unregister_query_id,output);
279         }
280         catch(...){
281                 dlog_print(DLOG_ERROR,LOG_TAG,"#### atoi() conversion error");
282         }
283 }
284
285 static void
286 plus_cb(void *data , Evas_Object *obj , void *event_info)
287 {
288         appdata_s *ad = (appdata_s *)data;
289         char output[10];
290         const char *query_id_str = elm_entry_entry_get(ad->unregister_query_id);
291         if (!query_id_str || (strlen(query_id_str) == 0))
292                 return;
293         try{
294                 int val = atoi(query_id_str);
295                 sprintf(output,"%d",val+1);
296                 elm_entry_entry_set(ad->unregister_query_id,output);
297         }
298         catch(...){
299                 dlog_print(DLOG_ERROR,LOG_TAG,"#### atoi() conversion error");
300         }
301 }
302
303 static void
304 unregister_cb(void *data , Evas_Object *obj , void *event_info)
305 {
306         appdata_s *ad = (appdata_s *)data;
307         const char *qidstr = NULL;
308         if (!ad->unregister_query_id)
309                 return;
310         qidstr = elm_entry_entry_get(ad->unregister_query_id);
311         if (!qidstr || (strlen(qidstr) == 0))
312                 return;
313         char log[50];
314         int qid;
315         try{
316                 qid = atoi(qidstr);
317                 //invoke unregisterQuery
318                 OIC::SSMRESULT res = OIC::UnregisterQuery(qid);
319                 if(res == OIC::SSM_S_OK)
320                 {
321                         updateLog(ad, "The query has been unregistered!<br>");
322                         sprintf(log, "QID : %d<br>", qid);
323                         updateLog(ad, log);
324                 }
325                 else
326                 {
327                         sprintf(log,"Error occured(%d)<br>", res);
328                         updateLog(ad, log);
329                 }
330         }
331         catch(...){
332                 dlog_print(DLOG_ERROR,LOG_TAG,"#### atoi() conversion error");
333         }
334 }
335
336 static void
337 clear_log_cb(void *data , Evas_Object *obj , void *event_info)
338 {
339         appdata_s *ad = (appdata_s *)data;
340         elm_entry_entry_set(ad->log,"");
341 }
342
343 static void
344 clear_cb(void *data , Evas_Object *obj , void *event_info)
345 {
346         appdata_s *ad = (appdata_s *)data;
347         elm_entry_entry_set(ad->query_text,"");
348 }
349
350 bool is_connected()
351 {
352         bool isConnected = false;
353
354         static connection_h connection;
355
356         if(connection_create(&connection) == CONNECTION_ERROR_NONE)
357         {
358             char *ip_addr = NULL;
359             connection_get_ip_address(connection, CONNECTION_ADDRESS_FAMILY_IPV4, &ip_addr);
360             connection_destroy(connection);
361             if(strlen(ip_addr) > 0)
362                 isConnected = true;
363             free(ip_addr);
364         }
365
366         return isConnected;
367 }
368
369 static void
370 create_base_gui(appdata_s *ad)
371 {
372         /* Window */
373         ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
374         elm_win_conformant_set(ad->win, EINA_TRUE);
375         elm_win_autodel_set(ad->win, EINA_TRUE);
376
377         if (elm_win_wm_rotation_supported_get(ad->win)) {
378                 int rots[4] = { 0, 90, 180, 270 };
379                 elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
380         }
381
382         evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
383         eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad);
384
385         /* Conformant */
386         ad->conform = elm_conformant_add(ad->win);
387         evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
388         elm_win_resize_object_add(ad->win, ad->conform);
389         evas_object_show(ad->conform);
390
391         /* naviframe */
392         ad->naviframe = elm_naviframe_add(ad->conform);
393         elm_object_content_set(ad->conform,ad->naviframe);
394         evas_object_show(ad->naviframe);
395
396         /* scroller */
397         ad->scroller = elm_scroller_add(ad->naviframe);
398
399         /* Box container */
400         ad->box = elm_box_add(ad->scroller);
401         evas_object_size_hint_align_set(ad->box, EVAS_HINT_FILL, 0.0);
402         evas_object_size_hint_weight_set(ad->box, EVAS_HINT_EXPAND, 0.0);
403         elm_object_content_set(ad->scroller, ad->box);
404
405         ad->layout = elm_layout_add(ad->box);
406         evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, 0.0);
407         //elm_layout_theme_set(ad->layout, "layout", "application", "default");
408         evas_object_size_hint_align_set(ad->layout, EVAS_HINT_FILL, 0.0);
409         elm_layout_file_set(ad->layout,ELM_DEMO_EDJ,"mainpage_layout");
410
411         ad->query_text = elm_entry_add(ad->layout);
412         elm_object_part_text_set(ad->query_text, "elm.guide", "Enter the query here!!!");
413         evas_object_size_hint_align_set(ad->query_text, EVAS_HINT_FILL, EVAS_HINT_FILL);
414         evas_object_size_hint_weight_set(ad->query_text, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
415         elm_object_part_content_set(ad->layout,"query_text",ad->query_text);
416         elm_entry_scrollable_set(ad->query_text,EINA_TRUE);
417         //evas_object_show(ad->query_text);
418         elm_entry_input_panel_show_on_demand_set(ad->query_text,EINA_TRUE);
419
420         ad->register_button = elm_button_add(ad->layout);
421         elm_object_text_set(ad->register_button, "Register");
422         evas_object_size_hint_weight_set(ad->register_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
423         evas_object_size_hint_align_set(ad->register_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
424         evas_object_smart_callback_add(ad->register_button, "clicked", register_cb, ad);
425         elm_object_part_content_set(ad->layout,"register",ad->register_button);
426         //evas_object_show(ad->register_button);
427
428         ad->clear_button = elm_button_add(ad->layout);
429         elm_object_text_set(ad->clear_button, "Clear");
430         evas_object_size_hint_weight_set(ad->search_devices_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
431         evas_object_size_hint_align_set(ad->search_devices_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
432         evas_object_smart_callback_add(ad->clear_button, "clicked", clear_cb, ad);
433         elm_object_part_content_set(ad->layout,"clear",ad->clear_button);
434         //evas_object_show(ad->clear_button);
435
436         ad->example_queries_label = elm_label_add(ad->layout);
437         elm_object_text_set(ad->example_queries_label, _("<color=#00008BFF><b><align=left>Example Queries</align></b></color>"));
438         elm_object_part_content_set(ad->layout,"example_queries",ad->example_queries_label);
439         //evas_object_show(ad->example_queries_label);
440
441         ad->search_devices_button = elm_button_add(ad->layout);
442         //evas_object_size_hint_align_set(ad->search_devices_button, EVAS_HINT_FILL, 0.0);
443         elm_object_text_set(ad->search_devices_button, "Search Devices");
444         evas_object_smart_callback_add(ad->search_devices_button, "clicked", search_devices_cb, ad);
445         elm_object_part_content_set(ad->layout,"search_devices",ad->search_devices_button);
446         //evas_object_show(ad->search_devices_button);
447
448         ad->discomfort_index_button = elm_button_add(ad->layout);
449         //evas_object_size_hint_align_set(ad->discomfort_index_button, EVAS_HINT_FILL, 0.0);
450         elm_object_part_content_set(ad->layout,"discomfort_index",ad->discomfort_index_button);
451         elm_object_text_set(ad->discomfort_index_button, "Discomfort Index");
452         evas_object_smart_callback_add(ad->discomfort_index_button, "clicked", discomfort_index_cb, ad);
453         //evas_object_show(ad->discomfort_index_button);
454
455         ad->unregister_query_label = elm_label_add(ad->layout);
456         elm_object_text_set(ad->unregister_query_label,_("<color=#00008BFF><b><align=left>Unregister Query</align></b></color>"));
457         //evas_object_size_hint_weight_set(ad->unregister_query_label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
458         elm_object_part_content_set(ad->layout,"unregister_query_label",ad->unregister_query_label);
459         //evas_object_show(ad->unregister_query_label);
460
461
462         ad->minus_button = elm_button_add(ad->layout);
463         //evas_object_size_hint_align_set(ad->discomfort_index_button, EVAS_HINT_FILL, 0.0);
464         elm_object_part_content_set(ad->layout,"minus",ad->minus_button);
465         elm_object_text_set(ad->minus_button, "-");
466         evas_object_smart_callback_add(ad->minus_button, "clicked", minus_cb, ad);
467         //evas_object_show(ad->minus_button);
468
469         ad->unregister_query_id = elm_entry_add(ad->layout);
470         elm_object_part_text_set(ad->unregister_query_id, "elm.guide", "Query id!!!");
471         //evas_object_size_hint_align_set(ad->unregister_query_id, EVAS_HINT_FILL, EVAS_HINT_FILL);
472         elm_object_part_content_set(ad->layout,"unregister_query_id",ad->unregister_query_id);
473         elm_entry_input_panel_show_on_demand_set(ad->unregister_query_id,EINA_TRUE);
474         elm_entry_input_panel_layout_set(ad->unregister_query_id,ELM_INPUT_PANEL_LAYOUT_NUMBER);
475         evas_object_show(ad->unregister_query_id);
476
477         ad->plus_button = elm_button_add(ad->layout);
478         //evas_object_size_hint_align_set(ad->discomfort_index_button, EVAS_HINT_FILL, 0.0);
479         elm_object_part_content_set(ad->layout,"plus",ad->plus_button);
480         elm_object_text_set(ad->plus_button, "+");
481         evas_object_smart_callback_add(ad->plus_button, "clicked", plus_cb, ad);
482         //evas_object_show(ad->plus_button);
483
484         ad->unregister_button = elm_button_add(ad->layout);
485         //evas_object_size_hint_align_set(ad->unregister_button, EVAS_HINT_FILL, 0.0);
486         elm_object_part_content_set(ad->layout,"unregister_button",ad->unregister_button);
487         elm_object_text_set(ad->unregister_button, "Unregister");
488         evas_object_smart_callback_add(ad->unregister_button, "clicked", unregister_cb, ad);
489         //evas_object_show(ad->unregister_button);
490
491         ad->clear_log_button = elm_button_add(ad->layout);
492         //evas_object_size_hint_align_set(ad->clear_log_button, EVAS_HINT_FILL, 0.0);
493         elm_object_part_content_set(ad->layout,"log_button",ad->clear_log_button);
494         elm_object_text_set(ad->clear_log_button, "Clear Log");
495         evas_object_smart_callback_add(ad->clear_log_button, "clicked", clear_log_cb, ad);
496         //evas_object_show(ad->clear_log_button);
497
498         ad->log = elm_entry_add(ad->layout);
499         elm_object_part_content_set(ad->layout,"log_text",ad->log);
500         elm_object_part_text_set(ad->log, "elm.guide", "Log messages will be update here!!!");
501         elm_entry_scrollable_set(ad->log,EINA_TRUE);
502         elm_entry_editable_set(ad->log,EINA_FALSE);
503         //evas_object_size_hint_align_set(ad->log, EVAS_HINT_FILL, EVAS_HINT_FILL);
504         //evas_object_show(ad->log);
505
506         elm_box_pack_end(ad->box, ad->layout);
507         evas_object_show(ad->layout);
508         elm_naviframe_item_push(ad->naviframe, "Soft Sensor Manager App", NULL, NULL, ad->scroller, NULL);
509
510         //Show window after base gui is set up
511         evas_object_show(ad->win);
512 }
513
514 static bool
515 app_create(void *data)
516 {
517         /* Hook to take necessary actions before main event loop starts
518                 Initialize UI resources and application's data
519                 If this function returns true, the main loop of application starts
520                 If this function returns false, the application is terminated */
521         appdata_s *ad = (appdata_s *)data;
522
523         std::string xmlDescription = "<SSMCore>"
524                                 "<Device>"
525                                 "<UDN>abcde123-31f8-11b4-a222-08002b34c050</UDN>"
526                                 "<Name>MyPC</Name>"
527                                 "<Type>PC</Type>"
528                                 "</Device>"
529                                 "<Config>"
530                                 "<SoftSensorDescription>/opt/usr/apps/org.iotivity.service.ssm.ssmtesterapp/lib/SoftSensorDescription.xml</SoftSensorDescription>"
531                                 "<SoftSensorRepository>/opt/usr/apps/org.iotivity.service.ssm.ssmtesterapp/lib/</SoftSensorRepository>"
532                                 "</Config>"
533                                 "</SSMCore>";
534
535         g_pQueryEngineEvent = new CQueryEngineEvent(ad);
536
537         create_base_gui(ad);
538
539         if(is_connected())
540         {
541             if (OIC::InitializeSSM(xmlDescription) == OIC::SSM_S_OK){
542                     dlog_print(DLOG_DEBUG, LOG_TAG, "#### InitializeSSM() returned SSM_S_OK");
543                 }
544                 else{
545                     dlog_print(DLOG_DEBUG, LOG_TAG, "#### InitializeSSM() failed");
546                 }
547         }
548         else
549         {
550             updateLog(ad, "WiFi not connected, connect first and re-run application");
551
552         }
553
554         return true;
555 }
556
557 static void
558 app_control(app_control_h app_control, void *data)
559 {
560         /* Handle the launch request. */
561         dlog_print(DLOG_INFO,LOG_TAG,"#### in app_control");
562 }
563
564 static void
565 app_pause(void *data)
566 {
567         /* Take necessary actions when application becomes invisible. */
568         dlog_print(DLOG_INFO,LOG_TAG,"#### in app_pause");
569 }
570
571 static void
572 app_resume(void *data)
573 {
574         /* Take necessary actions when application becomes visible. */
575         dlog_print(DLOG_INFO,LOG_TAG,"#### in app_resume");
576 }
577
578 static void
579 app_terminate(void *data)
580 {
581         /* Release all resources. */
582         dlog_print(DLOG_INFO,LOG_TAG,"#### in app_terminate");
583
584         if (OIC::TerminateSSM() == OIC::SSM_S_OK){
585                 dlog_print(DLOG_DEBUG, LOG_TAG, "#### TerminateSSM() returned SSM_S_OK");
586         }
587         else{
588                 dlog_print(DLOG_DEBUG, LOG_TAG, "#### TerminateSSM() failed");
589         }
590
591         delete g_pQueryEngineEvent;
592 }
593
594 static void
595 ui_app_lang_changed(app_event_info_h event_info, void *user_data)
596 {
597         /*APP_EVENT_LANGUAGE_CHANGED*/
598         char *locale = NULL;
599         system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
600         elm_language_set(locale);
601         free(locale);
602         return;
603 }
604
605 static void
606 ui_app_orient_changed(app_event_info_h event_info, void *user_data)
607 {
608         /*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/
609         dlog_print(DLOG_INFO,LOG_TAG,"#### app orient changed");
610         return;
611 }
612
613 static void
614 ui_app_region_changed(app_event_info_h event_info, void *user_data)
615 {
616         /*APP_EVENT_REGION_FORMAT_CHANGED*/
617 }
618
619 static void
620 ui_app_low_battery(app_event_info_h event_info, void *user_data)
621 {
622         /*APP_EVENT_LOW_BATTERY*/
623 }
624
625 static void
626 ui_app_low_memory(app_event_info_h event_info, void *user_data)
627 {
628         /*APP_EVENT_LOW_MEMORY*/
629 }
630
631 int
632 main(int argc, char *argv[])
633 {
634         appdata_s ad = {0,};
635         int ret = 0;
636
637         ui_app_lifecycle_callback_s event_callback = {0,};
638         app_event_handler_h handlers[5] = {NULL, };
639
640         event_callback.create = app_create;
641         event_callback.terminate = app_terminate;
642         event_callback.pause = app_pause;
643         event_callback.resume = app_resume;
644         event_callback.app_control = app_control;
645
646         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
647         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
648         ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
649         ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
650         ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
651         ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
652
653         ret = ui_app_main(argc, argv, &event_callback, &ad);
654
655         if (ret != APP_ERROR_NONE) {
656                 dlog_print(DLOG_ERROR, LOG_TAG, "app_main() is failed. err = %d", ret);
657         }
658
659         return ret;
660 }