efm now checks (on startup) for stale device links on desktop and tries to remove them

ticket #1689


SVN revision: 78608
This commit is contained in:
Mike Blumenkrantz 2012-10-29 09:52:23 +00:00
parent b26e49dbff
commit 676c71a2a1
9 changed files with 129 additions and 45 deletions

View File

@ -2892,6 +2892,9 @@ e_fm2_client_data(Ecore_Ipc_Event_Client_Data *e)
}
break;
case E_FM_OP_VOLUME_LIST_DONE:
e_fm2_device_check_desktop_icons();
break;
case E_FM_OP_VOLUME_ADD: /*volume add*/
if ((e->data) && (e->size > 0))
{

View File

@ -41,7 +41,7 @@
#include "e_fm_op.h"
#undef E_TYPEDEFS
#include "e_fm_main.h"
#include "e_fm_shared_codec.h"
#define DEF_SYNC_NUM 8
#define DEF_ROUND_TRIP 0.05
#define DEF_ROUND_TRIP_TOLERANCE 0.01
@ -123,6 +123,9 @@ static int _e_sync_num = 0;
static Eina_List *_e_fm_ipc_slaves = NULL;
static Eina_List *_e_fm_tasks = NULL;
static Eina_Bool _init_timer_run = EINA_FALSE;
static Ecore_Timer *_init_timer = NULL;
/* local subsystem functions */
static Eina_Bool _e_fm_ipc_cb_server_add(void *data, int type, void *event);
static Eina_Bool _e_fm_ipc_cb_server_del(void *data, int type, void *event);
@ -1463,3 +1466,34 @@ _e_fm_ipc_prepare_command(E_Fm_Op_Type type, const char *args)
return buffer;
}
static Eina_Bool
_e_fm_ipc_timer_cb(void *d __UNUSED__)
{
ecore_ipc_server_send(_e_fm_ipc_server,
6 /*E_IPC_DOMAIN_FM*/,
E_FM_OP_VOLUME_LIST_DONE,
0, 0, 0, "", 1);
_init_timer_run = EINA_TRUE;
return EINA_FALSE;
}
void
e_fm_ipc_volume_add(E_Volume *v)
{
void *msg_data;
int msg_size;
if (_init_timer && (!_init_timer_run))
ecore_timer_reset(_init_timer);
else if ((!_init_timer) && (!_init_timer_run))
_init_timer = ecore_timer_add(2.0, _e_fm_ipc_timer_cb, NULL);
msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size);
if (!msg_data) return;
ecore_ipc_server_send(_e_fm_ipc_server,
6 /*E_IPC_DOMAIN_FM*/,
E_FM_OP_VOLUME_ADD,
0, 0, 0, msg_data, msg_size);
free(msg_data);
}

View File

@ -7,6 +7,7 @@ int _e_fm_ipc_init(void);
Eina_Bool _e_fm_ipc_slave_data_cb(void *data, int type, void *event);
Eina_Bool _e_fm_ipc_slave_error_cb(void *data, int type, void *event);
Eina_Bool _e_fm_ipc_slave_del_cb(void *data, int type, void *event);
void e_fm_ipc_volume_add(E_Volume *v);
EAPI E_Storage *e_storage_add(const char *udi);
EAPI void e_storage_del(const char *udi);

View File

@ -455,20 +455,7 @@ _e_fm_main_eeze_volume_add(const char *syspath,
}
v->validated = EINA_TRUE;
{
void *msg_data;
int msg_size;
msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size);
if (msg_data)
{
ecore_ipc_server_send(_e_fm_ipc_server,
6 /*E_IPC_DOMAIN_FM*/,
E_FM_OP_VOLUME_ADD,
0, 0, 0, msg_data, msg_size);
free(msg_data);
}
}
e_fm_ipc_volume_add(v);
return v;
}

View File

@ -562,20 +562,7 @@ _e_fm_main_hal_cb_vol_prop(void *data,
// if (s) printf(" for storage: %s\n", s->udi);
// else printf(" storage unknown\n");
v->validated = EINA_TRUE;
{
void *msg_data;
int msg_size;
msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size);
if (msg_data)
{
ecore_ipc_server_send(_e_fm_ipc_server,
6 /*E_IPC_DOMAIN_FM*/,
E_FM_OP_VOLUME_ADD,
0, 0, 0, msg_data, msg_size);
free(msg_data);
}
}
e_fm_ipc_volume_add(v);
return;
error:

View File

@ -534,20 +534,7 @@ _e_fm_main_udisks_cb_vol_prop(E_Volume *v,
// if (s) printf(" for storage: %s", s->udi);
// else printf(" storage unknown");
v->validated = EINA_TRUE;
{
void *msg_data;
int msg_size;
msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size);
if (msg_data)
{
ecore_ipc_server_send(_e_fm_ipc_server,
6 /*E_IPC_DOMAIN_FM*/,
E_FM_OP_VOLUME_ADD,
0, 0, 0, msg_data, msg_size);
free(msg_data);
}
}
e_fm_ipc_volume_add(v);
return;
error:

