forked from enlightenment/efl
parent
cfa9703607
commit
d85ab417fd
|
@ -183,26 +183,6 @@ _eio_file_write(int fd, void *mem, ssize_t length)
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_eio_file_send(Ecore_Thread *thread, Eio_File_Progress *op, off_t current, off_t max)
|
|
||||||
{
|
|
||||||
Eio_Progress *progress;
|
|
||||||
|
|
||||||
if (op->progress_cb == NULL)
|
|
||||||
return ;
|
|
||||||
|
|
||||||
progress = eio_progress_malloc();
|
|
||||||
if (!progress) return ;
|
|
||||||
|
|
||||||
progress->current = current;
|
|
||||||
progress->max = max;
|
|
||||||
progress->percent = (float) current * 100.0 / (float) max;
|
|
||||||
progress->source = eina_stringshare_ref(op->source);
|
|
||||||
progress->dest = eina_stringshare_ref(op->dest);
|
|
||||||
|
|
||||||
ecore_thread_feedback(thread, progress);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_eio_file_progress(Eio_Progress *progress, Eio_File_Progress *op)
|
_eio_file_progress(Eio_Progress *progress, Eio_File_Progress *op)
|
||||||
{
|
{
|
||||||
|
@ -321,6 +301,10 @@ _eio_file_copy_heavy(Ecore_Thread *thread, void *data)
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
As we need file size for progression information and both copy method
|
||||||
|
call fstat (better than stat as it avoid race condition).
|
||||||
|
*/
|
||||||
if (fstat(in, &buf) < 0)
|
if (fstat(in, &buf) < 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
|
@ -330,14 +314,20 @@ _eio_file_copy_heavy(Ecore_Thread *thread, void *data)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
#ifdef EFL_HAVE_SPLICE
|
#ifdef EFL_HAVE_SPLICE
|
||||||
|
/* fast file copy code using Linux splice API */
|
||||||
result = _eio_file_copy_splice(thread, copy, in, out, buf.st_size);
|
result = _eio_file_copy_splice(thread, copy, in, out, buf.st_size);
|
||||||
if (result == 0)
|
if (result == 0)
|
||||||
goto on_error;
|
goto on_error;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* classic copy method using mmap and write */
|
||||||
if (result == -1 && !_eio_file_copy_mmap(thread, copy, in, out, buf.st_size))
|
if (result == -1 && !_eio_file_copy_mmap(thread, copy, in, out, buf.st_size))
|
||||||
goto on_error;
|
goto on_error;
|
||||||
|
|
||||||
|
/* change access right to match source */
|
||||||
|
if (fchmod(out, buf.st_mode) != 0)
|
||||||
|
goto on_error;
|
||||||
|
|
||||||
close(out);
|
close(out);
|
||||||
close(in);
|
close(in);
|
||||||
|
|
||||||
|
@ -488,7 +478,7 @@ _eio_file_move_error(void *data)
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move->progress.common.error == EXDEV && !ecore_thread_check(thread))
|
if (move->progress.common.error == EXDEV)
|
||||||
{
|
{
|
||||||
Eio_File *eio_cp;
|
Eio_File *eio_cp;
|
||||||
|
|
||||||
|
@ -628,9 +618,9 @@ eio_file_cancel(Eio_File *ls)
|
||||||
* @param data Private data given to callback.
|
* @param data Private data given to callback.
|
||||||
*
|
*
|
||||||
* This function will copy a file from source to dest. It will try to use splice
|
* This function will copy a file from source to dest. It will try to use splice
|
||||||
* if possible, if not it will fallback to mmap/write.
|
* if possible, if not it will fallback to mmap/write. It will try to preserve
|
||||||
|
* access right, but not user/group identification.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
EAPI Eio_File *
|
EAPI Eio_File *
|
||||||
eio_file_copy(const char *source,
|
eio_file_copy(const char *source,
|
||||||
const char *dest,
|
const char *dest,
|
||||||
|
@ -664,6 +654,20 @@ eio_file_copy(const char *source,
|
||||||
return ©->common;
|
return ©->common;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Move a file asynchronously
|
||||||
|
* @param source Should be the name of the file to move the data from.
|
||||||
|
* @param dest Should be the name of the file to move the data to.
|
||||||
|
* @param progress_cb Callback called to know the progress of the move.
|
||||||
|
* @param done_cb Callback called when the move is done.
|
||||||
|
* @param error_cb Callback called when something goes wrong.
|
||||||
|
* @param data Private data given to callback.
|
||||||
|
*
|
||||||
|
* This function will copy a file from source to dest. It will try to use splice
|
||||||
|
* if possible, if not it will fallback to mmap/write. It will try to preserve
|
||||||
|
* access right, but not user/group identification.
|
||||||
|
|
||||||
|
*/
|
||||||
EAPI Eio_File *
|
EAPI Eio_File *
|
||||||
eio_file_move(const char *source,
|
eio_file_move(const char *source,
|
||||||
const char *dest,
|
const char *dest,
|
||||||
|
|
Loading…
Reference in New Issue