forked from enlightenment/efl
* eio: start to implement new cleaner API.
SVN revision: 51784
This commit is contained in:
parent
e687c13d1c
commit
1915b760ee
|
@ -26,6 +26,10 @@
|
|||
# include <Evil.h>
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <Eina.h>
|
||||
|
||||
#ifdef EAPI
|
||||
|
@ -66,16 +70,27 @@ typedef enum _Eio_File_Op_Flags
|
|||
} Eio_File_Op_Flags;
|
||||
|
||||
typedef struct _Eio_File Eio_File;
|
||||
typedef struct _Eio_Progress Eio_Progress;
|
||||
typedef struct _Eio_Stat Eio_Stat;
|
||||
|
||||
typedef Eina_Bool (*Eio_Filter_Cb)(const void *data, const char *file);
|
||||
typedef void (*Eio_Main_Cb)(const void *data, const char *file);
|
||||
typedef void (*Eio_File_Op_Main_Cb)(const void *data, Eio_File_Op_Flags flag, void *value);
|
||||
|
||||
typedef Eina_Bool (*Eio_Filter_Direct_Cb)(const void *data, const Eina_File_Direct_Info *info);
|
||||
typedef void (*Eio_Main_Direct_Cb)(const void *data, const Eina_File_Direct_Info *info);
|
||||
|
||||
typedef void (*Eio_Stat_Cb)(const void *data, const struct stat *stat);
|
||||
typedef void (*Eio_Progress_Cb)(const void *data, const Eio_Progress *info);
|
||||
|
||||
typedef void (*Eio_Done_Cb)(const void *data);
|
||||
|
||||
struct _Eio_Progress
|
||||
{
|
||||
size_t current;
|
||||
size_t max;
|
||||
float percent;
|
||||
};
|
||||
|
||||
EAPI int eio_init(void);
|
||||
EAPI int eio_shutdown(void);
|
||||
|
||||
|
@ -93,12 +108,56 @@ EAPI Eio_File *eio_file_direct_ls(const char *dir,
|
|||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_file_direct_stat(const char *path,
|
||||
Eio_Stat_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_file_unlink(const char *path,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_file_mkdir(const char *path,
|
||||
mode_t mode,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_file_move(const char *source,
|
||||
const char *dest,
|
||||
Eio_Progress_Cb progress_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_file_copy(const char *source,
|
||||
const char *dest,
|
||||
Eio_Progress_Cb progress_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_dir_move(const char *source,
|
||||
const char *dest,
|
||||
Eio_Progress_Cb progress_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_dir_copy(const char *source,
|
||||
const char *dest,
|
||||
Eio_Progress_Cb progress_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eio_File *eio_dir_unlink(const char *path,
|
||||
Eio_Progress_Cb progress_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
|
||||
EAPI Eina_Bool eio_file_cancel(Eio_File *ls);
|
||||
|
||||
EAPI Eio_File *eio_file_operation(const char *file,
|
||||
Eio_File_Op_Flags eio_file_flags,
|
||||
Eio_File_Op_Main_Cb main_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data);
|
||||
#endif
|
||||
|
|
|
@ -9,8 +9,11 @@ includes_HEADERS = Eio.h
|
|||
includesdir = $(includedir)/eio-@VMAJ@
|
||||
|
||||
libeio_la_SOURCES = \
|
||||
eio_file.c
|
||||
eio_file.c \
|
||||
eio_main.c \
|
||||
eio_single.c
|
||||
|
||||
libeio_la_LIBADD = @EIO_LIBS@
|
||||
libeio_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
|
||||
|
||||
EXTRA_DIST = eio_private.h
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <Ecore.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
|
@ -43,59 +41,10 @@
|
|||
#include <sys/stat.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#include "eio_private.h"
|
||||
|
||||
#include "Eio.h"
|
||||
|
||||
typedef struct _Eio_File_Ls Eio_File_Ls;
|
||||
typedef struct _Eio_File_Direct_Ls Eio_File_Direct_Ls;
|
||||
typedef struct _Eio_File_Char_Ls Eio_File_Char_Ls;
|
||||
typedef struct _Eio_File_Op Eio_File_Op;
|
||||
|
||||
struct _Eio_File
|
||||
{
|
||||
Ecore_Thread *thread;
|
||||
const void *data;
|
||||
|
||||
Eio_Done_Cb done_cb;
|
||||
Eio_Done_Cb error_cb;
|
||||
};
|
||||
|
||||
struct _Eio_File_Ls
|
||||
{
|
||||
Eio_File common;
|
||||
const char *directory;
|
||||
};
|
||||
|
||||
struct _Eio_File_Direct_Ls
|
||||
{
|
||||
Eio_File_Ls ls;
|
||||
|
||||
Eio_Filter_Direct_Cb filter_cb;
|
||||
Eio_Main_Direct_Cb main_cb;
|
||||
};
|
||||
|
||||
struct _Eio_File_Char_Ls
|
||||
{
|
||||
Eio_File_Ls ls;
|
||||
|
||||
Eio_Filter_Cb filter_cb;
|
||||
Eio_Main_Cb main_cb;
|
||||
};
|
||||
|
||||
struct _Eio_File_Op
|
||||
{
|
||||
Eio_File common;
|
||||
const char *file;
|
||||
struct stat st;
|
||||
Eio_File_Op_Flags flags;
|
||||
Eina_Bool exists;
|
||||
Eina_Bool can_read;
|
||||
Eina_Bool can_write;
|
||||
Eina_Bool can_execute;
|
||||
Eio_File_Op_Main_Cb main_cb;
|
||||
};
|
||||
|
||||
static int _eio_count = 0;
|
||||
|
||||
static void
|
||||
_eio_file_heavy(Ecore_Thread *thread, void *data)
|
||||
{
|
||||
|
@ -220,112 +169,6 @@ _eio_file_error(void *data)
|
|||
free(async);
|
||||
}
|
||||
|
||||
static void
|
||||
_eio_file_op_cb(void *data)
|
||||
{
|
||||
Eio_File_Op *async = data;
|
||||
|
||||
async->exists = (stat(async->file, &async->st) == 0);
|
||||
if (async->exists)
|
||||
{
|
||||
if ((async->flags & EIO_FILE_CAN_READ) == EIO_FILE_CAN_READ)
|
||||
{
|
||||
if (!access(async->file, R_OK))
|
||||
async->can_read = EINA_TRUE;
|
||||
else
|
||||
async->can_read = EINA_FALSE;
|
||||
}
|
||||
if ((async->flags & EIO_FILE_CAN_WRITE) == EIO_FILE_CAN_WRITE)
|
||||
{
|
||||
if (!access(async->file, W_OK))
|
||||
async->can_write = EINA_TRUE;
|
||||
else
|
||||
async->can_write = EINA_FALSE;
|
||||
}
|
||||
if ((async->flags & EIO_FILE_CAN_EXECUTE) == EIO_FILE_CAN_EXECUTE)
|
||||
{
|
||||
if (!access(async->file, X_OK))
|
||||
async->can_execute = EINA_TRUE;
|
||||
else
|
||||
async->can_execute = EINA_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_eio_file_op_end(void *data)
|
||||
{
|
||||
Eio_File_Op *async = data;
|
||||
|
||||
if (!async->exists)
|
||||
{
|
||||
if ((async->flags & EIO_FILE_EXISTS) == EIO_FILE_EXISTS)
|
||||
{
|
||||
async->main_cb(async->common.data, EIO_FILE_EXISTS, (void *)(long)async->exists);
|
||||
if (async->common.done_cb)
|
||||
async->common.done_cb(async->common.data);
|
||||
}
|
||||
else
|
||||
ecore_thread_cancel(async->common.thread);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((async->flags & EIO_FILE_MOD_TIME) == EIO_FILE_MOD_TIME)
|
||||
async->main_cb(async->common.data, EIO_FILE_MOD_TIME, (void *)(long)async->st.st_mtime);
|
||||
if ((async->flags & EIO_FILE_SIZE) == EIO_FILE_SIZE)
|
||||
async->main_cb(async->common.data, EIO_FILE_SIZE, (void *)(long)async->st.st_size);
|
||||
if ((async->flags & EIO_FILE_EXISTS) == EIO_FILE_EXISTS)
|
||||
async->main_cb(async->common.data, EIO_FILE_EXISTS, (void *)(long)async->exists);
|
||||
if ((async->flags & EIO_FILE_IS_DIR) == EIO_FILE_IS_DIR)
|
||||
async->main_cb(async->common.data, EIO_FILE_IS_DIR, (void *)(long)S_ISDIR(async->st.st_mode));
|
||||
if ((async->flags & EIO_FILE_CAN_READ) == EIO_FILE_CAN_READ)
|
||||
async->main_cb(async->common.data, EIO_FILE_CAN_READ, (void *)(long)async->can_read);
|
||||
if ((async->flags & EIO_FILE_CAN_WRITE) == EIO_FILE_CAN_WRITE)
|
||||
async->main_cb(async->common.data, EIO_FILE_CAN_WRITE, (void *)(long)async->can_write);
|
||||
if ((async->flags & EIO_FILE_CAN_EXECUTE) == EIO_FILE_CAN_EXECUTE)
|
||||
async->main_cb(async->common.data, EIO_FILE_CAN_EXECUTE, (void *)(long)async->can_execute);
|
||||
if (async->common.done_cb)
|
||||
async->common.done_cb(async->common.data);
|
||||
|
||||
free(async);
|
||||
}
|
||||
|
||||
static void
|
||||
_eio_file_op_error(void *data)
|
||||
{
|
||||
Eio_File_Op *async = data;
|
||||
|
||||
if (async->common.error_cb)
|
||||
async->common.error_cb(async->common.data);
|
||||
|
||||
free(async);
|
||||
}
|
||||
|
||||
EAPI int
|
||||
eio_init(void)
|
||||
{
|
||||
_eio_count++;
|
||||
|
||||
if (_eio_count > 1) return _eio_count;
|
||||
|
||||
eina_init();
|
||||
ecore_init();
|
||||
|
||||
return _eio_count;
|
||||
}
|
||||
|
||||
EAPI int
|
||||
eio_shutdown(void)
|
||||
{
|
||||
_eio_count--;
|
||||
|
||||
if (_eio_count > 0) return _eio_count;
|
||||
|
||||
ecore_shutdown();
|
||||
eina_shutdown();
|
||||
return _eio_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief List content of a directory without locking your app.
|
||||
* @param dir The directory to list.
|
||||
|
@ -348,8 +191,11 @@ eio_file_ls(const char *dir,
|
|||
{
|
||||
Eio_File_Char_Ls *async = NULL;
|
||||
|
||||
if (!dir)
|
||||
return NULL;
|
||||
|
||||
async = malloc(sizeof (Eio_File_Char_Ls));
|
||||
if (!async) goto on_error;
|
||||
if (!async) return NULL;
|
||||
|
||||
async->filter_cb = filter_cb;
|
||||
async->main_cb = main_cb;
|
||||
|
@ -368,6 +214,7 @@ eio_file_ls(const char *dir,
|
|||
return &async->ls.common;
|
||||
|
||||
on_error:
|
||||
eina_stringshare_del(async->ls.directory);
|
||||
free(async);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -394,8 +241,11 @@ eio_file_direct_ls(const char *dir,
|
|||
{
|
||||
Eio_File_Direct_Ls *async = NULL;
|
||||
|
||||
if (!dir)
|
||||
return NULL;
|
||||
|
||||
async = malloc(sizeof (Eio_File_Direct_Ls));
|
||||
if (!async) goto on_error;
|
||||
if (!async) return NULL;
|
||||
|
||||
async->filter_cb = filter_cb;
|
||||
async->main_cb = main_cb;
|
||||
|
@ -413,8 +263,8 @@ eio_file_direct_ls(const char *dir,
|
|||
|
||||
return &async->ls.common;
|
||||
|
||||
|
||||
on_error:
|
||||
eina_stringshare_del(async->ls.directory);
|
||||
free(async);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -425,48 +275,3 @@ eio_file_cancel(Eio_File *ls)
|
|||
return ecore_thread_cancel(ls->thread);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Perform standard File IO operations.
|
||||
* @param file The file to operate on.
|
||||
* @param flags Eio_File_Op_Flags to specify which operations to do.
|
||||
* @param main_cb Callback called from the main loop with the results of the file operations.
|
||||
* @param done_cb Callback called from the main loop when the operations are through.
|
||||
* @param error_cb Callback called from the main loop when the file operations could not be completed.
|
||||
* @return A reference to the IO operation.
|
||||
*
|
||||
* eio_file_operation runs selected operations in a separated thread using
|
||||
* ecore_thread_run. This prevents any locking in your apps.
|
||||
*/
|
||||
EAPI Eio_File *
|
||||
eio_file_operation(const char *file,
|
||||
Eio_File_Op_Flags eio_file_flags,
|
||||
Eio_File_Op_Main_Cb main_cb,
|
||||
Eio_Done_Cb done_cb,
|
||||
Eio_Done_Cb error_cb,
|
||||
const void *data)
|
||||
{
|
||||
Eio_File_Op *async = NULL;
|
||||
|
||||
async = malloc(sizeof (Eio_File_Op));
|
||||
if (!async) goto on_error;
|
||||
|
||||
async->main_cb = main_cb;
|
||||
async->file = file;
|
||||
async->flags = eio_file_flags;
|
||||
async->common.done_cb = done_cb;
|
||||
async->common.error_cb = error_cb;
|
||||
async->common.data = data;
|
||||
|
||||
async->common.thread = ecore_thread_run(_eio_file_op_cb,
|
||||
_eio_file_op_end,
|
||||
_eio_file_op_error,
|
||||
async);
|
||||
if (!async->common.thread) goto on_error;
|
||||
|
||||
return &async->common;
|
||||
|
||||
on_error:
|
||||
free(async);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue