forked from enlightenment/efl
eio: fetch mime type asynchronously.
This commit is contained in:
parent
919829aa7d
commit
fb8d139ad0
|
@ -70,7 +70,6 @@ _eio_stat_done_cb(void *data, Eio_File *handler EINA_UNUSED, const Eina_Stat *st
|
||||||
eina_list_free(priv->property_promises);
|
eina_list_free(priv->property_promises);
|
||||||
priv->property_promises = NULL;
|
priv->property_promises = NULL;
|
||||||
|
|
||||||
eio_file_cancel(priv->stat_file);
|
|
||||||
priv->stat_file = NULL;
|
priv->stat_file = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,16 +288,41 @@ _eio_model_efl_model_properties_get(Eo *obj EINA_UNUSED, Eio_Model_Data *_pd)
|
||||||
/**
|
/**
|
||||||
* Property Get
|
* Property Get
|
||||||
*/
|
*/
|
||||||
|
static void
|
||||||
|
_on_idle_mime(void *data, const Efl_Event *ev)
|
||||||
|
{
|
||||||
|
Eio_Model_Data *priv = data;
|
||||||
|
Efl_Promise *p;
|
||||||
|
const char *value;
|
||||||
|
|
||||||
|
// Make sure that we are not over consuming time in the main loop
|
||||||
|
if (ecore_time_get() - ecore_loop_time_get() > 0.004) return ;
|
||||||
|
|
||||||
|
// Are we done yet ?
|
||||||
|
efl_event_callback_del(ev->object, EFL_LOOP_EVENT_IDLE_ENTER, _on_idle_mime, priv);
|
||||||
|
if (!priv->fetching_mime) return ;
|
||||||
|
|
||||||
|
value = efreet_mime_type_get(priv->path);
|
||||||
|
|
||||||
|
EINA_LIST_FREE(priv->fetching_mime, p)
|
||||||
|
{
|
||||||
|
Eina_Value *v;
|
||||||
|
|
||||||
|
v = eina_value_new(EINA_VALUE_TYPE_STRING);
|
||||||
|
eina_value_set(v, value);
|
||||||
|
efl_promise_value_set(p, v, (Eina_Free_Cb)&eina_value_free);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static Efl_Future*
|
static Efl_Future*
|
||||||
_eio_model_efl_model_property_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *property)
|
_eio_model_efl_model_property_get(Eo *obj, Eio_Model_Data *priv, const char *property)
|
||||||
{
|
{
|
||||||
_Eio_Property_Name property_name;
|
_Eio_Property_Name property_name;
|
||||||
const char* value = NULL;
|
const char* value = NULL;
|
||||||
Efl_Promise *promise;
|
Efl_Promise *promise;
|
||||||
Efl_Future *future;
|
Efl_Future *future;
|
||||||
|
|
||||||
Eo *loop = efl_provider_find(obj, EFL_LOOP_CLASS);
|
promise = efl_add(EFL_PROMISE_CLASS, obj);
|
||||||
promise = efl_add(EFL_PROMISE_CLASS, loop);
|
|
||||||
future = efl_promise_future_get(promise);
|
future = efl_promise_future_get(promise);
|
||||||
|
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(priv, future);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(priv, future);
|
||||||
|
@ -348,15 +372,23 @@ _eio_model_efl_model_property_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, con
|
||||||
|
|
||||||
switch(property_name)
|
switch(property_name)
|
||||||
{
|
{
|
||||||
|
case EIO_MODEL_PROP_MIME_TYPE:
|
||||||
|
{
|
||||||
|
if (!priv->fetching_mime)
|
||||||
|
efl_event_callback_add(efl_provider_find(obj, EFL_LOOP_CLASS),
|
||||||
|
EFL_LOOP_EVENT_IDLE_ENTER, _on_idle_mime, priv);
|
||||||
|
priv->fetching_mime = eina_list_append(priv->fetching_mime, promise);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case EIO_MODEL_PROP_FILENAME:
|
case EIO_MODEL_PROP_FILENAME:
|
||||||
case EIO_MODEL_PROP_PATH:
|
case EIO_MODEL_PROP_PATH:
|
||||||
case EIO_MODEL_PROP_MIME_TYPE:
|
|
||||||
{
|
{
|
||||||
Eina_Value* v = eina_value_new(EINA_VALUE_TYPE_STRING);
|
Eina_Value* v = eina_value_new(EINA_VALUE_TYPE_STRING);
|
||||||
eina_value_set(v, value);
|
eina_value_set(v, value);
|
||||||
efl_promise_value_set(promise, v, (Eina_Free_Cb)&eina_value_free);
|
efl_promise_value_set(promise, v, (Eina_Free_Cb)&eina_value_free);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
_Eio_Property_Promise* p = calloc(1, sizeof(_Eio_Property_Promise));
|
_Eio_Property_Promise* p = calloc(1, sizeof(_Eio_Property_Promise));
|
||||||
|
@ -366,9 +398,9 @@ _eio_model_efl_model_property_get(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, con
|
||||||
|
|
||||||
if (!priv->stat_file)
|
if (!priv->stat_file)
|
||||||
_eio_stat_do(priv);
|
_eio_stat_do(priv);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return future;
|
return future;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,8 +719,19 @@ _eio_model_path_set(Eo *obj EINA_UNUSED, Eio_Model_Data *priv, const char *path)
|
||||||
static void
|
static void
|
||||||
_eio_model_efl_object_destructor(Eo *obj , Eio_Model_Data *priv)
|
_eio_model_efl_object_destructor(Eo *obj , Eio_Model_Data *priv)
|
||||||
{
|
{
|
||||||
|
Efl_Promise *p;
|
||||||
Eo *child;
|
Eo *child;
|
||||||
|
|
||||||
|
if (priv->fetching_mime)
|
||||||
|
efl_event_callback_del(efl_provider_find(obj, EFL_LOOP_CLASS),
|
||||||
|
EFL_LOOP_EVENT_IDLE_ENTER, _on_idle_mime, priv);
|
||||||
|
|
||||||
|
EINA_LIST_FREE(priv->fetching_mime, p)
|
||||||
|
{
|
||||||
|
efl_promise_failed_set(p, EINA_ERROR_FUTURE_CANCEL);
|
||||||
|
efl_del(p);
|
||||||
|
}
|
||||||
|
|
||||||
_eio_model_efl_model_monitor_del(priv);
|
_eio_model_efl_model_monitor_del(priv);
|
||||||
|
|
||||||
eina_spinlock_free(&priv->filter_lock);
|
eina_spinlock_free(&priv->filter_lock);
|
||||||
|
|
|
@ -74,6 +74,8 @@ struct _Eio_Model_Data
|
||||||
Eio_Filter_Direct_Cb filter_cb;
|
Eio_Filter_Direct_Cb filter_cb;
|
||||||
void *filter_userdata;
|
void *filter_userdata;
|
||||||
Eina_Spinlock filter_lock; /**< filter callback is called from another thread */
|
Eina_Spinlock filter_lock; /**< filter callback is called from another thread */
|
||||||
|
|
||||||
|
Eina_List *fetching_mime;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue