efl_io_copier: expose 'done' property.

This property has a protected setter and will simplify both internal
implementation as well as usage.
This commit is contained in:
Gustavo Sverzut Barbieri 2016-11-25 14:22:13 -02:00
parent 410d65900c
commit d9dafab785
2 changed files with 40 additions and 21 deletions

View File

@ -1,3 +1,5 @@
#define EFL_IO_COPIER_PROTECTED 1
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include <config.h> # include <config.h>
#endif #endif
@ -120,11 +122,7 @@ _efl_io_copier_job(void *data, const Efl_Event *ev EINA_UNUSED)
{ {
if ((!pd->done) && if ((!pd->done) &&
((!pd->destination) || (eina_binbuf_length_get(pd->buf) == 0))) ((!pd->destination) || (eina_binbuf_length_get(pd->buf) == 0)))
{ efl_io_copier_done_set(o, EINA_TRUE);
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);
}
} }
efl_unref(o); efl_unref(o);
@ -242,7 +240,7 @@ _efl_io_copier_read(Eo *o, Efl_Io_Copier_Data *pd)
} }
pd->progress.read += rw_slice.len; pd->progress.read += rw_slice.len;
pd->done = EINA_FALSE; efl_io_copier_done_set(o, EINA_FALSE);
if ((!pd->destination) && (eina_binbuf_length_get(pd->buf) > used)) if ((!pd->destination) && (eina_binbuf_length_get(pd->buf) > used))
{ {
@ -307,7 +305,7 @@ _efl_io_copier_write(Eo *o, Efl_Io_Copier_Data *pd)
return; return;
pd->progress.written += ro_slice.len; pd->progress.written += ro_slice.len;
pd->done = EINA_FALSE; efl_io_copier_done_set(o, EINA_FALSE);
/* Note: dispatch data and line from write since it will remove /* Note: dispatch data and line from write since it will remove
* from binbuf and make it simple to not repeat data that was * from binbuf and make it simple to not repeat data that was
@ -465,11 +463,7 @@ _efl_io_copier_destination_closed(void *data, const Efl_Event *event EINA_UNUSED
if (eina_binbuf_length_get(pd->buf) == 0) if (eina_binbuf_length_get(pd->buf) == 0)
{ {
if (!pd->done) if (!pd->done)
{ efl_io_copier_done_set(o, EINA_TRUE);
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);
}
} }
else else
{ {
@ -617,10 +611,7 @@ _efl_io_copier_efl_io_closer_close(Eo *o, Efl_Io_Copier_Data *pd)
efl_future_cancel(pd->inactivity_timer); efl_future_cancel(pd->inactivity_timer);
if (!pd->done) if (!pd->done)
{ efl_io_copier_done_set(o, EINA_TRUE);
pd->done = EINA_TRUE;
efl_event_callback_call(o, EFL_IO_COPIER_EVENT_DONE, NULL);
}
if (pd->source) if (pd->source)
{ {
@ -734,16 +725,29 @@ _efl_io_copier_flush(Eo *o, Efl_Io_Copier_Data *pd)
{ {
if ((!pd->done) && if ((!pd->done) &&
((!pd->destination) || (eina_binbuf_length_get(pd->buf) == 0))) ((!pd->destination) || (eina_binbuf_length_get(pd->buf) == 0)))
{ efl_io_copier_done_set(o, EINA_TRUE);
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; return pd->done;
} }
EOLIAN static Eina_Bool
_efl_io_copier_done_get(Eo *o EINA_UNUSED, Efl_Io_Copier_Data *pd)
{
return pd->done;
}
EOLIAN static void
_efl_io_copier_done_set(Eo *o, Efl_Io_Copier_Data *pd, Eina_Bool value)
{
if (pd->done == value) return;
pd->done = value;
if (!value) return;
if (pd->inactivity_timer) efl_future_cancel(pd->inactivity_timer);
efl_event_callback_call(o, EFL_IO_COPIER_EVENT_DONE, NULL);
}
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)
{ {

View File

@ -285,6 +285,21 @@ class Efl.Io.Copier (Efl.Loop_User, Efl.Io.Closer) {
} }
} }
@property done {
[[Reports if copier is done.
A copier is done if source reached "eos" and all data
was written to "destination".
The copier is also done when it's @Efl.Io.Closer.closed.
]]
get { }
set @protected { }
values {
done: bool; [[If $true, source is "eos" and all data was written to "destination". If $false, it's still pending some more copies]]
}
}
binbuf_steal { binbuf_steal {
[[Steals the internal binbuf and return it to caller. [[Steals the internal binbuf and return it to caller.