diff options
Diffstat (limited to 'src/ui/popup-bin/popup.cpp')
-rw-r--r-- | src/ui/popup-bin/popup.cpp | 448 |
1 files changed, 216 insertions, 232 deletions
diff --git a/src/ui/popup-bin/popup.cpp b/src/ui/popup-bin/popup.cpp index b9381af..b3256b1 100644 --- a/src/ui/popup-bin/popup.cpp +++ b/src/ui/popup-bin/popup.cpp @@ -41,171 +41,162 @@ using namespace CCHECKER::UI; namespace { // anonymous -void on_done(void) { - // Quit the efl-mainloop - LogDebug("elm_exit()"); - elm_exit(); +void on_done(void) +{ + // Quit the efl-mainloop + LogDebug("elm_exit()"); + elm_exit(); } -void keep_answer(void *data, Evas_Object * /* obj */, void * /* event_info */) { +void keep_answer(void *data, Evas_Object * /* obj */, void * /* event_info */) +{ + LogDebug("keep_answer"); + + if (NULL == data) { + LogError("data is NULL; return"); + return; + } - LogDebug("keep_answer"); - if(NULL == data){ - LogError("data is NULL; return"); - return; - } - struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *> (data); - pdp->result = response_e::DONT_UNINSTALL; + struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *>(data); - on_done(); + pdp->result = response_e::DONT_UNINSTALL; + + on_done(); } -void uninstall_answer(void *data, Evas_Object * /* obj */, void * /* event_info */) { +void uninstall_answer(void *data, Evas_Object * /* obj */, void * /* event_info */) +{ + LogDebug("uninstall_answer"); - LogDebug("uninstall_answer"); - if(NULL == data){ - LogError("data is NULL; return"); - return; - } - struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *> (data); - pdp->result = response_e::UNINSTALL; + if (NULL == data) { + LogError("data is NULL; return"); + return; + } - on_done(); -} + struct cert_checker_popup_data *pdp = static_cast <struct cert_checker_popup_data *>(data); -void show_popup(struct cert_checker_popup_data *pdp) { - LogDebug("show_popup()"); - - if(NULL == pdp){ - LogError("pdp is NULL; return"); - return; - } - - pdp->win = elm_win_add(NULL, - dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED"), - ELM_WIN_NOTIFICATION); - - elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); - elm_win_autodel_set(pdp->win, EINA_TRUE); - evas_object_show(pdp->win); - elm_win_indicator_opacity_set(pdp->win, ELM_WIN_INDICATOR_TRANSLUCENT); - - pdp->popup = elm_popup_add(pdp->win); - - pdp->box = elm_box_add(pdp->popup); - evas_object_size_hint_weight_set(pdp->box, EVAS_HINT_EXPAND, 0); - evas_object_size_hint_align_set(pdp->box, EVAS_HINT_FILL, 0.0); - - pdp->title = elm_label_add(pdp->popup); - elm_object_style_set(pdp->title, "elm.text.title"); - elm_object_text_set(pdp->title, dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED")); - evas_object_show(pdp->title); - elm_box_pack_end(pdp->box, pdp->title); - - pdp->content = elm_label_add(pdp->popup); - elm_object_style_set(pdp->content, "elm.swallow.content"); - elm_label_line_wrap_set(pdp->content, ELM_WRAP_MIXED); - - char *buff = NULL; - int ret; - - // Set message - // App ID may be absent, so in that case we need to use only package ID - if (pdp->app_id == std::string(CCHECKER::TEMP_APP_ID)) { - char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_PACKAGE VERIFICATION_FAILED"); - ret = asprintf(&buff, content, pdp->pkg_id.c_str()); - } - else { - char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_VERIFICATION_FAILED"); - ret = asprintf(&buff, content, pdp->app_id.c_str(), pdp->pkg_id.c_str()); - } - - if(-1 == ret){ - LogError("asprintf failed - returned -1"); - evas_object_del(pdp->content); - evas_object_del(pdp->popup); - evas_object_del(pdp->win); - return; - } - elm_object_text_set(pdp->content, buff); - LogDebug("Popup label: " << buff); - free(buff); - evas_object_size_hint_weight_set(pdp->content, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(pdp->content, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(pdp->content); - elm_box_pack_end(pdp->box, pdp->content); - - elm_object_part_content_set(pdp->popup, "default", pdp->box); - - pdp->keep_button = elm_button_add(pdp->popup); - elm_object_style_set(pdp->keep_button, "elm.swallow.content.button1"); - elm_object_text_set(pdp->keep_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_KEEP_APP")); - elm_object_part_content_set(pdp->popup, "button1", pdp->keep_button); - evas_object_smart_callback_add(pdp->keep_button, "clicked", keep_answer, pdp); - - pdp->uninstall_button = elm_button_add(pdp->popup); - elm_object_style_set(pdp->uninstall_button, "elm.swallow.content.button2"); - elm_object_text_set(pdp->uninstall_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_UNINSTALL_APP")); - elm_object_part_content_set(pdp->popup, "button2 ", pdp->uninstall_button); - evas_object_smart_callback_add(pdp->uninstall_button, "clicked", uninstall_answer, pdp); - - evas_object_show(pdp->popup); - - // Showing the popup window - evas_object_show(pdp->win); - - // Run the efl mainloop - elm_run(); - - // Shutdown elementary - LogDebug("elm_shutdown()"); - elm_shutdown(); + pdp->result = response_e::UNINSTALL; + + on_done(); } -static int wait_for_parent_info (int pipe_in) +void show_popup(struct cert_checker_popup_data *pdp) { - // wait for parameters from pipe_in - // timeout is set for 10 seconds - struct timeval timeout = {10L, 0L}; - fd_set readfds; - FD_ZERO(&readfds); - FD_SET(pipe_in, &readfds); - - int sel = select(pipe_in + 1, &readfds, NULL, NULL, &timeout); - if (sel == -1) { - int error = errno; - LogError("Cannot get info from parent. Exit popup"); - LogError("Error: " << CCHECKER::GetErrnoString(error)); - close(pipe_in); - return -1; - } - else if (sel == 0) { - LogError("Timeout reached! Exit popup - ERROR"); - close(pipe_in); - return -1; - } - return 0; + LogDebug("show_popup()"); + + if (NULL == pdp) { + LogError("pdp is NULL; return"); + return; + } + + pdp->win = elm_win_add(NULL, + dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED"), + ELM_WIN_NOTIFICATION); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + elm_win_autodel_set(pdp->win, EINA_TRUE); + evas_object_show(pdp->win); + elm_win_indicator_opacity_set(pdp->win, ELM_WIN_INDICATOR_TRANSLUCENT); + pdp->popup = elm_popup_add(pdp->win); + pdp->box = elm_box_add(pdp->popup); + evas_object_size_hint_weight_set(pdp->box, EVAS_HINT_EXPAND, 0); + evas_object_size_hint_align_set(pdp->box, EVAS_HINT_FILL, 0.0); + pdp->title = elm_label_add(pdp->popup); + elm_object_style_set(pdp->title, "elm.text.title"); + elm_object_text_set(pdp->title, dgettext(SERVICE_NAME, "SID_TITLE_OCSP_VERIFICATION_FAILED")); + evas_object_show(pdp->title); + elm_box_pack_end(pdp->box, pdp->title); + pdp->content = elm_label_add(pdp->popup); + elm_object_style_set(pdp->content, "elm.swallow.content"); + elm_label_line_wrap_set(pdp->content, ELM_WRAP_MIXED); + char *buff = NULL; + int ret; + + // Set message + // App ID may be absent, so in that case we need to use only package ID + if (pdp->app_id == std::string(CCHECKER::TEMP_APP_ID)) { + char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_PACKAGE VERIFICATION_FAILED"); + ret = asprintf(&buff, content, pdp->pkg_id.c_str()); + } else { + char *content = dgettext(SERVICE_NAME, "SID_CONTENT_OCSP_VERIFICATION_FAILED"); + ret = asprintf(&buff, content, pdp->app_id.c_str(), pdp->pkg_id.c_str()); + } + + if (-1 == ret) { + LogError("asprintf failed - returned -1"); + evas_object_del(pdp->content); + evas_object_del(pdp->popup); + evas_object_del(pdp->win); + return; + } + + elm_object_text_set(pdp->content, buff); + LogDebug("Popup label: " << buff); + free(buff); + evas_object_size_hint_weight_set(pdp->content, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(pdp->content, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(pdp->content); + elm_box_pack_end(pdp->box, pdp->content); + elm_object_part_content_set(pdp->popup, "default", pdp->box); + pdp->keep_button = elm_button_add(pdp->popup); + elm_object_style_set(pdp->keep_button, "elm.swallow.content.button1"); + elm_object_text_set(pdp->keep_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_KEEP_APP")); + elm_object_part_content_set(pdp->popup, "button1", pdp->keep_button); + evas_object_smart_callback_add(pdp->keep_button, "clicked", keep_answer, pdp); + pdp->uninstall_button = elm_button_add(pdp->popup); + elm_object_style_set(pdp->uninstall_button, "elm.swallow.content.button2"); + elm_object_text_set(pdp->uninstall_button, dgettext(SERVICE_NAME, "SID_BTN_OCSP_UNINSTALL_APP")); + elm_object_part_content_set(pdp->popup, "button2 ", pdp->uninstall_button); + evas_object_smart_callback_add(pdp->uninstall_button, "clicked", uninstall_answer, pdp); + evas_object_show(pdp->popup); + // Showing the popup window + evas_object_show(pdp->win); + // Run the efl mainloop + elm_run(); + // Shutdown elementary + LogDebug("elm_shutdown()"); + elm_shutdown(); } -void deserialize (cert_checker_popup_data *pdp, char *line, ssize_t line_length) +static int wait_for_parent_info(int pipe_in) { - BinaryStream stream; - stream.Write(line_length, static_cast <void *> (line)); - - std::string app_id; - std::string pkg_id; - - LogDebug("------- Deserialization -------"); - // Deserialization order: - // app_id, pkg_id - - CCHECKER::Deserialization::Deserialize(stream, app_id); - LogDebug("app_id : " << app_id.c_str()); - pdp->app_id = app_id.c_str(); + // wait for parameters from pipe_in + // timeout is set for 10 seconds + struct timeval timeout = {10L, 0L}; + fd_set readfds; + FD_ZERO(&readfds); + FD_SET(pipe_in, &readfds); + int sel = select(pipe_in + 1, &readfds, NULL, NULL, &timeout); + + if (sel == -1) { + int error = errno; + LogError("Cannot get info from parent. Exit popup"); + LogError("Error: " << CCHECKER::GetErrnoString(error)); + close(pipe_in); + return -1; + } else if (sel == 0) { + LogError("Timeout reached! Exit popup - ERROR"); + close(pipe_in); + return -1; + } + + return 0; +} - CCHECKER::Deserialization::Deserialize(stream, pkg_id); - LogDebug("pkg_id : " << pkg_id.c_str()); - pdp->pkg_id = pkg_id.c_str(); +void deserialize(cert_checker_popup_data *pdp, char *line, ssize_t line_length) +{ + BinaryStream stream; + stream.Write(line_length, static_cast <void *>(line)); + std::string app_id; + std::string pkg_id; + LogDebug("------- Deserialization -------"); + // Deserialization order: + // app_id, pkg_id + CCHECKER::Deserialization::Deserialize(stream, app_id); + LogDebug("app_id : " << app_id.c_str()); + pdp->app_id = app_id.c_str(); + CCHECKER::Deserialization::Deserialize(stream, pkg_id); + LogDebug("pkg_id : " << pkg_id.c_str()); + pdp->pkg_id = pkg_id.c_str(); } } // anonymous @@ -213,88 +204,81 @@ void deserialize (cert_checker_popup_data *pdp, char *line, ssize_t line_length) EAPI_MAIN int elm_main(int argc, char **argv) { - // int pipe_in and int pipe_out should be passed to Popup via args. - - // These parameters should be passed to Popup via pipe_in: - // std::string app_id - // std::string pkg_id - - struct cert_checker_popup_data pd; - struct cert_checker_popup_data *pdp = &pd; - - LogDebug("############################ popup binary ################################"); - - setlocale(LC_ALL, ""); - - if(argc < 3){ - LogError("To few args passed in exec to popup-bin - should be at least 3:"); - LogError("(binary-name, pipe_in, pipe_out)"); - LogError("return ERROR"); - return popup_status::EXIT_ERROR; - } - - LogDebug("Passed args: " << argv[0] <<", " << argv[1] << ", " << argv[2]); - - int pipe_in; - int pipe_out; - - // Parsing args (pipe_in, pipe_out) - if ( 0 == sscanf(argv[1], "%d", &pipe_in) ){ - LogError("Error while parsing pipe_in; return ERROR"); - return popup_status::EXIT_ERROR; - } - if ( 0 == sscanf(argv[2], "%d", &pipe_out) ){ - LogError("Error while parsing pipe_out; return ERROR"); - return popup_status::EXIT_ERROR; - } - LogDebug("Parsed pipes: IN: " << pipe_in <<", OUT: " << pipe_out); - - if (wait_for_parent_info(pipe_in) == -1) { - close(pipe_out); - return popup_status::EXIT_ERROR; - } - - int buff_size = 1024; - char line[buff_size]; - - ssize_t count = 0; - - do { - count = TEMP_FAILURE_RETRY(read(pipe_in, line, buff_size)); - } while (0 == count); - if(count < 0){ - int error = errno; - close(pipe_in); - close(pipe_out); - LogError("read returned a negative value (" << count <<")"); - LogError("error: " << CCHECKER::GetErrnoString(error)); - LogError("Exit popup - ERROR"); - return popup_status::EXIT_ERROR; - } - LogDebug("Read bytes : " << count); - close(pipe_in); // cleanup - - deserialize(pdp, line, count); - - pdp->result = response_e::RESPONSE_ERROR; - - show_popup(pdp); // Showing popup - - // sending validation_result to popup-runner - BinaryStream stream_out; - - LogDebug("pdp->result : " << pdp->result); - CCHECKER::Serialization::Serialize(stream_out, pdp->result); - if(-1 == TEMP_FAILURE_RETRY(write(pipe_out, stream_out.char_pointer(), stream_out.size()))){ - LogError("Write to pipe failed!"); - close(pipe_out); - return popup_status::EXIT_ERROR; - } - - close(pipe_out); - - LogDebug("############################ /popup binary ################################"); - LogDebug("Return: " << popup_status::NO_ERROR); - return popup_status::NO_ERROR; + // int pipe_in and int pipe_out should be passed to Popup via args. + // These parameters should be passed to Popup via pipe_in: + // std::string app_id + // std::string pkg_id + struct cert_checker_popup_data pd; + struct cert_checker_popup_data *pdp = &pd; + LogDebug("############################ popup binary ################################"); + setlocale(LC_ALL, ""); + + if (argc < 3) { + LogError("To few args passed in exec to popup-bin - should be at least 3:"); + LogError("(binary-name, pipe_in, pipe_out)"); + LogError("return ERROR"); + return popup_status::EXIT_ERROR; + } + + LogDebug("Passed args: " << argv[0] << ", " << argv[1] << ", " << argv[2]); + int pipe_in; + int pipe_out; + + // Parsing args (pipe_in, pipe_out) + if (0 == sscanf(argv[1], "%d", &pipe_in)) { + LogError("Error while parsing pipe_in; return ERROR"); + return popup_status::EXIT_ERROR; + } + + if (0 == sscanf(argv[2], "%d", &pipe_out)) { + LogError("Error while parsing pipe_out; return ERROR"); + return popup_status::EXIT_ERROR; + } + + LogDebug("Parsed pipes: IN: " << pipe_in << ", OUT: " << pipe_out); + + if (wait_for_parent_info(pipe_in) == -1) { + close(pipe_out); + return popup_status::EXIT_ERROR; + } + + int buff_size = 1024; + char line[buff_size]; + ssize_t count = 0; + + do { + count = TEMP_FAILURE_RETRY(read(pipe_in, line, buff_size)); + } while (0 == count); + + if (count < 0) { + int error = errno; + close(pipe_in); + close(pipe_out); + LogError("read returned a negative value (" << count << ")"); + LogError("error: " << CCHECKER::GetErrnoString(error)); + LogError("Exit popup - ERROR"); + return popup_status::EXIT_ERROR; + } + + LogDebug("Read bytes : " << count); + close(pipe_in); // cleanup + deserialize(pdp, line, count); + pdp->result = response_e::RESPONSE_ERROR; + show_popup(pdp); // Showing popup + // sending validation_result to popup-runner + BinaryStream stream_out; + LogDebug("pdp->result : " << pdp->result); + CCHECKER::Serialization::Serialize(stream_out, pdp->result); + + if (-1 == TEMP_FAILURE_RETRY(write(pipe_out, stream_out.char_pointer(), stream_out.size()))) { + LogError("Write to pipe failed!"); + close(pipe_out); + return popup_status::EXIT_ERROR; + } + + close(pipe_out); + LogDebug("############################ /popup binary ################################"); + LogDebug("Return: " << popup_status::NO_ERROR); + return popup_status::NO_ERROR; } ELM_MAIN() |