efl

Форк
0
/
efl_io_model_test_file.c 
219 строк · 5.4 Кб
1
//Compile with:
2
// gcc -o emodel_test_file emodel_test_file.c `pkg-config --cflags --libs emodel`
3
#ifdef HAVE_CONFIG_H
4
# include <config.h>
5
#endif
6

7
#include <Eo.h>
8
#include <Eio.h>
9
#include <Ecore.h>
10
#include <Efl.h>
11
#include <stdio.h>
12

13
#include "eio_suite.h"
14
#define EFL_MODEL_TEST_FILENAME_PATH "/tmp"
15
#define EFL_MODEL_MAX_TEST_CHILDS 16
16

17
struct reqs_t {
18
   /* property change */
19
   int changed_is_dir;
20
   int changed_is_lnk;
21
   int changed_size;
22
   int changed_mtime;
23

24
   /* properties list */
25
   int proplist_filename;
26
   int proplist_path;
27
   int proplist_mtime;
28
   int proplist_is_dir;
29
   int proplist_is_lnk;
30
   int proplist_size;
31

32
   /* misc tests for data or propeties */
33
   int properties;
34
   int children;
35
   int child_add;
36
   int child_del;
37

38
   /* load status */
39
  int properties_loaded;
40
};
41

42
static struct reqs_t reqs;
43
static Ecore_Event_Handler *handler;
44

45
static Eina_Bool
46
exit_func(void *data EINA_UNUSED, int ev_type EINA_UNUSED, void *ev)
47
{
48
   Ecore_Event_Signal_Exit *e;
49

50
   e = (Ecore_Event_Signal_Exit *)ev;
51
   if (e->interrupt)      fprintf(stdout, "Exit: interrupt\n");
52
   else if (e->quit)      fprintf(stdout, "Exit: quit\n");
53
   else if (e->terminate) fprintf(stdout, "Exit: terminate\n");
54
   ecore_main_loop_quit();
55
   return ECORE_CALLBACK_CANCEL;
56
}
57

58
static Eina_Value
59
promise_then_accessor(void *data EINA_UNUSED,
60
                      const Eina_Value v,
61
                      const Eina_Future *dead_future EINA_UNUSED)
62
{
63
  Eo *child = NULL;
64
  unsigned int i, len;
65

66
  fail_if(eina_value_type_get(&v) != EINA_VALUE_TYPE_ARRAY);
67

68
  EINA_VALUE_ARRAY_FOREACH(&v, len, i, child)
69
    ;
70

71
  ecore_main_loop_quit();
72

73
  return EINA_VALUE_EMPTY;
74
}
75

76
static Eina_Value
77
listing(void *data,
78
        const Eina_Value v EINA_UNUSED,
79
        const Eina_Future *dead_future EINA_UNUSED)
80
{
81
   Eina_Future *future;
82
   Efl_Model *filemodel = data;
83
   static unsigned int it = 0;
84

85
   if (it++ >= 3)
86
     {
87
        fprintf(stderr, "Failed to list any files after 3 attemps.\n");
88
        ecore_main_loop_quit();
89
        return eina_value_error_init(ECANCELED);
90
     }
91

92
   if (efl_model_children_count_get(filemodel) == 0)
93
     {
94
        future = efl_loop_job(efl_provider_find(filemodel, EFL_LOOP_CLASS));
95
        future = eina_future_then(future, listing, filemodel, NULL);
96
     }
97
   else
98
     {
99
        future = efl_model_children_slice_get(filemodel, 0, efl_model_children_count_get(filemodel));
100
        future = eina_future_then(future, &promise_then_accessor, NULL, NULL);
101
     }
102

103
   return eina_future_as_value(future);
104
}
105

106
static Eina_Future *listingf = NULL;
107

108
static Eina_Value
109
clearup(void *data EINA_UNUSED,
110
        const Eina_Value v,
111
        const Eina_Future *dead_future EINA_UNUSED)
