add eject functions/events

SVN revision: 59443
This commit is contained in:
Mike Blumenkrantz 2011-05-16 11:03:06 +00:00
parent b63e9a5689
commit 775b86bccd
6 changed files with 68 additions and 13 deletions

View File

@ -1,3 +1,8 @@
2011-05-16 Mike Blumenkrantz (discomfitor/zmike)
+EEZE_EVENT_DISK_EJECT
+eeze_disk_eject
Functions for ejecting a disk
2011-05-15 Mike Blumenkrantz (discomfitor/zmike) 2011-05-15 Mike Blumenkrantz (discomfitor/zmike)
+eeze_disk_cancel +eeze_disk_cancel
Cancel the current pending mount/umount operation on a disk Cancel the current pending mount/umount operation on a disk

View File

@ -109,6 +109,7 @@ if test "x$eeze_mount" = "xyes";then
with_umount="/bin/umount" with_umount="/bin/umount"
AC_ARG_WITH([mount], AS_HELP_STRING([--with-mount], [specify mount bin @<:@default=detect@:>@])) AC_ARG_WITH([mount], AS_HELP_STRING([--with-mount], [specify mount bin @<:@default=detect@:>@]))
AC_ARG_WITH([umount], AS_HELP_STRING([--with-umount], [specify umount bin @<:@default=detect@:>@])) AC_ARG_WITH([umount], AS_HELP_STRING([--with-umount], [specify umount bin @<:@default=detect@:>@]))
AC_ARG_WITH([eject], AS_HELP_STRING([--with-eject], [specify eject bin @<:@default=detect@:>@]))
PKG_CHECK_MODULES([LIBMOUNT], [mount >= 2.18.0]) PKG_CHECK_MODULES([LIBMOUNT], [mount >= 2.18.0])
mount_v=$(pkg-config --modversion mount) mount_v=$(pkg-config --modversion mount)
PKG_CHECK_MODULES([ECORE_FILE], [ecore-file >= 1.0.0]) PKG_CHECK_MODULES([ECORE_FILE], [ecore-file >= 1.0.0])
@ -122,6 +123,11 @@ if test "x$eeze_mount" = "xyes";then
AC_PATH_PROG([with_umount], [umount], AC_MSG_ERROR([umount could not be found in PATH])) AC_PATH_PROG([with_umount], [umount], AC_MSG_ERROR([umount could not be found in PATH]))
fi fi
AC_DEFINE_UNQUOTED([EEZE_UNMOUNT_BIN], ["$with_umount"], [umount bin to use]) AC_DEFINE_UNQUOTED([EEZE_UNMOUNT_BIN], ["$with_umount"], [umount bin to use])
if test "x$with_eject" = "xdetect";then
AC_PATH_PROG([with_eject], [eject], AC_MSG_ERROR([eject could not be found in PATH]))
fi
AC_DEFINE_UNQUOTED([EEZE_EJECT_BIN], ["$with_eject"], [eject bin to use])
fi fi
AM_CONDITIONAL([OLD_LIBMOUNT], [test -n $mount_v -a $(echo $mount_v | cut -d'.' -f2) -lt 19]) AM_CONDITIONAL([OLD_LIBMOUNT], [test -n $mount_v -a $(echo $mount_v | cut -d'.' -f2) -lt 19])
if test -z "$OLD_LIBMOUNT_TRUE" ; then if test -z "$OLD_LIBMOUNT_TRUE" ; then
@ -182,6 +188,7 @@ if test "x$eeze_mount" = "xyes";then
echo echo
echo "Mount..................: ${with_mount}" echo "Mount..................: ${with_mount}"
echo "Umount.................: ${with_umount}" echo "Umount.................: ${with_umount}"
echo "Eject..................: ${with_eject}"
echo echo
fi fi
echo "Test...................: ${have_eeze_udev_test}" echo "Test...................: ${have_eeze_udev_test}"

View File

@ -55,23 +55,19 @@ typedef enum
EAPI extern int EEZE_EVENT_DISK_MOUNT; EAPI extern int EEZE_EVENT_DISK_MOUNT;
EAPI extern int EEZE_EVENT_DISK_UNMOUNT; EAPI extern int EEZE_EVENT_DISK_UNMOUNT;
EAPI extern int EEZE_EVENT_DISK_EJECT;
EAPI extern int EEZE_EVENT_DISK_ERROR; EAPI extern int EEZE_EVENT_DISK_ERROR;
typedef struct _Eeze_Event_Disk_Mount Eeze_Event_Disk_Mount; typedef struct _Eeze_Event_Disk Eeze_Event_Disk_Mount;
typedef struct _Eeze_Event_Disk_Unmount Eeze_Event_Disk_Unmount; typedef struct _Eeze_Event_Disk Eeze_Event_Disk_Unmount;
typedef struct _Eeze_Event_Disk Eeze_Event_Disk_Eject;
typedef struct _Eeze_Disk Eeze_Disk; typedef struct _Eeze_Disk Eeze_Disk;
struct _Eeze_Event_Disk_Mount struct _Eeze_Event_Disk
{ {
Eeze_Disk *disk; Eeze_Disk *disk;
}; };
struct _Eeze_Event_Disk_Unmount
{
Eeze_Disk *disk;
};
typedef struct _Eeze_Event_Disk_Error Eeze_Event_Disk_Error; typedef struct _Eeze_Event_Disk_Error Eeze_Event_Disk_Error;
struct _Eeze_Event_Disk_Error struct _Eeze_Event_Disk_Error

View File

@ -197,6 +197,9 @@ eeze_disk_free(Eeze_Disk *disk)
eina_strbuf_free(disk->mount_cmd); eina_strbuf_free(disk->mount_cmd);
if (disk->unmount_cmd) if (disk->unmount_cmd)
eina_strbuf_free(disk->unmount_cmd); eina_strbuf_free(disk->unmount_cmd);
if (disk->eject_cmd)
eina_strbuf_free(disk->eject_cmd);
if (disk->mounter) ecore_exe_kill(disk->mounter);
_eeze_disks = eina_list_remove(_eeze_disks, disk); _eeze_disks = eina_list_remove(_eeze_disks, disk);
free(disk); free(disk);
} }

View File

