nikawhite pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=2dae2c31b5e50c432fc21cdd0a6a71b870bacd89
commit 2dae2c31b5e50c432fc21cdd0a6a71b870bacd89 Author: Mykyta Biliavskyi <m.biliavs...@samsung.com> Date: Tue Aug 9 18:04:37 2016 +0300 Project manager: update functionality for export group source. Moved to use Ecore_Thread. --- src/bin/project_manager/project_manager.c | 124 ++-------------- .../project_manager/project_manager_export_edc.c | 160 ++++++++++++++++++++- src/bin/project_manager/project_manager_private.h | 12 +- 3 files changed, 184 insertions(+), 112 deletions(-) diff --git a/src/bin/project_manager/project_manager.c b/src/bin/project_manager/project_manager.c index a2ce354..75d9857 100644 --- a/src/bin/project_manager/project_manager.c +++ b/src/bin/project_manager/project_manager.c @@ -889,7 +889,7 @@ _external_resources_export(Eina_List *resources, const char *dst) eina_strbuf_free(buf); } -static void +void _external_resource_export(Eina_List *resources, Eina_Stringshare *name, const char *dst) { Eina_Strbuf *buf; @@ -917,107 +917,6 @@ _external_resource_export(Eina_List *resources, Eina_Stringshare *name, const ch eina_strbuf_free(buf); } -static void * -_group_source_code_export(void *data, Eina_Thread *thread __UNUSED__) -{ - Eina_Stringshare *code; - FILE *f; - Group *group = (Group *)data; - Part *part; - State *state; - Eina_List *l, *ls; - Eina_Stringshare *resource; - Resource *res; - Eina_Strbuf *buf; - char *name; - - PROGRESS_SEND(_("Generate group '%s' source code ..."), group->name); - - name = strdup(group->name); - string_char_replace(name, '/', '_'); - buf = eina_strbuf_new(); - eina_strbuf_append_printf(buf, "%s/%s", worker.path, name); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - eina_strbuf_reset(buf); - - /* create and open file for collect the group source code */ - eina_strbuf_append_printf(buf, "%s/%s/generated.edc", worker.path, name); - f = fopen(eina_strbuf_string_get(buf), "w"); - if (!f) - { - ERR("Could't open file '%s'", eina_strbuf_string_get(buf)) - END_SEND(PM_PROJECT_ERROR); - goto exit; - } - - /* get the full source code of given project */ - THREAD_CONTEXT_SWITCH_BEGIN; - code = edje_edit_source_generate(group->edit_object); - THREAD_CONTEXT_SWITCH_END; - - fputs(code, f); - edje_edit_string_free(code); - fclose(f); - - /* export images and fonts in accordance with parts */ - EINA_LIST_FOREACH(group->parts, l, part) - { - if (part->type == EDJE_PART_TYPE_IMAGE) - { - PROGRESS_SEND(_("Export images ...")); - eina_strbuf_reset(buf); - eina_strbuf_append_printf(buf, "%s/%s/images/", worker.path, name); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - EINA_LIST_FOREACH(part->states, ls, state) - { - resource = edje_edit_state_image_get(group->edit_object, part->name, state->name, state->val); - PROGRESS_SEND(_("Export image '%s'"), resource); - _external_resource_export(worker.project->images, resource, eina_strbuf_string_get(buf)); - eina_stringshare_del(resource); - } - } - if (part->type == EDJE_PART_TYPE_TEXT) - { - PROGRESS_SEND(_("Export fonts ...")); - eina_strbuf_reset(buf); - eina_strbuf_append_printf(buf, "%s/%s/fonts/", worker.path, name); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - EINA_LIST_FOREACH(part->states, ls, state) - { - resource = edje_edit_state_font_get(group->edit_object, part->name, state->name, state->val); - Eina_Stringshare *font_res = edje_edit_font_path_get(group->edit_object, resource); - PROGRESS_SEND(_("Export font '%s'"), font_res); - _external_resource_export(worker.project->fonts, font_res, eina_strbuf_string_get(buf)); - eina_stringshare_del(resource); - eina_stringshare_del(font_res); - } - } - } - PROGRESS_SEND(_("Export sounds ...")); - EINA_LIST_FOREACH(group->programs, l, res) - { - resource = edje_edit_program_sample_name_get(group->edit_object, res->name); - if (!resource) continue; - - eina_strbuf_reset(buf); - eina_strbuf_append_printf(buf, "%s/%s/sounds/", worker.path, name); - ecore_file_mkdir(eina_strbuf_string_get(buf)); - PROGRESS_SEND(_("Export sound '%s'"), res->name); - _external_resource_export(worker.project->sounds, resource, eina_strbuf_string_get(buf)); - eina_stringshare_del(resource); - } - - eina_strbuf_reset(buf); - eina_strbuf_append_printf(buf, "%s/%s/build.sh", worker.path, name); - _build_script_write(eina_strbuf_string_get(buf)); - - END_SEND(PM_PROJECT_SUCCESS); -exit: - eina_strbuf_free(buf); - free(name); - return NULL; -} - void pm_group_source_code_export(Project *project, Group *group, @@ -1030,17 +929,22 @@ pm_group_source_code_export(Project *project, assert(group != 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; + ptd->group = group; + eina_lock_new(&ptd->mutex); - if (!eina_thread_create(&worker.thread, EINA_THREAD_URGENT, -1, - (void *)_group_source_code_export, (void *)group)) - { - ERR("System error: can't create thread"); - abort(); - } + ecore_thread_feedback_run(_group_source_code_export_feedback_job, _group_source_code_export_feedback_cb, + _group_source_code_export_end_cb, _group_source_code_export_cancel_cb, ptd, + true); } + void pm_project_source_code_export(Project *project, const char *path, diff --git a/src/bin/project_manager/project_manager_export_edc.c b/src/bin/project_manager/project_manager_export_edc.c index 145958c..7a9d831 100644 --- a/src/bin/project_manager/project_manager_export_edc.c +++ b/src/bin/project_manager/project_manager_export_edc.c @@ -19,7 +19,7 @@ #include "project_manager.h" #include "project_manager_private.h" -/* Export source from a single group */ +/* Export source from a project */ void _project_source_code_export_cancel_cb(void *data, Ecore_Thread *th __UNUSED__) @@ -129,3 +129,161 @@ _project_source_code_export_feedback_job(void *data, Ecore_Thread *th) eina_strbuf_free(buf); eina_lock_release(&ptd->mutex); } + + + +/* Export source from a project */ +void +_group_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 +_group_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 +_group_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 +_group_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 *code; + FILE *f; + Group *group = ptd->group; + Part *part; + State *state; + Eina_List *l, *ls; + Eina_Stringshare *resource; + Resource *res; + Eina_Strbuf *buf; + char *name; + + message = eina_stringshare_printf(_("Generate group '%s' source code ..."), group->name); + ecore_thread_feedback(th, message); + + name = strdup(group->name); + string_char_replace(name, '/', '_'); + buf = eina_strbuf_new(); + eina_strbuf_append_printf(buf, "%s/%s", ptd->path, name); + ecore_file_mkdir(eina_strbuf_string_get(buf)); + eina_strbuf_reset(buf); + + /* create and open file for collect the group source code */ + eina_strbuf_append_printf(buf, "%s/%s/generated.edc", ptd->path, name); + f = fopen(eina_strbuf_string_get(buf), "w"); + if (!f) + { + ERR("Could't open file '%s'", eina_strbuf_string_get(buf)); + eina_lock_release(&ptd->mutex); + ecore_thread_cancel(th); + eina_strbuf_free(buf); + free(name); + return; + } + + /* get the full source code of given project */ + ecore_thread_main_loop_begin(); + code = edje_edit_source_generate(group->edit_object); + ecore_thread_main_loop_end(); + + fputs(code, f); + edje_edit_string_free(code); + fclose(f); + + /* export images and fonts in accordance with parts */ + EINA_LIST_FOREACH(group->parts, l, part) + { + if (part->type == EDJE_PART_TYPE_IMAGE) + { + message = eina_stringshare_printf(_("Export images ...")); + ecore_thread_feedback(th, message); + + eina_strbuf_reset(buf); + eina_strbuf_append_printf(buf, "%s/%s/images/", ptd->path, name); + EINA_LIST_FOREACH(part->states, ls, state) + { + resource = edje_edit_state_image_get(group->edit_object, part->name, state->name, state->val); + message = eina_stringshare_printf(_("Export image '%s'"), resource); + ecore_thread_feedback(th, message); + + _external_resource_export(ptd->project->images, resource, eina_strbuf_string_get(buf)); + eina_stringshare_del(resource); + } + } + if (part->type == EDJE_PART_TYPE_TEXT) + { + message = eina_stringshare_printf(_("Export fonts ...")); + ecore_thread_feedback(th, message); + + eina_strbuf_reset(buf); + eina_strbuf_append_printf(buf, "%s/%s/fonts/", ptd->path, name); + EINA_LIST_FOREACH(part->states, ls, state) + { + resource = edje_edit_state_font_get(group->edit_object, part->name, state->name, state->val); + Eina_Stringshare *font_res = edje_edit_font_path_get(group->edit_object, resource); + + message = eina_stringshare_printf(_("Export font '%s'"), font_res); + ecore_thread_feedback(th, message); + + _external_resource_export(ptd->project->fonts, font_res, eina_strbuf_string_get(buf)); + eina_stringshare_del(resource); + eina_stringshare_del(font_res); + } + } + } + message = eina_stringshare_printf(_("Export sounds ...")); + ecore_thread_feedback(th, message); + + EINA_LIST_FOREACH(group->programs, l, res) + { + resource = edje_edit_program_sample_name_get(group->edit_object, res->name); + if (!resource) continue; + + eina_strbuf_reset(buf); + eina_strbuf_append_printf(buf, "%s/%s/sounds/", ptd->path, name); + message = eina_stringshare_printf(_("Export sound '%s'"), res->name); + ecore_thread_feedback(th, message); + + _external_resource_export(ptd->project->sounds, resource, eina_strbuf_string_get(buf)); + eina_stringshare_del(resource); + } + + eina_strbuf_reset(buf); + eina_strbuf_append_printf(buf, "%s/%s/build.sh", ptd->path, name); + _build_script_write(eina_strbuf_string_get(buf)); + eina_lock_release(&ptd->mutex); + eina_strbuf_free(buf); + free(name); + return; +} + + diff --git a/src/bin/project_manager/project_manager_private.h b/src/bin/project_manager/project_manager_private.h index 53dd9a3..731fe91 100644 --- a/src/bin/project_manager/project_manager_private.h +++ b/src/bin/project_manager/project_manager_private.h @@ -163,10 +163,15 @@ 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 + * Exported files will be stored on dst destination */ void _external_resources_export(Eina_List *resources, const char *dst); +/* Export only one resource from resources list into file. + * Exported file will be store on dst destination + */ +void _external_resource_export(Eina_List *resources, Eina_Stringshare *name, const char *dst); + /* Prepare build.sh script, that contanin * instructions howto compile edc source back to edj file */ @@ -205,4 +210,9 @@ 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); + +void _group_source_code_export_feedback_job(void *data, Ecore_Thread *th); +void _group_source_code_export_feedback_cb(void *data, Ecore_Thread *th, void *msg_data); +void _group_source_code_export_end_cb(void *data, Ecore_Thread *th); +void _group_source_code_export_cancel_cb(void *data, Ecore_Thread *th); #endif --