*
*/
#include <linux/limits.h>
-#include <dd-usbhost.h>
#include "setting-storage-utils.h"
#include "setting-storage-USB.h"
-enum {
- STORAGE_USB_REQ_NONE,
- STORAGE_USB_REQ_MOUNT,
- STORAGE_USB_REQ_UNMOUNT,
- STORAGE_USB_REQ_UNMOUNT_BEFORE_FORMAT,
- STORAGE_USB_REQ_FORMAT
+struct storage_stats {
+ unsigned long long total; // in bytes
+ unsigned long long available; // in bytes
};
-static inline void storage_USB_unmount(SettingStorage *ad)
-{
- int ret;
- ret = unmount_usb_storage(ad->usb_otg_path);
- if (ret < 0) {
- SETTING_TRACE_ERROR("unmount_usb_storage(%s) Fail(%d)",
- ad->usb_otg_path, ret);
- storage_fail_popup(ad);
- ad->usb_request = STORAGE_USB_REQ_NONE;
- } else {
- ad->popup = setting_create_popup_with_progressbar(ad, ad->md.window,
- PROGRESSBAR_STYLE,
- NULL, STORAGE_STR_UNMOUNTING,
- storage_popup_del, 0, TRUE, TRUE, 0);
- }
-}
-
-static inline void storage_USB_mount(SettingStorage *ad)
-{
- int ret;
-
- ret = mount_usb_storage(ad->usb_otg_path);
- if (ret < 0) {
- SETTING_TRACE_ERROR("mount_usb_storage(%s) Fail(%d)",
- ad->usb_otg_path, ret);
- storage_fail_popup(ad);
- ad->usb_request = STORAGE_USB_REQ_NONE;
- } else {
- ad->popup = setting_create_popup_with_progressbar(ad, ad->md.window,
- PROGRESSBAR_STYLE,
- NULL, NULL, storage_popup_del, 2, TRUE, TRUE,
- 0);
- ad->usb_request = STORAGE_USB_REQ_MOUNT;
- }
-}
-
-static inline int storage_USB_format(SettingStorage *ad)
-{
- int ret;
-
- ret = format_usb_storage(ad->usb_otg_path);
- if (ret < 0) {
- SETTING_TRACE_ERROR("format_usb_storage(%s) Fail(%d)",
- ad->usb_otg_path, ret);
- storage_fail_popup(ad);
- return SETTING_RETURN_FAIL;
- } else {
- ad->popup = setting_create_popup_with_progressbar(ad, ad->md.window,
- PROGRESSBAR_STYLE,
- NULL, STORAGE_STR_FORMATTING,
- storage_popup_del, 0, TRUE, TRUE, 0);
- }
- return SETTING_RETURN_SUCCESS;
-}
-
-static void storage_USB_unmount_resp(void *data, Evas_Object *obj,
- void *event_info)
-{
- int response_type;
- SettingStorage *ad = data;
-
- ret_if(data == NULL);
-
- response_type = btn_type(obj);
-
- evas_object_del(ad->popup);
- ad->popup = NULL;
-
- if (POPUP_RESPONSE_OK == response_type) {
- ad->usb_request = STORAGE_USB_REQ_UNMOUNT;
- storage_USB_unmount(ad);
- }
-}
-
-static void storage_USB_format_se_confirm(void *data, Evas_Object *obj,
- void *event_info)
-{
- int response_type;
- SettingStorage *ad = data;
-
- ret_if(data == NULL);
-
- response_type = btn_type(obj);
-
- evas_object_del(ad->popup);
- ad->popup = NULL;
-
- if (POPUP_RESPONSE_OK == response_type) {
- ad->usb_request = STORAGE_USB_REQ_UNMOUNT_BEFORE_FORMAT;
- storage_USB_unmount(ad);
- }
-}
-
-static void storage_USB_format_first_confirm(void *data, Evas_Object *obj,
- void *event_info)
-{
- int response_type;
- SettingStorage *ad = data;
-
- ret_if(data == NULL);
-
- response_type = btn_type(obj);
- evas_object_del(ad->popup);
- ad->popup = NULL;
-
- if (POPUP_RESPONSE_OK == response_type) {
- evas_object_del(ad->popup);
-
- ad->popup = setting_create_popup(ad, ad->md.window, NULL,
- STORAGE_STR_USB_FORMAT_SECOND_Q,
- storage_USB_format_se_confirm, 0, FALSE,
- FALSE, 2, STORAGE_STR_OK,
- STORAGE_STR_CANCEL);
- }
-
-}
-
-static void storage_main_USB_sel(void *data, Evas_Object *obj,
- void *event_info)
-{
- SettingStorage *ad = data;
- Elm_Object_Item *item = event_info;
- Setting_GenGroupItem_Data *list_item;
-
- ret_if(NULL == data);
- ret_if(NULL == event_info);
-
- elm_genlist_item_selected_set(item, 0);
- list_item = elm_object_item_data_get(item);
- setting_retm_if(NULL == list_item, "list_item is NULL");
-
- SETTING_TRACE("clicking item[%s]", list_item->keyStr);
-
- evas_object_del(ad->popup);
- ad->popup = NULL;
-
- if (list_item == ad->usb_mount) {
- storage_USB_mount(ad);
- } else if (list_item == ad->usb_unmount) {
- ad->popup = setting_create_popup(ad, ad->md.window, NULL,
- STORAGE_STR_USB_UNMOUNT_POPUP_MSG, storage_USB_unmount_resp,
- 0, FALSE, FALSE, 2, STORAGE_STR_OK,
- STORAGE_STR_CANCEL);
-
- } else if (list_item == ad->usb_format) {
- ad->popup = setting_create_popup(ad, ad->md.window, NULL,
- STORAGE_STR_USB_FORMAT_Q, storage_USB_format_first_confirm,
- 0, FALSE, FALSE, 2, STORAGE_STR_OK,
- STORAGE_STR_CANCEL);
- }
-}
-
-static inline void storage_USB_remove_info(SettingStorage *ad)
+static void storage_clear_ui(SettingStorage *ad)
{
if (ad->usb_card) {
elm_object_item_del(ad->usb_card->item);
ad->usb_card = NULL;
}
- if (ad->usb_mount) {
- elm_object_item_del(ad->usb_mount->item);
- ad->usb_mount = NULL;
- }
if (ad->usb_total) {
elm_object_item_del(ad->usb_total->item);
ad->usb_total = NULL;
elm_object_item_del(ad->usb_available->item);
ad->usb_available = NULL;
}
- if (ad->usb_unmount) {
- elm_object_item_del(ad->usb_unmount->item);
- ad->usb_unmount = NULL;
- }
- if (ad->usb_format) {
- elm_object_item_del(ad->usb_format->item);
- ad->usb_format = NULL;
- }
}
-static inline void storage_USB_append_mounted_info(SettingStorage *ad)
+static void storage_create_ui(SettingStorage *ad, struct storage_stats *stats)
{
- double total = 0.0;
- double avail = 0.0;
+ double total = stats->total;
+ double avail = stats->available;
char total_str[STORAGE_MAX_STR_LEN] = { 0 };
char avail_str[STORAGE_MAX_STR_LEN] = { 0 };
- storage_get_external_storage_status(ad->usb_otg_path, &total, &avail);
storage_size_to_str(total, total_str, sizeof(total_str));
storage_size_to_str(avail, avail_str, sizeof(avail_str));
+ /* USB OTG storage */
+ ad->usb_card = setting_create_Gendial_field_titleItem(ad->md.genlist,
+ &(ad->itc_group_item), STORAGE_STR_USB, NULL);
+
/* Total space */
ad->usb_total = setting_create_Gendial_field_def(ad->md.genlist,
&(ad->itc_2text_2),
} else {
SETTING_TRACE_ERROR("ad->usb_available is NULL");
}
-
- /* Usb Unmount*/
- ad->usb_unmount = setting_create_Gendial_field_def(ad->md.genlist,
- &(ad->itc_1text), storage_main_USB_sel, ad,
- SWALLOW_Type_INVALID, NULL, NULL, 0,
- STORAGE_STR_UNMOUNT_USB, NULL, NULL);
- if (ad->usb_unmount)
- ad->usb_unmount->userdata = ad;
- else
- SETTING_TRACE_ERROR("ad->usb_unmount is NULL");
-
- /* Usb Format*/
- ad->usb_format = setting_create_Gendial_field_def(ad->md.genlist,
- &(ad->itc_1text), storage_main_USB_sel, ad,
- SWALLOW_Type_INVALID, NULL, NULL, 0,
- STORAGE_STR_FORMAT_USB, NULL, NULL);
- if (ad->usb_format)
- ad->usb_format->userdata = ad;
- else
- SETTING_TRACE_ERROR("ad->usb_format is NULL");
}
-static inline void storage_main_append_USB_info(SettingStorage *ad)
+static bool storage_foreach_supported_cb(int storage_id, storage_type_e type, storage_state_e state, const char *path, void *user_data)
{
- ret_if(NULL == ad);
+ struct storage_stats *stats = user_data;
+ unsigned long long total, available;
+ int err;
- if (ad->usb_card)
- storage_USB_remove_info(ad);
+ if (type != STORAGE_TYPE_EXTERNAL)
+ return true;
- if (ad->usb_otg_status == SETTING_STORAGE_USB_OTG_REMOVE)
- return;
+ if ((state != STORAGE_STATE_MOUNTED) && (state != STORAGE_STATE_MOUNTED_READ_ONLY))
+ return true;
- /* USB OTG storage */
- ad->usb_card = setting_create_Gendial_field_titleItem(ad->md.genlist,
- &(ad->itc_group_item), STORAGE_STR_USB, NULL);
+ err = storage_get_total_space(storage_id, &total);
+ retvm_if(err != 0, err, "storage_get_total_space() Fail(%d)", err);
- if (SETTING_STORAGE_USB_OTG_MOUNT == ad->usb_otg_status) {
- storage_USB_append_mounted_info(ad);
- } else {
- /* Usb Mount*/
- ad->usb_mount = setting_create_Gendial_field_def(ad->md.genlist,
- &(ad->itc_1text), storage_main_USB_sel, ad,
- SWALLOW_Type_INVALID, NULL, NULL, 0,
- STORAGE_STR_MOUNT_USB, NULL, NULL);
- if (ad->usb_mount)
- ad->usb_mount->userdata = ad;
- else
- SETTING_TRACE_ERROR("ad->usb_mount is NULL");
- }
+ err = storage_get_available_space(storage_id, &available);
+ retvm_if(err != 0, true, "storage_get_available_space() Fail(%d)", err);
+
+ stats->total += total;
+ stats->available += available;
+
+ return true;
}
-static void storage_USB_cb(char *type, char *path, int mount, void *data)
+static void storage_load_stats(struct storage_stats *stats)
{
- int ret;
- SettingStorage *ad = data;
-
- ret_if(NULL == type);
- ret_if(NULL == path);
- ret_if(NULL == data);
+ stats->total = 0;
+ stats->available = 0;
- SETTING_TRACE_DEBUG("path:%s type:%s", path, type);
+ int ret = storage_foreach_device_supported(storage_foreach_supported_cb, stats);
+ retm_if(ret != STORAGE_ERROR_NONE, "storage_foreach_device_supported () Fail(%d)", ret);
+}
- FREE(ad->usb_otg_path);
- ad->usb_otg_path = SAFE_STRDUP(path);
+static void storage_refresh_ui(SettingStorage *ad, struct storage_stats *stats)
+{
+ storage_clear_ui(ad);
- evas_object_del(ad->popup);
- ad->popup = NULL;
+ if (stats->total == 0)
+ return;
- if (!strcmp(type, "storage_remove")) {
- ad->usb_otg_status = SETTING_STORAGE_USB_OTG_REMOVE;
- } else if (!strcmp(type, "storage_mount")) {
- ad->usb_otg_status = SETTING_STORAGE_USB_OTG_MOUNT;
- if (STORAGE_USB_REQ_UNMOUNT == ad->usb_request) {
- SETTING_TRACE_ERROR("unmount_usb_storage() Fail");
- storage_fail_popup(ad);
- }
- } else if (!strcmp(type, "storage_unmount")) {
- ad->usb_otg_status = SETTING_STORAGE_USB_OTG_UNMOUNT;
- if (STORAGE_USB_REQ_UNMOUNT_BEFORE_FORMAT == ad->usb_request) {
- ret = storage_USB_format(ad);
- if (SETTING_RETURN_SUCCESS == ret) {
- ad->usb_request = STORAGE_USB_REQ_FORMAT;
- } else {
- ad->usb_request = STORAGE_USB_REQ_NONE;
- storage_USB_mount(ad);
- }
- return;
- } else if (STORAGE_USB_REQ_FORMAT == ad->usb_request) {
- SETTING_TRACE_ERROR("format_usb_storage() Fail");
- storage_fail_popup(ad);
- } else if (STORAGE_USB_REQ_MOUNT == ad->usb_request) {
- SETTING_TRACE_ERROR("mount_usb_storage() Fail");
- storage_fail_popup(ad);
- }
- } else if (!strcmp(type, "storage_updated")) {
- if (mount == 0)
- ad->usb_otg_status = SETTING_STORAGE_USB_OTG_UNMOUNT;
- else
- ad->usb_otg_status = SETTING_STORAGE_USB_OTG_MOUNT;
- }
- ad->usb_request = STORAGE_USB_REQ_NONE;
- storage_main_append_USB_info(ad);
+ storage_create_ui(ad, stats);
}
-void storage_init_USB(SettingStorage *ad)
+static void storage_refresh(SettingStorage *ad)
{
- int ret;
+ struct storage_stats stats;
- ret = init_usbhost_signal();
- retm_if(ret < 0, "init_usbhost_signal() Fail(%d)", ret);
+ storage_load_stats(&stats);
+ storage_refresh_ui(ad, &stats);
+}
+
+static void storage_storage_changed_cb(int storage_id, storage_dev_e dev, storage_state_e state, const char *fstype, const char *fsuuid, const char *mountpath, bool primary, int flags, void *user_data)
+{
+ SettingStorage *ad = user_data;
- ret = register_usb_storage_change_handler(storage_USB_cb, ad);
- if (ret < 0) {
- SETTING_TRACE_ERROR(
- "register_usb_storage_change_handler() Fail(%d)",
- ret);
- deinit_usbhost_signal();
+ if (dev != STORAGE_DEV_EXT_USB_MASS_STORAGE)
return;
+
+ switch (state) {
+ case STORAGE_STATE_UNMOUNTABLE:
+ break;
+ case STORAGE_STATE_REMOVED:
+ case STORAGE_STATE_MOUNTED:
+ case STORAGE_STATE_MOUNTED_READ_ONLY:
+ storage_refresh(ad);
+ break;
}
+}
+
+void storage_init_USB(SettingStorage *ad)
+{
+ int ret = storage_set_changed_cb(STORAGE_TYPE_EXTERNAL, storage_storage_changed_cb, ad);
+ retm_if(ret != STORAGE_ERROR_NONE, "storage_set_changed_cb() Fail(%d)", ret);
- ret = request_usb_storage_info();
- warn_if(ret < 0, "request_usb_storage_info() Fail(%d)", ret);
+ storage_refresh(ad);
}
void storage_deinit_USB()
{
- deinit_usbhost_signal();
+ storage_unset_changed_cb(STORAGE_TYPE_EXTERNAL, storage_storage_changed_cb);
}