cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=95dd799715e6ba7574dbc1fc1c244b91bf3a4927

commit 95dd799715e6ba7574dbc1fc1c244b91bf3a4927
Author: Cedric BAIL <[email protected]>
Date:   Tue Sep 12 15:40:42 2017 -0700

    eina: add an Eina_Value helper for Eina_File.
---
 src/lib/eina/eina_value.c | 118 +++++++++++++++++++++++++++++++++++++++++++++-
 src/lib/eina/eina_value.h |   8 ++++
 2 files changed, 125 insertions(+), 1 deletion(-)

diff --git a/src/lib/eina/eina_value.c b/src/lib/eina/eina_value.c
index cdc237d202..22b3f506e0 100644
--- a/src/lib/eina/eina_value.c
+++ b/src/lib/eina/eina_value.c
@@ -35,6 +35,7 @@
 #include "eina_strbuf.h"
 #include "eina_mempool.h"
 #include "eina_lock.h"
+#include "eina_file.h"
 
 /* undefs EINA_ARG_NONULL() so NULL checks are not compiled out! */
 #include "eina_safety_checks.h"
@@ -4668,6 +4669,119 @@ EAPI const Eina_Value_Type _EINA_VALUE_TYPE_OPTIONAL = {
   _eina_value_type_optional_pget
 };
 
+static Eina_Bool
+_eina_value_type_file_setup(const Eina_Value_Type *type EINA_UNUSED, void *mem)
+{
+   memset(mem, 0, sizeof(Eina_File *));
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_eina_value_type_file_flush(const Eina_Value_Type *type EINA_UNUSED, void *mem)
+{
+   Eina_File *f = *(Eina_File **)mem;
+
+   eina_file_close(f);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_eina_value_type_file_copy(const Eina_Value_Type *type EINA_UNUSED, const void 
*src, void *dst)
+{
+   const Eina_File *f = *(const Eina_File **)src;
+   Eina_File **d = dst;
+
+   *d = eina_file_dup(f);
+   return !!(*d);
+}
+
+static int
+_eina_value_type_file_compare(const Eina_Value_Type *type EINA_UNUSED, const 
void *a, const void *b)
+{
+   const Eina_File *ta = *(const Eina_File **)a;
+   const Eina_File *tb = *(const Eina_File **)b;
+
+   if (ta == tb) return 0;
+   if (!ta) return -1;
+   if (!tb) return 1;
+   return -1;
+}
+
+static Eina_Bool
+_eina_value_type_file_convert_to(const Eina_Value_Type *type EINA_UNUSED, 
const Eina_Value_Type *convert, const void *type_mem, void *convert_mem)
+{
+   const Eina_File *f = *(const Eina_File **) type_mem;
+   Eina_Bool ret = EINA_FALSE;
+
+   if ((convert == EINA_VALUE_TYPE_STRING) ||
+       (convert == EINA_VALUE_TYPE_STRINGSHARE))
+     {
+        const char *filename;
+
+        filename = eina_file_filename_get(f);
+        ret = eina_value_type_pset(convert, convert_mem, &filename);
+     }
+
+   return ret;
+}
+
+static Eina_Bool
+_eina_value_type_file_convert_from(const Eina_Value_Type *type EINA_UNUSED, 
const Eina_Value_Type *convert, void *type_mem, const void *convert_mem)
+{
+   Eina_File **f = type_mem;
+
+   if ((convert == EINA_VALUE_TYPE_STRING) ||
+       (convert == EINA_VALUE_TYPE_STRINGSHARE))
+     {
+        const char *filename = *(const char **)convert_mem;
+
+        if (!filename) return EINA_FALSE;
+        *f = eina_file_open(filename, EINA_FALSE);
+        return !!(*f);
+     }
+
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_eina_value_type_file_pset(const Eina_Value_Type *type EINA_UNUSED, void *mem, 
const void *ptr)
+{
+   Eina_File **d = mem;
+   const Eina_File *s = ptr;
+
+   *d = eina_file_dup(s);
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_eina_value_type_file_vset(const Eina_Value_Type *type, void *mem, va_list 
args)
+{
+   const Eina_File *f = va_arg(args, Eina_File *);
+   return _eina_value_type_file_pset(type, mem, f);
+}
+
+static Eina_Bool
+_eina_value_type_file_pget(const Eina_Value_Type *type EINA_UNUSED, const void 
*mem, void *ptr)
+{
+   memcpy(ptr, mem, sizeof (Eina_File*));
+   return EINA_TRUE;
+}
+
+EAPI const Eina_Value_Type _EINA_VALUE_TYPE_FILE = {
+  EINA_VALUE_TYPE_VERSION,
+  sizeof (Eina_File *),
+  "Eina_Value_File",
+  _eina_value_type_file_setup,
+  _eina_value_type_file_flush,
+  _eina_value_type_file_copy,
+  _eina_value_type_file_compare,
+  _eina_value_type_file_convert_to,
+  _eina_value_type_file_convert_from,
+  _eina_value_type_file_vset,
+  _eina_value_type_file_pset,
+  _eina_value_type_file_pget
+};
+
 /* keep all basic types inlined in an array so we can compare if it's
  * a basic type using pointer arithmetic.
  *
@@ -5120,7 +5234,8 @@ eina_value_init(void)
    EINA_VALUE_TYPE_BLOB = &_EINA_VALUE_TYPE_BLOB;
    EINA_VALUE_TYPE_STRUCT = &_EINA_VALUE_TYPE_STRUCT;
 
-   EINA_VALUE_TYPE_OPTIONAL       = &_EINA_VALUE_TYPE_OPTIONAL;
+   EINA_VALUE_TYPE_OPTIONAL = &_EINA_VALUE_TYPE_OPTIONAL;
+   EINA_VALUE_TYPE_FILE = &_EINA_VALUE_TYPE_FILE;
 
    EINA_VALUE_BLOB_OPERATIONS_MALLOC = &_EINA_VALUE_BLOB_OPERATIONS_MALLOC;
 
@@ -5209,6 +5324,7 @@ EAPI const Eina_Value_Type *EINA_VALUE_TYPE_TIMEVAL = 
NULL;
 EAPI const Eina_Value_Type *EINA_VALUE_TYPE_BLOB = NULL;
 EAPI const Eina_Value_Type *EINA_VALUE_TYPE_STRUCT = NULL;
 EAPI const Eina_Value_Type *EINA_VALUE_TYPE_OPTIONAL = NULL;
+EAPI const Eina_Value_Type *EINA_VALUE_TYPE_FILE = NULL;
 
 
 EAPI const Eina_Value_Blob_Operations *EINA_VALUE_BLOB_OPERATIONS_MALLOC = 
NULL;
diff --git a/src/lib/eina/eina_value.h b/src/lib/eina/eina_value.h
index e9bfff229c..c1b6deec79 100644
--- a/src/lib/eina/eina_value.h
+++ b/src/lib/eina/eina_value.h
@@ -3669,6 +3669,14 @@ EAPI Eina_Bool eina_value_optional_reset(Eina_Value 
*value) EINA_ARG_NONNULL(1);
 static inline const Eina_Value_Type *eina_value_optional_type_get(Eina_Value 
*value) EINA_ARG_NONNULL(1);
 
 /**
+ * @var EINA_VALUE_TYPE_FILE
+ * manages optional type.
+ *
+ * @since 1.21
+ */
+EAPI extern const Eina_Value_Type *EINA_VALUE_TYPE_FILE;
+
+/**
  * @}
  */
 

-- 


Reply via email to