summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCedric BAIL <cedric@osg.samsung.com>2017-09-12 15:40:42 -0700
committerCedric BAIL <cedric@osg.samsung.com>2017-09-12 17:03:17 -0700
commit95dd799715e6ba7574dbc1fc1c244b91bf3a4927 (patch)
tree975023ec145dc2c886255a27605b657b4a90790a
parentde106a29733daf398d318eae2aa6e1c1c8581970 (diff)
downloadefl-95dd799715e6ba7574dbc1fc1c244b91bf3a4927.tar.gz
eina: add an Eina_Value helper for Eina_File.
-rw-r--r--src/lib/eina/eina_value.c118
-rw-r--r--src/lib/eina/eina_value.h8
2 files changed, 125 insertions, 1 deletions
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;
+
+/**
* @}
*/