nikawhite pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=bcbd5cec8d8fb60311ab2a4520c5c99c30c1d994

commit bcbd5cec8d8fb60311ab2a4520c5c99c30c1d994
Author: Mykyta Biliavskyi <m.biliavs...@samsung.com>
Date:   Tue Aug 9 12:55:59 2016 +0300

    Project manager: move import form edj to correct ecore_exe_pipe usage.
    
    Added internam submodule project_manager_import_edj. This submodule
    is responsible for a manage imporing procees. Only for edj files.
---
 src/bin/Makefile.am                                |   1 +
 src/bin/project_manager/project_manager.c          | 223 +++++----------------
 .../project_manager/project_manager_import_edj.c   | 201 +++++++++++++++++++
 src/bin/project_manager/project_manager_open.c     |  11 +-
 src/bin/project_manager/project_manager_private.h  |  38 +++-
 5 files changed, 292 insertions(+), 182 deletions(-)

diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index 6f57dab..7034a0f 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -66,6 +66,7 @@ libete_a_SOURCES = \
 ../../src/bin/project_manager/group_manager.c \
 ../../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/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 8a8be4e..7805bca 100644
--- a/src/bin/project_manager/project_manager.c
+++ b/src/bin/project_manager/project_manager.c
@@ -20,6 +20,7 @@
 #include "project_manager.h"
 #include "project_manager_private.h"
 #include <fcntl.h>
+
 #ifndef _WIN32
 #include <sys/wait.h>
 #else
@@ -40,14 +41,6 @@ typedef struct
    void *data;
 } Progress_Message;
 
-typedef struct
-{
-   Eina_Stringshare *cmd;
-   Ecore_Exe *exe_cmd;
-   pid_t exe_pid;
-   Ecore_Exe_Flags flags;
-} Edje_Exe_Data;
-
 static Project_Thread worker;
 #define WORKER_CREATE(FUNC_PROGRESS, FUNC_END, DATA, PROJECT, \
                       NAME, PATH, EDJ, EDC, BUILD_OPTIONS, WIDGET_LIST) \
@@ -155,31 +148,32 @@ _lock_try(const char *path, Eina_Bool check)
 }
 
 void
-_project_descriptor_init(void)
+_project_descriptor_init(Project_Thread *ptd)
 {
    Eet_Data_Descriptor_Class eddc;
+   assert(ptd);
 
-   if (eed_project) return;
+   if (ptd->eed_project) return;
 
    eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(eddc),
                                              "Project", sizeof(Project));
