eio: convert Efl.Io.Manager.stat() to return Eina_Future.
authorCedric BAIL <cedric@osg.samsung.com>
Wed, 27 Sep 2017 23:32:58 +0000 (16:32 -0700)
committerCedric BAIL <cedric@osg.samsung.com>
Wed, 27 Sep 2017 23:32:58 +0000 (16:32 -0700)
src/lib/eio/efl_io_manager.c
src/lib/eio/efl_io_manager.eo
src/tests/eio/eio_test_manager.c

index b19f7e3..59af2d2 100644 (file)
@@ -51,6 +51,11 @@ struct _Job_Closure
 };
 
 /* 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)
@@ -343,50 +348,80 @@ _efl_io_manager_ls(Eo *obj,
 }
 
 /* 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 */
@@ -453,12 +488,6 @@ _future_file_error_cb(void *data,
    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,
index 9d8f46d..8ad5443 100644 (file)
@@ -52,7 +52,7 @@ class Efl.Io.Manager (Efl.Loop_User)
       params {
         @in path: string; [[Path we want to get stat information for]]
       }
-      return: future<Eina.Stat>; [[Stat information]]
+      return: ptr(Eina.Future); [[Stat information]]
     }
 
     // FIXME: Add helper for Eina.Value to Xattr
index e973102..8224af2 100644 (file)
@@ -75,19 +75,37 @@ _open_done_cb(void *data,
    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
@@ -128,7 +146,7 @@ START_TEST(efl_io_manager_test_stat)
    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;
 
@@ -150,12 +168,12 @@ START_TEST(efl_io_manager_test_stat)
 
    // 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