@ -15,6 +15,7 @@
EAPI int EEZE_EVENT_DISK_MOUNT = 0; EAPI int EEZE_EVENT_DISK_MOUNT = 0;
EAPI int EEZE_EVENT_DISK_UNMOUNT = 0; EAPI int EEZE_EVENT_DISK_UNMOUNT = 0;
EAPI int EEZE_EVENT_DISK_EJECT = 0;
EAPI int EEZE_EVENT_DISK_ERROR = 0; EAPI int EEZE_EVENT_DISK_ERROR = 0;
static Ecore_Event_Handler *_mount_handler = NULL; static Ecore_Event_Handler *_mount_handler = NULL;
static Eina_List *eeze_events = NULL; static Eina_List *eeze_events = NULL;
@ -91,7 +92,7 @@ _eeze_disk_mount_result_handler(void *data __UNUSED__, int type __UNUSED__, Ecor
else else
_eeze_disk_mount_error_handler(disk, "incorrect invocation or permissions"); _eeze_disk_mount_error_handler(disk, "incorrect invocation or permissions");
} }
else else if (disk->mount_status == EEZE_DISK_UNMOUNTING)
switch (ev->exit_code) switch (ev->exit_code)
{ {
case 0: case 0:
@ -104,11 +105,27 @@ _eeze_disk_mount_result_handler(void *data __UNUSED__, int type __UNUSED__, Ecor
default: default:
INF("Could not unmount disk, retrying"); INF("Could not unmount disk, retrying");
disk->mounter = ecore_exe_pipe_run(eina_strbuf_string_get(disk->unmount_cmd), 0, disk); disk->mounter = ecore_exe_run(eina_strbuf_string_get(disk->unmount_cmd), disk);
eeze_events = eina_list_append(eeze_events, disk); eeze_events = eina_list_append(eeze_events, disk);
return ECORE_CALLBACK_RENEW; return ECORE_CALLBACK_RENEW;
} }
else
switch (ev->exit_code)
{
case 0:
e = malloc(sizeof(Eeze_Event_Disk_Eject));
EINA_SAFETY_ON_NULL_RETURN_VAL(e, ECORE_CALLBACK_RENEW);
e->disk = disk;
disk->mounter = NULL;
ecore_event_add(EEZE_EVENT_DISK_EJECT, e, NULL, NULL);
break;
default:
INF("Could not eject disk, retrying");
disk->mounter = ecore_exe_run(eina_strbuf_string_get(disk->unmount_cmd), disk);
eeze_events = eina_list_append(eeze_events, disk);
return ECORE_CALLBACK_RENEW;
}
return ECORE_CALLBACK_RENEW; return ECORE_CALLBACK_RENEW;
} }
@ -123,6 +140,7 @@ eeze_mount_init(void)
{ {
EEZE_EVENT_DISK_MOUNT = ecore_event_type_new(); EEZE_EVENT_DISK_MOUNT = ecore_event_type_new();
EEZE_EVENT_DISK_UNMOUNT = ecore_event_type_new(); EEZE_EVENT_DISK_UNMOUNT = ecore_event_type_new();
EEZE_EVENT_DISK_EJECT = ecore_event_type_new();
EEZE_EVENT_DISK_ERROR = ecore_event_type_new(); EEZE_EVENT_DISK_ERROR = ecore_event_type_new();
_mount_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _mount_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
(Ecore_Event_Handler_Cb)_eeze_disk_mount_result_handler, NULL); (Ecore_Event_Handler_Cb)_eeze_disk_mount_result_handler, NULL);
@ -324,13 +342,37 @@ eeze_disk_unmount(Eeze_Disk *disk)
return EINA_TRUE; return EINA_TRUE;
} }
EAPI Eina_Bool
eeze_disk_eject(Eeze_Disk *disk)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(disk, EINA_FALSE);
if (!disk->eject_cmd)
{
disk->eject_cmd = eina_strbuf_new();
if (disk->mount_wrapper)
eina_strbuf_append_printf(disk->eject_cmd, "%s ", disk->mount_wrapper);
eina_strbuf_append_printf(disk->eject_cmd, EEZE_EJECT_BIN" %s", eeze_disk_devpath_get(disk));
}
INF("Ejecting: %s", eina_strbuf_string_get(disk->eject_cmd));
disk->mounter = ecore_exe_run(eina_strbuf_string_get(disk->eject_cmd), disk);
if (!disk->mounter)
return EINA_FALSE;
eeze_events = eina_list_append(eeze_events, disk);
disk->mount_status = EEZE_DISK_EJECTING;
return EINA_TRUE;
}
EAPI void EAPI void
eeze_disk_cancel(Eeze_Disk *disk) eeze_disk_cancel(Eeze_Disk *disk)
{ {
EINA_SAFETY_ON_NULL_RETURN(disk); EINA_SAFETY_ON_NULL_RETURN(disk);
if ((!disk->mount_status) || (!disk->mounter)) return; if ((!disk->mount_status) || (!disk->mounter)) return;
disk->mount_status = EEZE_DISK_NULL; disk->mount_status = EEZE_DISK_NULL;
ecore_exe_quit(disk->mounter); ecore_exe_kill(disk->mounter);
disk->mounter = NULL;
} }
EAPI const char * EAPI const char *

View File

@ -34,7 +34,8 @@ typedef enum
{ {
EEZE_DISK_NULL, EEZE_DISK_NULL,
EEZE_DISK_MOUNTING, EEZE_DISK_MOUNTING,
EEZE_DISK_UNMOUNTING EEZE_DISK_UNMOUNTING,
EEZE_DISK_EJECTING
} Eeze_Disk_Status; } Eeze_Disk_Status;
struct _Eeze_Disk struct _Eeze_Disk
@ -45,6 +46,7 @@ struct _Eeze_Disk
Eeze_Disk_Status mount_status; Eeze_Disk_Status mount_status;
Eina_Strbuf *mount_cmd; Eina_Strbuf *mount_cmd;
Eina_Strbuf *unmount_cmd; Eina_Strbuf *unmount_cmd;
Eina_Strbuf *eject_cmd;
Eina_Bool mount_cmd_changed : 1; Eina_Bool mount_cmd_changed : 1;
Eina_Bool unmount_cmd_changed : 1; Eina_Bool unmount_cmd_changed : 1;
Eina_Bool mounted : 1; Eina_Bool mounted : 1;