-   eed_project = eet_data_descriptor_stream_new(&eddc);
-
-   EET_DATA_DESCRIPTOR_ADD_BASIC(eed_project, Project, "version", version, 
EET_T_INT);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(eed_project, Project, "dev", dev, 
EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(eed_project, Project, "saved_edj", saved_edj, 
EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(eed_project, Project, "develop_path", 
develop_path, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_BASIC(eed_project, Project, "release_options", 
release_options, EET_T_STRING);
-   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(eed_project, Project, "images", 
res.images);
-   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(eed_project, Project, "sounds", 
res.sounds);
-   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(eed_project, Project, "fonts", 
res.fonts);
+   ptd->eed_project = eet_data_descriptor_stream_new(&eddc);
+
+   EET_DATA_DESCRIPTOR_ADD_BASIC(ptd->eed_project, Project, "version", 
version, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(ptd->eed_project, Project, "dev", dev, 
EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(ptd->eed_project, Project, "saved_edj", 
saved_edj, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(ptd->eed_project, Project, "develop_path", 
develop_path, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(ptd->eed_project, Project, "release_options", 
release_options, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(ptd->eed_project, Project, "images", 
res.images);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(ptd->eed_project, Project, "sounds", 
res.sounds);
+   EET_DATA_DESCRIPTOR_ADD_LIST_STRING(ptd->eed_project, Project, "fonts", 
res.fonts);
 }
 
 void
-_pm_project_descriptor_shutdown(void)
+_pm_project_descriptor_shutdown(Project_Thread *ptd)
 {
-   eet_data_descriptor_free(eed_project);
-   eed_project = NULL;
+   eet_data_descriptor_free(ptd->eed_project);
+   ptd->eed_project = NULL;
 }
 
 static void
@@ -254,19 +248,19 @@ exit:
    pro->res.NAME = eina_list_append(pro->res.NAME, eina_stringshare_add(tmp)); 
\
    eina_stringshare_del(tmp)
 
-static Project *
-_project_files_create(void)
+Project *
+_project_files_create(Project_Thread *ptd)
 {
    Project *pro;
    Eina_Stringshare *folder_path, *pro_path, *tmp;
    Eina_Bool error = false;
 
-   _project_descriptor_init();
+   _project_descriptor_init(ptd);
 
-   folder_path = eina_stringshare_printf("%s/%s", worker.path, worker.name);
+   folder_path = eina_stringshare_printf("%s/%s", ptd->path, ptd->name);
    if (ecore_file_mkdir(folder_path))
      {
-        DBG("Create the folder '%s' for new project '%s'", folder_path, 
worker.name);
+        DBG("Create the folder '%s' for new project '%s'", folder_path, 
ptd->name);
      }
    else
      {
@@ -276,16 +270,15 @@ _project_files_create(void)
    eina_stringshare_del(folder_path);
    if (error) return NULL;
 
-   THREAD_TESTCANCEL;
    pro = (Project *)mem_calloc(1, sizeof(Project));
-   folder_path = eina_stringshare_printf("%s/%s", worker.path, worker.name);
+   folder_path = eina_stringshare_printf("%s/%s", ptd->path, ptd->name);
    pro->version = PROJECT_FILE_VERSION;
-   pro->name = eina_stringshare_add(worker.name);
-   pro->dev = eina_stringshare_printf("%s/%s.dev", folder_path, worker.name);
-   pro->saved_edj = eina_stringshare_printf("%s/%s.edj", folder_path, 
worker.name);
+   pro->name = eina_stringshare_add(ptd->name);
+   pro->dev = eina_stringshare_printf("%s/%s.dev", folder_path, ptd->name);
+   pro->saved_edj = eina_stringshare_printf("%s/%s.edj", folder_path, 
ptd->name);
    pro->develop_path = eina_stringshare_printf("%s/develop", folder_path);
 
-   pro_path = eina_stringshare_printf("%s/%s.pro", folder_path, worker.name);
+   pro_path = eina_stringshare_printf("%s/%s.pro", folder_path, ptd->name);
    pro->ef = eet_open(pro_path, EET_FILE_MODE_READ_WRITE);
    ecore_file_mkdir(pro->develop_path);
    MKDIR(images);
@@ -293,12 +286,11 @@ _project_files_create(void)
    MKDIR(fonts);
    eina_stringshare_del(folder_path);
 
-   if (!eet_data_write(pro->ef, eed_project, PROJECT_FILE_KEY, pro, 
compess_level))
+   if (!eet_data_write(pro->ef, ptd->eed_project, PROJECT_FILE_KEY, pro, 
compess_level))
      error = true;
 
-   DBG("Create a specific project file '%s': %s", pro_path, error ? "failsed" 
: "success");
-   THREAD_TESTCANCEL;
-   _pm_project_descriptor_shutdown();
+   DBG("Create a specific project file '%s': %s", pro_path, error ? "failed" : 
"success");
+   _pm_project_descriptor_shutdown(ptd);
    eina_stringshare_del(pro_path);
    if (error)
      {
@@ -315,10 +307,9 @@ _project_files_create(void)
 
    return pro;
 }
-
 #undef MKDIR
 
-static void
+void
 _copy_meta_data_to_pro(void)
 {
    Eet_File *ef;
@@ -343,7 +334,7 @@ _copy_meta_data_to_pro(void)
    if (comment) free(comment);
 }
 
-static Eina_Bool
+Eina_Bool
 _project_edj_file_copy(void)
 {
    Eina_Stringshare *src, *dst;
@@ -436,123 +427,6 @@ _project_dummy_image_add(Project *project)
    THREAD_CONTEXT_SWITCH_END;
 }
 
-static void *
-_project_import_edj(void *data,
-                    Eina_Thread *thread __UNUSED__)
-{
-   Eina_Tmpstr *tmp_dirname;
-   Eina_Stringshare *edj_in, *edj_out;
-   Eina_Bool send_end = (data) ? (*(Eina_Bool *)data) : true;
-   Eina_List *l, *groups;
-   Eina_Stringshare *group;
-   Evas_Object *obj = NULL;
-   Eina_Strbuf *strbuf;
-   Edje_Exe_Data *edje_pick_data;
-   int edje_cc_res = 0, waitpid_res = 0;
-
-   PROGRESS_SEND(_("Start import '%s' file as new project"), worker.edj);
-   PROGRESS_SEND(_("Creating a specifiec file and folders"));
-   worker.project = _project_files_create();
-   TODO("Add correct error handling here (if project == NULL). Probably we 
should add negative TC where directory already exist");
-   THREAD_TESTCANCEL;
-   worker.project->pro_path = eina_stringshare_printf("%s/%s/%s.pro", 
worker.path, worker.name, worker.name);
-   THREAD_TESTCANCEL;
-
-   if (!_lock_try(worker.project->pro_path, true))
-     {
-        /* really this case is unlickly, but we need handle it */
-        END_SEND(PM_PROJECT_LOCKED);
-        return NULL;
-     }
-   groups = edje_file_collection_list(worker.edj);
-
-   if (worker.widgets && (eina_list_count(groups) != 
eina_list_count(worker.widgets)))
-     {
-        eina_file_mkdtemp("eflete_build_XXXXXX", &tmp_dirname);
-        edj_in = eina_stringshare_printf("%s/in.edj", tmp_dirname);
-        edj_out = eina_stringshare_printf("%s/out.edj", tmp_dirname);
-        ecore_file_cp(worker.edj, edj_in);
-
-        /* prepare the cmd string for run edje_pick */
-        strbuf = eina_strbuf_new();
-        eina_strbuf_append_printf(strbuf, "edje_pick -o %s -i %s", edj_out, 
edj_in);
-
-        /* load any group for coping */
-        if (worker.widgets)
-          {
-             obj = edje_edit_object_add(evas_object_evas_get(ap.win));
-             if (!edje_object_file_set(obj, edj_in, 
eina_list_data_get(worker.widgets)))
-               {
-                  CRIT("Can't load object");
-                  abort();
-               }
-          }
-        EINA_LIST_FOREACH(worker.widgets, l, group)
-          {
-             if ((group[0] == 'c') && (group[1] == 'p') && (group[2] == '*') 
&& (group[3] == '*') && (group[4] == '*'))
-               {
-                  char **arr = eina_str_split(group, "***", 0);
-                  THREAD_CONTEXT_SWITCH_BEGIN;
-                  you_shall_not_pass_editor_signals(NULL);
-                  if (!editor_group_copy(obj, arr[1], arr[2]))
-                    {
-                       CRIT("Can not copy group %s, to %s", arr[1], arr[2]);
-                       abort();
-                    }
-                  you_shall_not_pass_editor_signals(NULL);
-                  THREAD_CONTEXT_SWITCH_END;
-                  eina_strbuf_append_printf(strbuf, " -g %s", arr[2]);
-                  free(arr[0]);
-                  free(arr);
-               }
-             else
-               eina_strbuf_append_printf(strbuf, " -g %s", group);
-          }
-        edje_pick_data = mem_malloc(sizeof(Edje_Exe_Data));
-        edje_pick_data->cmd = 
eina_stringshare_add(eina_strbuf_string_get(strbuf));
-        edje_pick_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_pick_data);
-        THREAD_TESTCANCEL;
-        waitpid_res = waitpid(edje_pick_data->exe_pid, &edje_cc_res, 0);
-        eina_stringshare_del(edje_pick_data->cmd);
-        free(edje_pick_data);
-
-        if ((waitpid_res == -1) ||
-            (WIFEXITED(edje_cc_res) && (WEXITSTATUS(edje_cc_res) != 0 )))
-          {
-             END_SEND(PM_PROJECT_ERROR);
-             return NULL;
-          }
-        ecore_file_unlink(eina_strbuf_string_get(strbuf));
-        eina_strbuf_free(strbuf);
-
-        eina_stringshare_del(worker.edj);
-        worker.edj = eina_stringshare_ref(edj_out);
-        eina_stringshare_del(edj_in);
-        eina_stringshare_del(edj_out);
-
-
-     }
-   edje_edit_string_list_free(groups);
-
-   PROGRESS_SEND(_("Import processing"));
-   _project_edj_file_copy();
-   _copy_meta_data_to_pro();
-   _project_special_group_add(worker.project);
-   _project_dummy_image_add(worker.project);
-   _project_open_internal(worker.project);
-   THREAD_TESTCANCEL;
-
-   PROGRESS_SEND(_("Import finished. Project '%s' created"), 
worker.project->name);
-   if (send_end) END_SEND(PM_PROJECT_SUCCESS);
-
-   return NULL;
-}
-
 void
 pm_project_import_edj(const char *name,
                       const char *path,
@@ -566,15 +440,18 @@ pm_project_import_edj(const char *name,
    assert(path != NULL);
    assert(edj != NULL);
 
-   WORKER_CREATE(func_progress, func_end, data, NULL,
-                 name, path, edj, NULL, NULL, list);
-
-   if (!eina_thread_create(&worker.thread, EINA_THREAD_URGENT, -1,
-                           (void *)_project_import_edj, NULL))
-     {
-        ERR("System error: can't create thread");
-        abort();
-     }
+   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->edj = eina_stringshare_add(edj);
+   ptd->widgets = list;
+
+   _project_import_edj(ptd);
 }
 
 static Eina_Bool
@@ -601,7 +478,7 @@ static void *
 _project_import_edc(void *data,
                     Eina_Thread *thread __UNUSED__)
 {
-   Eina_Bool send_end_child;
+//   Eina_Bool send_end_child;
    Eina_Bool send_end = (data) ? (*(Eina_Bool *)data) : true;
 
    Eina_Tmpstr *tmp_dirname;
@@ -646,8 +523,8 @@ _project_import_edc(void *data,
         return NULL;
      }
 
-   send_end_child = false;
-   _project_import_edj(&send_end_child, NULL);
+//   send_end_child = false;
+//   _project_import_edj(&send_end_child, NULL);
 
    PROGRESS_SEND(_("Removing temporary files..."));
    ecore_file_recursive_rm(tmp_dirname);
@@ -738,7 +615,7 @@ _project_open(void *data,
 
    PROGRESS_SEND(_("Opening project \"%s\""), path);
 
-   _project_descriptor_init();
+//   _project_descriptor_init();
    ef = eet_open(path, EET_FILE_MODE_READ_WRITE);
    if (!ef)
      {
@@ -749,8 +626,8 @@ _project_open(void *data,
 
    PROGRESS_SEND(_("Reading project descriptor"));
 
-   worker.project = eet_data_read(ef, eed_project, PROJECT_FILE_KEY);
-   _pm_project_descriptor_shutdown();
+   worker.project = eet_data_read(ef, worker.eed_project, PROJECT_FILE_KEY);
+//   _pm_project_descriptor_shutdown();
    if (!worker.project)
      {
         eina_stringshare_del(path);
diff --git a/src/bin/project_manager/project_manager_import_edj.c 
b/src/bin/project_manager/project_manager_import_edj.c
new file mode 100644
index 0000000..f1a0614
--- /dev/null
+++ b/src/bin/project_manager/project_manager_import_edj.c
@@ -0,0 +1,201 @@
+/*
+ * 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_pick_cb(void *data,
+                        int type __UNUSED__,
+                        void *event_info)
+{
+   int i = 0;
+   Edje_Exe_Data *edje_pick_data = (Edje_Exe_Data *)data;
+   assert(edje_pick_data != NULL);
+   Project_Thread *ptd = (Project_Thread *)edje_pick_data->data;
+   assert(ptd->func_progress != NULL);
+
+   Ecore_Exe_Event_Data *edje_pick_msg = (Ecore_Exe_Event_Data *)event_info;
+   if (!edje_pick_msg) return ECORE_CALLBACK_DONE;
+
+   for (i = 0; edje_pick_msg->lines[i].line != NULL; i++)
+      ptd->func_progress(NULL, edje_pick_msg->lines[i].line);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_edje_pick_end_cb(void *data,
+                  int type __UNUSED__,
+                  void *event_info)
+{
+   Edje_Exe_Data *edje_pick_data = (Edje_Exe_Data *)data;
+   assert(edje_pick_data != NULL);
+   Project_Thread *ptd = (Project_Thread *)edje_pick_data->data;
+   assert(ptd->func_progress != NULL);
+   Ecore_Exe_Event_Del *edje_pick_exit = (Ecore_Exe_Event_Del *)event_info;
+
+   eina_stringshare_del(edje_pick_data->cmd);
+   free(edje_pick_data);
+
+   if (edje_pick_exit->exit_code != 0)
+     {
+        ptd->result = PM_PROJECT_ERROR;
+        ecore_file_unlink(ptd->source_edj);
+        _end_send(ptd);
+        return ECORE_CALLBACK_DONE;
+     }
+
+   /* Replace void with ptd */
+   _project_edj_file_copy();
+   /* Replace void with ptd */
+   _copy_meta_data_to_pro();
+   _project_special_group_add(ptd->project);
+   _project_dummy_image_add(ptd->project);
+   /* Replace ptd->project with ptd */
+   _project_open_internal(ptd->project);
+   ecore_file_unlink(ptd->source_edj);
+
+   return ECORE_CALLBACK_DONE;
+}
+
+void
+_project_import_edj(void *data)
+{
+   Project_Thread *ptd = (Project_Thread *)data;
+
+   Eina_Stringshare *edj_in, *edj_out;
+   Eina_List *l, *groups;
+   Eina_Stringshare *group;
+   Evas_Object *obj = NULL;
+   Eina_Strbuf *strbuf;
+   Edje_Exe_Data *edje_pick_data;
+
+   Eina_Stringshare *msg = eina_stringshare_printf(_("Start import '%s' file 
as new project"), ptd->edj);
+   ptd->func_progress(NULL, msg);
+   eina_stringshare_del(msg);
+
+   /* Replace void with ptd */
+   ptd->project = _project_files_create(ptd);
+   assert(ptd->project != NULL);
+   TODO("Add correct error handling here (if project == NULL). Probably we 
should add negative TC where directory already exist");
+   ptd->project->pro_path = eina_stringshare_printf("%s/%s/%s.pro", ptd->path, 
ptd->name, ptd->name);
+
+   if (!_lock_try(ptd->project->pro_path, true))
+     {
+        /* really this case is unlickly, but we need handle it */
+        ptd->result = PM_PROJECT_LOCKED;
+        _end_send(ptd);
+        return;
+     }
+   groups = edje_file_collection_list(ptd->edj);
+
+   if (ptd->widgets && (eina_list_count(groups) != 
eina_list_count(ptd->widgets)))
+     {
+        msg = eina_stringshare_printf(_("Merging groups from choosen file"));
+        ptd->func_progress(NULL, msg);
+        eina_stringshare_del(msg);
+
+        eina_file_mkdtemp("eflete_build_XXXXXX", &ptd->tmp_dirname);
+        edj_in = eina_stringshare_printf("%s/in.edj", ptd->tmp_dirname);
+        edj_out = eina_stringshare_printf("%s/out.edj", ptd->tmp_dirname);
+        ecore_file_cp(ptd->edj, edj_in);
+
+        /* prepare the cmd string for run edje_pick */
+        strbuf = eina_strbuf_new();
+        eina_strbuf_append_printf(strbuf, "edje_pick -o %s -i %s", edj_out, 
edj_in);
+
+        /* load any group for coping */
+        if (ptd->widgets)
+          {
+             obj = edje_edit_object_add(evas_object_evas_get(ap.win));
+             if (!edje_object_file_set(obj, edj_in, 
eina_list_data_get(ptd->widgets)))
+               {
+                  CRIT("Can't load object");
+                  abort();
+               }
+          }
+        EINA_LIST_FOREACH(ptd->widgets, l, group)
+          {
+             if ((group[0] == 'c') && (group[1] == 'p') && (group[2] == '*') 
&& (group[3] == '*') && (group[4] == '*'))
+               {
+                  char **arr = eina_str_split(group, "***", 0);
+                  you_shall_not_pass_editor_signals(NULL);
+                  if (!editor_group_copy(obj, arr[1], arr[2]))
+                    {
+                       CRIT("Can not copy group %s, to %s", arr[1], arr[2]);
+                       abort();
+                    }
+                  you_shall_not_pass_editor_signals(NULL);
+                  eina_strbuf_append_printf(strbuf, " -g %s", arr[2]);
+                  free(arr[0]);
+                  free(arr);
+               }
+             else
+               eina_strbuf_append_printf(strbuf, " -g %s", group);
+          }
+
+        eina_stringshare_del(ptd->edj);
+        ptd->edj = eina_stringshare_ref(edj_out);
+        ptd->source_edj = eina_stringshare_ref(edj_in);
+
+        edje_pick_data = mem_malloc(sizeof(Edje_Exe_Data));
+        edje_pick_data->cmd = 
eina_stringshare_add(eina_strbuf_string_get(strbuf));
+        edje_pick_data->flags  = ECORE_EXE_PIPE_READ |
+                                 ECORE_EXE_PIPE_READ_LINE_BUFFERED |
+                                 ECORE_EXE_PIPE_ERROR |
+                                 ECORE_EXE_PIPE_ERROR_LINE_BUFFERED;
+        edje_pick_data->data = (void *)ptd;
+        edje_pick_data->exe_cmd = ecore_exe_pipe_run(edje_pick_data->cmd, 
edje_pick_data->flags, NULL);
+        edje_pick_data->exe_pid = ecore_exe_pid_get(edje_pick_data->exe_cmd);
+        eina_strbuf_free(strbuf);
+
+        eina_stringshare_del(edj_in);
+        eina_stringshare_del(edj_out);
+
+        ptd->data_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DATA, 
_data_from_edje_pick_cb,
+                                                    (void *)edje_pick_data);
+        ptd->del_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, 
_edje_pick_end_cb,
+                                                   (void *)edje_pick_data);
+        ptd->error_handler = ecore_event_handler_add(ECORE_EXE_EVENT_ERROR, 
_data_from_edje_pick_cb,
+                                                     (void *)edje_pick_data);
+    }
+   else
+     {
+        msg = eina_stringshare_printf(_("Import processing"));
+        ptd->func_progress(NULL, msg);
+        eina_stringshare_del(msg);
+
+        /* Replace void with ptd */
+        _project_edj_file_copy();
+        /* Replace void with ptd */
+        _copy_meta_data_to_pro();
+        _project_special_group_add(ptd->project);
+        _project_dummy_image_add(ptd->project);
+        /* Replace ptd->project with ptd */
+        _project_open_internal(ptd->project);
+
+        msg = eina_stringshare_printf(_("Import finished. Project '%s' 
created"), ptd->project->name);
+        ptd->func_progress(NULL, msg);
+        eina_stringshare_del(msg);
+
+     }
+   edje_edit_string_list_free(groups);
+   return;
+}
+
diff --git a/src/bin/project_manager/project_manager_open.c 
b/src/bin/project_manager/project_manager_open.c
index 3ef2de1..d8c14d5 100644
--- a/src/bin/project_manager/project_manager_open.c
+++ b/src/bin/project_manager/project_manager_open.c
@@ -26,7 +26,7 @@ _project_open_cancel_cb(void *data __UNUSED__, Ecore_Thread 
*th __UNUSED__)
    ERR("Project opening process canceled");
 
    /*Procedure of correct freing resources */
-   _pm_project_descriptor_shutdown();
+   _pm_project_descriptor_shutdown(ptd);
 
    ptd->result = PM_PROJECT_ERROR;
    _end_send(ptd);
@@ -54,7 +54,6 @@ _project_open_feedback_cb(void *data,
    eina_stringshare_del(message);
 }
 
-
 void
 _project_open_feedback_job(void *data, Ecore_Thread *th)
 {
@@ -87,11 +86,11 @@ _project_open_feedback_job(void *data, Ecore_Thread *th)
    message = eina_stringshare_printf(_("Opening project \"%s\""), ptd->path);
    ecore_thread_feedback(th, message);
 
-   _project_descriptor_init();
+   _project_descriptor_init(ptd);
    ef = eet_open(ptd->path, EET_FILE_MODE_READ_WRITE);
    if (!ef)
      {
-        _pm_project_descriptor_shutdown();
+        _pm_project_descriptor_shutdown(ptd);
         eina_lock_release(&ptd->mutex);
         ERR("Failed to open project file handler");
         ecore_thread_cancel(th);
@@ -101,8 +100,8 @@ _project_open_feedback_job(void *data, Ecore_Thread *th)
    message = eina_stringshare_add(_("Reading project descriptor"));
    ecore_thread_feedback(th, message);
 
-   ptd->project = eet_data_read(ef, eed_project, PROJECT_FILE_KEY);
-   _pm_project_descriptor_shutdown();
+   ptd->project = eet_data_read(ef, ptd->eed_project, PROJECT_FILE_KEY);
+   _pm_project_descriptor_shutdown(ptd);
    if (!ptd->project)
      {
         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 337e050..ae5bb1f 100644
--- a/src/bin/project_manager/project_manager_private.h
+++ b/src/bin/project_manager/project_manager_private.h
@@ -31,7 +31,6 @@
 #define PROJECT_KEY_LICENSE      "edje/license"
 #define PROJECT_KEY_COMMENT      "edje/comment"
 
-Eet_Data_Descriptor *eed_project = NULL;
 
 /* A handler for Project process. */
 typedef struct
@@ -75,10 +74,28 @@ typedef struct
    Ecore_Event_Handler *error_handler;
    Ecore_Event_Handler *del_handler;
 
+   /** Desriptor for read data form eet file */
+   Eet_Data_Descriptor *eed_project;
+
    /** Mutext for resolve multithread resource usage */
    Eina_Lock mutex;
 } Project_Thread;
 
+/* A struture for pass data into ecore_exe callbacks */
+typedef struct
+{
+   /** Full command that was passed into exe_pipe. */
+   Eina_Stringshare *cmd;
+   /** A process handle to the spawned process.*/
+   Ecore_Exe *exe_cmd;
+   /** The process ID. */
+   pid_t exe_pid;
+   /** The flag parameters for how to deal with inter-process I/O. */
+   Ecore_Exe_Flags flags;
+   /** User data that will be passed into callback functions. */
+   void *data;
+} Edje_Exe_Data;
+
 
 /* General funcions */
 
@@ -90,10 +107,10 @@ typedef struct
 void _end_send(void *data);
 
 /* Prepare descriptor structure for reading *.pro file */
-void _project_descriptor_init(void);
+void _project_descriptor_init(Project_Thread *ptd);
 
 /* Destroy descriptor, that provide ability to read *.pro files */
-void _pm_project_descriptor_shutdown(void);
+void _pm_project_descriptor_shutdown(Project_Thread *ptd);
 
 /* Used for fill project structure with valid data.
  * Open shared file handler for a *.dev file.
@@ -129,6 +146,18 @@ void _project_special_group_add(Project *project);
  */
 void _project_dummy_image_add(Project *project);
 
+/* Copy current edj file into path, that stored for save */
+Eina_Bool _project_edj_file_copy(void);
+
+/* Direct read meta data from eet file and copy it
+ * inside *.pro file.
+ */
+void _copy_meta_data_to_pro(void);
+
+/* Allocate Project structure and prepare data
+ * for files tree of project.
+ */
+Project *_project_files_create(Project_Thread *ptd);
 
 /*------- Open Project functions --------*/
 void _project_open_cancel_cb(void *data, Ecore_Thread *th);
@@ -139,4 +168,7 @@ 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);
+
 #endif

-- 


Reply via email to