4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
20 #include <sys/mount.h>
21 #if SUPPORT_ENCRYPTION
24 #include "setting-storage-utils.h"
25 #include "setting-storage-SD.h"
27 typedef void (*storageUg_mmc_cb)(int result, void *data);
30 STORAGEUG_SD_REQ_NONE,
31 STORAGEUG_SD_REQ_MOUNT,
32 STORAGEUG_SD_REQ_UNMOUNT,
33 STORAGEUG_SD_REQ_FORMAT
36 static void storageUg_SD_finish_progress(int result, void *data)
38 SettingStorageUG *ad = data;
43 evas_object_del(ad->popup);
48 SETTING_TRACE_ERROR("result(%d) Invalid", result);
49 storageUg_fail_popup(ad);
51 ad->sd_request = STORAGEUG_SD_REQ_NONE;
54 static void storageUg_SD_unmount(SettingStorageUG *ad, storageUg_mmc_cb cb)
60 ad->popup = setting_create_popup_with_progressbar(ad, ad->win, PROGRESSBAR_STYLE,
61 NULL, STORAGEUG_STR_UNMOUNTING_SD, storageUg_popup_del, 0, TRUE, TRUE, 0);
63 ad->mmc_content.mmc_cb = cb;
64 ad->mmc_content.user_data = ad;
65 ret = deviced_request_unmount_mmc(&ad->mmc_content, MNT_FORCE);
67 SETTING_TRACE_ERROR("deviced_request_unmount_mmc() Fail");
68 storageUg_fail_popup(ad);
70 ad->sd_request = STORAGEUG_SD_REQ_UNMOUNT;
73 static void storageUg_SD_unmount_resp(void *data, Evas_Object *obj,
77 SettingStorageUG *ad = data;
81 response_type = btn_type(obj);
83 evas_object_del(ad->popup);
87 if (POPUP_RESPONSE_OK == response_type)
88 storageUg_SD_unmount(ad, storageUg_SD_finish_progress);
91 static void storageUg_SD_handle_mount_unmount(void *data)
93 SettingStorageUG *ad = data;
97 SETTING_TRACE("mmc_status = %d", ad->mmc_status);
100 evas_object_del(ad->popup);
104 if (VCONFKEY_SYSMAN_MMC_MOUNTED == ad->mmc_status) {
105 ad->popup = setting_create_popup(ad, ad->win, STORAGEUG_STR_UNMOUNT_SD,
106 STORAGEUG_STR_SD_UNMOUNT_POPUP_MSG, storageUg_SD_unmount_resp,
108 2, STORAGEUG_STR_OK, STORAGEUG_STR_CANCEL);
112 ad->popup = setting_create_popup_with_progressbar(ad, ad->win,
113 PROGRESSBAR_STYLE, NULL, "IDS_ST_POP_MOUNTING_SD_CARD_ING", storageUg_popup_del, 0, TRUE, TRUE, 0);
115 ad->mmc_content.mmc_cb = storageUg_SD_finish_progress;
116 ad->mmc_content.user_data = ad;
117 ret = deviced_request_mount_mmc(&ad->mmc_content);
118 /* if fail, popup failed info */
120 SETTING_TRACE_ERROR("deviced_request_mount_mmc() Fail");
121 storageUg_fail_popup(ad);
124 ad->sd_request = STORAGEUG_SD_REQ_MOUNT;
128 static void storageUg_SD_finish_format(int result, void *data)
130 SettingStorageUG *ad = data;
132 ret_if(data == NULL);
135 evas_object_del(ad->popup);
139 ad->sd_request = STORAGEUG_SD_REQ_NONE;
142 SETTING_TRACE_ERROR("result(%d) Invalid", result);
143 storageUg_fail_popup(ad);
148 static void storageUg_SD_format(int result, void *data)
151 SettingStorageUG *ad = data;
153 ret_if(data == NULL);
156 evas_object_del(ad->popup);
161 SETTING_TRACE_ERROR("result(%d) Invalid", result);
162 storageUg_fail_popup(ad);
163 ad->sd_request = STORAGEUG_SD_REQ_NONE;
167 ad->popup = setting_create_popup_with_progressbar(ad, ad->win, "default",
168 NULL, STORAGEUG_STR_FORMATTING_SD, NULL, 0, TRUE, TRUE, 0);
170 ad->mmc_content.mmc_cb = storageUg_SD_finish_format;
171 ad->mmc_content.user_data = ad;
172 ret = deviced_request_format_mmc(&ad->mmc_content);
174 SETTING_TRACE_ERROR("fail to call deviced_request_format_mmc");
175 storageUg_fail_popup(ad);
177 ad->sd_request = STORAGEUG_SD_REQ_FORMAT;
181 static void storageUg_SD_format_se_confirm_resp(void *data, Evas_Object *obj,
185 SettingStorageUG *ad = data;
187 ret_if(data == NULL);
189 response_type = btn_type(obj);
191 evas_object_del(ad->popup);
195 if (POPUP_RESPONSE_OK == response_type)
196 storageUg_SD_unmount(ad, storageUg_SD_format);
200 static void storageUg_SD_format_se_confirm(SettingStorageUG *ad)
203 evas_object_del(ad->popup);
205 ad->popup = setting_create_popup(ad, ad->win, NULL,
206 STORAGEUG_STR_FORMAT_SECOND_Q, storageUg_SD_format_se_confirm_resp,
208 2, STORAGEUG_STR_OK, STORAGEUG_STR_CANCEL);
212 static void storageUg_passwd_ug_result_cb(ui_gadget_h ug, app_control_h service,
216 SettingStorageUG *ad = priv;
218 ret_if(NULL == priv);
220 app_control_get_extra_data(service, "result", &result);
221 if (safeStrCmp(result, "SETTING_PW_TYPE_ENTER_LOCK_TYPE") == 0)
222 storageUg_SD_format_se_confirm(ad);
224 storageUg_fail_popup(ad);
228 elm_object_tree_focus_allow_set(ad->lo_main, EINA_TRUE);
229 setting_ug_destroy(ug);
232 static inline void storageUg_passwd_ug(SettingStorageUG *ad)
240 if (app_control_create(&svc))
243 app_control_add_extra_data(svc, "viewtype", "SETTING_PW_TYPE_ENTER_LOCK_TYPE");
245 memset(&cbs, 0, sizeof(struct ug_cbs));
246 cbs.layout_cb = storageUg_ug_layout_cb;
247 cbs.result_cb = storageUg_passwd_ug_result_cb;
248 cbs.destroy_cb = storageUg_ug_destroy_cb;
249 cbs.priv = (void *)ad;
251 elm_object_tree_focus_allow_set(ad->lo_main, EINA_FALSE);
252 ug = setting_ug_create(ad->ug, "setting-password-efl", UG_MODE_FULLVIEW, svc, &cbs);
253 warn_if(NULL == ug, "setting_ug_create() Fail");
255 app_control_destroy(svc);
258 static inline int storageUg_checkencrypt()
261 #if SUPPORT_ENCRYPTION
262 if (ode_init() == 0) {
263 sde_status = sde_checkencrypt();
270 static inline void storageUg_SD_prepare_format(SettingStorageUG *ad)
274 is_encrypt = storageUg_checkencrypt();
276 storageUg_passwd_ug(ad);
278 storageUg_SD_format_se_confirm(ad);
281 static void storageUg_SD_format_first_confirm_resp(void *data,
282 Evas_Object *obj, void *event_info)
285 SettingStorageUG *ad = data;
287 ret_if(data == NULL);
289 response_type = btn_type(obj);
291 evas_object_del(ad->popup);
295 if (POPUP_RESPONSE_OK == response_type) {
296 storageUg_SD_prepare_format(ad);
302 static inline void storageUg_SD_handle_format(SettingStorageUG *ad)
307 evas_object_del(ad->popup);
311 popup_msg = STORAGEUG_STR_FORMAT_USE_MSG;
313 ad->popup = setting_create_popup(ad, ad->win, NULL, popup_msg,
314 storageUg_SD_format_first_confirm_resp,
316 2, STORAGEUG_STR_OK, STORAGEUG_STR_CANCEL);
319 static void storageUg_SD_sel(void *data, Evas_Object *obj, void *event_info)
321 SettingStorageUG *ad = data;
322 Elm_Object_Item *item = event_info;
324 ret_if(NULL == data);
325 ret_if(NULL == event_info);
327 elm_genlist_item_selected_set(item, 0);
329 if (item == ad->sd_mount->item)
330 storageUg_SD_handle_mount_unmount(ad);
331 else if (item == ad->sd_format->item)
332 storageUg_SD_handle_format(ad);
334 SETTING_TRACE_ERROR("item(%p) Invalid", item);
337 static Setting_GenGroupItem_Data *storageUg_SD_gl_insert_after(
338 Evas_Object *genlist,
339 const Elm_Genlist_Item_Class *itc,
340 Elm_Object_Item *before,
341 setting_call_back_func gl_sel,
345 SettingStorageUG *ad)
347 Setting_GenGroupItem_Data *it_data = calloc(1, sizeof(Setting_GenGroupItem_Data));
348 retvm_if(NULL == it_data, NULL, "calloc failed");
350 it_data->keyStr = (char *)g_strdup(keyStr);
351 it_data->sub_desc = (char *)g_strdup(sub_desc);
352 it_data->swallow_type = SWALLOW_Type_INVALID;
353 it_data->userdata = ad;
355 it_data->item = elm_genlist_item_insert_after(genlist, itc, it_data, NULL, before,
356 ELM_GENLIST_ITEM_NONE, gl_sel, sel_data);
361 static inline void storageUg_SD_info_removed(SettingStorageUG *ad)
364 ad->sd_mount = storageUg_SD_gl_insert_after(ad->gl_main, &itc_2text_2,
365 ad->sd_card->item, NULL, NULL, STORAGEUG_STR_MOUNT_SD, STORAGEUG_STR_INSERT,
368 elm_object_item_disabled_set(ad->sd_mount->item, EINA_TRUE);
370 SETTING_TRACE_ERROR("ad->sd_mount is NULL");
374 static inline void storageUg_SD_info_inserted_not_mounted(SettingStorageUG *ad)
376 ad->sd_mount = storageUg_SD_gl_insert_after(ad->gl_main, &itc_1text,
377 ad->sd_card->item, storageUg_SD_sel, ad, STORAGEUG_STR_MOUNT_SD, NULL,
379 warn_if(NULL == ad->sd_mount, "ad->sd_mount is NULL");
384 vconf_get_int(VCONFKEY_SYSMAN_MMC_MOUNT, &status);
385 if (VCONFKEY_SYSMAN_MMC_MOUNT_COMPLETED == status
386 || VCONFKEY_SYSMAN_MMC_MOUNT_ALREADY == status) {
387 setting_disable_genlist_item(ad->sd_format->item);
390 SETTING_TRACE_ERROR("ad->sd_format is NULL");
394 static inline void storageUg_SD_info_mounted(SettingStorageUG *ad)
398 char total_str[STORAGEUG_MAX_STR_LEN] = {0};
399 char avail_str[STORAGEUG_MAX_STR_LEN] = {0};
400 const char *MMC_path = "/opt/storage/sdcard";
402 storageUg_get_external_storage_status(MMC_path, &total, &avail);
403 storageUg_size_to_str(total, total_str, sizeof(total_str));
404 storageUg_size_to_str(avail, avail_str, sizeof(avail_str));
406 ad->sd_total = storageUg_SD_gl_insert_after(ad->gl_main, &itc_2text_2,
407 ad->sd_card->item, NULL, ad, STORAGEUG_STR_TOTAL, total_str,
410 elm_genlist_item_select_mode_set(ad->sd_total->item,
411 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
412 ad->sd_avail = storageUg_SD_gl_insert_after(ad->gl_main, &itc_2text_2,
413 ad->sd_total->item, NULL, ad, STORAGEUG_STR_AVAIL_SPACE, avail_str,
416 elm_genlist_item_select_mode_set(ad->sd_avail->item,
417 ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
418 ad->sd_mount = storageUg_SD_gl_insert_after(ad->gl_main, &itc_1text,
419 ad->sd_avail->item, storageUg_SD_sel, ad, STORAGEUG_STR_UNMOUNT_SD, NULL,
421 warn_if(NULL == ad->sd_mount, "ad->sd_mount is NULL");
423 SETTING_TRACE_ERROR("ad->sd_avail is NULL");
425 ad->sd_format = storageUg_SD_gl_insert_after(ad->gl_main, &itc_1text,
426 ad->sd_mount->item, storageUg_SD_sel, ad, STORAGEUG_STR_FORMAT_SD, NULL,
428 warn_if(NULL == ad->sd_format, "ad->sd_format is NULL");
431 SETTING_TRACE_ERROR("ad->sd_total is NULL");
435 static inline void storageUg_SD_remove_info(SettingStorageUG *ad)
438 elm_object_item_del(ad->sd_mount->item);
442 elm_object_item_del(ad->sd_total->item);
446 elm_object_item_del(ad->sd_avail->item);
450 elm_object_item_del(ad->sd_format->item);
451 ad->sd_format = NULL;
455 void storageUg_main_append_SD_info(SettingStorageUG *ad)
462 mmc_mode = ad->mmc_status;
464 SETTING_TRACE_DEBUG("mmc_mode: %d", mmc_mode);
466 storageUg_SD_remove_info(ad);
469 mmc_mode = VCONFKEY_SYSMAN_MMC_REMOVED;
471 if (VCONFKEY_SYSMAN_MMC_REMOVED == mmc_mode)
472 storageUg_SD_info_removed(ad);
473 else if (VCONFKEY_SYSMAN_MMC_INSERTED_NOT_MOUNTED == mmc_mode)
474 storageUg_SD_info_inserted_not_mounted(ad);
475 else if (VCONFKEY_SYSMAN_MMC_MOUNTED == mmc_mode)
476 storageUg_SD_info_mounted(ad);
478 SETTING_TRACE_ERROR("mmc_mode(%d) Invalid", mmc_mode);
481 str = vconf_get_str(storageUg_ENCRYPT_stat);
482 warn_if(NULL == str, "vconf_get_str(%s) Fail", storageUg_ENCRYPT_stat);
483 if (!safeStrCmp(str, "encryption_start") || !safeStrCmp(str, "decryption_start")) {
484 if (ad->sd_mount) setting_disable_genlist_item(ad->sd_mount->item);
485 if (ad->sd_format) setting_disable_genlist_item(ad->sd_format->item);
490 void storageUg_SD_change_cb(keynode_t *node, void *user_data)
492 SettingStorageUG *ad = user_data;
494 ret_if(NULL == user_data);
496 ad->mmc_status = vconf_keynode_get_int(node);
498 storageUg_main_append_SD_info(ad);