13 static E_DBus_Connection *conn;
15 static int mount_id = 0;
18 #define DEVICE_TYPE_STORAGE 1
19 #define DEVICE_TYPE_VOLUME 2
20 typedef struct Device Device;
26 typedef struct Storage Storage;
39 unsigned long media_size;
43 char media_check_enabled;
54 typedef struct Volume Volume;
63 char *partition_label;
70 static Ecore_List *storage_devices;
71 static Ecore_List *volumes;
79 mvc = ewl_widget_name_find("device_mvc");
80 ewl_mvc_dirty_set(EWL_MVC(mvc), 1);
89 s = calloc(1, sizeof(Storage));
90 s->type = DEVICE_TYPE_STORAGE;
91 s->volumes = ecore_list_new();
96 storage_free(Storage *storage)
99 printf("storage_free: %s\n", storage->udi);
101 /* disconnect storage from volume */
102 ecore_list_first_goto(storage->volumes);
103 while ((v = ecore_list_next(storage->volumes)))
105 ecore_list_destroy(storage->volumes);
107 if (storage->udi) free(storage->udi);
108 if (storage->bus) free(storage->bus);
109 if (storage->drive_type) free(storage->drive_type);
111 if (storage->model) free(storage->model);
112 if (storage->vendor) free(storage->vendor);
113 if (storage->serial) free(storage->serial);
114 if (storage->icon.drive) free(storage->icon.drive);
115 if (storage->icon.volume) free(storage->icon.volume);
121 storage_find_helper(Storage *s, const char *udi)
123 if (!s->udi) return -1;
124 return strcmp(s->udi, udi);
128 storage_find(const char *udi)
131 if (!udi) return NULL;
132 s = ecore_list_find(storage_devices, ECORE_COMPARE_CB(storage_find_helper), udi);
137 storage_remove(const char *udi)
139 if (storage_find(udi))
141 ecore_list_remove_destroy(storage_devices);
147 cb_storage_properties(void *data, void *reply_data, DBusError *error)
150 E_Hal_Properties *ret = reply_data;
153 if (dbus_error_is_set(error))
156 dbus_error_free(error);
160 s->bus = e_hal_property_string_get(ret, "storage.bus", &err);
162 s->drive_type = e_hal_property_string_get(ret, "storage.drive_type", &err);
164 s->model = e_hal_property_string_get(ret, "storage.model", &err);
166 s->vendor = e_hal_property_string_get(ret, "storage.vendor", &err);
168 s->serial = e_hal_property_string_get(ret, "storage.serial", &err);
170 s->removable = e_hal_property_bool_get(ret, "storage.removable", &err);
175 s->media_available = e_hal_property_bool_get(ret, "storage.removable.media_available", &err);
176 s->media_size = e_hal_property_uint64_get(ret, "storage.removable.media_size", &err);
179 s->requires_eject = e_hal_property_bool_get(ret, "storage.requires_eject", &err);
180 s->hotpluggable = e_hal_property_bool_get(ret, "storage.hotpluggable", &err);
181 s->media_check_enabled = e_hal_property_bool_get(ret, "storage.media_check_enabled", &err);
183 s->icon.drive = e_hal_property_string_get(ret, "storage.icon.drive", &err);
184 s->icon.volume = e_hal_property_string_get(ret, "storage.icon.volume", &err);
187 /* now fetch the children (volumes?) */
189 //printf("Got storage:\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);
193 storage_remove(s->udi);
197 storage_append(const char *udi)
200 if (!udi) return NULL;
202 s->udi = strdup(udi);
203 ecore_list_append(storage_devices, s);
204 e_hal_device_get_all_properties(conn, s->udi, cb_storage_properties, s);
213 v = calloc(1, sizeof(Volume));
214 v->type = DEVICE_TYPE_VOLUME;
219 volume_free(Volume *volume)
223 /* disconnect volume from storage */
226 if (ecore_list_goto(volume->storage->volumes, volume))
227 ecore_list_remove(volume->storage->volumes);
230 if (volume->udi) free(volume->udi);
231 if (volume->uuid) free(volume->uuid);
232 if (volume->label) free(volume->label);
233 if (volume->fstype) free(volume->fstype);
234 if (volume->partition_label) free(volume->partition_label);
235 if (volume->mount_point) free(volume->mount_point);
241 volume_find_helper(Volume *v, const char *udi)
243 if (!v->udi) return -1;
244 return strcmp(v->udi, udi);
248 volume_find(const char *udi)
250 if (!udi) return NULL;
251 return ecore_list_find(volumes, ECORE_COMPARE_CB(volume_find_helper), udi);
255 volume_remove(const char *udi)
257 if (volume_find(udi))
259 ecore_list_remove_destroy(volumes);
265 cb_volume_properties(void *data, void *reply_data, DBusError *error)
269 E_Hal_Device_Get_All_Properties_Return *ret = reply_data;
273 if (dbus_error_is_set(error))
276 dbus_error_free(error);
280 /* skip volumes with volume.ignore set */
281 if (e_hal_property_bool_get(ret, "volume.ignore", &err) || err)
284 /* skip volumes that aren't filesystems */
285 str = e_hal_property_string_get(ret, "volume.fsusage", &err);
286 if (err || !str) goto error;
287 if (strcmp(str, "filesystem")) goto error;
291 v->uuid = e_hal_property_string_get(ret, "volume.uuid", &err);
294 v->label = e_hal_property_string_get(ret, "volume.label", &err);
297 v->fstype = e_hal_property_string_get(ret, "volume.fstype", &err);
300 v->mounted = e_hal_property_bool_get(ret, "volume.is_mounted", &err);
303 v->partition = e_hal_property_bool_get(ret, "volume.is_partition", &err);
306 v->mount_point = e_hal_property_string_get(ret, "volume.mount_point", &err);
311 v->partition_label = e_hal_property_string_get(ret, "volume.partition.label", &err);
315 str = e_hal_property_string_get(ret, "info.parent", &err);
318 s = storage_find(str);
322 ecore_list_append(s->volumes, v);
328 //printf("Got volume\n udi: %s\n uuid: %s\n fstype: %s\n label: %s\n partition: %d\n partition_label: %s\n mounted: %d\n mount_point: %s\n\n", v->udi, v->uuid, v->fstype, v->label, v->partition, v->partition ? v->partition_label : "(not a partition)", v->mounted, v->mount_point);
329 //if (s) printf(" for storage: %s\n", s->udi);
330 //else printf(" storage unknown\n");
337 volume_remove(v->udi);
343 volume_setup(Volume *v)
345 e_hal_device_get_all_properties(conn, v->udi, cb_volume_properties, v);
349 volume_append(const char *udi)
352 if (!udi) return NULL;
353 printf("ADDING %s\n", udi);
355 v->udi = strdup(udi);
356 ecore_list_append(volumes, v);
359 //this will get called when volume_setup() returns, which is more important
366 cb_test_get_all_devices(void *user_data, void *reply_data, DBusError *error)
368 E_Hal_Manager_Get_All_Devices_Return *ret = reply_data;
371 if (!ret || !ret->strings) return;
373 if (dbus_error_is_set(error))
376 dbus_error_free(error);
380 ecore_list_first_goto(ret->strings);
381 while ((device = ecore_list_next(ret->strings)))
383 printf("device: %s\n", device);
388 cb_test_find_device_by_capability_storage(void *user_data, void *reply_data, DBusError *error)
390 E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
393 if (!ret || !ret->strings) return;
395 if (dbus_error_is_set(error))
398 dbus_error_free(error);
402 ecore_list_first_goto(ret->strings);
403 while ((device = ecore_list_next(ret->strings)))
404 storage_append(device);
408 cb_test_find_device_by_capability_volume(void *user_data, void *reply_data, DBusError *error)
410 E_Hal_Manager_Find_Device_By_Capability_Return *ret = reply_data;
413 if (!ret || !ret->strings) return;
415 if (dbus_error_is_set(error))
418 dbus_error_free(error);
422 ecore_list_first_goto(ret->strings);
423 while ((device = ecore_list_next(ret->strings)))
424 volume_append(device);
428 cb_is_storage(void *user_data, void *reply_data, DBusError *error)
430 char *udi = user_data;
431 E_Hal_Device_Query_Capability_Return *ret = reply_data;
433 if (dbus_error_is_set(error))
436 dbus_error_free(error);
440 if (ret && ret->boolean)
448 cb_is_volume(void *user_data, void *reply_data, DBusError *error)
450 char *udi = user_data;
451 E_Hal_Device_Query_Capability_Return *ret = reply_data;
453 if (dbus_error_is_set(error))
456 dbus_error_free(error);
460 if (ret && ret->boolean)
468 cb_signal_device_added(void *data, DBusMessage *msg)
474 dbus_error_init(&err);
475 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
477 printf("Device added: %s\n", udi);
478 ret = e_hal_device_query_capability(conn, udi, "storage", cb_is_storage, strdup(udi));
479 e_hal_device_query_capability(conn, udi, "volume", cb_is_volume, strdup(udi));
483 cb_signal_device_removed(void *data, DBusMessage *msg)
488 dbus_error_init(&err);
490 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_INVALID);
491 printf("Removed: %s\n", udi);
497 cb_signal_new_capability(void *data, DBusMessage *msg)
500 char *udi, *capability;
502 dbus_error_init(&err);
504 dbus_message_get_args(msg, &err, DBUS_TYPE_STRING, &udi, DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID);
505 if (!strcmp(capability, "storage"))
514 cb_window_destroy(Ewl_Widget *w, void *ev, void *data)
520 cb_window_close(Ewl_Widget *w, void *ev, void *data)
522 ewl_widget_destroy(w);
526 cb_volume_unmounted(void *user_data, void *method_return, DBusError *error)
528 Volume *vol = user_data;
530 printf("Volume unmounted reply: %s\n", vol->udi);
534 cb_volume_mounted(void *user_data, void *method_return, DBusError *error)
536 Volume *vol = user_data;
538 printf("Volume mounted reply: %s\n", vol->udi);
542 cb_device_view_clicked(Ewl_Widget *w, void *ev, void *data)
547 printf("Device clicked: %s\n", dev->udi);
548 if (dev->type == DEVICE_TYPE_VOLUME)
550 Volume *vol = (Volume *)dev;
553 e_hal_device_volume_unmount(conn, vol->udi, NULL, cb_volume_unmounted, vol);
559 if (vol->mount_point && vol->mount_point[0])
560 mount_point = vol->mount_point;
562 if (vol->label && vol->label[0])
563 mount_point = vol->label;
564 else if (vol->uuid && vol->uuid[0])
565 mount_point = vol->uuid;
568 // XXX need to check this...
569 snprintf(buf, sizeof(buf), "%d\n", mount_id++);
573 printf("Attempting to mount %s to %s\n", vol->udi, mount_point);
574 e_hal_device_volume_mount(conn, vol->udi, mount_point, vol->fstype, NULL, cb_volume_mounted, vol);
581 cb_device_view_constructor(void)
585 icon = ewl_icon_simple_new();
586 ewl_box_orientation_set(EWL_BOX(icon), EWL_ORIENTATION_HORIZONTAL);
591 device_view_device_set(Ewl_Icon *icon, Device *dev)
595 const char *icon_name = NULL;
597 if (dev->type == DEVICE_TYPE_STORAGE)
599 Storage *s = (Storage *)dev;
601 if (s->icon.drive && s->icon.drive[0])
602 icon_name = s->icon.drive;
604 snprintf(buf, sizeof(buf), "%s", (s->model && s->model[0]) ? s->model : "Unknown drive");
606 else if (dev->type == DEVICE_TYPE_VOLUME)
608 Volume *v = (Volume *)dev;
609 if (v->storage && v->storage->icon.volume && v->storage->icon.volume[0])
610 icon_name = v->storage->icon.volume;
611 snprintf(buf, sizeof(buf), "%s (%s)", (v->label && v->label[0]) ? v->label : "Unlabeled Volume", v->fstype ? v->fstype : "Unknown");
615 fprintf(stderr, "Invalid device type.");
619 ewl_icon_label_set(icon, buf);
622 //printf("find icon path: %s\n", icon_name);
623 path = efreet_icon_path_find("Tango", icon_name, 32);
624 //printf("found: %s\n", path);
627 ewl_icon_image_set(icon, path, NULL);
631 ewl_callback_append(EWL_WIDGET(icon), EWL_CALLBACK_CLICKED, cb_device_view_clicked, dev);
636 cb_device_view_assign(Ewl_Widget *w, void *data)
639 device_view_device_set(EWL_ICON(w), dev);
643 cb_device_view_header_fetch(void *data, int column)
647 label = ewl_label_new();
648 ewl_label_text_set(EWL_LABEL(label), "Device");
649 ewl_widget_show(label);
654 cb_device_tree_expandable_get(void *data, unsigned int row)
660 if (!devices) return FALSE;
662 dev = ecore_list_index_goto(devices, row);
663 if (!dev) return FALSE;
665 if (dev->type == DEVICE_TYPE_STORAGE)
667 Storage *s = (Storage *)dev;
668 if (ecore_list_count(s->volumes) > 0)
676 cb_device_tree_expansion_data_fetch(void *data, unsigned int parent)
684 if (!devices) return NULL;
686 dev = ecore_list_index_goto(devices, parent);
688 if (!dev) return NULL;
689 if (dev->type != DEVICE_TYPE_STORAGE) return NULL;
696 mountbox_list_new(void)
702 model = ewl_model_ecore_list_get();
704 view = ewl_view_new();
705 ewl_view_constructor_set(view, cb_device_view_constructor);
706 ewl_view_assign_set(view, EWL_VIEW_ASSIGN(cb_device_view_assign));
708 list = ewl_list_new();
709 ewl_mvc_model_set(EWL_MVC(list), model);
710 ewl_mvc_view_set(EWL_MVC(list), view);
711 ewl_mvc_data_set(EWL_MVC(list), volumes);
713 ewl_widget_name_set(list, "volume_mvc");
720 mountbox_tree_new(void)
726 model = ewl_model_ecore_list_get();
727 ewl_model_expandable_set(model, cb_device_tree_expandable_get);
728 ewl_model_expansion_data_fetch_set(model, cb_device_tree_expansion_data_fetch);
730 view = ewl_view_new();
731 ewl_view_constructor_set(view, cb_device_view_constructor);
732 ewl_view_assign_set(view, EWL_VIEW_ASSIGN(cb_device_view_assign));
733 ewl_view_header_fetch_set(view, cb_device_view_header_fetch);
735 tree = ewl_tree2_new();
736 ewl_mvc_model_set(EWL_MVC(tree), model);
737 ewl_mvc_data_set(EWL_MVC(tree), storage_devices);
738 ewl_tree2_column_append(EWL_TREE2(tree), view, FALSE);
740 ewl_widget_name_set(tree, "device_mvc");
746 mountbox_mainwin_new(void)
748 Ewl_Widget *win, *box, *list;
749 win = ewl_window_new();
750 ewl_window_title_set(EWL_WINDOW(win), "EWL Mountbox");
751 ewl_window_class_set(EWL_WINDOW(win), "ewl_mountbox");
752 ewl_window_name_set(EWL_WINDOW(win), "ewl_mountbox");
754 ewl_object_fill_policy_set(EWL_OBJECT(win), EWL_FLAG_FILL_ALL);
755 ewl_object_size_request(EWL_OBJECT(win), 400, 400);
757 ewl_callback_append(win, EWL_CALLBACK_DELETE_WINDOW, cb_window_close, NULL);
758 ewl_callback_append(win, EWL_CALLBACK_DESTROY, cb_window_destroy, NULL);
760 box = ewl_vbox_new();
761 ewl_container_child_append(EWL_CONTAINER(win), box);
762 ewl_widget_show(box);
764 list = mountbox_tree_new();
765 ewl_container_child_append(EWL_CONTAINER(box), list);
766 ewl_widget_show(list);
772 main(int argc, char **argv)
784 if (!ewl_init(&argc, argv))
786 fprintf(stderr, "Unable to init EWL.\n");
791 conn = e_dbus_bus_get(DBUS_BUS_SYSTEM);
794 printf("Error connecting to system bus. Is it running?\n");
798 storage_devices = ecore_list_new();
799 ecore_list_free_cb_set(storage_devices, ECORE_FREE_CB(storage_free));
800 volumes = ecore_list_new();
801 ecore_list_free_cb_set(volumes, ECORE_FREE_CB(volume_free));
804 win = mountbox_mainwin_new();
805 ewl_widget_show(win);
808 e_hal_manager_get_all_devices(conn, cb_test_get_all_devices, NULL);
809 e_hal_manager_find_device_by_capability(conn, "storage", cb_test_find_device_by_capability_storage, NULL);
810 e_hal_manager_find_device_by_capability(conn, "volume", cb_test_find_device_by_capability_volume, NULL);
812 e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager", "DeviceAdded", cb_signal_device_added, NULL);
813 e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager", "DeviceRemoved", cb_signal_device_removed, NULL);
814 e_dbus_signal_handler_add(conn, "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager", "NewCapability", cb_signal_new_capability, NULL);
821 ecore_main_loop_begin();
823 ecore_list_destroy(storage_devices);
824 ecore_list_destroy(volumes);
825 e_dbus_connection_close(conn);
827 ecore_string_shutdown();