hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=ac1430ded048e7fbd0bfb5dc8e82a8d02660f802

commit ac1430ded048e7fbd0bfb5dc8e82a8d02660f802
Author: ChunEon Park <[email protected]>
Date:   Sat Aug 9 20:03:06 2014 +0900

    build: build with ecore_exe and notify errors.
---
 src/bin/base_gui.c  |  11 +++++
 src/bin/build.c     | 114 ++++++++++++++++++++++++++++++++++++++++++----------
 src/include/build.h |   1 +
 3 files changed, 104 insertions(+), 22 deletions(-)

diff --git a/src/bin/base_gui.c b/src/bin/base_gui.c
index 225a798..08c1c01 100644
--- a/src/bin/base_gui.c
+++ b/src/bin/base_gui.c
@@ -122,6 +122,15 @@ base_gui_term(void)
    free(bd);
 }
 
+static void
+err_noti_cb(void *data, const char *msg)
+{
+   base_data *bd = data;
+
+   printf("%s\n", msg);
+   fflush(stdout);
+}
+
 Eina_Bool
 base_gui_init(void)
 {
@@ -161,6 +170,8 @@ base_gui_init(void)
    Evas_Object *panes = panes_init(layout);
    elm_object_part_content_set(layout, "elm.swallow.panes", panes);
 
+   build_err_noti_cb_set(err_noti_cb, bd);
+
    bd->win = win;
    bd->layout = layout;
 
diff --git a/src/bin/build.c b/src/bin/build.c
index 2d5f741..67914a7 100644
--- a/src/bin/build.c
+++ b/src/bin/build.c
@@ -1,17 +1,55 @@
 #include <Elementary.h>
 #include "common.h"
 
-static char *EDJE_CC_CMD = NULL;
+typedef struct builder_s
+{
+   Eina_Strbuf *strbuf;
+   char *build_cmd;
+   void (*noti_cb)(void *data, const char *msg);
+   void *noti_data;
+   Ecore_Event_Handler *event_data_handler;
+   Ecore_Event_Handler *event_err_handler;
+
+} build_data;
+
+static build_data *g_bd = NULL;
+
+static Eina_Bool
+exe_event_error_cb(void *data, int type EINA_UNUSED, void *event_info)
+{
+   build_data *bd = data;
+   Ecore_Exe_Event_Data *ev = event_info;
+   Ecore_Exe_Event_Data_Line *el;
+
+   eina_strbuf_reset(bd->strbuf);
+
+   for (el = ev->lines; el && el->line; el++)
+     {
+        eina_strbuf_append(bd->strbuf, el->line);
+        eina_strbuf_append_char(bd->strbuf, '\n');
+     }
+
+   bd->noti_cb(bd->noti_data, eina_strbuf_string_get(bd->strbuf));
+
+   return ECORE_CALLBACK_RENEW;
+}
 
 Eina_Bool
 build_cmd_set(void)
 {
-   Eina_Strbuf *buf = eina_strbuf_new();
-   if (!buf) return EINA_FALSE;
+   build_data *bd = g_bd;
 
-   free(EDJE_CC_CMD);
+   free(bd->build_cmd);
+   bd->build_cmd = NULL;
 
-   eina_strbuf_append_printf(buf,
+   Eina_Strbuf *strbuf = eina_strbuf_new();
+   if (!strbuf)
+     {
+        EINA_LOG_ERR("Failed to new strbuf");
+        return EINA_FALSE;
+     }
+
+   eina_strbuf_append_printf(strbuf,
                              "edje_cc -fastcomp %s %s -id %s/images -sd 
%s/sounds -fd %s/fonts -dd %s/data %s %s %s %s",
                              config_edc_path_get(),
                              config_edj_path_get(),
@@ -24,37 +62,69 @@ build_cmd_set(void)
                              config_edc_fnt_path_get(),
                              config_edc_data_path_get());
 
-   EDJE_CC_CMD = eina_strbuf_string_steal(buf);
-   eina_strbuf_free(buf);
+   bd->build_cmd = eina_strbuf_string_steal(strbuf);
+   eina_strbuf_free(strbuf);
 
-   return EINA_TRUE;;
+   return EINA_TRUE;
 }
 
 void
 build_edc(void)
 {
-   char *bp = NULL;
-   size_t size;
-   FILE *stream = open_memstream(&bp, &size);
-   (void)stream;
-   //stderr = &(*stream);
-
-   int ret = system(EDJE_CC_CMD);
-   if (ret == -1)
-     EINA_LOG_ERR("error running %s command.", EDJE_CC_CMD);
-
-  // if (bp)
-  // printf("@@@@ buf = %s, size = %d\n", bp, size);
+   build_data *bd = g_bd;
+   if (!bd->build_cmd)
+     {
+        EINA_LOG_ERR("Build Command is not set!");
+        return;
+     }
+   Ecore_Exe_Flags flags =
+      (ECORE_EXE_PIPE_READ_LINE_BUFFERED | ECORE_EXE_PIPE_READ |
+       ECORE_EXE_PIPE_ERROR_LINE_BUFFERED | ECORE_EXE_PIPE_ERROR);
+   ecore_exe_pipe_run(bd->build_cmd, flags, NULL);
 }
 
 Eina_Bool
 build_init(void)
 {
-   return build_cmd_set();
+   build_data *bd = g_bd;
+   if (bd) return EINA_TRUE;
+
+   bd = calloc(1, sizeof(build_data));
+   if (!bd)
+     {
+        EINA_LOG_ERR("Failed to allocate Memory!");
+        return EINA_FALSE;
+     }
+   g_bd = bd;
+
+   Eina_Bool ret = build_cmd_set();
+
+   bd->event_data_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DATA,
+                                                    exe_event_error_cb, bd);
+   bd->event_err_handler = ecore_event_handler_add(ECORE_EXE_EVENT_ERROR,
+                                                   exe_event_error_cb, bd);
+
+   bd->strbuf = eina_strbuf_new();
+
+   return ret;
 }
 
 void
 build_term(void)
 {
-   free(EDJE_CC_CMD);
+   build_data *bd = g_bd;
+   ecore_event_handler_del(bd->event_data_handler);
+   ecore_event_handler_del(bd->event_err_handler);
+   eina_strbuf_free(bd->strbuf);
+   free(bd->build_cmd);
+   free(bd);
+   g_bd = NULL;
+}
+
+void
+build_err_noti_cb_set(void (*cb)(void *data, const char *msg), void *data)
+{
+   build_data *bd = g_bd;
+   bd->noti_cb = cb;
+   bd->noti_data = data;
 }
diff --git a/src/include/build.h b/src/include/build.h
index d912b5c..1dcf18c 100644
--- a/src/include/build.h
+++ b/src/include/build.h
@@ -2,3 +2,4 @@ void build_edc(void);
 Eina_Bool build_init(void);
 void build_term(void);
 Eina_Bool build_cmd_set(void);
+void build_err_noti_cb_set(void (*cb)(void *data, const char *msg), void 
*data);

-- 


Reply via email to