Changeset View
Changeset View
Standalone View
Standalone View
src/lib/ecore/efl_io_buffered_stream.c
Show All 10 Lines | |||||
11 | 11 | | |||
12 | typedef struct | 12 | typedef struct | ||
13 | { | 13 | { | ||
14 | Eo *inner_io; | 14 | Eo *inner_io; | ||
15 | Eo *incoming; | 15 | Eo *incoming; | ||
16 | Eo *outgoing; | 16 | Eo *outgoing; | ||
17 | Eo *sender; | 17 | Eo *sender; | ||
18 | Eo *receiver; | 18 | Eo *receiver; | ||
19 | Eina_Bool is_closing; | ||||
19 | Eina_Bool closed; | 20 | Eina_Bool closed; | ||
20 | Eina_Bool eos; | 21 | Eina_Bool eos; | ||
21 | Eina_Bool can_read; | 22 | Eina_Bool can_read; | ||
22 | Eina_Bool can_write; | 23 | Eina_Bool can_write; | ||
23 | Eina_Bool is_closer; | 24 | Eina_Bool is_closer; | ||
24 | Eina_Bool is_finished; | 25 | Eina_Bool is_finished; | ||
25 | } Efl_Io_Buffered_Stream_Data; | 26 | } Efl_Io_Buffered_Stream_Data; | ||
26 | 27 | | |||
▲ Show 20 Lines • Show All 119 Lines • ▼ Show 20 Line(s) | 143 | if (!pd->inner_io) | |||
146 | } | 147 | } | ||
147 | 148 | | |||
148 | return efl_finalize(efl_super(o, MY_CLASS)); | 149 | return efl_finalize(efl_super(o, MY_CLASS)); | ||
149 | } | 150 | } | ||
150 | 151 | | |||
151 | EOLIAN static void | 152 | EOLIAN static void | ||
152 | _efl_io_buffered_stream_efl_object_invalidate(Eo *o, Efl_Io_Buffered_Stream_Data *pd) | 153 | _efl_io_buffered_stream_efl_object_invalidate(Eo *o, Efl_Io_Buffered_Stream_Data *pd) | ||
153 | { | 154 | { | ||
155 | if (!efl_io_closer_closed_get(o)) | ||||
156 | efl_io_closer_close(o); | ||||
157 | | ||||
154 | if (pd->inner_io) | 158 | if (pd->inner_io) | ||
155 | { | 159 | { | ||
156 | efl_event_callback_array_del(pd->inner_io, _efl_io_buffered_stream_inner_io_cbs(), o); | 160 | efl_event_callback_array_del(pd->inner_io, _efl_io_buffered_stream_inner_io_cbs(), o); | ||
157 | if (efl_parent_get(pd->inner_io) == o) | 161 | if (efl_parent_get(pd->inner_io) == o) | ||
158 | efl_parent_set(pd->inner_io, NULL); | 162 | efl_parent_set(pd->inner_io, NULL); | ||
159 | else | 163 | else | ||
160 | efl_unref(pd->inner_io); /* do not del, just take our ref */ | 164 | efl_unref(pd->inner_io); /* do not del, just take our ref */ | ||
161 | pd->inner_io = NULL; | 165 | pd->inner_io = NULL; | ||
162 | } | 166 | } | ||
163 | 167 | | |||
164 | pd->incoming = NULL; | 168 | pd->incoming = NULL; | ||
165 | pd->outgoing = NULL; | 169 | pd->outgoing = NULL; | ||
166 | pd->sender = NULL; | 170 | pd->sender = NULL; | ||
167 | pd->receiver = NULL; | 171 | pd->receiver = NULL; | ||
168 | 172 | | |||
169 | if (!pd->is_finished) | 173 | if (!pd->is_finished) | ||
170 | { | 174 | { | ||
171 | fprintf(stderr, "forced finish\n"); | | |||
172 | pd->is_finished = EINA_TRUE; | 175 | pd->is_finished = EINA_TRUE; | ||
173 | efl_event_callback_call(o, EFL_IO_BUFFERED_STREAM_EVENT_FINISHED, NULL); | 176 | efl_event_callback_call(o, EFL_IO_BUFFERED_STREAM_EVENT_FINISHED, NULL); | ||
174 | } | 177 | } | ||
175 | 178 | | |||
176 | efl_invalidate(efl_super(o, MY_CLASS)); | 179 | efl_invalidate(efl_super(o, MY_CLASS)); | ||
177 | } | 180 | } | ||
178 | 181 | | |||
179 | EOLIAN static Eina_Error | 182 | EOLIAN static Eina_Error | ||
180 | _efl_io_buffered_stream_efl_io_closer_close(Eo *o, Efl_Io_Buffered_Stream_Data *pd) | 183 | _efl_io_buffered_stream_efl_io_closer_close(Eo *o, Efl_Io_Buffered_Stream_Data *pd) | ||
181 | { | 184 | { | ||
182 | Eina_Error err = 0; | 185 | Eina_Error err = 0; | ||
183 | 186 | | |||
184 | EINA_SAFETY_ON_TRUE_RETURN_VAL(pd->closed, EINVAL); | 187 | EINA_SAFETY_ON_TRUE_RETURN_VAL(pd->closed, EINVAL); | ||
188 | if (pd->is_closing) return 0; | ||||
189 | pd->is_closing = EINA_TRUE; | ||||
185 | 190 | | |||
186 | if (pd->outgoing) | 191 | if (pd->outgoing) | ||
187 | { | 192 | { | ||
188 | efl_io_queue_eos_mark(pd->outgoing); | 193 | efl_io_queue_eos_mark(pd->outgoing); | ||
189 | efl_io_copier_flush(pd->sender, EINA_FALSE, EINA_TRUE); | 194 | efl_io_copier_flush(pd->sender, EINA_FALSE, EINA_TRUE); | ||
190 | } | 195 | } | ||
191 | 196 | | |||
192 | /* line delimiters may be holding a last chunk of data */ | 197 | /* line delimiters may be holding a last chunk of data */ | ||
▲ Show 20 Lines • Show All 401 Lines • Show Last 20 Lines |