nikawhite pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=9cb767792cfa6d9ca2681fd0e4e85f5e869f78db
commit 9cb767792cfa6d9ca2681fd0e4e85f5e869f78db Author: Mykyta Biliavskyi <m.biliavs...@samsung.com> Date: Tue Aug 9 17:46:15 2016 +0300 Project manager: add submodule project_manager_export_edc. New submodule works on exporting current project to edc format. Based on Ecore_Thread. --- src/bin/Makefile.am | 1 + src/bin/project_manager/project_manager.c | 108 +++-------------- .../project_manager/project_manager_export_edc.c | 131 +++++++++++++++++++++ src/bin/project_manager/project_manager_private.h | 15 +++ 4 files changed, 165 insertions(+), 90 deletions(-) diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index ee69ca8..ae766c2 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -69,6 +69,7 @@ libete_a_SOURCES = \ ../../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/project_manager_export_edc.c \ ../../src/bin/project_manager/resource_manager.c \ ../../src/bin/logger/logger.c \ ../../src/bin/config/config.c \ diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index 39b6cae..a2ce354 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -208,7 +208,7 @@ _ecore_exe_edje_exe(void *data) return NULL; } -static Eina_Bool +Eina_Bool _build_script_write(const char *path) { FILE *f; @@ -864,7 +864,7 @@ pm_project_resource_export(Project *pro __UNUSED__, const char* dir_path __UNUSE return false; } -static void +void _external_resources_export(Eina_List *resources, const char *dst) { Eina_Strbuf *buf; @@ -1041,84 +1041,6 @@ pm_group_source_code_export(Project *project, } } -static Eina_Bool -_project_src_export(const char *path) -{ - char *code; - Eina_Strbuf *buf; - FILE *f; - - buf = eina_strbuf_new(); - /* create a folder for collect the source files */ - ecore_file_mkdir(path); - eina_strbuf_reset(buf); - - /* create and open edc file for print the source code of collection (project) */ - eina_strbuf_append_printf(buf, "%s/generated.edc", path); - f = fopen(eina_strbuf_string_get(buf), "w"); - if (!f) - { - ERR("Could't open file '%s'", eina_strbuf_string_get(buf)) - return false; - } - eina_strbuf_reset(buf); - - /* get the full source code of given project */ - THREAD_CONTEXT_SWITCH_BEGIN; - code = edje_edit_full_source_generate(worker.project->global_object); - THREAD_CONTEXT_SWITCH_END; - - fputs(code, f); - free(code); - if (f) fclose(f); - - /* export resource */ - if (worker.project->images) - { - eina_strbuf_append_printf(buf, "%s/images/", path); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - _external_resources_export(worker.project->images, eina_strbuf_string_get(buf)); - eina_strbuf_reset(buf); - } - if (worker.project->sounds) - { - eina_strbuf_append_printf(buf, "%s/sounds/", path); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - _external_resources_export(worker.project->sounds, eina_strbuf_string_get(buf)); - eina_strbuf_reset(buf); - } - if (worker.project->fonts) - { - eina_strbuf_append_printf(buf, "%s/fonts/", path); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - _external_resources_export(worker.project->fonts, eina_strbuf_string_get(buf)); - eina_strbuf_reset(buf); - } - - eina_strbuf_reset(buf); - eina_strbuf_append_printf(buf, "%s/build.sh", path); - _build_script_write(eina_strbuf_string_get(buf)); - - eina_strbuf_free(buf); - return true; -} - -static void * -_source_code_export(void *data __UNUSED__, Eina_Thread *thread __UNUSED__) -{ - Eina_Strbuf *buf; - - PROGRESS_SEND(_("Generate source code ...")); - buf = eina_strbuf_new(); - eina_strbuf_append_printf(buf, "%s/%s", worker.path, worker.project->name); - if (_project_src_export(eina_strbuf_string_get(buf))) - END_SEND(PM_PROJECT_SUCCESS) - else - END_SEND(PM_PROJECT_ERROR) - eina_strbuf_free(buf); - return NULL; -} - void pm_project_source_code_export(Project *project, const char *path, @@ -1129,15 +1051,21 @@ pm_project_source_code_export(Project *project, assert(project != NULL); assert(path != NULL); - WORKER_CREATE(func_progress, func_end, data, project, - NULL, path, NULL, NULL, data, NULL); + Project_Thread *ptd; + ptd = mem_calloc(1, sizeof(Project_Thread)); + ptd->path = eina_stringshare_add(path); + ptd->project = project; + ptd->func_progress = func_progress; + ptd->func_end = func_end; + ptd->data = (void *)data; + eina_lock_new(&ptd->mutex); + + ecore_thread_feedback_run(_project_source_code_export_feedback_job, + _project_source_code_export_feedback_cb, + _project_source_code_export_end_cb, + _project_source_code_export_cancel_cb, ptd, + true); - if (!eina_thread_create(&worker.thread, EINA_THREAD_URGENT, -1, - (void *)_source_code_export, NULL)) - { - ERR("System error: can't create thread"); - abort(); - } } static void * @@ -1154,11 +1082,12 @@ _release_export(void *data __UNUSED__, PROGRESS_SEND(_("Export to file '%s'"), worker.edj); eina_file_mkdtemp("eflete_build_XXXXXX", &tmp_dirname); - if (!_project_src_export(tmp_dirname)) +/* if (!_project_src_export(tmp_dirname)) { END_SEND(PM_PROJECT_ERROR) goto exit0; } + */ if (worker.func_progress) { cb_msg_stdout = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, _exe_data, NULL); @@ -1196,7 +1125,6 @@ _release_export(void *data __UNUSED__, exit1: eina_strbuf_free(cmd); -exit0: ecore_file_recursive_rm(tmp_dirname); eina_tmpstr_del(tmp_dirname); return NULL; diff --git a/src/bin/project_manager/project_manager_export_edc.c b/src/bin/project_manager/project_manager_export_edc.c new file mode 100644 index 0000000..145958c --- /dev/null +++ b/src/bin/project_manager/project_manager_export_edc.c @@ -0,0 +1,131 @@ +/* + * 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" + +/* Export source from a single group */ + +void +_project_source_code_export_cancel_cb(void *data, Ecore_Thread *th __UNUSED__) +{ + Project_Thread *ptd = (Project_Thread *)data; + ptd->result = PM_PROJECT_ERROR; + _end_send(ptd); +} + +void +_project_source_code_export_end_cb(void *data, + Ecore_Thread *th __UNUSED__) +{ + Project_Thread *ptd = (Project_Thread *)data; + ptd->result = PM_PROJECT_SUCCESS; + _end_send(ptd); +} + +void +_project_source_code_export_feedback_cb(void *data, + Ecore_Thread *th __UNUSED__, + void *msg_data) +{ + Project_Thread *ptd = (Project_Thread *)data; + Eina_Stringshare *message = (Eina_Stringshare *)msg_data; + assert(message != NULL); + + ptd->func_progress(NULL, message); + eina_stringshare_del(message); +} + +void +_project_source_code_export_feedback_job(void *data, Ecore_Thread *th) +{ + Project_Thread *ptd = (Project_Thread *)data; + if (!eina_lock_take(&ptd->mutex)) + { + ERR("Failed access data"); + ecore_thread_cancel(th); + return; + } + + Eina_Stringshare *message = eina_stringshare_printf(_("Generate source code ...")); + ecore_thread_feedback(th, message); + + Eina_Stringshare *path = eina_stringshare_printf("%s/%s", ptd->path, ptd->project->name); + + char *code; + Eina_Strbuf *buf; + FILE *f; + + buf = eina_strbuf_new(); + /* create a folder for collect the source files */ + ecore_file_mkdir(path); + eina_strbuf_reset(buf); + + /* create and open edc file for print the source code of collection (project) */ + eina_strbuf_append_printf(buf, "%s/generated.edc", path); + f = fopen(eina_strbuf_string_get(buf), "w"); + if (!f) + { + ERR("Could't open file '%s'", eina_strbuf_string_get(buf)); + eina_strbuf_free(buf); + eina_lock_release(&ptd->mutex); + ecore_thread_cancel(th); + return; + } + eina_strbuf_reset(buf); + + /* get the full source code of given project */ + TODO("Move this into thread, because it is really laggy"); + ecore_thread_main_loop_begin(); + code = edje_edit_full_source_generate(ptd->project->global_object); + ecore_thread_main_loop_end(); + + fputs(code, f); + free(code); + if (f) fclose(f); + + /* export resource */ + if (ptd->project->images) + { + eina_strbuf_append_printf(buf, "%s/images/", path); + ecore_file_mkdir(eina_strbuf_string_get(buf)); + _external_resources_export(ptd->project->images, eina_strbuf_string_get(buf)); + eina_strbuf_reset(buf); + } + if (ptd->project->sounds) + { + eina_strbuf_append_printf(buf, "%s/sounds/", path); + ecore_file_mkdir(eina_strbuf_string_get(buf)); + _external_resources_export(ptd->project->sounds, eina_strbuf_string_get(buf)); + eina_strbuf_reset(buf); + } + if (ptd->project->fonts) + { + eina_strbuf_append_printf(buf, "%s/fonts/", path); + ecore_file_mkdir(eina_strbuf_string_get(buf)); + _external_resources_export(ptd->project->fonts, eina_strbuf_string_get(buf)); + eina_strbuf_reset(buf); + } + + eina_strbuf_reset(buf); + eina_strbuf_append_printf(buf, "%s/build.sh", path); + _build_script_write(eina_strbuf_string_get(buf)); + + eina_strbuf_free(buf); + eina_lock_release(&ptd->mutex); +} diff --git a/src/bin/project_manager/project_manager_private.h b/src/bin/project_manager/project_manager_private.h index 451b2b1..53dd9a3 100644 --- a/src/bin/project_manager/project_manager_private.h +++ b/src/bin/project_manager/project_manager_private.h @@ -162,6 +162,16 @@ void _copy_meta_data_to_pro(Project_Thread *ptd); */ Project *_project_files_create(Project_Thread *ptd); +/* Export all items inside list resources into files. + * Exported files will be storet on dst destination + */ +void _external_resources_export(Eina_List *resources, const char *dst); + +/* Prepare build.sh script, that contanin + * instructions howto compile edc source back to edj file + */ +Eina_Bool _build_script_write(const char *path); + /*------- Group tree load functions ---------*/ void _gm_group_load_cancel_cb(void *data, Ecore_Thread *th); void _gm_group_load_end_cb(void *data, Ecore_Thread *th); @@ -190,4 +200,9 @@ void _project_import_edj(void *data); /*------- Import form edc functions -----*/ void _project_import_edc(Project_Thread *ptd); +/*------- Export source -----------------*/ +void _project_source_code_export_cancel_cb(void *data, Ecore_Thread *th); +void _project_source_code_export_end_cb(void *data, Ecore_Thread *th); +void _project_source_code_export_feedback_cb(void *data, Ecore_Thread *th, void *msg_data); +void _project_source_code_export_feedback_job(void *data, Ecore_Thread *th); #endif --