112
{
113
   listingf = NULL;
114

115
   return v;
116
}
117

118
static void
119
setup_waiter(Efl_Model *model)
120
{
121
   Efl_Loop *loop = efl_provider_find(model, EFL_LOOP_CLASS);
122

123
   if (listingf) return ;
124
   listingf = efl_loop_job(loop);
125
   listingf = eina_future_then(listingf, listing, model, NULL);
126
   listingf = eina_future_then(listingf, clearup, NULL, NULL);
127
}
128

129
static void
130
_property_changed(void *data EINA_UNUSED, const Efl_Event *event)
131
{
132
   // Wait and check is_dir
133
   Efl_Model_Property_Event *ev = event->info;
134
   Efl_Model *filemodel = event->object;
135
   const char *property;
136
   Eina_Array_Iterator iterator;
137
   unsigned int i;
138

139
   EINA_ARRAY_ITER_NEXT(ev->changed_properties, i, property, iterator)
140
     if (!strcmp(property, "is_dir"))
141
       {
142
          if (efl_model_children_count_get(filemodel) > 0)
143
            setup_waiter(filemodel);
144
       }
145
}
146

147
static void
148
_child_added(void *data EINA_UNUSED, const Efl_Event *event)
149
{
150
   // Wait for a child being added to setup a job to list the directory
151
   Efl_Model *filemodel = event->object;
152

153
   if (efl_model_children_count_get(filemodel) > 0)
154
     setup_waiter(filemodel);
155
}
156

157
EFL_CALLBACKS_ARRAY_DEFINE(model,
158
                           { EFL_MODEL_EVENT_PROPERTIES_CHANGED, _property_changed },
159
                           { EFL_MODEL_EVENT_CHILD_ADDED, _child_added })
160

161
EFL_START_TEST(efl_io_model_test_test_file)
162
{
163
   Eo *filemodel = NULL;
164
   Eina_Value *result;
165
   char *str;
166

167
   memset(&reqs, 0, sizeof(struct reqs_t));
168

169
   filemodel = efl_add(EFL_IO_MODEL_CLASS, efl_main_loop_get(),
170
                       efl_io_model_path_set(efl_added, EFL_MODEL_TEST_FILENAME_PATH));
171
   fail_if(!filemodel, "ERROR: Cannot init model!\n");
172

173
   handler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, exit_func, NULL);
174

175
   result = efl_model_property_get(filemodel, "filename");
176
   fail_if(!result);
177
   str = eina_value_to_string(result);
178
   fail_if(!str);
179
   free(str);
180
   eina_value_free(result);
181

182
   result = efl_model_property_get(filemodel, "size");
183
   fail_if(!result);
184
   eina_value_free(result);
185

186
   result = efl_model_property_get(filemodel, "mtime");
187
   fail_if(!result);
188
   eina_value_free(result);
189

190
   efl_event_callback_array_add(filemodel, model(), NULL);
191

192
   ecore_main_loop_begin();
193

194
   efl_del(filemodel);
195
}
196
EFL_END_TEST
197

198
EFL_START_TEST(efl_io_model_test_del)
199
{
200
   Eo *model;
201
   int i;
202

203
   DISABLE_ABORT_ON_CRITICAL_START;
204
   for (i = 0; i < 10; i++)
205
     {
206
        model = efl_add(EFL_IO_MODEL_CLASS, efl_main_loop_get(),
207
                        efl_io_model_path_set(efl_added, EFL_MODEL_TEST_FILENAME_PATH));
208
        efl_del(model);
209
     }
210
   DISABLE_ABORT_ON_CRITICAL_END;
211
}
212
EFL_END_TEST
213

214
void
215
efl_io_model_test_file(TCase *tc)
216
{
217
    tcase_add_test(tc, efl_io_model_test_test_file);
218
    tcase_add_test(tc, efl_io_model_test_del);
219
}
220

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

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

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

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