efl_io_copier: add flush method.
This method will force a read-write cycle and returns if it's fully done or not. It may be used to force data to be written before a handle is deleted (when one can't wait for the data to be written asynchronously).
This commit is contained in:
parent
aaaf77965a
commit
5c961bba9b
|
@ -704,6 +704,43 @@ _efl_io_copier_inactivity_timeout_get(Eo *o EINA_UNUSED, Efl_Io_Copier_Data *pd)
|
||||||
return pd->inactivity_timeout;
|
return pd->inactivity_timeout;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EOLIAN static Eina_Bool
|
||||||
|
_efl_io_copier_flush(Eo *o, Efl_Io_Copier_Data *pd)
|
||||||
|
{
|
||||||
|
uint64_t old_read = pd->progress.read;
|
||||||
|
uint64_t old_written = pd->progress.written;
|
||||||
|
uint64_t old_total = pd->progress.total;
|
||||||
|
|
||||||
|
_COPIER_DBG(o, pd);
|
||||||
|
|
||||||
|
if (pd->source && !efl_io_reader_eos_get(pd->source))
|
||||||
|
_efl_io_copier_read(o, pd);
|
||||||
|
|
||||||
|
if (pd->destination)
|
||||||
|
_efl_io_copier_write(o, pd);
|
||||||
|
|
||||||
|
if ((old_read != pd->progress.read) ||
|
||||||
|
(old_written != pd->progress.written) ||
|
||||||
|
(old_total != pd->progress.total))
|
||||||
|
{
|
||||||
|
efl_event_callback_call(o, EFL_IO_COPIER_EVENT_PROGRESS, NULL);
|
||||||
|
_efl_io_copier_inactivity_timeout_reschedule(o, pd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pd->source || efl_io_reader_eos_get(pd->source))
|
||||||
|
{
|
||||||
|
if ((!pd->done) &&
|
||||||
|
((!pd->destination) || (eina_binbuf_length_get(pd->buf) == 0)))
|
||||||
|
{
|
||||||
|
pd->done = EINA_TRUE;
|
||||||
|
if (pd->inactivity_timer) efl_future_cancel(pd->inactivity_timer);
|
||||||
|
efl_event_callback_call(o, EFL_IO_COPIER_EVENT_DONE, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pd->done;
|
||||||
|
}
|
||||||
|
|
||||||
EOLIAN static Eo *
|
EOLIAN static Eo *
|
||||||
_efl_io_copier_efl_object_constructor(Eo *o, Efl_Io_Copier_Data *pd)
|
_efl_io_copier_efl_object_constructor(Eo *o, Efl_Io_Copier_Data *pd)
|
||||||
{
|
{
|
||||||
|
|
|
@ -112,6 +112,31 @@ class Efl.Io.Copier (Efl.Loop_User, Efl.Io.Closer) {
|
||||||
]]
|
]]
|
||||||
return: free(own(ptr(Eina.Binbuf)), eina_binbuf_free) @warn_unused; [[Binbuf]]
|
return: free(own(ptr(Eina.Binbuf)), eina_binbuf_free) @warn_unused; [[Binbuf]]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
flush {
|
||||||
|
[[Forces reading from source and writing to destination.
|
||||||
|
|
||||||
|
This executes a single read->write cycle, if more data
|
||||||
|
could be read from source (ie: not EOS) or not all data
|
||||||
|
was written to destination, then $false is
|
||||||
|
returned. Then to forcefully drain source and write all
|
||||||
|
contents to destination, use in a loop until it returns
|
||||||
|
$true.
|
||||||
|
|
||||||
|
The return value matches "done" event, that is, when
|
||||||
|
$true is returned, the "done" event is emitted.
|
||||||
|
|
||||||
|
This function may also emit "progress" and "error"
|
||||||
|
events.
|
||||||
|
|
||||||
|
\@note this function may block the main loop execution
|
||||||
|
until operations complete! This is bad for usability, as
|
||||||
|
user interface or other operations may freeze. A better
|
||||||
|
approach is to operate asynchronously and wait for
|
||||||
|
"done" event.
|
||||||
|
]]
|
||||||
|
return: bool(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
events {
|
events {
|
||||||
|
|
Loading…
Reference in New Issue