efl

Форк
0
/
efl_exe.c 
71 строка · 2.7 Кб
1
#include <stdio.h>
2
#include <string.h>
3

4
#include <Eina.h>
5
#include <Eo.h>
6
#include <Efl_Core.h>
7

8
static void _read_change(void *data EINA_UNUSED, const Efl_Event *ev);
9
static void _task_exit(void *data EINA_UNUSED, const Efl_Event *ev);
10

11
static void
12
_read_change(void *data EINA_UNUSED, const Efl_Event *ev)
13
{
14
   // read output from exe status changed - read what we can
15
   Eo *obj = ev->object;
16
   char buf[4096];
17
   Eina_Rw_Slice rw_slice = EINA_SLICE_ARRAY(buf);
18

19
   while (efl_io_reader_can_read_get(obj))
20
     {
21
        Eina_Error err = efl_io_reader_read(obj, &rw_slice);
22
        if (!err)
23
          {
24
             buf[rw_slice.len - 1] = 0;
25
             printf("--- READ [%p] [%s] ok %i bytes '%s'\n", obj, efl_core_command_line_command_get(obj), (int)rw_slice.len, buf);
26
          }
27
     }
28
}
29

30
static void
31
_task_exit(void *data EINA_UNUSED, const Efl_Event *ev)
32
{
33
   // called when the task says it has completed and exited.
34
   // all output to read has stopped
35
   Eo *obj = ev->object;
36
   printf("--- [%p] EXITED exit_code=%i\n", obj, efl_task_exit_code_get(obj));
37
   efl_loop_quit(efl_provider_find(obj, EFL_LOOP_CLASS), eina_value_int_init(99));
38
   // exe auto deleted at this point like efl threads. more convenient as
39
   // you don't need to remember to delete them yourself if launching
40
   // lots of commands - this is how ecore_exe worked. so listen to the
41
   // exit event (or del event) if you care about this... or ref it to keep
42
   // it around longer.
43
}
44

45
EAPI_MAIN void
46
efl_main(void *data EINA_UNUSED, const Efl_Event *ev)
47
{
48
   Eo *app = ev->object;
49

50
   const Efl_Version *v = efl_app_build_efl_version_get(app);
51
   printf("--- EFL %i.%i.%i\n", v->major, v->minor, v->micro);
52
   Eina_Array *args = eina_array_new(1);
53
   eina_array_push(args, eina_stringshare_add("./efl_exe_test.sh"));
54
   Eo *env = efl_duplicate(efl_env_self());
55
   efl_core_env_set(env, "BLAH", "blahvalue");
56
   Eo *obj = efl_add(EFL_EXE_CLASS, app,
57
                     efl_core_command_line_command_array_set(efl_added, args),
58
                     efl_exe_env_set(efl_added, env),
59
                     efl_task_flags_set(efl_added, EFL_TASK_FLAGS_USE_STDOUT | EFL_TASK_FLAGS_USE_STDIN),
60
                     efl_event_callback_add(efl_added, EFL_IO_READER_EVENT_CAN_READ_CHANGED, _read_change, NULL),
61
                     efl_event_callback_add(efl_added, EFL_TASK_EVENT_EXIT, _task_exit, NULL),
62
                     efl_task_run(efl_added)
63
                    );
64
   efl_unref(env);
65

66
   char *buf2 = "sample-input\n";
67
   Eina_Slice slice = { strlen(buf2), .mem = buf2 };
68
   Eina_Error err = efl_io_writer_write(obj, &slice, NULL);
69
   if (!err) printf("--- WRITE [%p] [%s] ok %i bytes\n", obj, efl_core_command_line_command_get(obj), (int)slice.len);
70
}
71
EFL_MAIN()
72

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.