3 #include <net_connection.h>
6 #include "ssmtesterapp.h"
7 #include "SSMInterface.h"
9 typedef struct appdata {
12 Evas_Object *naviframe;
14 Evas_Object *scroller;
17 Evas_Object *query_text;
19 Evas_Object *unregister_query_id;
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;
30 Evas_Object *example_queries_label;
31 Evas_Object *unregister_query_label;
34 typedef struct threadContext{
39 #define ELM_DEMO_EDJ "opt/usr/apps/org.iotivity.service.ssm.ssmtesterapp/res/ui_controls.edj"
41 char log_buffer[10000];
42 void updateLog(appdata_s *ad, const char *newlog)
44 const char *log_text = NULL;
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);
53 void* updateCallbackLog(void *data)
55 threadContext_s *pThreadContext = (threadContext_s*)data;
57 updateLog(pThreadContext->ad, pThreadContext->log);
62 static int s_hc2i(char hexChar)
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';
70 long long s_h2uint64(const char *hex, size_t maxdigit)
72 long long nNumber = 0;
75 while (nLen < maxdigit && (nInt = s_hc2i(*hex)) >= 0) {
76 nNumber=(nNumber*(long long)16) + (long long)nInt;
83 int s_h2i(char *strHex) {
84 return (int) s_h2uint64(strHex, sizeof(int)*2);
87 void unescape(char *val)
89 char *tmp = (char *)val;
96 // process special chars
98 if (!strncmp((char *)tmp,"&",5)) {
100 memmove(&tmp[1],&tmp[5],strlen((char *)&tmp[5])+1);
102 else if (!strncmp((char *)tmp," ",6)) {
104 memmove(&tmp[1],&tmp[6],strlen((char *)&tmp[6])+1);
106 else if (!strncmp((char *)tmp,"<",4)) {
108 memmove(&tmp[1],&tmp[4],strlen((char *)&tmp[4])+1);
110 else if (!strncmp((char *)tmp,">",4)) {
112 memmove(&tmp[1],&tmp[4],strlen((char *)&tmp[4])+1);
114 else if (!strncmp((char *)tmp,"'",6)) {
116 memmove(&tmp[1],&tmp[6],strlen((char *)&tmp[6])+1);
118 else if (!strncmp((char *)tmp,""",6)) {
120 memmove(&tmp[1],&tmp[6],strlen((char *)&tmp[6])+1);
122 else if (!strncmp((char *)tmp,"&#",2)) { // &#nnn; || &#xnn;
125 if (tmp[2]=='x') nChar=s_h2i((char *)&tmp[3]);
126 else nChar=atoi((char *)&tmp[2]);
128 memmove(&tmp[1],&tmp[i+1],strlen((char *)&tmp[i+1])+1);
136 if (tmp < (char *)(val+len))
140 class CQueryEngineEvent : public OIC::IQueryEngineEvent
143 appdata_s *m_pAppData;
144 threadContext_s m_ThreadContext;
147 CQueryEngineEvent(appdata_s *pAppData)
149 m_pAppData = pAppData;
150 m_ThreadContext.ad = m_pAppData;
151 m_ThreadContext.log = NULL;
154 OIC::SSMRESULT onQueryEngineEvent(int cqid, OIC::IDataReader *pResult)
157 char log[2000],buf[100];
158 OIC::IModelData *pModelData = NULL;
159 std::vector<std::string> affectedModels;
161 dlog_print(DLOG_ERROR,LOG_TAG,"Event received!");
163 sprintf(buf,"Event received! cqid = %d<br>", cqid);
166 pResult->getAffectedModels(&affectedModels);
168 for (std::vector<std::string>::iterator itor = affectedModels.begin();
169 itor != affectedModels.end(); ++itor)
171 sprintf(buf,"Printing = %s model<br>", (*itor).c_str());
174 pResult->getModelDataCount(*itor, &dataCount);
175 for (int i = 0; i < dataCount; i++)
177 pResult->getModelData(*itor, i, &pModelData);
178 sprintf(buf,"dataId: %d<br>", pModelData->getDataId());
180 for (int j = 0; j < pModelData->getPropertyCount(); j++)
182 sprintf(buf,"Type: %s Value: %s<br>", (pModelData->getPropertyName(j)).c_str(), (pModelData->getPropertyValue(j)).c_str());
185 m_ThreadContext.log = log;
186 ecore_main_loop_thread_safe_call_sync((void *(*)(void *))updateCallbackLog, &m_ThreadContext);
190 return OIC::SSM_S_OK;
194 CQueryEngineEvent *g_pQueryEngineEvent = NULL;
198 win_delete_request_cb(void *data , Evas_Object *obj , void *event_info)
204 win_back_cb(void *data, Evas_Object *obj, void *event_info)
206 //appdata_s *ad = (appdata_s *)data;
207 /* Let window go to hide state. */
208 //elm_win_lower(ad->win);
214 register_cb(void *data , Evas_Object *obj , void *event_info)
216 appdata_s *ad = (appdata_s *)data;
217 const char *main_text = NULL;
218 char *escaped_text = NULL;
221 main_text = elm_entry_entry_get(ad->query_text);
222 if (!main_text || (strlen(main_text) == 0))
225 //invoke registerQuery
229 escaped_text = strdup(main_text);
230 unescape(escaped_text);
232 dlog_print(DLOG_ERROR,LOG_TAG,"registering query");
234 OIC::SSMRESULT res = OIC::RegisterQuery(escaped_text, g_pQueryEngineEvent, qid);
235 if(res == OIC::SSM_S_OK)
237 updateLog(ad, "The query has been registered!<br>");
238 sprintf(log, "QID : %d<br>", qid);
243 sprintf(log,"Error occured(%d)<br>", res);
249 dlog_print(DLOG_ERROR,LOG_TAG,"registering query done");
253 search_devices_cb(void *data , Evas_Object *obj , void *event_info)
255 appdata_s *ad = (appdata_s *)data;
256 elm_entry_entry_set(ad->query_text, "subscribe Device if Device.dataId > 0");
260 discomfort_index_cb(void *data , Evas_Object *obj , void *event_info)
262 appdata_s *ad = (appdata_s *)data;
263 elm_entry_entry_set(ad->query_text, "subscribe Device.DiscomfortIndexSensor "\
264 "if Device.DiscomfortIndexSensor.discomfortIndex != 0");
268 minus_cb(void *data , Evas_Object *obj , void *event_info)
270 appdata_s *ad = (appdata_s *)data;
272 const char *query_id_str = elm_entry_entry_get(ad->unregister_query_id);
273 if (!query_id_str || (strlen(query_id_str) == 0))
276 int val = atoi(query_id_str);
277 sprintf(output,"%d",val-1);
278 elm_entry_entry_set(ad->unregister_query_id,output);
281 dlog_print(DLOG_ERROR,LOG_TAG,"#### atoi() conversion error");
286 plus_cb(void *data , Evas_Object *obj , void *event_info)
288 appdata_s *ad = (appdata_s *)data;
290 const char *query_id_str = elm_entry_entry_get(ad->unregister_query_id);
291 if (!query_id_str || (strlen(query_id_str) == 0))
294 int val = atoi(query_id_str);
295 sprintf(output,"%d",val+1);
296 elm_entry_entry_set(ad->unregister_query_id,output);
299 dlog_print(DLOG_ERROR,LOG_TAG,"#### atoi() conversion error");
304 unregister_cb(void *data , Evas_Object *obj , void *event_info)
306 appdata_s *ad = (appdata_s *)data;
307 const char *qidstr = NULL;
308 if (!ad->unregister_query_id)
310 qidstr = elm_entry_entry_get(ad->unregister_query_id);
311 if (!qidstr || (strlen(qidstr) == 0))
317 //invoke unregisterQuery
318 OIC::SSMRESULT res = OIC::UnregisterQuery(qid);
319 if(res == OIC::SSM_S_OK)
321 updateLog(ad, "The query has been unregistered!<br>");
322 sprintf(log, "QID : %d<br>", qid);
327 sprintf(log,"Error occured(%d)<br>", res);
332 dlog_print(DLOG_ERROR,LOG_TAG,"#### atoi() conversion error");
337 clear_log_cb(void *data , Evas_Object *obj , void *event_info)
339 appdata_s *ad = (appdata_s *)data;
340 elm_entry_entry_set(ad->log,"");
344 clear_cb(void *data , Evas_Object *obj , void *event_info)
346 appdata_s *ad = (appdata_s *)data;
347 elm_entry_entry_set(ad->query_text,"");
352 bool isConnected = false;
354 static connection_h connection;
356 if(connection_create(&connection) == CONNECTION_ERROR_NONE)
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)
370 create_base_gui(appdata_s *ad)
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);
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);
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);
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);
392 ad->naviframe = elm_naviframe_add(ad->conform);
393 elm_object_content_set(ad->conform,ad->naviframe);
394 evas_object_show(ad->naviframe);
397 ad->scroller = elm_scroller_add(ad->naviframe);
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);
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");
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
510 //Show window after base gui is set up
511 evas_object_show(ad->win);
515 app_create(void *data)
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;
523 std::string xmlDescription = "<SSMCore>"
525 "<UDN>abcde123-31f8-11b4-a222-08002b34c050</UDN>"
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>"
535 g_pQueryEngineEvent = new CQueryEngineEvent(ad);
541 if (OIC::InitializeSSM(xmlDescription) == OIC::SSM_S_OK){
542 dlog_print(DLOG_DEBUG, LOG_TAG, "#### InitializeSSM() returned SSM_S_OK");
545 dlog_print(DLOG_DEBUG, LOG_TAG, "#### InitializeSSM() failed");
550 updateLog(ad, "WiFi not connected, connect first and re-run application");
558 app_control(app_control_h app_control, void *data)
560 /* Handle the launch request. */
561 dlog_print(DLOG_INFO,LOG_TAG,"#### in app_control");
565 app_pause(void *data)
567 /* Take necessary actions when application becomes invisible. */
568 dlog_print(DLOG_INFO,LOG_TAG,"#### in app_pause");
572 app_resume(void *data)
574 /* Take necessary actions when application becomes visible. */
575 dlog_print(DLOG_INFO,LOG_TAG,"#### in app_resume");
579 app_terminate(void *data)
581 /* Release all resources. */
582 dlog_print(DLOG_INFO,LOG_TAG,"#### in app_terminate");
584 if (OIC::TerminateSSM() == OIC::SSM_S_OK){
585 dlog_print(DLOG_DEBUG, LOG_TAG, "#### TerminateSSM() returned SSM_S_OK");
588 dlog_print(DLOG_DEBUG, LOG_TAG, "#### TerminateSSM() failed");
591 delete g_pQueryEngineEvent;
595 ui_app_lang_changed(app_event_info_h event_info, void *user_data)
597 /*APP_EVENT_LANGUAGE_CHANGED*/
599 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
600 elm_language_set(locale);
606 ui_app_orient_changed(app_event_info_h event_info, void *user_data)
608 /*APP_EVENT_DEVICE_ORIENTATION_CHANGED*/
609 dlog_print(DLOG_INFO,LOG_TAG,"#### app orient changed");
614 ui_app_region_changed(app_event_info_h event_info, void *user_data)
616 /*APP_EVENT_REGION_FORMAT_CHANGED*/
620 ui_app_low_battery(app_event_info_h event_info, void *user_data)
622 /*APP_EVENT_LOW_BATTERY*/
626 ui_app_low_memory(app_event_info_h event_info, void *user_data)
628 /*APP_EVENT_LOW_MEMORY*/
632 main(int argc, char *argv[])
637 ui_app_lifecycle_callback_s event_callback = {0,};
638 app_event_handler_h handlers[5] = {NULL, };
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;
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]);
653 ret = ui_app_main(argc, argv, &event_callback, &ad);
655 if (ret != APP_ERROR_NONE) {
656 dlog_print(DLOG_ERROR, LOG_TAG, "app_main() is failed. err = %d", ret);