* eio: start to implement new cleaner API.

SVN revision: 51784
This commit is contained in:
Cedric BAIL 2010-08-31 16:24:58 +00:00
parent e687c13d1c
commit 1915b760ee
3 changed files with 82 additions and 215 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}