View File

@ -13,6 +13,10 @@ static void _e_fm2_device_unmount_fail(E_Fm2_Mount *m) EINA_ARG_NONNULL(1);
static Eina_List *_e_stores = NULL;
static Eina_List *_e_vols = NULL;
static Eina_Bool _check_run_show = EINA_FALSE;
static Eina_Bool _check_run_hide = EINA_FALSE;
static Ecore_Thread *_check_vols = NULL;
static void
_e_fm2_device_volume_setup(E_Volume *v)
{
@ -610,6 +614,48 @@ _e_fm2_device_unmount_fail(E_Fm2_Mount *m)
m->unmount_fail(m->data);
}
static void
_e_fm2_device_check_desktop_icons_cb_end(void *data __UNUSED__, Ecore_Thread *eth __UNUSED__)
{
_check_vols = NULL;
if (_check_run_show)
e_fm2_device_show_desktop_icons();
else if (_check_run_hide)
e_fm2_device_hide_desktop_icons();
_check_run_hide = _check_run_show = EINA_FALSE;
}
static void
_e_fm2_device_check_desktop_icons_list_cb(const char *name, const char *path, void *data)
{
char buf[PATH_MAX], buf2[PATH_MAX];
Eina_List *l;
char *file;
if (path[0] != '|') return; // not e17 link
if (!eina_str_has_extension(name, ".desktop")) return;
snprintf(buf, sizeof(buf), "%s/%s", path, name);
if (ecore_file_size(buf) > 200) return; // unlikely that we're going to write a desktop file this long
e_user_dir_snprintf(buf2, sizeof(buf2), "fileman/favorites/%s", name);
if (!ecore_file_exists(buf2)) return;
EINA_LIST_FOREACH(data, l, file)
if (!strcmp(file, buf)) return; // valid link
ecore_file_unlink(buf);
ecore_file_unlink(buf2);
}
static void
_e_fm2_device_check_desktop_icons_cb(void *data, Ecore_Thread *eth __UNUSED__)
{
char buf[PATH_MAX];
e_user_homedir_concat_static(buf, _("Desktop"));
eina_file_dir_list(buf, EINA_FALSE, _e_fm2_device_check_desktop_icons_list_cb, data);
E_FREE_LIST(data, free);
}
EAPI void
e_fm2_device_show_desktop_icons(void)
{
@ -619,6 +665,13 @@ e_fm2_device_show_desktop_icons(void)
char buf2[PATH_MAX] = {0};
const char *id;
if (_check_vols)
{
_check_run_hide = EINA_FALSE;
_check_run_show = EINA_TRUE;
return;
}
EINA_LIST_FOREACH(_e_vols, l, v)
{
if (!v) continue;
@ -650,6 +703,13 @@ e_fm2_device_hide_desktop_icons(void)
char buf[PATH_MAX] = {0};
const char *id;
if (_check_vols)
{
_check_run_show = EINA_FALSE;
_check_run_hide = EINA_TRUE;
return;
}
EINA_LIST_FOREACH(_e_vols, l, v)
{
if (!v) continue;
@ -669,6 +729,30 @@ e_fm2_device_hide_desktop_icons(void)
}
}
EAPI void
e_fm2_device_check_desktop_icons(void)
{
Eina_List *l, *thd = NULL;
E_Volume *v;
char buf[PATH_MAX] = {0};
const char *id;
if (_check_vols) return;
EINA_LIST_FOREACH(_e_vols, l, v)
{
if (!v) continue;
if (!v->storage) continue;
id = ecore_file_file_get(v->storage->udi);
e_user_homedir_snprintf(buf, sizeof(buf),
"%s/|%s_%d.desktop",
_("Desktop"), id, v->partition_number);
thd = eina_list_append(thd, strdup(buf));
}
_check_vols = ecore_thread_run(_e_fm2_device_check_desktop_icons_cb, _e_fm2_device_check_desktop_icons_cb_end, _e_fm2_device_check_desktop_icons_cb_end, thd);
}
EAPI Eina_List *
e_fm2_device_volume_list_get(void)
{

View File

@ -27,7 +27,7 @@ EAPI void e_fm2_device_unmount_fail(E_Volume *v);
EAPI void e_fm2_device_show_desktop_icons(void);
EAPI void e_fm2_device_hide_desktop_icons(void);
EAPI void e_fm2_device_check_desktop_icons(void);
EAPI Eina_List *e_fm2_device_volume_list_get(void);
#endif

View File

@ -52,7 +52,8 @@ typedef enum _E_Fm_Op_Type
E_FM_OP_EJECT_DONE,
E_FM_OP_EJECT_ERROR,
E_FM_OP_SECURE_REMOVE,
E_FM_OP_DESTROY
E_FM_OP_DESTROY,
E_FM_OP_VOLUME_LIST_DONE
} E_Fm_Op_Type;
#else