};
/* Helper functions */
+static void
+_efl_io_manager_future_cancel(void *data, const Eina_Promise *dead_ptr EINA_UNUSED)
+{
+ eio_file_cancel(data);
+}
static void
_no_future(void *data, const Efl_Event *ev EINA_UNUSED)
}
/* Stat function */
+EINA_VALUE_STRUCT_DESC_DEFINE(_eina_stat_desc,
+ NULL,
+ sizeof (Eina_Stat),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, dev),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, ino),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, mode),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, nlink),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, uid),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_UINT, Eina_Stat, gid),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, rdev),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, size),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, blksize),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, blocks),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, atime),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, atimensec),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, mtime),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, mtimensec),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, ctime),
+ EINA_VALUE_STRUCT_MEMBER(EINA_VALUE_TYPE_ULONG, Eina_Stat, ctimensec));
+
static void
_file_stat_done_cb(void *data, Eio_File *handle EINA_UNUSED, const Eina_Stat *stat)
{
- Efl_Promise *p = data;
- Eina_Stat *c;
+ Eina_Value_Struct value = { _eina_stat_desc(), NULL };
+ Eina_Promise *p = data;
+ Eina_Value r = EINA_VALUE_EMPTY;
+ Eina_Stat *cpy = NULL;
- c = calloc(1, sizeof (Eina_Stat));
- if (!c)
- {
- efl_promise_failed_set(p, ENOMEM);
- goto end;
- }
+ cpy = calloc(1, sizeof (Eina_Stat));
+ if (!cpy) goto on_error;
- memcpy(c, stat, sizeof (Eina_Stat));
- efl_promise_value_set(p, c, free);
+ memcpy(cpy, stat, sizeof (Eina_Stat));
+ value.memory = cpy;
- end:
- efl_del(p);
+ if (!eina_value_setup(&r, EINA_VALUE_TYPE_STRUCT))
+ goto on_error;
+ if (!eina_value_pset(&r, &value))
+ goto on_error;
+
+ eina_promise_resolve(p, r);
+
+ return ;
+
+ on_error:
+ free(cpy);
+ eina_value_flush(&r);
+ eina_promise_reject(p, eina_error_get());
}
-static Efl_Future *
+static Eina_Future *
_efl_io_manager_stat(Eo *obj,
Efl_Io_Manager_Data *pd EINA_UNUSED,
const char *path)
{
- Efl_Promise *p;
+ Eina_Promise *p;
+ Eina_Future *future;
Eio_File *h;
- Eo *loop = efl_loop_get(obj);
- p = efl_add(EFL_PROMISE_CLASS, loop);
+ p = eina_promise_new(efl_loop_future_scheduler_get(obj),
+ _efl_io_manager_future_cancel, NULL);
if (!p) return NULL;
+ future = eina_future_new(p);
h = eio_file_direct_stat(path,
_file_stat_done_cb,
_file_error_cb,
p);
if (!h) goto end;
+ eina_promise_data_set(p, h);
- efl_event_callback_array_add(p, promise_handling(), h);
- return efl_promise_future_get(p);
+ return efl_future_Eina_FutureXXX_then(obj, future);
end:
- efl_del(p);
- return NULL;
+ return future;
}
/* eXtended attribute manipulation */
eina_promise_reject(p, error);
}
-static void
-_efl_io_manager_future_cancel(void *data, const Eina_Promise *dead_ptr EINA_UNUSED)
-{
- eio_file_cancel(data);
-}
-
static Eina_Future *
_efl_io_manager_xattr_set(Eo *obj,
Efl_Io_Manager_Data *pd EINA_UNUSED,
return file;
}
-static void
-_stat_done_cb(void *data, const Efl_Event *ev)
+static Eina_Value
+_stat_done_cb(void *data,
+ const Eina_Value st,
+ const Eina_Future *dead EINA_UNUSED)
{
- Efl_Future_Event_Success *success = ev->info;
- Eina_Stat const* stat = success->value;
Eina_Bool *is_dir = data;
unsigned int rights;
- fail_if(eio_file_is_dir(stat) != *is_dir);
- fail_if(eio_file_is_lnk(stat));
- rights = stat->mode & (S_IRWXU | S_IRWXG | S_IRWXO);
- fail_if(rights != default_rights);
+ if (st.type == EINA_VALUE_TYPE_ERROR)
+ {
+ Eina_Error err;
+ eina_value_get(&st, &err);
+ fprintf(stderr, "Something has gone wrong: %s\n", eina_error_msg_get(err));
+ abort();
+ }
+
+ if (st.type == EINA_VALUE_TYPE_STRUCT)
+ {
+ unsigned int mode = 0;
+
+ fail_if(!eina_value_struct_get(&st, "mode", &mode));
+ fail_if(S_ISDIR(mode) != *is_dir);
+ fail_if(S_ISLNK(mode));
+
+ rights = mode & (S_IRWXU | S_IRWXG | S_IRWXO);
+ fail_if(rights != default_rights);
+ }
+
ecore_main_loop_quit();
+
+ return st;
}
static void
Eina_Tmpstr *nested_dirname;
Eina_Tmpstr *nested_filename;
Efl_Io_Manager *job;
- Efl_Future *f;
+ Eina_Future *f;
Eina_Bool is_dir = EINA_TRUE;
int ret;
// Start testing
f = efl_io_manager_stat(job, nested_dirname);
- efl_future_then(f, &_stat_done_cb, &_error_cb, NULL, &is_dir);
+ eina_future_then(f, _stat_done_cb, &is_dir);
ecore_main_loop_begin();
is_dir = EINA_FALSE;
f = efl_io_manager_stat(job, nested_filename);
- efl_future_then(f, &_stat_done_cb, &_error_cb, NULL, &is_dir);
+ eina_future_then(f, _stat_done_cb, &is_dir);
ecore_main_loop_begin();
// Cleanup