8 # define alloca __builtin_alloca
10 # define alloca __alloca
11 #elif defined _MSC_VER
13 # define alloca _alloca
29 #include <sys/types.h>
32 #include <sys/param.h>
45 #include <Ecore_Ipc.h>
46 #include <Ecore_File.h>
51 #include "e_fm_main.h"
52 #include "e_fm_main_udisks.h"
54 #include "e_fm_shared_codec.h"
55 #include "e_fm_shared_device.h"
57 #include "e_fm_device.h"
59 static E_DBus_Signal_Handler *_udisks_poll = NULL;
60 static E_DBus_Connection *_e_fm_main_udisks_conn = NULL;
61 static Eina_List *_e_stores = NULL;
62 static Eina_List *_e_vols = NULL;
64 static void _e_fm_main_udisks_cb_dev_all(void *user_data __UNUSED__,
65 E_Ukit_String_List_Return *ret,
67 static void _e_fm_main_udisks_cb_dev_verify(const char *udi,
70 static void _e_fm_main_udisks_cb_dev_add_verify(const char *udi,
73 static void _e_fm_main_udisks_cb_dev_add(void *data,
75 static void _e_fm_main_udisks_cb_dev_del(void *data,
77 static void _e_fm_main_udisks_cb_dev_chg(void *data,
79 static void _e_fm_main_udisks_cb_prop_modified(E_Volume *v,
81 static void _e_fm_main_udisks_cb_store_prop(E_Storage *s,
82 E_Ukit_Properties *ret,
84 static void _e_fm_main_udisks_cb_vol_prop(E_Volume *v,
85 E_Ukit_Properties *ret,
87 static void _e_fm_main_udisks_cb_vol_mounted(E_Volume *v,
89 static void _e_fm_main_udisks_cb_vol_unmounted(E_Volume *v,
91 static void _e_fm_main_udisks_cb_vol_unmounted_before_eject(E_Volume *v,
92 void *method_return __UNUSED__,
95 static Eina_Bool _e_fm_main_udisks_cb_vol_ejecting_after_unmount(E_Volume *v);
96 static void _e_fm_main_udisks_cb_vol_ejected(E_Volume *v,
97 void *method_return __UNUSED__,
99 static int _e_fm_main_udisks_format_error_msg(char **buf,
102 static void _e_fm_main_udisks_test(void *data,
105 static void _e_fm_main_udisks_poll(void *data,
108 static Eina_Bool _e_fm_main_udisks_vol_mount_timeout(E_Volume *v);
109 static Eina_Bool _e_fm_main_udisks_vol_unmount_timeout(E_Volume *v);
110 static Eina_Bool _e_fm_main_udisks_vol_eject_timeout(E_Volume *v);
113 _e_fm_main_udisks_poll(void *data __UNUSED__,
117 const char *name, *from, *to;
119 dbus_error_init(&err);
120 if (!dbus_message_get_args(msg, &err,
121 DBUS_TYPE_STRING, &name,
122 DBUS_TYPE_STRING, &from,
123 DBUS_TYPE_STRING, &to,
125 dbus_error_free(&err);
127 //printf("name: %s\nfrom: %s\nto: %s\n", name, from, to);
128 if ((name) && !strcmp(name, E_UDISKS_BUS))
129 _e_fm_main_udisks_test(NULL, NULL, NULL);
133 _e_fm_main_udisks_test(void *data __UNUSED__,
134 DBusMessage *msg __UNUSED__,
137 if ((error) && (dbus_error_is_set(error)))
139 dbus_error_free(error);
140 _e_fm_main_udisks_catch(EINA_FALSE);
144 e_dbus_signal_handler_del(_e_fm_main_udisks_conn, _udisks_poll);
146 e_udisks_get_all_devices(_e_fm_main_udisks_conn, (E_DBus_Callback_Func)_e_fm_main_udisks_cb_dev_all, NULL);
148 e_dbus_signal_handler_add(_e_fm_main_udisks_conn, E_UDISKS_BUS,
151 "DeviceAdded", (E_DBus_Signal_Cb)_e_fm_main_udisks_cb_dev_add, NULL);
152 e_dbus_signal_handler_add(_e_fm_main_udisks_conn, E_UDISKS_BUS,
155 "DeviceRemoved", (E_DBus_Signal_Cb)_e_fm_main_udisks_cb_dev_del, NULL);
156 e_dbus_signal_handler_add(_e_fm_main_udisks_conn, E_UDISKS_BUS,
159 "DeviceChanged", (E_DBus_Signal_Cb)_e_fm_main_udisks_cb_dev_chg, NULL);
160 _e_fm_main_udisks_catch(EINA_TRUE); /* signal usage of udisks for mounting */
164 _e_fm_main_udisks_cb_dev_all(void *user_data __UNUSED__,
165 E_Ukit_String_List_Return *ret,
171 if (!ret || !ret->strings) return;
173 if (dbus_error_is_set(error))
175 dbus_error_free(error);
179 EINA_LIST_FOREACH(ret->strings, l, udi)
181 printf("DB INIT DEV+: %s\n", udi);
182 e_udisks_get_property(_e_fm_main_udisks_conn, udi, "IdUsage",
183 (E_DBus_Callback_Func)_e_fm_main_udisks_cb_dev_verify, (void*)eina_stringshare_add(udi));
189 _e_fm_main_udisks_cb_dev_verify(const char *udi,
190 E_Ukit_Property *ret,
195 if (dbus_error_is_set(error))
197 dbus_error_free(error);
201 if ((!ret->val.s) || (!ret->val.s[0])) /* storage */
202 _e_fm_main_udisks_storage_add(udi);
203 else if (!strcmp(ret->val.s, "filesystem"))
205 printf("DB VOL+: %s\n", udi);
206 _e_fm_main_udisks_volume_add(udi, EINA_TRUE);
208 //eina_stringshare_del(udi);
212 _e_fm_main_udisks_cb_dev_add_verify(const char *udi,
213 E_Ukit_Property *ret,
218 if (dbus_error_is_set(error))
220 dbus_error_free(error);
224 if ((!ret->val.s) || (!ret->val.s[0])) /* storage */
225 _e_fm_main_udisks_storage_add(udi);
226 else if (!strcmp(ret->val.s, "filesystem"))
228 printf("DB VOL+: %s\n", udi);
229 _e_fm_main_udisks_volume_add(udi, EINA_FALSE);
231 //eina_stringshare_del(udi);
235 _e_fm_main_udisks_cb_dev_add(void *data __UNUSED__,
241 dbus_error_init(&err);
242 dbus_message_get_args(msg, &err, DBUS_TYPE_OBJECT_PATH, &udi, DBUS_TYPE_INVALID);
244 e_udisks_get_property(_e_fm_main_udisks_conn, udi, "IdUsage",
245 (E_DBus_Callback_Func)_e_fm_main_udisks_cb_dev_add_verify, (void*)eina_stringshare_add(udi));
249 _e_fm_main_udisks_cb_dev_del(void *data __UNUSED__,
256 dbus_error_init(&err);
258 dbus_message_get_args(msg,
259 &err, DBUS_TYPE_OBJECT_PATH,
260 &udi, DBUS_TYPE_INVALID);
261 printf("DB DEV-: %s\n", udi);
262 if ((v = _e_fm_main_udisks_volume_find(udi)))
264 if (v->optype == E_VOLUME_OP_TYPE_EJECT)
265 _e_fm_main_udisks_cb_vol_ejected(v, msg, &err);
267 _e_fm_main_udisks_volume_del(udi);
268 _e_fm_main_udisks_storage_del(udi);
272 _e_fm_main_udisks_cb_dev_chg(void *data __UNUSED__,
278 dbus_error_init(&err);
280 dbus_message_get_args(msg, &err,
281 DBUS_TYPE_OBJECT_PATH, &udi,
284 printf("DB STORE CAP+: %s\n", udi);
285 e_udisks_get_property(_e_fm_main_udisks_conn, udi, "IdUsage",
286 (E_DBus_Callback_Func)_e_fm_main_udisks_cb_dev_add_verify, (void*)eina_stringshare_add(udi));
290 _e_fm_main_udisks_cb_prop_modified(E_Volume *v,
295 if (dbus_message_get_error_name(msg))
297 printf("DBUS ERROR: %s\n", dbus_message_get_error_name(msg));
300 e_udisks_get_all_properties(_e_fm_main_udisks_conn, v->udi,
301 (E_DBus_Callback_Func)_e_fm_main_udisks_cb_vol_prop, v);
305 _e_fm_main_udisks_cb_store_prop(E_Storage *s,
306 E_Ukit_Properties *ret,
312 if (!ret) goto error;
314 if (dbus_error_is_set(error))
316 dbus_error_free(error);
320 s->bus = e_ukit_property_string_get(ret, "DriveConnectionInterface", &err);
322 s->bus = eina_stringshare_add(s->bus);
326 l = e_ukit_property_strlist_get(ret, "DriveMediaCompatibility", &err);
328 if (l) s->drive_type = eina_stringshare_add(l->data);
330 s->model = e_ukit_property_string_get(ret, "DriveModel", &err);
332 s->model = eina_stringshare_add(s->model);
333 s->vendor = e_ukit_property_string_get(ret, "DriveVendor", &err);
335 s->vendor = eina_stringshare_add(s->vendor);
336 s->serial = e_ukit_property_string_get(ret, "DriveSerial", &err);
337 // if (err) goto error;
338 if (err) printf("Error getting serial for %s\n", s->udi);
339 s->serial = eina_stringshare_add(s->serial);
341 s->removable = e_ukit_property_bool_get(ret, "DeviceIsRemovable", &err);
342 s->system_internal = e_ukit_property_bool_get(ret, "DeviceIsSystemInternal", &err);
343 if (s->system_internal) goto error; /* only track non internal */
344 str = e_ukit_property_string_get(ret, "IdUsage", &err);
345 /* if not of filesystem usage type - skip it - testing on ubuntu 10.04 */
346 if (!((str) && (!strcmp(str, "filesystem")))) goto error;
347 /* force it to be removable if it passed the above tests */
348 s->removable = EINA_TRUE;
350 // ubuntu 10.04 - only dvd is reported as removable. usb storage and mmcblk
351 // is not - but its not "system internal".
352 // if (!s->removable) goto error; /* only track removable media */
353 s->media_available = e_ukit_property_bool_get(ret, "DeviceIsMediaAvailable", &err);
354 s->media_size = e_ukit_property_uint64_get(ret, "DeviceSize", &err);
356 s->requires_eject = e_ukit_property_bool_get(ret, "DriveIsMediaEjectable", &err);
357 s->hotpluggable = e_ukit_property_bool_get(ret, "DriveCanDetach", &err);
358 s->media_check_enabled = !e_ukit_property_bool_get(ret, "DeviceIsMediaChangeDetectionInhibited", &err);
360 s->icon.drive = e_ukit_property_string_get(ret, "DevicePresentationIconName", &err);
361 if (s->icon.drive && s->icon.drive[0]) s->icon.drive = eina_stringshare_add(s->icon.drive);
362 else s->icon.drive = NULL;
363 s->icon.volume = e_ukit_property_string_get(ret, "DevicePresentationIconName", &err);
364 if (s->icon.volume && s->icon.volume[0]) s->icon.volume = eina_stringshare_add(s->icon.volume);
365 else s->icon.volume = NULL;
367 // printf("++STO:\n udi: %s\n bus: %s\n drive_type: %s\n model: %s\n vendor: %s\n serial: %s\n icon.drive: %s\n icon.volume: %s\n\n", s->udi, s->bus, s->drive_type, s->model, s->vendor, s->serial, s->icon.drive, s->icon.volume);
368 s->validated = EINA_TRUE;
373 msg_data = _e_fm_shared_codec_storage_encode(s, &msg_size);
376 ecore_ipc_server_send(_e_fm_ipc_server,
377 6 /*E_IPC_DOMAIN_FM*/,
379 0, 0, 0, msg_data, msg_size);
386 // printf("ERR %s\n", s->udi);
387 _e_fm_main_udisks_storage_del(s->udi);
391 _e_fm_main_udisks_cb_vol_prop(E_Volume *v,
392 E_Ukit_Properties *ret,
397 const char *str = NULL;
399 if ((!v) || (!ret)) goto error;
401 if (dbus_error_is_set(error))
403 dbus_error_free(error);
407 if (e_ukit_property_bool_get(ret, "DeviceIsSystemInternal", &err) || err) goto error;
409 /* skip volumes with volume.ignore set */
410 if (e_ukit_property_bool_get(ret, "DeviceIsMediaChangeDetectionInhibited", &err) || err)
413 /* skip volumes that aren't filesystems */
414 str = e_ukit_property_string_get(ret, "IdUsage", &err);
415 if (err || !str) goto error;
416 if (strcmp(str, "filesystem"))
418 if (strcmp(str, "crypto"))
419 v->encrypted = e_ukit_property_bool_get(ret, "DeviceIsLuks", &err);
426 v->uuid = e_ukit_property_string_get(ret, "IdUuid", &err);
428 v->uuid = eina_stringshare_add(v->uuid);
430 v->label = e_ukit_property_string_get(ret, "IdLabel", &err);
431 if (!v->label) v->label = e_ukit_property_string_get(ret, "DeviceFile", &err); /* avoid having blank labels */
432 if (!v->label) v->label = v->uuid; /* last resort */
433 v->label = eina_stringshare_add(v->label);
439 l = e_ukit_property_strlist_get(ret, "DeviceMountPaths", &err);
441 if (l) v->mount_point = eina_stringshare_add(l->data);
443 v->fstype = e_ukit_property_string_get(ret, "IdType", &err);
444 v->fstype = eina_stringshare_add(v->fstype);
446 v->size = e_ukit_property_uint64_get(ret, "DeviceSize", &err);
448 v->mounted = e_ukit_property_bool_get(ret, "DeviceIsMounted", &err);
452 v->unlocked = e_ukit_property_bool_get(ret, "DeviceIsLuksCleartext", &err);
454 v->partition = e_ukit_property_bool_get(ret, "DeviceIsPartition", &err);
459 v->partition_number = e_ukit_property_int_get(ret, "PartitionNumber", NULL);
460 v->partition_label = e_ukit_property_string_get(ret, "PartitionLabel", NULL);
461 v->partition_label = eina_stringshare_add(v->partition_label);
469 enc = e_ukit_property_string_get(ret, "LuksCleartextSlave", &err);
470 venc = _e_fm_main_udisks_volume_find(enc);
471 v->parent = venc->parent;
472 v->storage = venc->storage;
473 v->storage->volumes = eina_list_append(v->storage->volumes, v);
477 v->parent = e_ukit_property_string_get(ret, "PartitionSlave", &err);
483 s = e_storage_find(v->parent);
487 if (!eina_list_data_find_list(s->volumes, v))
488 s->volumes = eina_list_append(s->volumes, v);
493 v->storage = _e_fm_main_udisks_storage_add(v->udi); /* disk is both storage and volume */
494 if (v->storage) v->storage->volumes = eina_list_append(v->storage->volumes, v);
499 v->parent = eina_stringshare_add(v->parent);
503 case E_VOLUME_OP_TYPE_MOUNT:
504 _e_fm_main_udisks_cb_vol_mounted(v, error);
506 case E_VOLUME_OP_TYPE_UNMOUNT:
507 _e_fm_main_udisks_cb_vol_unmounted(v, error);
509 case E_VOLUME_OP_TYPE_EJECT:
510 _e_fm_main_udisks_cb_vol_unmounted_before_eject(v, NULL, error);
516 // printf("++VOL:\n udi: %s\n uuid: %s\n fstype: %s\n size: %llu\n label: %s\n partition: %d\n partition_number: %d\n partition_label: %s\n mounted: %d\n mount_point: %s\n", v->udi, v->uuid, v->fstype, v->size, v->label, v->partition, v->partition_number, v->partition ? v->partition_label : "(not a partition)", v->mounted, v->mount_point);
517 // if (s) printf(" for storage: %s\n", s->udi);
518 // else printf(" storage unknown\n");
519 v->validated = EINA_TRUE;
524 msg_data = _e_fm_shared_codec_volume_encode(v, &msg_size);
527 ecore_ipc_server_send(_e_fm_ipc_server,
528 6 /*E_IPC_DOMAIN_FM*/,
530 0, 0, 0, msg_data, msg_size);
537 if (v) _e_fm_main_udisks_volume_del(v->udi);
542 _e_fm_main_udisks_format_error_msg(char **buf,
546 int size, vu, vm, en;
549 vu = strlen(v->udi) + 1;
550 vm = strlen(v->mount_point) + 1;
551 en = strlen(error->name) + 1;
552 size = vu + vm + en + strlen(error->message) + 1;
553 tmp = *buf = malloc(size);
557 strcpy(tmp, v->mount_point);
559 strcpy(tmp, error->name);
561 strcpy(tmp, error->message);
567 _e_fm_main_udisks_vol_mount_timeout(E_Volume *v)
574 dbus_pending_call_cancel(v->op);
576 v->optype = E_VOLUME_OP_TYPE_NONE;
577 error.name = "org.enlightenment.fm2.MountTimeout";
578 error.message = "Unable to mount the volume with specified time-out.";
579 size = _e_fm_main_udisks_format_error_msg(&buf, v, &error);
580 ecore_ipc_server_send(_e_fm_ipc_server, 6 /*E_IPC_DOMAIN_FM*/, E_FM_OP_MOUNT_ERROR,
584 return ECORE_CALLBACK_CANCEL;
588 _e_fm_main_udisks_cb_vol_mounted(E_Volume *v,
596 ecore_timer_del(v->guard);
600 if (error && dbus_error_is_set(error))
602 size = _e_fm_main_udisks_format_error_msg(&buf, v, error);
603 ecore_ipc_server_send(_e_fm_ipc_server, 6 /*E_IPC_DOMAIN_FM*/, E_FM_OP_MOUNT_ERROR,
605 dbus_error_free(error);
607 v->optype = E_VOLUME_OP_TYPE_NONE;
610 if (!v->mount_point) return; /* come back later */
612 v->optype = E_VOLUME_OP_TYPE_NONE;
614 v->mounted = EINA_TRUE;
615 // printf("MOUNT: %s from %s\n", v->udi, v->mount_point);
616 size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
619 strcpy(buf + strlen(buf) + 1, v->mount_point);
620 ecore_ipc_server_send(_e_fm_ipc_server,
621 6 /*E_IPC_DOMAIN_FM*/,
627 _e_fm_main_udisks_vol_unmount_timeout(E_Volume *v)
634 dbus_pending_call_cancel(v->op);
636 v->optype = E_VOLUME_OP_TYPE_NONE;
637 error.name = "org.enlightenment.fm2.UnmountTimeout";
638 error.message = "Unable to unmount the volume with specified time-out.";
639 size = _e_fm_main_udisks_format_error_msg(&buf, v, &error);
640 ecore_ipc_server_send(_e_fm_ipc_server, 6 /*E_IPC_DOMAIN_FM*/, E_FM_OP_UNMOUNT_ERROR,
644 return ECORE_CALLBACK_CANCEL;
648 _e_fm_main_udisks_cb_vol_unmounted(E_Volume *v,
656 ecore_timer_del(v->guard);
660 if (v->optype != E_VOLUME_OP_TYPE_EJECT)
662 v->optype = E_VOLUME_OP_TYPE_NONE;
665 if (dbus_error_is_set(error))
667 size = _e_fm_main_udisks_format_error_msg(&buf, v, error);
668 ecore_ipc_server_send(_e_fm_ipc_server, 6 /*E_IPC_DOMAIN_FM*/, E_FM_OP_UNMOUNT_ERROR,
670 dbus_error_free(error);
675 v->mounted = EINA_FALSE;
676 // printf("UNMOUNT: %s from %s\n", v->udi, v->mount_point);
677 size = strlen(v->udi) + 1 + strlen(v->mount_point) + 1;
680 strcpy(buf + strlen(buf) + 1, v->mount_point);
681 ecore_ipc_server_send(_e_fm_ipc_server,
682 6 /*E_IPC_DOMAIN_FM*/,
683 E_FM_OP_UNMOUNT_DONE,
688 _e_fm_main_udisks_vol_eject_timeout(E_Volume *v)
695 dbus_pending_call_cancel(v->op);
697 v->optype = E_VOLUME_OP_TYPE_NONE;
698 error.name = "org.enlightenment.fm2.EjectTimeout";
699 error.message = "Unable to eject the media with specified time-out.";
700 size = _e_fm_main_udisks_format_error_msg(&buf, v, &error);
701 ecore_ipc_server_send(_e_fm_ipc_server, 6 /*E_IPC_DOMAIN_FM*/, E_FM_OP_EJECT_ERROR,
705 return ECORE_CALLBACK_CANCEL;
709 _e_fm_main_udisks_cb_vol_ejecting_after_unmount(E_Volume *v)
711 v->guard = ecore_timer_add(E_FM_EJECT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_udisks_vol_eject_timeout, v);
712 v->op = e_udisks_volume_eject(_e_fm_main_udisks_conn, v->udi, NULL);
714 return ECORE_CALLBACK_CANCEL;
718 _e_fm_main_udisks_cb_vol_unmounted_before_eject(E_Volume *v,
719 void *method_return __UNUSED__,
724 err = !!dbus_error_is_set(error);
725 _e_fm_main_udisks_cb_vol_unmounted(v, error);
727 // delay is required for all message handlers were executed after unmount
729 ecore_timer_add(1.0, (Ecore_Task_Cb)_e_fm_main_udisks_cb_vol_ejecting_after_unmount, v);
733 _e_fm_main_udisks_cb_vol_ejected(E_Volume *v,
734 void *method_return __UNUSED__,
742 ecore_timer_del(v->guard);
746 v->optype = E_VOLUME_OP_TYPE_NONE;
748 if (dbus_error_is_set(error))
750 size = _e_fm_main_udisks_format_error_msg(&buf, v, error);
751 ecore_ipc_server_send(_e_fm_ipc_server, 6 /*E_IPC_DOMAIN_FM*/, E_FM_OP_EJECT_ERROR,
753 dbus_error_free(error);
758 size = strlen(v->udi) + 1;
761 ecore_ipc_server_send(_e_fm_ipc_server,
762 6 /*E_IPC_DOMAIN_FM*/,
768 _e_fm_main_udisks_volume_add(const char *udi,
769 Eina_Bool first_time)
773 if (!udi) return NULL;
774 if (e_volume_find(udi)) return NULL;
775 v = calloc(1, sizeof(E_Volume));
777 // printf("VOL+ %s\n", udi);
778 v->efm_mode = EFM_MODE_USING_UDISKS_MOUNT;
779 v->udi = eina_stringshare_add(udi);
781 v->first_time = first_time;
782 _e_vols = eina_list_append(_e_vols, v);
783 e_udisks_get_all_properties(_e_fm_main_udisks_conn, v->udi,
784 (E_DBus_Callback_Func)_e_fm_main_udisks_cb_vol_prop, v);
785 v->prop_handler = e_dbus_signal_handler_add(_e_fm_main_udisks_conn,
790 (E_DBus_Signal_Cb)_e_fm_main_udisks_cb_prop_modified, v);
797 _e_fm_main_udisks_volume_del(const char *udi)
801 v = e_volume_find(udi);
805 ecore_timer_del(v->guard);
808 if (v->prop_handler) e_dbus_signal_handler_del(_e_fm_main_udisks_conn, v->prop_handler);
811 // printf("--VOL %s\n", v->udi);
812 /* FIXME: send event of storage volume (disk) removed */
813 ecore_ipc_server_send(_e_fm_ipc_server,
814 6 /*E_IPC_DOMAIN_FM*/,
816 0, 0, 0, v->udi, eina_stringshare_strlen(v->udi) + 1);
818 _e_vols = eina_list_remove(_e_vols, v);
819 _e_fm_shared_device_volume_free(v);
823 _e_fm_main_udisks_volume_find(const char *udi)
828 if (!udi) return NULL;
829 EINA_LIST_FOREACH(_e_vols, l, v)
831 if (!v->udi) continue;
832 if (!strcmp(udi, v->udi)) return v;
838 _e_fm_main_udisks_volume_eject(E_Volume *v)
840 if (!v || v->guard) return;
843 v->guard = ecore_timer_add(E_FM_UNMOUNT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_udisks_vol_unmount_timeout, v);
844 v->op = e_udisks_volume_unmount(_e_fm_main_udisks_conn, v->udi, NULL);
848 v->guard = ecore_timer_add(E_FM_EJECT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_udisks_vol_eject_timeout, v);
849 v->op = e_udisks_volume_eject(_e_fm_main_udisks_conn, v->udi, NULL);
851 v->optype = E_VOLUME_OP_TYPE_EJECT;
855 _e_fm_main_udisks_volume_unmount(E_Volume *v)
857 // printf("unmount %s %s\n", v->udi, v->mount_point);
858 if (!v || v->guard) return;
860 v->guard = ecore_timer_add(E_FM_UNMOUNT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_udisks_vol_unmount_timeout, v);
861 v->op = e_udisks_volume_unmount(_e_fm_main_udisks_conn, v->udi, NULL);
862 v->optype = E_VOLUME_OP_TYPE_UNMOUNT;
866 _e_fm_main_udisks_volume_mount(E_Volume *v)
870 Eina_List *opt = NULL;
872 if ((!v) || (v->guard))
875 // printf("mount %s %s [fs type = %s]\n", v->udi, v->mount_point, v->fstype);
877 // for vfat and ntfs we want the uid mapped to the user mounting, if we can
878 if ((!strcmp(v->fstype, "vfat")) ||
879 (!strcmp(v->fstype, "ntfs"))
882 snprintf(buf, sizeof(buf), "uid=%i", (int)getuid());
883 opt = eina_list_append(opt, buf);
886 // force utf8 as the encoding - e only likes/handles utf8. its the
887 // pseudo-standard these days anyway for "linux" for intl text to work
888 // everywhere. problem is some fs's use differing options
889 if ((!strcmp(v->fstype, "vfat")) ||
890 (!strcmp(v->fstype, "ntfs")) ||
891 (!strcmp(v->fstype, "iso9660"))
894 snprintf(buf2, sizeof(buf2), "utf8");
895 opt = eina_list_append(opt, buf2);
897 else if ((!strcmp(v->fstype, "fat")) ||
898 (!strcmp(v->fstype, "jfs")) ||
899 (!strcmp(v->fstype, "udf"))
902 snprintf(buf2, sizeof(buf2), "iocharset=utf8");
903 opt = eina_list_append(opt, buf2);
906 v->guard = ecore_timer_add(E_FM_MOUNT_TIMEOUT, (Ecore_Task_Cb)_e_fm_main_udisks_vol_mount_timeout, v);
907 // on ubuntu 10.04 if we request mount with opt - it fails. unknown why right
908 // now, but lets try without and maybe we need to try 2 mounts - one with
909 // opts and one without?
910 // v->op = e_udisks_volume_mount(_e_fm_main_udisks_conn, v->udi,
912 v->op = e_udisks_volume_mount(_e_fm_main_udisks_conn, v->udi,
915 v->optype = E_VOLUME_OP_TYPE_MOUNT;
919 _e_fm_main_udisks_init(void)
925 _e_fm_main_udisks_conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
926 if (!_e_fm_main_udisks_conn) return;
928 _udisks_poll = e_dbus_signal_handler_add(_e_fm_main_udisks_conn,
929 E_DBUS_FDO_BUS, E_DBUS_FDO_PATH,
930 E_DBUS_FDO_INTERFACE,
931 "NameOwnerChanged", _e_fm_main_udisks_poll, NULL);
933 e_dbus_get_name_owner(_e_fm_main_udisks_conn, E_UDISKS_BUS, _e_fm_main_udisks_test, NULL); /* test for already running udisks */
934 msg = dbus_message_new_method_call(E_UDISKS_BUS, E_UDISKS_PATH, E_UDISKS_BUS, "suuuuuup");
935 e_dbus_method_call_send(_e_fm_main_udisks_conn, msg, NULL, (E_DBus_Callback_Func)_e_fm_main_udisks_test, NULL, -1, NULL); /* test for not running udisks */
936 dbus_message_unref(msg);
940 _e_fm_main_udisks_shutdown(void)
942 if (_e_fm_main_udisks_conn)
943 e_dbus_connection_close(_e_fm_main_udisks_conn);
949 _e_fm_main_udisks_storage_add(const char *udi)
953 if (!udi) return NULL;
954 if (e_storage_find(udi)) return NULL;
955 s = calloc(1, sizeof(E_Storage));
957 s->udi = eina_stringshare_add(udi);
958 _e_stores = eina_list_append(_e_stores, s);
959 e_udisks_get_all_properties(_e_fm_main_udisks_conn, s->udi,
960 (E_DBus_Callback_Func)_e_fm_main_udisks_cb_store_prop, s);
965 _e_fm_main_udisks_storage_del(const char *udi)
969 s = e_storage_find(udi);
973 // printf("--STO %s\n", s->udi);
974 ecore_ipc_server_send(_e_fm_ipc_server,
975 6 /*E_IPC_DOMAIN_FM*/,
977 0, 0, 0, s->udi, strlen(s->udi) + 1);
979 _e_stores = eina_list_remove(_e_stores, s);
980 _e_fm_shared_device_storage_free(s);
984 _e_fm_main_udisks_storage_find(const char *udi)
989 EINA_LIST_FOREACH(_e_stores, l, s)
991 if (!strcmp(udi, s->udi)) return s;