nikawhite pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=d38cb1ebc1e095737528acc9767f2b4ed286ab66
commit d38cb1ebc1e095737528acc9767f2b4ed286ab66 Author: Mykyta Biliavskyi <m.biliavs...@samsung.com> Date: Tue Aug 9 16:43:00 2016 +0300 Project manager: add submodule project_manager_import_edc. New submodule response to import edc project into Eflete. Used ecore_exe_pipe with monitoring returned status from edje_cc app. --- src/bin/Makefile.am | 1 + src/bin/project_manager/project_manager.c | 81 +++------------- .../project_manager/project_manager_import_edc.c | 102 +++++++++++++++++++++ src/bin/project_manager/project_manager_private.h | 6 +- 4 files changed, 117 insertions(+), 73 deletions(-) diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index f8cb0cd..ee69ca8 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -67,6 +67,7 @@ libete_a_SOURCES = \ ../../src/bin/project_manager/project_manager.c \ ../../src/bin/project_manager/project_manager_open.c \ ../../src/bin/project_manager/project_manager_import_edj.c \ +../../src/bin/project_manager/project_manager_import_edc.c \ ../../src/bin/project_manager/project_manager_export_resources.c \ ../../src/bin/project_manager/resource_manager.c \ ../../src/bin/logger/logger.c \ diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index 1d853d0..6a93791 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -558,68 +558,6 @@ _exe_data(void *data __UNUSED__, return ECORE_CALLBACK_PASS_ON; } -static void * -_project_import_edc(void *data, - Eina_Thread *thread __UNUSED__) -{ -// Eina_Bool send_end_child; - Eina_Bool send_end = (data) ? (*(Eina_Bool *)data) : true; - - Eina_Tmpstr *tmp_dirname; - Ecore_Event_Handler *cb_msg_stdout = NULL, - *cb_msg_stderr = NULL; - int edje_cc_res = 0, waitpid_res = 0; - - PROGRESS_SEND(_("Start import '%s' file as new project"), worker.edc); - PROGRESS_SEND(_("Creating a specifiec file and folders")); - if (worker.func_progress) - { - cb_msg_stdout = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _exe_data, NULL); - cb_msg_stderr = ecore_event_handler_add(ECORE_EXE_EVENT_ERROR, _exe_data, NULL); - } - eina_file_mkdtemp("eflete_build_XXXXXX", &tmp_dirname); - worker.edj = eina_stringshare_printf("%s/out.edj", tmp_dirname); - Edje_Exe_Data *edje_cc_data = mem_malloc(sizeof(Edje_Exe_Data)); - edje_cc_data->cmd = eina_stringshare_printf("edje_cc -v %s %s %s", - worker.edc, - worker.edj, - worker.build_options); - edje_cc_data->flags = ECORE_EXE_PIPE_READ | - ECORE_EXE_PIPE_READ_LINE_BUFFERED | - ECORE_EXE_PIPE_ERROR | - ECORE_EXE_PIPE_ERROR_LINE_BUFFERED; - THREAD_TESTCANCEL; - ecore_main_loop_thread_safe_call_sync(_ecore_exe_edje_exe, edje_cc_data); - THREAD_TESTCANCEL; - waitpid_res = waitpid(edje_cc_data->exe_pid, &edje_cc_res, 0); - eina_stringshare_del(edje_cc_data->cmd); - free(edje_cc_data); - if (worker.func_progress) - { - ecore_event_handler_del(cb_msg_stdout); - ecore_event_handler_del(cb_msg_stderr); - } - - if ((waitpid_res == -1) || - (WIFEXITED(edje_cc_res) && (WEXITSTATUS(edje_cc_res) != 0 ))) - { - END_SEND(PM_PROJECT_ERROR); - return NULL; - } - -// send_end_child = false; -// _project_import_edj(&send_end_child, NULL); - - PROGRESS_SEND(_("Removing temporary files...")); - ecore_file_recursive_rm(tmp_dirname); - eina_tmpstr_del(tmp_dirname); - PROGRESS_SEND(_("Done.")); - - if (send_end) END_SEND(PM_PROJECT_SUCCESS) - - return NULL; -} - void pm_project_import_edc(const char *name, const char *path, @@ -633,15 +571,18 @@ pm_project_import_edc(const char *name, assert(path != NULL); assert(edc != NULL); - WORKER_CREATE(func_progress, func_end, data, NULL, - name, path, NULL, edc, import_options, NULL); + Project_Thread *ptd; + ptd = mem_calloc(1, sizeof(Project_Thread)); + ptd->func_progress = func_progress; + ptd->func_end = func_end; + ptd->data = (void *)data; + ptd->result = PM_PROJECT_LAST; + ptd->name = eina_stringshare_add(name); + ptd->path = eina_stringshare_add(path); + ptd->edc = eina_stringshare_add(edc); + ptd->build_options = eina_stringshare_add(import_options); - if (!eina_thread_create(&worker.thread, EINA_THREAD_URGENT, -1, - (void *)_project_import_edc, NULL)) - { - ERR("System error: can't create thread"); - abort(); - } + _project_import_edc(ptd); } Eina_Bool diff --git a/src/bin/project_manager/project_manager_import_edc.c b/src/bin/project_manager/project_manager_import_edc.c new file mode 100644 index 0000000..88434bb --- /dev/null +++ b/src/bin/project_manager/project_manager_import_edc.c @@ -0,0 +1,102 @@ +/* + * Efl Edje Theme Editor + * Copyright (C) 2013-2016 Samsung Electronics. + * + * This file is part of Edje Theme Editor. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; If not, see www.gnu.org/licenses/lgpl.html. + */ +#include "project_manager.h" +#include "project_manager_private.h" + + +static Eina_Bool +_data_from_edje_cc(void *data __UNUSED__, + int type __UNUSED__, + void *event_info) +{ + int i = 0; + Ecore_Exe_Event_Data *edje_cc_msg = (Ecore_Exe_Event_Data *)event_info; + Edje_Exe_Data *edje_cc_data = (Edje_Exe_Data*)data; + Project_Thread *ptd = (Project_Thread *)edje_cc_data->data; + if (!edje_cc_msg) return ECORE_CALLBACK_DONE; + + for (i = 0; edje_cc_msg->lines[i].line != NULL; i++) + ptd->func_progress(NULL, edje_cc_msg->lines[i].line); + + return ECORE_CALLBACK_DONE; +} + +static Eina_Bool +_finish_from_edje_cc(void *data, + int type __UNUSED__, + void *event_info __UNUSED__) +{ + Edje_Exe_Data *edje_cc_data = (Edje_Exe_Data *)data; + Project_Thread *ptd = (Project_Thread *)edje_cc_data->data; + Ecore_Exe_Event_Del *edje_cc_exit = (Ecore_Exe_Event_Del *)event_info; + + eina_stringshare_del(edje_cc_data->cmd); + free(edje_cc_data); + if (edje_cc_exit->exit_code != 0) + { + ptd->result = PM_PROJECT_ERROR; + _end_send(ptd); + return ECORE_CALLBACK_DONE; + } + + if (ptd->func_progress) + { + Eina_Stringshare *msg = eina_stringshare_printf(_("Data for importing prepared")); + ptd->func_progress(NULL, msg); + eina_stringshare_del(msg); + } + + _project_import_edj(ptd); + + return ECORE_CALLBACK_DONE; +} + +void +_project_import_edc(Project_Thread *ptd) +{ + assert(ptd != NULL); + + Eina_Stringshare *msg = eina_stringshare_printf(_("Start import '%s' file as new project"), ptd->edc); + ptd->func_progress(NULL, msg); + eina_stringshare_del(msg); + + eina_file_mkdtemp("eflete_build_XXXXXX", &ptd->tmp_dirname); + ptd->edj = eina_stringshare_printf("%s/out.edj", ptd->tmp_dirname); + Edje_Exe_Data *edje_cc_data = mem_malloc(sizeof(Edje_Exe_Data)); + edje_cc_data->cmd = eina_stringshare_printf("edje_cc -v %s %s %s", + ptd->edc, + ptd->edj, + ptd->build_options); + edje_cc_data->flags = ECORE_EXE_PIPE_READ | + ECORE_EXE_PIPE_READ_LINE_BUFFERED | + ECORE_EXE_PIPE_ERROR | + ECORE_EXE_PIPE_ERROR_LINE_BUFFERED; + edje_cc_data->data = (void *)ptd; + + edje_cc_data->exe_cmd = ecore_exe_pipe_run(edje_cc_data->cmd, edje_cc_data->flags, NULL); + edje_cc_data->exe_pid = ecore_exe_pid_get(edje_cc_data->exe_cmd); + + ptd->data_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _data_from_edje_cc, edje_cc_data); + ptd->error_handler = ecore_event_handler_add(ECORE_EXE_EVENT_ERROR, _data_from_edje_cc, edje_cc_data); + ptd->del_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _finish_from_edje_cc, edje_cc_data); + + + return; +} + diff --git a/src/bin/project_manager/project_manager_private.h b/src/bin/project_manager/project_manager_private.h index 425c5fa..db642cc 100644 --- a/src/bin/project_manager/project_manager_private.h +++ b/src/bin/project_manager/project_manager_private.h @@ -180,14 +180,14 @@ void _resources_export_cancel_cb(void *data, Ecore_Thread *th); /*------- Open Project functions --------*/ void _project_open_cancel_cb(void *data, Ecore_Thread *th); - void _project_open_end_cb(void *data, Ecore_Thread *th); - void _project_open_feedback_cb(void *data, Ecore_Thread *th, void *msg_data); - void _project_open_feedback_job(void *data, Ecore_Thread *th); /*------- Import form edj functions -----*/ void _project_import_edj(void *data); +/*------- Import form edc functions -----*/ +void _project_import_edc(Project_Thread *ptd); + #endif --