summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-11-25 14:22:13 -0200
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>2016-11-25 17:25:18 -0200
commitd9dafab78531f676217e0e81d78c0533edd0cc30 (patch)
tree803b8292cd9728c0f829410a371e510b96618081
parent410d65900c9ce4daa412047c8b49312b98a1d353 (diff)
downloadefl-d9dafab78531f676217e0e81d78c0533edd0cc30.tar.gz
efl_io_copier: expose 'done' property.
This property has a protected setter and will simplify both internal implementation as well as usage.
-rw-r--r--src/lib/ecore/efl_io_copier.c46
-rw-r--r--src/lib/ecore/efl_io_copier.eo15
2 files changed, 40 insertions, 21 deletions
diff --git a/src/lib/ecore/efl_io_copier.c b/src/lib/ecore/efl_io_copier.c
index 5646e0d101..3eee61ff59 100644
--- a/src/lib/ecore/efl_io_copier.c
+++ b/src/lib/ecore/efl_io_copier.c
@@ -1,3 +1,5 @@
+#define EFL_IO_COPIER_PROTECTED 1
+
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
@@ -120,11 +122,7 @@ _efl_io_copier_job(void *data, const Efl_Event *ev EINA_UNUSED)
{
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);
- }
+ efl_io_copier_done_set(o, EINA_TRUE);
}
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->done = EINA_FALSE;
+ efl_io_copier_done_set(o, EINA_FALSE);
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;
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
* 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 (!pd->done)
- {
- 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_io_copier_done_set(o, EINA_TRUE);
}
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);
if (!pd->done)
- {
- pd->done = EINA_TRUE;
- efl_event_callback_call(o, EFL_IO_COPIER_EVENT_DONE, NULL);
- }
+ efl_io_copier_done_set(o, EINA_TRUE);
if (pd->source)
{
@@ -734,16 +725,29 @@ _efl_io_copier_flush(Eo *o, Efl_Io_Copier_Data *pd)
{
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);
- }
+ efl_io_copier_done_set(o, EINA_TRUE);
}
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 *
_efl_io_copier_efl_object_constructor(Eo *o, Efl_Io_Copier_Data *pd)
{
diff --git a/src/lib/ecore/efl_io_copier.eo b/src/lib/ecore/efl_io_copier.eo
index af0bf8f4e5..1c0bd5fd93 100644
--- a/src/lib/ecore/efl_io_copier.eo
+++ b/src/lib/ecore/efl_io_copier.eo
@@ -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 {
[[Steals the internal binbuf and return it to caller.